0

以下代码假设在任何文本示例中将用户名更改为 Player:'[Player2]: Hi Player' 为 '[Player2]: Hi >Player<',其中 Player 为红色,>< 符号为黄色。问题是它没有检测到其他玩家说它,只是按班级简单地给他们上色,并在我说我的名字时发出警告,而应该反过来。

我知道可能存在全球泄漏,例如目前这是一个 beta 阶段的插件,我一直在努力重写功能以使其更好,但现在我正试图让一切都先运行。如果您可以简化名称检测并在不弄乱 WoW 中的链接的情况下对其进行更改,我会接受建议,我将在代码中添加一个注释行,以显示您的姓名以获得信用,并在主插件页面中显示。否则我只需要修复来找出它为什么不能按预期工作。

这是代码:

    local _PlayerName2 = CM2.StripSpecial(UnitName("player"), true)
    _PlayerName2 = _PlayerName2:lower()
    local _PlayerName, _ = UnitName("player")

    --Detect if the current character said their own name. Block Warnings.
    local throwWarn = true

    if ChatAuthor == curPlayer then
        --Player said something.
        throwWarn = false
        --CM2.Print("Disabled Warnings")
    end

    if text == nil then
        print("Text Nil, Check URL Detection Code")
    end

    --Color own name in your chat. Really only sender name because all other references will
    --be tied to the alert.     
    if throwWarn == false and text:find(" "..curPlayer.." ") ~= nil then
        text = CM2.far(text, curPlayer, CM2.ColorName(CM2_Nick[plainPlayerName][2], plainPlayerName))
    end
    if throwWarn == false and text:find(case_insensitive_pattern(plainPlayerName)) ~= nil then
        text = CM2.far(text, plainPlayerName, CM2.ColorName(CM2_Nick[plainPlayerName][2], plainPlayerName))
    end

    --Detect and alert when playername is spoken
    local pos = 0

    if throwWarn == true and text:find(" ".._PlayerName.." ") ~= nil then
        --Detect if the Original Player name was said.
        text = text:gsub(" ".._PlayerName.." ", " "..CHATMOD_COLOR["YELLOW"]..">"..CHATMOD_COLOR["RED"].._PlayerName..CHATMOD_COLOR["YELLOW"].."<\124r ")           
        UIErrorsFrame:AddMessage(text, red, green, blue, nil, UIERRORS_HOLD_TIME)
        PlaySound("FriendJoinGame")
    elseif throwWarn == true and text:find(" "..case_insensitive_pattern(plainPlayerName).." ") ~= nil then
        --Detect if the stripped down Player Name was said.
        text = text:gsub(" ".._PlayerName2.." ", " "..CHATMOD_COLOR["YELLOW"]..">"..CHATMOD_COLOR["RED"].._PlayerName2..CHATMOD_COLOR["YELLOW"].."<\124r ")         
        UIErrorsFrame:AddMessage(text, red, green, blue, nil, UIERRORS_HOLD_TIME)
        PlaySound("FriendJoinGame")
    end



    if text == nil then
        print("Text Nil, Check playername highlighter Code")
    end


    -- Color Nicks
    if CM2_Options["ColorNicks"] then
        -- Hold Original unmodified words for later use
        temp2 = text
        temp2 = CM2.StripSpecial(temp2)
        temp = CM2.StripSpecial(text)
        temp = string.gsub(temp, "%]%[", " ")
        temp = string.gsub(temp, "[^a-zA-Z0-9%s]", "")
        words = CM2.GetWords(temp)
        words2 = CM2.GetWords(temp:lower())

        for word = 1, #words do
            -- Cant be the player name or it locks up the client... Go figure...
            if words[word] ~= UnitName("player") and words[word] ~= plainPlayerName then
                --print(words[word]:lower())
                if CM2_Nick[words[word]:lower()] ~= nil then
                    --{level, class, guild, realm, name} Nick Layout. Name is the unfiltered name.
                    local newWord = CM2.ColorName(CM2_Nick[words[word]:lower()][2], words[word]:lower())

                    word2find = words[word]
                    pos = temp2:find(word2find) or temp:find(words2[word])

                    if newWord ~= nil then
                        --replace with find code.
                        text = CM2.far(text, word2find, newWord)
                    end
                end
            end
        end
    end   

功能CM2.far:

    function CM2.far(str, fstr, rstr)
    if (str and type(str) == "string") and (fstr and type(fstr) == "string") and (rstr and type(rstr) == "string") then
        --And space at the end so gfind will find till the end.
        --In case a match is there.
        str = str .. " "
        local pos = nil
        for x in str:gmatch("[^%:]"..case_insensitive_pattern(fstr).."[^%:]") do

            if pos ~= nil and pos ~= str:find("[^%:]"..case_insensitive_pattern(fstr).."[^%:]", pos+1) then
                str = str:sub(1, pos) .. rstr .. str:sub(pos + #fstr + 1)
                --print(str)
                pos = str:find("[^%:]"..case_insensitive_pattern(fstr).."[^%:]", pos+1)
            elseif pos == nil then
                pos = str:find("[^%:]"..case_insensitive_pattern(fstr).."[^%:]")
                str = str:sub(1, pos) .. rstr .. str:sub(pos + #fstr + 1)
                pos = str:find("[^%:]"..case_insensitive_pattern(fstr).."[^%:]", pos+1)
                --print(str)
            end
        end
        str = str:sub(1, #str - 1)
        return str
    end
end

功能 CM2.StripSpecial:

    function CM2.StripSpecial(msg, player)
    PlayerStripped = 0

    --Strips out all special characters such as Ö and the like.
    --Should only be used for being returned to a temp string unless replacement is required.
    if msg ~= nil and type(msg) == "string" then
        for x=1, #msg do
            local CharVal = string.byte(string.sub(msg,x,x+1), -1)
            --local StrTab = {}
            --for a=1, #msg do
              --  StrTab:Insert(
            --print("Debug: "..string.byte(string.sub(msg,x,x+1)))
            --print(CharVal)
            if CharVal ~= nil then
                if 146 <= CharVal and CharVal <= 150 then
                    msg = StringReplace(msg, x, "O")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 178 <= CharVal and CharVal <= 182 then
                    msg = StringReplace(msg, x, "o")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 128 <= CharVal and CharVal <= 134 then
                    msg = StringReplace(msg, x, "A")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 160 <= CharVal and CharVal <= 166 then
                    msg = StringReplace(msg, x, "a")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 136 <= CharVal and CharVal <= 139 then
                    msg = StringReplace(msg, x, "E")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 168 <= CharVal and CharVal <= 171 then
                    msg = StringReplace(msg, x, "e")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 153 <= CharVal and CharVal <= 156 then
                    msg = StringReplace(msg, x, "U")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 185 <= CharVal and CharVal <= 188 then
                    msg = StringReplace(msg, x, "u")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 140 <= CharVal and CharVal <= 143 then
                    msg = StringReplace(msg, x, "I")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 172 <= CharVal and CharVal <= 175 then
                    msg = StringReplace(msg, x, "i")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 135 == CharVal then
                    msg = StringReplace(msg, x, "C")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 167 == CharVal then
                    msg = StringReplace(msg, x, "c")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 144 == CharVal then
                    msg = StringReplace(msg, x, "D")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 176 == CharVal then
                    msg = StringReplace(msg, x, "o")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 152 == CharVal then
                    msg = StringReplace(msg, x, "O")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                elseif 184 == CharVal then
                    msg = StringReplace(msg, x, "o")
                    if player then
                        PlayerStripped = PlayerStripped + 1
                    end
                end
            end
        end
    end

    return msg
end

函数 CM2.GetWords:

    function CM2.GetWords(str)
    if type(str) == "string" then
        local results = {}

        for word in string.gmatch(str, "%S+", 9) do
            table.insert(results, word)
        end

        return results
    end
end

函数 case_insensitive_pattern:

    function case_insensitive_pattern(pattern)

  -- find an optional '%' (group 1) followed by any character (group 2)
  local p = pattern:gsub("(%%?)(.)", function(percent, letter)
    --print(percent, letter)
    if percent ~= "" or (not letter:match("%a")) then
      if letter ~= "-" then
          -- if the '%' matched, or `letter` is not a letter, return "as is"
          return percent .. letter
      elseif letter == "-" then
          return "%-"
      end
    else
        if letter == "[" then
          return "%["
        elseif letter == "]" then
          --print("hi")
          return "%]"
        end
      -- else, return a case-insensitive character class of the matched letter
      return string.format("[%s%s]", letter:lower(), letter:upper())
    end

  end)

  return p
end

功能 CM2.ColorName:

    function CM2.ColorName(str, word)
    --Using the class and word provided precolor it for chat.
    if str == "MONK" then
        word = "\124cff00ff96" .. CM2_Nick[word][5] .. "|r"
    elseif str == "DEATH KNIGHT" then
        word = "\124cffc41f3b" .. CM2_Nick[word][5] .. "|r"
    elseif str == "DRUID" then
        word = "\124cffff7d0a" .. CM2_Nick[word][5] .. "|r"
    elseif str == "HUNTER" then
        word = "\124cffabd473" .. CM2_Nick[word][5] .. "|r"
    elseif str == "MAGE" then
        word = "\124cff69ccf0" .. CM2_Nick[word][5] .. "|r"
    elseif str == "PALADIN" then
        word = "\124cfff58cba" .. CM2_Nick[word][5] .. "|r"
    elseif str == "PRIEST" then
        word = "\124cffffffff" .. CM2_Nick[word][5] .. "|r"
    elseif str == "ROGUE" then
        word = "\124cfffff569" .. CM2_Nick[word][5] .. "|r"
    elseif str == "SHAMAN" then
        word = "\124cff0070de" .. CM2_Nick[word][5] .. "|r"
    elseif str == "WARLOCK" then
        word = "\124cff9482c9" .. CM2_Nick[word][5] .. "|r"
    elseif str == "WARRIOR" then
        word = "\124cffc79c6e" .. CM2_Nick[word][5] .. "|r"
    end

    return word
end

编辑 1:设法修复了自我名称警告,但注意到在聊天中说您的完整匹配玩家名称没有被着色。我可以自己处理。我们还不能做出任何改变来修复其他玩家说玩家名字警告的问题。

4

0 回答 0