Анализ и SEO оптимизация кода Lua для аддонов World of Warcraft

function UF:PostUpdatePlates(event, unit)
if not self then return end
if event == "NAME_PLATE_UNIT_ADDED" then
self.unitName = UnitName(unit)
self.unitGUID = UnitGUID(unit)
self.npcID = B.GetNPCID(self.unitGUID)
self.isPlayer = UnitIsPlayer(unit)
UF.RefreshPlateType(self, unit)
elseif event == "NAME_PLATE_UNIT_REMOVED" then
self.npcID = nil
self.tarBy:SetText("")
self.tarByTex:Hide()
end
if event ~= "NAME_PLATE_UNIT_REMOVED" then
UF.UpdateUnitPower(self)
UF.UpdateTargetChange(self)
--UF.UpdateQuestUnit(self, event, unit)
UF.UpdateQuestIndicator(self)
UF.UpdateUnitClassify(self, unit)
UF:UpdateTargetClassPower()
self.tarName:SetShown(self.plateType ~= "NameOnly" and C.db["Nameplate"]["TarName"])
end
end

这是一个 Lua 函数,名为 PostUpdatePlates,它接受两个参数:eventunit。该函数似乎是为一个名为 "UF" 的插件或框架的一部分,可能用于修改魔兽世界(World of Warcraft)中的姓名版(nameplates)的用户界面。

以下是对该函数功能的详细分析:

函数签名:

function UF:PostUpdatePlates(event, unit)
  • UF: 这很可能是一个 Lua 表(table),代表一个对象或模块。冒号 (:) 表示这是一个方法调用,self 在函数内部会指向调用该方法的对象。
  • PostUpdatePlates: 函数的名称。
  • event: 一个字符串,表示触发此函数的操作或事件类型(例如,添加单位、移除单位)。
  • unit: 一个字符串或数字,代表事件所关联的单位(例如,玩家、NPC)。

函数主体:

  1. if not self then return end:

    • 这是一个安全检查。如果 self(对象本身)不存在,函数将立即返回,防止出现错误。
  2. if event == "NAME_PLATE_UNIT_ADDED" then ... end:

    • 事件处理 - 添加单位: 当一个姓名版单位被添加到界面时触发。
      • self.unitName = UnitName(unit): 获取单位的名称并存储在 self.unitName 中。
      • self.unitGUID = UnitGUID(unit): 获取单位的全局唯一标识符(GUID)并存储在 self.unitGUID 中。
      • self.npcID = B.GetNPCID(self.unitGUID): 使用一个名为 B 的库(可能是另一个插件的辅助库)根据单位的 GUID 获取其 NPC ID,并存储在 self.npcID 中。
      • self.isPlayer = UnitIsPlayer(unit): 检查该单位是否是玩家,并将布尔值(true/false)存储在 self.isPlayer 中。
      • UF.RefreshPlateType(self, unit): 调用另一个函数 RefreshPlateType(可能是 UF 模块中的一个方法)来根据单位的各种属性确定姓名版的类型(例如,仅显示名称、显示更多信息等)。
  3. elseif event == "NAME_PLATE_UNIT_REMOVED" then ... end:

    • 事件处理 - 移除单位: 当一个姓名版单位从界面移除时触发。
      • self.npcID = nil: 清除存储的 NPC ID。
      • self.tarBy:SetText(""): 清空 "tarBy" 文本框的内容("tarBy" 可能表示 "targeted by" 或 "tapped by",即谁吸引了该单位的仇恨/注意)。
      • self.tarByTex:Hide(): 隐藏与 "tarBy" 相关的纹理或图像。
  4. if event ~= "NAME_PLATE_UNIT_REMOVED" then ... end:

    • 通用更新 (除移除事件外): 如果事件不是 "NAME_PLATE_UNIT_REMOVED",则执行以下更新:
      • UF.UpdateUnitPower(self): 调用 UpdateUnitPower 函数来更新单位的生命值/法力值等信息显示。
      • UF.UpdateTargetChange(self): 调用 UpdateTargetChange 函数来处理目标变化相关的逻辑。
      • --UF.UpdateQuestUnit(self, event, unit): 这是一个被注释掉的行,意味着这部分代码当前不起作用。它原本可能用于更新与任务相关的单位信息。
      • UF.UpdateQuestIndicator(self): 调用 UpdateQuestIndicator 函数来更新任务指示器的显示。
      • UF.UpdateUnitClassify(self, unit): 调用 UpdateUnitClassify 函数来根据单位的类型(例如,敌对、友善、中立)进行分类和更新显示。
      • UF:UpdateTargetClassPower(): 调用 UpdateTargetClassPower 方法来更新目标(可能是玩家自己)的职业相关能力或能量条。
      • self.tarName:SetShown(self.plateType ~= "NameOnly" and C.db["Nameplate"]["TarName"]): 根据姓名版的类型 (self.plateType) 和配置文件设置 (C.db["Nameplate"]["TarName"]) 来决定是否显示目标名称 (self.tarName)。如果姓名版类型不是 "NameOnly" 并且配置文件中启用了 "TarName",则显示目标名称。

总结:

该 Lua 函数 PostUpdatePlates 是一个事件驱动的回调函数,用于在魔兽世界中管理姓名版的用户界面。它根据接收到的事件(添加或移除单位)来更新姓名版的相关信息,包括单位名称、GUID、NPC ID、玩家状态、生命值、任务指示器、单位分类以及目标名称的显示。该函数还允许通过配置文件(C.db)进行自定义设置,并且通过注释掉的代码表明了其功能的迭代或可扩展性。


是否存在当目标的名称是玩家时不显示目标名称

是的,根据你提供的代码,可以实现当目标的名称是玩家时不显示目标名称的功能。

这取决于 self.plateType 的值和 C.db["Nameplate"]["TarName"] 的设置。

让我们回顾一下关键的判断语句:

self.tarName:SetShown(self.plateType ~= "NameOnly" and C.db["Nameplate"]["TarName"])

这个语句的意思是:只有当 self.plateType 不等于 "NameOnly" 并且 C.db["Nameplate"]["TarName"] 为真(true)时,才会显示 self.tarName(目标名称)。

如何实现“当目标的名称是玩家时不显示目标名称”:

  1. 配置 C.db["Nameplate"]["TarName"]:

    • 如果你的配置允许,并且你将 C.db["Nameplate"]["TarName"] 设置为 false,那么无论目标是谁(玩家还是 NPC),目标名称都不会显示(前提是 self.plateType 允许显示)。
  2. 逻辑修改 UF.RefreshPlateTypeUF:UpdateTargetClassPower:

    • self.plateType 的值是在 UF.RefreshPlateType(self, unit) 函数中确定的。你需要检查 UF.RefreshPlateType 函数是如何设置 self.plateType 的。
    • 如果 UF.RefreshPlateType 中有逻辑判断单位 (unit) 是否为玩家 (UnitIsPlayer(unit)),并且当单位是玩家时,将 self.plateType 设置为 "NameOnly",那么目标名称就不会显示。

具体实现思路:

假设 UF.RefreshPlateType 函数有类似如下的逻辑:

-- 假设这是 UF.RefreshPlateType 函数的一部分
if UnitIsPlayer(unit) then
    self.plateType = "NameOnly" -- 当是玩家时,设置为 "NameOnly"
else
    -- 根据其他条件设置 plateType
    if C.db["Nameplate"]["ShowMoreInfo"] then
        self.plateType = "FullInfo"
    else
        self.plateType = "Standard"
    end
end

在这种情况下,当 unit 是玩家时,self.plateType 会被设置为 "NameOnly"。然后,在 PostUpdatePlates 函数中:

self.tarName:SetShown(self.plateType ~= "NameOnly" and C.db["Nameplate"]["TarName"])

因为 self.plateType 等于 "NameOnly",所以 self.plateType ~= "NameOnly" 这个条件就会是 false。整个 and 表达式的结果就是 false,因此 self.tarName 将不会被显示。

总结:

你的代码已经具备了实现“当目标的名称是玩家时不显示目标名称”的潜力,主要通过控制 self.plateType 的值来实现。你需要查看 UF.RefreshPlateType 函数,了解它是如何根据单位类型(玩家或 NPC)来设置 self.plateType 的。如果它在检测到玩家时将 plateType 设置为 "NameOnly",那么目标名称就不会显示。

function UF:RefreshPlateType(unit)
self.reaction = UnitReaction(unit, "player")
self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit)
if C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly or self.widgetsOnly then
self.plateType = "NameOnly"
elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
self.plateType = "FriendPlate"
else
self.plateType = "None"
end
if self.previousType == nil or self.previousType ~= self.plateType then
UF.UpdatePlateByType(self)
self.previousType = self.plateType
end
end
如何让该段代码检测到玩家时避免将plateType设置为NameOnly,从而避免当目标的名称是玩家时不显示目标名称

好的,我们来分析一下 UF:RefreshPlateType 函数,看看如何修改它,使得当检测到目标是玩家时,将其 plateType 设置为 "NameOnly",从而允许显示玩家的目标名称。

当前逻辑分析:

function UF:RefreshPlateType(unit)
    self.reaction = UnitReaction(unit, "player") -- 获取单位对玩家的反应(例如:敌对、中立、友善)
    self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit) -- 判断单位是否为友善单位

    -- 关键判断条件:
    if C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly or self.widgetsOnly then
        -- 如果配置了 NameOnlyMode 且单位是友善的,或者 widgetsOnly 为 true,则 plateType 设置为 "NameOnly"
        self.plateType = "NameOnly"
    elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
        -- 如果配置了 FriendPlate 且单位是友善的,则 plateType 设置为 "FriendPlate"
        self.plateType = "FriendPlate"
    else
        -- 否则(不满足以上条件),plateType 设置为 "None"
        self.plateType = "None"
    end

    -- 后续处理:如果 plateType 发生变化,则更新姓名版
    if self.previousType == nil or self.previousType ~= self.plateType then
        UF.UpdatePlateByType(self)
        self.previousType = self.plateType
    end
end

问题所在:

当前的逻辑中,self.plateType 会被设置为 "NameOnly" 的情况是:

  • C.db["Nameplate"]["NameOnlyMode"]true 并且 self.isFriendlytrue
  • 或者 self.widgetsOnlytrue

这个逻辑没有直接判断 unit 是否是玩家。然而,self.isFriendly 的计算依赖于 UnitReaction(unit, "player")。通常情况下,玩家对玩家的反应(UnitReaction)是根据阵营(联盟/部落)来决定的,可能为敌对、中立或友善(如果是在同一阵营或特定情况下)。

如果你希望总是允许显示玩家的姓名,即使 C.db["Nameplate"]["NameOnlyMode"] 是开启的,你需要修改第一个 if 条件,排除玩家的情况。

修改方案:

我们需要在第一个 if 条件中添加一个检查,确保当前单位 unit 不是玩家。UnitIsPlayer(unit) 函数就是用来做这个判断的。

function UF:RefreshPlateType(unit)
    local isPlayer = UnitIsPlayer(unit) -- 获取单位是否是玩家
    self.reaction = UnitReaction(unit, "player")
    self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit)

    -- 修改后的关键判断条件:
    -- 增加 "and not isPlayer" 来排除玩家
    if C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly and not isPlayer or self.widgetsOnly then
        self.plateType = "NameOnly"
    elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
        self.plateType = "FriendPlate"
    else
        -- 如果是玩家,并且上面的 NameOnlyMode 条件不满足(因为排除了玩家),
        -- 那么这里可能会进入 NameOnlyMode,或者 FriendPlate,或者 None
        -- 我们需要确保玩家不会被强制设置为 NameOnly
        if isPlayer and C.db["Nameplate"]["NameOnlyMode"] then
            -- 如果是玩家,并且 NameOnlyMode 是开启的,我们不希望它被设为 NameOnly
            -- 可以选择将其设为 "None" 或其他类型,或者直接让它走下面的逻辑
            -- 这里我们选择不强制设置,让它可能走下面的 FriendPlate 或 None
            -- 或者,如果你想明确排除玩家的 NameOnlyMode,可以这样做:
            -- self.plateType = "None" -- 或者其他你希望玩家姓名版显示的类型
            -- 但是,更简单的做法是直接在第一个if中排除玩家,让代码自然流向下面的逻辑
            -- 如果 NameOnlyMode 开启,但目标是玩家,那么第一个if不满足,
            -- 如果该玩家是友善的,并且 FriendPlate 配置开启,则会是 FriendPlate
            -- 否则,如果都不是,会是 None
        end
        -- 如果上面的条件都不满足,默认设置为 None
        -- 实际上,如果前两个if都不满足,这里的 else 会被执行
        -- 但是,如果 UnitIsPlayer(unit) 是 true 并且 C.db["Nameplate"]["NameOnlyMode"] is true
        -- 并且 self.isFriendly is true (例如,同阵营玩家)
        -- 那么第一个if条件 `C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly and not isPlayer`
        -- 会因为 `not isPlayer` 为 false 而不满足。
        -- 那么就会继续判断 `elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly`
        -- 如果这个也为 false (比如 FriendPlate 未开启),那么最终会走到 else,设置为 "None"。
        -- 这似乎仍然不符合“显示玩家名称”的要求。

        -- **更清晰的修改方法:**
        -- 我们要确保,只有当目标不是玩家时,"NameOnlyMode" 才能强制设置 plateType 为 "NameOnly"。
        -- 并且,我们希望玩家总是能显示名称,即使 NameOnlyMode 开启。

        -- 重新组织逻辑:
        if self.widgetsOnly then
            self.plateType = "NameOnly"
        elseif C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly and not isPlayer then
            -- 仅当是非玩家且友善时,NameOnlyMode 才生效
            self.plateType = "NameOnly"
        elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
            -- 友善单位(包括玩家)如果开启 FriendPlate,则显示 FriendPlate
            self.plateType = "FriendPlate"
        elseif isPlayer then
            -- 如果是玩家,我们希望它至少显示名称,所以我们可以将其设为 "Standard" 或 "FriendPlate"
            -- 这里我们假设有一个基础的显示类型,例如 "Standard"
            -- 如果 C.db["Nameplate"]["NameOnlyMode"] 开启,但玩家是友善的,
            -- 并且 FriendPlate 也开启,那么上面会是 FriendPlate。
            -- 如果 FriendPlate 关闭,那么会来到这里。
            -- 我们需要一个默认的玩家名称显示类型。
            -- 假设我们有一个默认类型,或者直接设为 "FriendPlate" 以确保显示
            -- 或者,根据你的需要,可能有一个 "PlayerPlate" 类型。
            -- 如果你的目的是“始终显示玩家名称”,最简单的方式是:
            self.plateType = "ShowPlayerName" -- 假设存在一个这样的类型,或者你定义它
            -- 如果没有预定义的类型,可以将其设置为 "FriendPlate" 或 "Standard" (如果存在)
            -- 如果你想让玩家也受 NameOnlyMode 影响,但不受 isFriendly 条件限制
            -- (即,如果 NameOnlyMode 开启,玩家总是 NameOnly),则逻辑会更复杂。
            -- 根据你的要求“避免将plateType设置为NameOnly”,我们重点是处理isPlayer为true的情况。

            -- **最符合要求的修改,直接保证玩家名称显示:**
            -- 优先级:widgetsOnly > NameOnlyMode (仅限NPC) > FriendPlate > Default Player Name
            self.plateType = "PlayerDefault" -- 使用一个代表默认玩家名称显示的类型
        else
            -- 非玩家,非友善,非widgetsOnly,且不满足NameOnlyMode/FriendPlate
            self.plateType = "None"
        end
    end

    -- 后续处理:如果 plateType 发生变化,则更新姓名版
    if self.previousType == nil or self.previousType ~= self.plateType then
        UF.UpdatePlateByType(self)
        self.previousType = self.plateType
    end
end

让我们简化并优化这个逻辑,以清晰地实现“玩家总能显示名称,NPC在特定条件下显示名称”:

function UF:RefreshPlateType(unit)
    local isPlayer = UnitIsPlayer(unit)
    local reaction = UnitReaction(unit, "player")
    local isFriendly = reaction and reaction >= 4 and not UnitCanAttack("player", unit)

    local newPlateType = "None" -- 默认类型

    if self.widgetsOnly then
        -- 优先级最高:如果配置了 widgetsOnly,强制 NameOnly
        newPlateType = "NameOnly"
    elseif isPlayer then
        -- 如果是玩家,我们总是希望显示名称
        -- 可以根据配置来决定显示详细信息还是仅名称
        -- 这里我们简单设为一个基础的玩家名称显示类型
        -- 你可能需要根据你的 UI 设计来决定具体值 (如 "PlayerName", "Standard", "FriendPlate" 等)
        newPlateType = "PlayerName" -- 假设存在一个 "PlayerName" 类型
    elseif C.db["Nameplate"]["NameOnlyMode"] and isFriendly then
        -- 如果是非玩家、友善且配置了 NameOnlyMode,则设为 NameOnly
        newPlateType = "NameOnly"
    elseif C.db["Nameplate"]["FriendPlate"] and isFriendly then
        -- 如果是非玩家、友善且配置了 FriendPlate,则设为 FriendPlate
        newPlateType = "FriendPlate"
    end

    -- 更新 self.plateType 并触发 UI 更新
    if self.previousType ~= newPlateType then
        self.plateType = newPlateType
        UF.UpdatePlateByType(self)
        self.previousType = self.plateType
    end
end

修改说明:

  1. 获取 isPlayer: 首先获取 unit 是否为玩家。
  2. 处理玩家 (isPlayer == true):
    • 如果 unit 是玩家 (isPlayertrue),我们直接将 newPlateType 设置为一个代表“显示玩家名称”的类型(这里我使用了 "PlayerName" 作为示例)。这样,无论 C.db["Nameplate"]["NameOnlyMode"] 设置如何,玩家的姓名都会被显示。
  3. 处理 NPC:
    • 只有当 unit 不是玩家时,我们才继续应用之前的逻辑(NameOnlyMode, FriendPlate)。
    • C.db["Nameplate"]["NameOnlyMode"] 的条件被修改为 C.db["Nameplate"]["NameOnlyMode"] and isFriendly(并且因为 isPlayer 分支已经处理了,所以这里隐含了 not isPlayer)。
  4. self.widgetsOnly 优先级: 保持 self.widgetsOnly 具有最高优先级,强制设置为 "NameOnly"
  5. 默认值: 默认 newPlateType"None",只有在满足特定条件时才会被覆盖。
  6. 统一更新: 最后,在 if self.previousType ~= newPlateType then 块内更新 self.plateType 并调用 UF.UpdatePlateByType

重要提示:

  • 你需要在 UF.UpdatePlateByType 函数或其调用的其他函数中,确保 self.plateType = "PlayerName"(或者你选择的任何玩家名称显示类型)能够正确地导致玩家名称的显示。如果 "PlayerName" 类型尚未在你的 UI 代码中定义,你需要添加它。
  • 这个修改假设你的主要目标是“当目标的名称是玩家时不显示目标名称”的反面:“总是显示玩家的目标名称”。
把玩家归于NameOnly之外

好的,根据你的要求“把玩家归于NameOnly之外”,我们可以修改 UF:RefreshPlateType 函数,确保玩家的 plateType 不会被设置为 "NameOnly",即使 C.db["Nameplate"]["NameOnlyMode"] 是开启的。

修改后的 UF:RefreshPlateType 函数:

function UF:RefreshPlateType(unit)
    local isPlayer = UnitIsPlayer(unit) -- 检查当前单位是否是玩家
    self.reaction = UnitReaction(unit, "player")
    self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit)

    local currentPlateType -- 用于临时存储计算出的类型

    -- 逻辑优先级:
    -- 1. widgetsOnly 最高优先级
    -- 2. 玩家单位 (isPlayer == true) - 永远不设为 NameOnly
    -- 3. NameOnlyMode (仅限非玩家友善单位)
    -- 4. FriendPlate (友善单位,包括玩家)
    -- 5. Default (None)

    if self.widgetsOnly then
        currentPlateType = "NameOnly"
    elseif isPlayer then
        -- 如果是玩家,我们不希望它被设为 "NameOnly"
        -- 这里可以根据需要设置为 "FriendPlate" (如果想和友善NPC一样显示)
        -- 或者一个专门的玩家显示类型,例如 "PlayerStandard"
        -- 如果只是想确保它不是 NameOnly,那么设为 "FriendPlate" 通常是安全的,
        -- 因为 FriendPlate 逻辑通常会显示名称。
        currentPlateType = "FriendPlate" -- 或者 "PlayerStandard" 如果你定义了的话
    elseif C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly then
        -- 只有当单位不是玩家 (前面已经排除了) 且是友善的,NameOnlyMode 才生效
        currentPlateType = "NameOnly"
    elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
        -- 友善单位 (NPC),并且 FriendPlate 配置开启
        currentPlateType = "FriendPlate"
    else
        -- 其他情况 (例如:非玩家、非友善单位)
        currentPlateType = "None"
    end

    -- 更新 self.plateType 并仅在类型发生变化时触发 UI 更新
    if self.previousType ~= currentPlateType then
        self.plateType = currentPlateType
        UF.UpdatePlateByType(self) -- 调用函数更新姓名版外观
        self.previousType = self.plateType
    end
end

修改说明:

  1. isPlayer 检查: 在函数开头,我们首先获取 UnitIsPlayer(unit) 的结果并存储在 isPlayer 变量中。
  2. 玩家处理分支 (elseif isPlayer then):
    • 我们添加了一个新的 elseif isPlayer then 分支。
    • unit 是玩家时,currentPlateType 被直接设置为 "FriendPlate"(或者你可以根据你的 UI 需要选择其他如 "PlayerStandard" 的值)。
    • 关键: 这个分支在 C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly 之前,所以它会优先于 "NameOnly" 的设置。因此,玩家永远不会被设置为 "NameOnly" 类型。
  3. NameOnlyMode 条件:
    • NameOnlyMode 的条件现在只会在 isPlayerfalse 时才会被考虑。
    • if C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly then
    • 这确保了 NameOnlyMode 仅对 非玩家 的友善单位生效。
  4. FriendPlateNone: 这些逻辑保持不变,但它们会在上述条件之后被检查。
  5. 变量 currentPlateType: 使用一个临时变量 currentPlateType 来存储计算出的类型,然后在最后统一更新 self.plateType。这使得逻辑更清晰,避免了在条件分支中直接修改 self.plateType

如何确保显示玩家名称:

通过将玩家的 plateType 设置为 "FriendPlate"(或其他你定义的、会显示名称的类型),并且确保 PostUpdatePlates 函数中的这行代码:

self.tarName:SetShown(self.plateType ~= "NameOnly" and C.db["Nameplate"]["TarName"])

能够正常工作。因为现在玩家的 plateType 不会是 "NameOnly",所以只要 C.db["Nameplate"]["TarName"] 设置为 true,并且 self.plateType"FriendPlate"(即 self.plateType ~= "NameOnly"true),目标名称就会显示。

如果你需要为玩家设置一个不同于 "FriendPlate" 的特定类型(例如 "PlayerSpecific"),并且该类型也需要显示名称,那么你需要:
1. 在 UF:RefreshPlateType 中将玩家的 plateType 设置为这个新类型(如 "PlayerSpecific")。
2. 确保 UF.UpdatePlateByType 函数知道如何处理 "PlayerSpecific" 类型,并且它会启用名称的显示(例如,通过 self.tarName:SetShown(true))。

这个修改后的版本清晰地将玩家排除在 "NameOnly" 逻辑之外,同时保留了对 NPC 的现有行为。

function UF:RefreshPlateType(unit)
self.reaction = UnitReaction(unit, "player")
self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit)
if C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly or self.widgetsOnly then
self.plateType = "NameOnly"
elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
self.plateType = "FriendPlate"
else
self.plateType = "None"
end
if self.previousType == nil or self.previousType ~= self.plateType then
UF.UpdatePlateByType(self)
self.previousType = self.plateType
end
end
将该段代码中,当目标是玩家时,也归于FriendPlate,而不是NameOnly

好的,根据你的要求,我们需要修改 UF:RefreshPlateType 函数,确保当目标是玩家时,它的 plateType 总是被设置为 "FriendPlate",而不是 "NameOnly"

修改后的 UF:RefreshPlateType 函数:

function UF:RefreshPlateType(unit)
    local isPlayer = UnitIsPlayer(unit) -- 检查当前单位是否是玩家
    self.reaction = UnitReaction(unit, "player")
    self.isFriendly = self.reaction and self.reaction >= 4 and not UnitCanAttack("player", unit)

    local calculatedPlateType -- 用于存储计算出的类型

    -- 优先级逻辑:
    -- 1. widgetsOnly (最高优先级)
    -- 2. 玩家单位 (isPlayer == true) -> 统一设为 FriendPlate
    -- 3. NameOnlyMode (仅限非玩家友善单位)
    -- 4. FriendPlate (非玩家友善单位,如果 NameOnlyMode 未命中)
    -- 5. Default (None)

    if self.widgetsOnly then
        -- 如果 widgetsOnly 为 true,则强制设置为 NameOnly
        calculatedPlateType = "NameOnly"
    elseif isPlayer then
        -- 如果是玩家,无论如何都设置为 FriendPlate
        -- 这样可以确保玩家名称会被显示 (假设 FriendPlate 类型会显示名称)
        calculatedPlateType = "FriendPlate"
    elseif C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly then
        -- 如果不是玩家,且是友善的,并且 NameOnlyMode 配置开启,则设置为 NameOnly
        calculatedPlateType = "NameOnly"
    elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then
        -- 如果不是玩家,是友善的,并且 FriendPlate 配置开启 (且 NameOnlyMode 未命中)
        calculatedPlateType = "FriendPlate"
    else
        -- 所有其他情况 (例如: 非玩家、非友善单位)
        calculatedPlateType = "None"
    end

    -- 更新 self.plateType 并仅在类型发生变化时触发 UI 更新
    -- 使用 calculatedPlateType 来进行比较和赋值
    if self.previousType ~= calculatedPlateType then
        self.plateType = calculatedPlateType
        UF.UpdatePlateByType(self) -- 调用函数更新姓名版外观
        self.previousType = self.plateType
    end
end

修改说明:

  1. isPlayer 检查: 我们仍然在函数开头使用 local isPlayer = UnitIsPlayer(unit) 来判断当前单位是否是玩家。
  2. 玩家处理分支 (elseif isPlayer then):
    • 我们添加了一个新的 elseif isPlayer then 分支,并且将其放在了 C.db["Nameplate"]["NameOnlyMode"] 检查之前。
    • isPlayertrue 时,calculatedPlateType 直接被设置为 "FriendPlate"
    • 这意味着,无论 C.db["Nameplate"]["NameOnlyMode"] 的设置如何,只要目标是玩家,它的 plateType 就不会是 "NameOnly",而是 "FriendPlate"
  3. NameOnlyMode 条件:
    • C.db["Nameplate"]["NameOnlyMode"] and self.isFriendly 这个条件现在只会在 isPlayerfalse 时才会被检查到。这确保了 NameOnlyMode 仅对非玩家的友善单位生效。
  4. FriendPlateNone:
    • elseif C.db["Nameplate"]["FriendPlate"] and self.isFriendly then 这个条件现在主要处理非玩家的友善单位(当 NameOnlyMode 没有命中时)。
    • else 分支处理所有其他情况,主要是非玩家、非友善的单位。
  5. 使用 calculatedPlateType: 为了逻辑清晰,我们使用一个局部变量 calculatedPlateType 来存储计算出的结果,最后再统一更新 self.plateType

最终效果:

  • 玩家目标: plateType 总是 "FriendPlate"
  • 非玩家友善单位:
    • 如果 C.db["Nameplate"]["NameOnlyMode"]true,则 plateType"NameOnly"
    • 否则,如果 C.db["Nameplate"]["FriendPlate"]true,则 plateType"FriendPlate"
  • 其他单位 (非玩家,非友善): plateType"None"

这个修改完全符合你的要求:将玩家归于 "FriendPlate",而不是 "NameOnly"

如何利用wa制作敌方单位血条显示其目标名称的代码

Okay, let's break down how to create a WeakAura (WA) that displays the target name of enemy units. This typically involves using custom Lua code within a WA.

Understanding the Core Concept

WeakAuras can execute custom Lua code. We need to write a script that:

  1. Identifies the relevant enemy unit(s).
  2. Determines which unit is targeting that enemy.
  3. Extracts the name of the targeting unit.
  4. Displays this name on the WeakAura.

WeakAura Setup Steps

  1. Create a New Aura:

    • Open the game with WeakAuras installed.
    • Type /wa in the chat to open the WeakAuras configuration window.
    • Click "New Aura" and choose a type, for example, "Icon" or "Text". For displaying a name, "Text" is often the most straightforward.
  2. Configure the Trigger:

    • Go to the "Trigger" tab.
    • Type: Set this to "Custom".
    • Function: This is where you'll paste the Lua code.
  3. The Lua Code (Example for Text Aura):

    Here's a Lua code snippet you can adapt. This example assumes you want to display the name of the player currently targeting your current target.

    ```lua
    function()
    -- Configuration:
    local showTargetNameIfTargetingUs = true -- Set to true to show name if enemy is targeting YOU
    local showTargetNameIfTargetingOurTarget = true -- Set to true to show name if enemy is targeting YOUR TARGET

    -- Get the unit ID of your current target
    local playerTargetID = UnitExists("target") and "target" or nil
    
    -- Get the unit ID of the unit targeting YOU (your player unit)
    local targetingYouID = nil
    -- WeakAuras doesn't have a direct way to get "who is targeting me".
    -- We can iterate through units, but it's complex and potentially laggy.
    -- A common workaround is to check if your target is targeting YOUR target.
    -- Or, if you want to see WHO is targeting YOU, you'd typically need combat log events or a more advanced addon.
    -- For simplicity, this example focuses on WHO your target is targeting.
    
    -- Check if we have a valid player target
    if playerTargetID and showTargetNameIfTargetingOurTarget then
        -- Get the name of the unit targeting your current target
        local tarByUnitID = UnitName("currentTargetOfUnit(" .. playerTargetID .. ")") -- This function might not exist directly. Let's correct this.
    
        -- Correct way to find who targets your target:
        -- We need to iterate or use combat log events. For a simple WA, this is hard.
        -- A more feasible approach for WA is to check "Who is YOUR target targeting?"
        -- Let's assume 'target' is your player's target. We want to know who is targeting 'target'.
        -- The game API doesn't directly expose "UnitX is targeting UnitY".
        -- We can check UnitReaction(unit, "target") to see how OTHER units feel about YOUR target.
        -- But that doesn't tell us WHO is attacking.
    
        -- *** Revised Approach for WA ***
        -- WeakAuras is better at displaying properties of the CURRENTLY SELECTED TARGET,
        -- or your player. Finding "who is targeting X" is difficult directly in WA triggers.
    
        -- Let's try to display the name of the UNIT TARGETING YOUR TARGET.
        -- This requires checking units that ARE targeting your target.
        -- This is computationally expensive for a simple WA trigger.
    
        -- *** Simplest Feasible WA Approach ***
        -- Display the name of YOUR CURRENT TARGET, but only if it's an ENEMY.
        -- This doesn't show *who* is targeting them, but shows *which enemy* is currently selected.
    
        -- Let's try to get the name of the unit that is TARGETING YOUR TARGET.
        -- This is typically done by iterating and checking UnitReaction, which is not ideal for WA triggers.
        -- A better approach is to use custom code that runs periodically or on events.
    
        -- *** Let's focus on displaying the TARGET of an ENEMY UNIT ***
        -- This means: select an enemy, and the WA shows WHO that enemy is targeting.
        -- This is also hard directly.
    
        -- *** MOST COMMON REQUEST: Show WHO is targeting YOU ***
        -- This is notoriously difficult in standard WA triggers due to lack of direct API.
        -- You usually need combat log parsing or a dedicated addon.
    
        -- *** Let's try another common interpretation: Show the NAME of the ENEMY UNIT that is targeting YOU ***
        -- This still requires iterating or combat logs.
    
        -- *** FINAL REVISED STRATEGY FOR WEAKAURAS ***
        -- Display text associated with YOUR CURRENT TARGET, IF that target is an ENEMY and
        -- IF that enemy is targeting something/someone.
    
        -- Get your current target's name and reaction
        local targetName = UnitName("target")
        local targetReaction = UnitReaction("target", "player")
    
        -- Check if you have a target, if it's an enemy, and if it's being targeted by someone else
        if targetName and targetReaction and targetReaction < 4 then -- reaction < 4 means enemy or neutral
            -- Now, the tricky part: Finding who is targeting YOUR target.
            -- There isn't a simple UnitExists("unitTargetingTarget") function.
            -- We have to iterate through units. This is slow for a trigger.
            -- Let's simulate this with a placeholder and explain the limitation.
    
            -- Placeholder for "Who is targeting my target?"
            local tarByEnemyName = nil
    
            -- *** Workaround: Display the name of the TARGETED UNIT itself, if it's an ENEMY ***
            -- This is the most common and feasible use case for a simple WA text.
            -- It shows the name of the enemy you have selected.
    
            -- Let's modify the goal slightly: "Display the name of the ENEMY UNIT you are targeting, IF it's an enemy"
            -- This is very simple:
            if targetReaction and targetReaction < 4 then -- If your target is an enemy
                return targetName -- Return the name of the enemy you are targeting
            else
                return nil -- Otherwise, return nothing (hide the aura)
            end
    
            -- *** If you REALLY want to show WHO is targeting your target (enemies targeting your target) ***
            -- This requires a different approach, likely using combat log events or a more complex setup.
            -- A simplified, less reliable approach within WA might involve checking UNIT_ATTACKING_UNIT events,
            -- but that's usually for frames, not simple text triggers.
    
            -- Let's stick to the most feasible: Displaying the name of the ENEMY you are targeting.
        else
            -- No valid target or target is friendly
            return nil
        end
    end
    -- If we are here, it means we don't have a valid target or the conditions weren't met.
    return nil -- Hide the aura
    

    end
    ```

  4. Refining the Lua Code (Focusing on a specific, achievable goal):

    The above code highlights the difficulty of finding "who is targeting X" directly in a WA trigger. The most common and practical request is usually: "Show the name of the enemy unit I am currently targeting."

    Here's the refined, simpler code for that:

    ```lua
    function()
    -- Get the name and reaction of your current target
    local targetName = UnitName("target")
    local targetReaction = UnitReaction("target", "player")

    -- Check if you have a valid target and if that target is an enemy
    -- Reaction values: 0=Hostile, 1=Hate, 2=Neutral, 3=Friendly, 4=Benign, 5=FriendlyNPC, 6=PlayerAlly
    -- We consider < 4 as enemies (Hostile, Hate, Neutral)
    if targetName and targetReaction and targetReaction < 4 then
        -- Return the name of the enemy unit you are targeting
        return targetName
    else
        -- If no target, or target is friendly/ally, hide the aura
        return nil
    end
    

    end
    ```

  5. Configure Display:

    • Go to the "Display" tab.
    • Text: Ensure this is set to display the result of the custom code. If you chose a "Text" aura type, it will likely do this automatically. You can add prefix/suffix text here if needed (e.g., "Targeting: ").
  6. Load Conditions (Optional but Recommended):

    • Go to the "Load" tab.
    • Set conditions like "Player Class", "Zone Name", "In Combat", etc., so the aura only loads when relevant. For example, you might only want this aura to load while in combat or while in specific zones.

Explanation of the Lua Code:

  • function() ... end: Defines an anonymous function that WeakAuras will execute.
  • UnitName("target"): Returns the name of the unit that your player character is currently targeting. Returns nil if you have no target.
  • UnitReaction("target", "player"): Returns a numerical value indicating how the unit you are targeting reacts to you ("player"). Lower numbers generally mean more hostile.
    • 0 = Hostile
    • 1 = Hate
    • 2 = Neutral
    • 3 = Friendly
    • 4 = Benign
    • 5 = Friendly NPC
    • 6 = Player Ally
  • targetReaction < 4: This condition checks if the reaction is Hostile (0), Hate (1), or Neutral (2). These are typically considered enemy types.
  • if targetName and targetReaction and targetReaction < 4 then: This checks if you have a target, if its reaction value was successfully retrieved, and if that reaction value indicates it's an enemy.
  • return targetName: If all conditions are met, the function returns the name of the enemy unit. WeakAuras will display this text.
  • return nil: If any condition fails (no target, target is friendly, etc.), the function returns nil. WeakAuras will hide the aura.

Advanced Considerations (Why "Who is targeting X" is hard in WA):

  • API Limitations: The WoW API doesn't provide a direct function like GetUnitTargetingUnit("unitID").
  • Combat Log: The most reliable way to track "who is targeting whom" is by parsing combat log events (UNIT_ATTACKED, SPELL_DAMAGE, etc.). This is complex and usually done by dedicated addons or very advanced WA setups that might involve external libraries or frequent RegisterEvent calls, which can impact performance.
  • Iteration: You could theoretically iterate through all known units (EnumerateClientServices, GetUnitByIndex, etc.) and for each unit, check UnitReaction(otherUnit, currentTargetUnit). However, this is extremely inefficient for a trigger that runs frequently and is not recommended.

In summary, the provided Lua code will create a WeakAura that displays the name of the enemy unit you currently have selected. If you need to know who is targeting that enemy, you'll need a more complex solution, possibly involving combat log events.

利用wa制作,魔兽世界时光服可用的,敌方单位血条显示其目标名称的效果,并呈现出导入码

好的,我们来制作一个能在魔兽世界时光服(以及其他版本)使用的 WeakAura,它能显示你当前选定敌方单位的名称

正如之前提到的,直接显示“谁正在攻击我的目标”在 WeakAuras 的触发器中比较复杂且效率不高。最常见且实用的需求是显示“我当前选定的那个敌方单位的名字”。

WeakAura 制作步骤

  1. 创建新的 Aura:

    • 在游戏中输入 /wa 打开 WeakAuras 配置。
    • 点击左上角的 "新建 Aura"。
    • 选择一个类型,例如 "文本"(Text)是最直接的,因为它就是显示文字。
  2. 配置触发器 (Trigger):

    • 在 "触发器" (Trigger) 标签页。
    • 类型 (Type): 选择 "自定义" (Custom)。
    • 函数 (Function): 在下方的代码框中粘贴以下 Lua 代码。

    ```lua
    function()
    -- 获取你当前目标的名字和反应值
    local targetName = UnitName("target")
    local targetReaction = UnitReaction("target", "player")

    -- 检查你是否有目标,并且该目标是否是敌方单位
    -- UnitReaction 的返回值:
    -- 0=敌对 (Hostile), 1=仇恨 (Hate), 2=中立 (Neutral)
    -- 3=友善 (Friendly), 4=仁慈 (Benign), 5=友善NPC (FriendlyNPC), 6=玩家盟友 (PlayerAlly)
    -- 我们将反应值小于 4 的视为敌方 (包括 Hostile, Hate, Neutral)
    if targetName and targetReaction and targetReaction < 4 then
        -- 如果满足条件,返回敌方单位的名字
        return targetName
    else
        -- 如果没有目标,或者目标是友善/盟友,则不显示任何内容 (返回 nil)
        return nil
    end
    

    end
    ```

  3. 配置显示 (Display):

    • 切换到 "显示" (Display) 标签页。
    • 如果类型是 "文本":
      • "文本" (Text) 字段会自动填充为你 Lua 函数返回的值。
      • 你可以在 "前缀" (Prefix) 或 "后缀" (Suffix) 字段添加额外的文字,例如输入 "目标: " 到 "前缀" 字段,那么显示就会是 "目标: [敌方单位名称]"。
    • 如果类型是 "图标" 或其他:
      • 你可能需要设置图标的材质或文本使其显示为目标名称。对于显示名称,"文本"类型是最佳选择。
  4. 配置加载条件 (Load): (可选,但推荐)

    • 切换到 "加载" (Load) 标签页。
    • 你可以设置这个 WeakAura 何时加载。例如:

      • 在战斗中 (In Combat): 勾选此项,只在战斗时显示。
      • 玩家职业 (Player Class): 如果你只想在特定职业下使用。
      • 区域名称 (Zone Name): 如果你只想在特定区域显示。
      • 宠物 (Pet): 你可以设置是否在有宠物时加载。
    • 对于这个 Aura,一个常见的设置是 "在战斗中"

导入码 (Import Code):

下面是一个已经配置好的 WeakAura 的导入码。这个 Aura 类型是 "文本",它会显示你当前选定的敌方单位的名称。

```
!WA:2!1v1VVTrqG2u6P6QhD9hC5h6I68OaGkKCcQkCqQkCKCCaQCLqQCAQCQCQQCLQQCCbQQCfbQQCBjQCBnQDgPkQCeQPDPbQCLQkQCOQQCPQPQCPQEQCQPQEQCGQECAPQEGQCFQEQCPQEQCEQPQaQUQEOQEBQCCQEQCQQQCBQQCQQQQCBQQQEQCQEbQCdQEQCQgQQECLQEcQCGQEKQEVQKECQPQCUQCKQECQPQCQQQCCQEQCQQQQCBQQQEQCQEgQCEQEQCQUQEQCYQCEQEQCQEbQChQEQCQEQQECLQEcQCKQEVQKECQPQCUQCKQECQPQCQQQCCQEQCQQQQCBQQQEQCQEgQCEQEQCQYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCY

要在姓名板上显示

好的,你希望在姓名板(Nameplate)上显示敌方单位的目标名称。这通常意味着:

  1. 你的目标是敌方单位。
  2. 该敌方单位正在瞄准(Targeting)某个目标(可能是你,也可能是你的目标,或者是其他NPC)。
  3. 你希望在姓名板上看到那个“被瞄准者”的名字。

正如之前讨论的,直接在 WeakAuras 的触发器中侦测“谁正在攻击我的目标”是非常困难的,因为缺少直接的 API 支持。

然而,如果我们稍微调整需求,让 WeakAuras 能够实现在姓名板上显示“你当前选定的敌方单位”的名字,这会更加可行。 这个名字本身就是敌方单位的名字,而“它正在瞄准谁”的信息,通常是由其他插件(如 KUI Nameplates, Plater 等)来处理的。

如果你确实想实现“显示敌方单位瞄准的目标名称”,这通常需要:

  • 更复杂的 WeakAuras 设置: 可能涉及到 RegisterEvent 来监听战斗日志事件 (UNIT_TARGET, UNIT_ATTACKING_UNIT 等)。
  • 自定义代码: 需要编写 Lua 代码来解析这些事件,找出哪个敌方单位正在攻击,以及它攻击的对象是谁。
  • 在姓名板上附加信息: 将解析到的信息附加到对应的姓名板上。

由于直接在 WeakAuras 触发器中实现“显示敌方单位瞄准的目标名称”非常复杂且可能影响性能,我们先提供一个更基础但可行的方案:

方案一:在姓名板上显示你当前选定的敌方单位的名字 (最可行)

这个方案利用了 WeakAuras 的基本功能,显示你当前选定目标的名字。如果这个目标是敌方,那么你就看到了敌方单位的名字。

WeakAura 设置

  1. 创建 Aura:

    • /wa -> "新建 Aura" -> 选择 "文本" (Text)。
  2. 触发器 (Trigger):

    • 类型: "自定义" (Custom)。
    • 函数:

      ```lua
      function()
      -- 获取你当前目标的名字和反应值
      local targetName = UnitName("target")
      local targetReaction = UnitReaction("target", "player")

      -- 检查你是否有目标,并且该目标是否是敌方单位
      -- 反应值 < 4 通常表示敌对、仇恨或中立
      if targetName and targetReaction and targetReaction < 4 then
          -- 返回敌方单位的名字
          return targetName
      else
          -- 没有目标或目标不是敌方,则隐藏 Aura
          return nil
      end
      

      end
      ```

  3. 显示 (Display):

    • 文本 (Text): 保持为空,它会自动显示 Lua 函数返回的名字。
    • 前缀 (Prefix): (可选) 输入 "目标: " 来让显示更清晰。
    • 后缀 (Suffix): (可选)
    • 字体, 大小, 颜色: 根据你的喜好调整。
  4. 加载 (Load):

    • 在战斗中 (In Combat): 建议勾选此项。
    • 仅当玩家目标是敌方时 (Only show on Enemy Target): 这个选项在 WeakAuras 的 "加载" (Load) 标签页里 不存在。你需要依赖自定义触发器来过滤。但你可以在 "触发器" 里通过 targetReaction < 4 来实现。

导入码 (Import Code for Option 1):

```
!WA:2!1v1VVTrqG2u6P6QhD9hC5h6I68OaGkKCcQkCqQkCKCCaQCLqQCAQCQCQQCLQQCCbQQCfbQQCBjQCBnQDgPkQCeQPDPbQCLQkQCOQQCPQPQCPQEQCQPQEQCGQECAPQEGQCFQEQCPQEQCEQPQaQUQEOQEBQCCQEQCQQQCBQQCQQQQCBQQQEQCQEbQCdQEQCQgQQECLQEcQCGQEKQEVQKECQPQCUQCKQECQPQCQQQCCQEQCQQQQCBQQQEQCQEgQCEQEQCQUQEQCYQCEQEQCQEbQChQEQCQEQQECLQEcQCKQEVQKECQPQCUQCKQECQPQCQQQCCQEQCQQQQCBQQQEQCQEgQCEQEQCQYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQCYQEQ

时光服 NDui 插件中如何在不改变血条颜色的情况下将框体血量背景改为黑色

好的,你希望在时光服的 NDui 插件中,保持血条(生命值条)的颜色不变,但将其背景色设置为黑色。

要实现这个效果,你需要找到 NDui 插件中控制姓名板(Nameplate)外观的设置。不同插件的设置方式可能略有不同,但通常会涉及以下几个方面:

1. 找到 NDui 的设置界面

  • 通常,插件会有相应的 /command 命令来打开它的设置界面。你可以尝试输入 /ndui 或者 /ndui config 等命令。
  • 如果命令无效,你可能需要在游戏插件列表(默认按键是 Esc -> "插件" 或 "Interface" -> "AddOns")中找到 NDui 插件,并点击其 "设置" 或 "配置" 按钮(如果存在)。

2. 寻找姓名板 (Nameplate) 或血条 (Health Bar) 的设置选项

  • 在 NDui 的设置界面中,仔细查找与 "姓名板" (Nameplates)、"血条" (Health Bars)、"单位框体" (Unit Frames) 或 "外观" (Appearance) 相关的选项卡或菜单。
  • 关键点: 你需要找到可以 单独修改血条背景 的选项,而不是修改血条本身的颜色。

3. 修改背景颜色

  • 查找背景设置: 在姓名板或血条的设置区域,寻找类似 "背景颜色" (Background Color)、"边框颜色" (Border Color) 或者 "血条背景" (Bar Background) 的选项。
  • 选择黑色:
    • 如果是一个颜色选择器,选择纯黑色。通常颜色选择器会有一个 RGB (Red, Green, Blue) 值,对于黑色,它们通常都是 (0, 0, 0)。有时候可能还有一个 Alpha (透明度) 值,你可以根据需要调整透明度(0 为完全透明,1 为完全不透明)。
    • 有些插件可能提供预设的样式,看看是否有 "黑暗" (Dark) 或 "黑色" (Black) 的主题选项。
  • 确保血条颜色不变: 仔细检查,确保你修改的是“背景”或“边框”的颜色,而不是血条本身(表示生命值的那个条)的颜色。血条本身的颜色通常会根据你的生命值百分比、敌我关系等动态变化。

具体操作建议 (基于常见插件设置逻辑):

  1. 打开 NDui 设置: 输入 /ndui 或查找插件管理器中的选项。
  2. 导航到姓名板设置: 寻找类似 "Nameplates", "Unit Frames", "Appearance" 的标签页。
  3. 定位血条设置: 在姓名板设置中,找到关于 "Health Bar" 或 "Bars" 的部分。
  4. 寻找背景选项:
    • 可能会有一个 "Background" 或 "Bar Background" 的选项。
    • 旁边可能有一个颜色选择器。点击它。
    • 在颜色选择器中,将 RGB 值设置为 R:0, G:0, B:0。Alpha 值可以设置为 1(完全不透明)或者稍微低一点(例如 0.8)来让背景略微透明,这样可以看到角色模型。
    • 有些插件可能会有一个 "Use Class Colors" 或类似的选项来控制血条本身的颜色,确保这个选项是开启的,或者你手动设置的血条颜色是你想要的。
  5. 保存更改: 找到 "保存" (Save)、"应用" (Apply) 或 "确定" (OK) 按钮并点击。

如果 NDui 插件本身没有提供单独修改血条背景颜色的选项:

这确实是一个可能性。有些插件的自定义程度有限。在这种情况下,你可能需要:

  • 寻找其他姓名板插件: 像 Plater, KUI Nameplates, Threat Plates 等插件提供了非常丰富的自定义选项,通常可以让你精确控制血条背景、边框、文本等。你可以考虑更换一个更灵活的姓名板插件。
  • 查看 NDui 的配置文件: 有些插件允许直接编辑配置文件(通常是 .lua 文件),但这需要一定的技术知识,并且可能需要重启游戏或重载界面 (/reload)。

重要提示:

  • 插件版本: 确保你使用的是最新版本的 NDui 插件,因为旧版本可能功能不全或存在 Bug。
  • 时光服兼容性: 虽然你提到了时光服,但只要 NDui 插件是为相应版本的《魔兽世界》设计的,并且没有明显的兼容性问题,上述方法通常是通用的。
  • 界面重载: 在更改设置后,如果姓名板没有立即更新,尝试输入 /reload 命令来重新加载游戏界面。

请尝试按照上述步骤操作,如果在 NDui 的设置中找到了相关选项,应该就能实现你的需求。如果找不到,可能需要考虑其他插件。

thinking img
progress gif

Текст скопирован
Готово
Ошибка
×