如何在聊天中改回玩家的默认颜色

How to change back the player's default color in chat

我一直在学习如何更改玩家的聊天颜色和标签,我现在唯一想实现的是将其更改回默认值

这是代码(我只包括重要的代码)

ceValue.Changed:Connect(function() 
    local player = game.Players:WaitForChild(ceValue.Value)
    local character = player.Character

    while character do
        if chatService ~= nil then
            local speaker = chatService:GetSpeaker(player.Name)

            repeat wait(1)
                speaker = chatService:GetSpeaker(player.Name)
            until speaker ~= nil            

            speaker:SetExtraData("NameColor", ceColor)
            speaker:SetExtraData("ChatColor", ceColor)

            if ceValue.Value == "" then
                for i, v in pairs(game.Players:GetChildren()) do
                    speaker = chatService:GetSpeaker(v.Name)

                    --///HERE'S WHERE I WANT TO CHANGE THE PLAYER'S CHAT COLOR///---
                end

                break
            end

            wait(0.5)
        end
    end
end)

每个聊天发言人在创建时都会根据其用户名分配一种颜色。这样,如果每个 Speaker 离开并加入另一个游戏,他们就不会得到不同的颜色。

有几种不同的方法可以检索扬声器的默认颜色。

获取默认颜色

保存

玩家加入后,您可以缓存他们的颜色,然后允许他们修改。对于此方法,您必须确保您不允许玩家事先修改他们的颜色 - 否则,您最终会保存错误的颜色。

此代码片段将获取它们的默认颜色并存储它,而不是使用 chatService.

中的 ComputeNameColor(player.Name)
local Players = game:GetService("Players")
 
Players.PlayerAdded:Connect(function(player)
    local color = ComputeNameColor(player.Name)
    
    local colorObj = Instance.new("Color3Value")
    colorObj.Name = "DefaultChatColor"
    colorObj.Value = color
    colorObj.Parent = player
end)

聊天颜色确实由 BrickColorColor3 值组成,但 Roblox 颜色词典中使用 BrickColor.new("x").Color 属性 来引用这些 BrickColor 项无论如何都会将它们转换为 Color3

稍后,您只需调用player.DefaultChatColor.Value即可再次检索聊天颜色。

重新生成它

如果您无法从 Color3Value 检索颜色,您始终可以像 Roblox 一样生成扬声器的默认颜色 - 对用户名执行数学运算!您需要致电 GetNameColor(Speaker) 以获得演讲者的 team/default 颜色,或者如果您想完全忽略团队则致电 ComputeNameColor(player.Name)

生成默认颜色的代码出现在第 86-127 行的 game.Chat.DefaultChatModules.ExtraDataInitializer 中(由于变量名称,此代码看起来像是 运行 内部),但您可以克隆如果您在 GUI 或其他地方工作:

local NAME_COLORS =
{
  Color3.new(253/255, 41/255, 67/255), -- BrickColor.new("Bright red").Color,
  Color3.new(1/255, 162/255, 255/255), -- BrickColor.new("Bright blue").Color,
  Color3.new(2/255, 184/255, 87/255), -- BrickColor.new("Earth green").Color,
  BrickColor.new("Bright violet").Color,
  BrickColor.new("Bright orange").Color,
  BrickColor.new("Bright yellow").Color,
  BrickColor.new("Light reddish violet").Color,
  BrickColor.new("Brick yellow").Color,
}
local function GetNameValue(pName)
  local value = 0
  for index = 1, #pName do
    local cValue = string.byte(string.sub(pName, index, index))
    local reverseIndex = #pName - index + 1
    if #pName%2 == 1 then
      reverseIndex = reverseIndex - 1
    end
    if reverseIndex%4 >= 2 then
      cValue = -cValue
    end
    value = value + cValue
  end
  return value
end
local color_offset = 0
local function ComputeNameColor(pName)
  return NAME_COLORS[((GetNameValue(pName) + color_offset) % #NAME_COLORS) + 1]
end
local function GetNameColor(speaker)
  local player = speaker:GetPlayer()
  if player then
    if player.Team ~= nil then
      return player.TeamColor.Color
    end
  end
  return ComputeNameColor(speaker.Name)
end

正在申请

在这种情况下应用新的或旧的,聊天颜色应该与您在代码中已经完成的相同:使用 speaker:setExtraData("(x)Color", oldColor).

“重新生成它”

ceValue.Changed:Connect(function() 
    local player = game.Players:WaitForChild(ceValue.Value)
    local character = player.Character

    while character do
        if chatService ~= nil then
            local speaker = chatService:GetSpeaker(player.Name)

            repeat wait(1)
                speaker = chatService:GetSpeaker(player.Name)
            until speaker ~= nil            

            speaker:SetExtraData("NameColor", ceColor)
            speaker:SetExtraData("ChatColor", ceColor)

            if ceValue.Value == "" then
                for i, v in pairs(game.Players:GetChildren()) do
                    speaker = chatService:GetSpeaker(v.Name)

                    defColor = GetNameColor(Speaker)
                    speaker:SetExtraData("NameColor", defColor)
                    speaker:SetExtraData("ChatColor", defColor)
                end

                break
            end

            wait(0.5)
        end
    end
end)

“存储它!”

ceValue.Changed:Connect(function() 
    local player = game.Players:WaitForChild(ceValue.Value)
    local character = player.Character

    while character do
        if chatService ~= nil then
            local speaker = chatService:GetSpeaker(player.Name)

            repeat wait(1)
                speaker = chatService:GetSpeaker(player.Name)
            until speaker ~= nil            

            speaker:SetExtraData("NameColor", ceColor)
            speaker:SetExtraData("ChatColor", ceColor)

            if ceValue.Value == "" then
                for i, v in pairs(game.Players:GetChildren()) do
                    speaker = chatService:GetSpeaker(v.Name)

                    local cachedCol = v:FindFirstChild("DefaultChatColor")
                    if cachedCol ~= nil then
                        --There's a cache found.
                        speaker:SetExtraData("NameColor",cachedCol.Value)
                        speaker:SetExtraData("ChatColor",cachedCol.Value)
                    end
                end

                break
            end

            wait(0.5)
        end
    end
end)

希望对您有所帮助!