Как изменить цвет игрока по умолчанию в чате

Я учился менять цвет чата и теги игрока, единственное, чего я хочу сейчас добиться, - это вернуть его к значениям по умолчанию.

Вот код (я включу только самые важные)

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)

person Philiero    schedule 13.06.2020    source источник


Ответы (1)


Каждому динамику чата назначается цвет при его создании в зависимости от его имени пользователя. Таким образом, каждый спикер не получит другого цвета, если он уйдет и присоединится к другой игре.

Есть несколько различных методов, с помощью которых вы можете получить цвет динамика по умолчанию.

Получение цвета по умолчанию

Сохрани это

Как только игрок присоединится, вы можете кэшировать его цвет, а затем позволить ему изменить его. Для этого метода вы должны убедиться, что вы не позволяете игроку изменять свой цвет заранее, иначе вы в конечном итоге сохраните неправильный цвет.

Этот фрагмент кода получит цвет по умолчанию и сохранит его, используя ComputeNameColor(player.Name) из chatService.

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)

Цвета чата состоят из значений BrickColor и Color3, но BrickColor.new("x").Color , используемое в словаре цветов Roblox для ссылки на эти BrickColor элементы, все равно преобразует их в Color3.

Позже вы можете снова получить цвет чата, просто позвонив player.DefaultChatColor.Value.

Восстановить это

Если вы не можете получить цвет из Color3Value, вы всегда можете сгенерировать цвет динамика по умолчанию так же, как это делает Roblox - вычисляя имя пользователя! Вы захотите позвонить GetNameColor(Speaker), чтобы получить цвет команды докладчика / цвет по умолчанию, или ComputeNameColor(player.Name), если вы хотите полностью игнорировать команды.

Код, который генерирует цвета по умолчанию, присутствует в game.Chat.DefaultChatModules.ExtraDataInitializer в строках 86-127 (где похоже, что этот код выполняется внутри из-за имен переменных), но вы можете клонировать его, если вы работаете внутри графического интерфейса или где-то еще:

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)

Надеюсь это поможет!

person ToxiBoi    schedule 25.06.2020