Каждому динамику чата назначается цвет при его создании в зависимости от его имени пользователя. Таким образом, каждый спикер не получит другого цвета, если он уйдет и присоединится к другой игре.
Есть несколько различных методов, с помощью которых вы можете получить цвет динамика по умолчанию.
Получение цвета по умолчанию
Сохрани это
Как только игрок присоединится, вы можете кэшировать его цвет, а затем позволить ему изменить его. Для этого метода вы должны убедиться, что вы не позволяете игроку изменять свой цвет заранее, иначе вы в конечном итоге сохраните неправильный цвет.
Этот фрагмент кода получит цвет по умолчанию и сохранит его, используя 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