Stary system czatu

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Hierarchia

System czatu dziedzictwa używa modelu klient-serwer.Komponenty modułu czatu po stronie serwera ChatChannel i ChatSpeaker są zarządzane przez ChatService na serwerze, podczas gdy klient jest odpowiedzialny za wpisanie i wyświetlanie wiadomości.Komunikacja między serwerem a klientami jest obsługiwana automatycznie za pomocą RemoteEvents .

Sama usługa silnika Chat jest podstawową jednostką przechowywania dla systemu czatu: gdy ładowana jest strona Roblox (w klientzie lub w Studio podczas uruchamiania lub grania), następujące komponenty są automatycznie wczytywane do usługi Chat, jeśli Chat.LoadDefaultChat jest prawdą.

  • Moduły czatu — Ta Folder jest kolekcją modułów, które są wymagane przez ChatServiceRunner .Całe zawartość tego folderu jest wymagana przez skrypt i jest używana do tworzenia niestandardowego zachowania na serwerze.
  • Moduły czatu klienta — Ten folder zawiera różne ModuleScripts wymagane przez Skrypt czatu .
    • Moduły komend — Zawiera moduły używane do implementacji poleceń czatu strony klienta.
    • MessageCreatorModule — Zawiera moduły używane do obsługi i formatowania wiadomości.
    • Konstancje czatu — Zawiera konstancje współdzielone przez serwer i klient.
    • Ustawienia czatu — przechowuje różne ustawienia do konfiguracji różnych aspektów okna czatu.
  • Lokalizacja czatu — Struktura danych przechowująca tłumaczenia tekstu.
  • ChatServiceRunner — Ta Script uruchamia komponent serwera czatu.Ogólnie rzecz biorąc, nie musi być modyfikowany, aby tworzyć niestandardowe zachowanie i funkcjonalność czatu.
  • BubbleChat — Wyświetla wiadomości czatu użytkownika powyżej ich awatara w grze (jeśli włączone).
  • ChatScript — Ta LocalScript uruchamia komponent klienta czatu.Podobnie jak ChatServiceRunner, nie powinno to wymagać modyfikacji, aby dostosować czat.Kiedy gra się uruchamia, zostaje to automatycznie sklonowane do StarterPlayerScripts .

Dostosuj system czatu

Aby zmodyfikować lub dostosować starszy system czatu, musisz najpierw utworzyć kopię hierarchii powyżej.

  1. W oknie Eksploratora znajdź TextChatService .Następnie, w oknie Właściwości, ustaw właściwość ChatVersion na LegacyChatService .

  2. Wykonaj doświadczenie za pomocą przycisku Graj (F5).

  3. Wybierz i skopiuj ( CtrlC lub C ) obiekty, które zostaną dodane do Chat .

  4. Zatrzymaj doświadczenie za pomocą przycisku Zatrzymaj ( ShiftF5 ).

  5. Wybierz Chat i wklej do ( CtrlShiftV lub ShiftV ) skopiowane obiekty (muszą być przypisane do Chat jako były podczas uruchamiania doświadczenia).

  6. Upewnij się, że Chat.LoadDefaultChat jest włączone.

Przepływ pracy czatu

Zanim stworzysz moduły do dostosowania czatu, ważne jest zrozumienie przepływu pracy, przez który przechodzi wiadomość czatu.Wraz z wysyłaniem wiadomości tekstowych istnieje wiele poleceń zbudowanych w systemie czatu, więc każda wiadomość musi zostać sprawdzona, aby zobaczyć, czy musi być interpretowana jako polecenie lub tylko wiadomość tekstowa.Nawet wiadomości tekstowe mogą być modyfikowane i filtrowane w procesie.

Po tym, jak użytkownik skupi się na wejściu czatu i wprowadzi znak, kilka kontroli jest natychmiast wykonywanych na klientzie.Jeśli znak jest Esc, pudełko wprowadzenia zamyka się, a nie są podejmowane żadne działania.Jeśli znak jest czymkolwiek innym niż Enter, tekst przechodzi przez procesory komendy W toku.Służą one do oceny tekstu, aby sprawdzić, czy należy podjąć jakieś działanie.Na przykład, gdy użytkownik zaczyna szeptać za pomocą polecenia /whisper, jak tylko nazwa użytkownika została wprowadzona po poleceniu, pasek wpisu zmienia się, aby wskazać, że użytkownik wchodzi teraz na kanał szeptu.

Na stronie klienta czatu istnieją dwa rodzaje procesorów: w toku i zakończone.Pierwszy ocenia się po każdym wpisaniu znaku, podczas gdy drugi ocenia się tylko wtedy, gdy użytkownik skończył pisać i dotarł do Enter.

Gdy użytkownik skończy pisanie i naciśnie Enter tekst, jego wpis zostanie wysłany do kilku kolejnych procesorów poleceń.Jeśli polecenie W toku wykonało niestandardowy stan czatu, czat sprawdza stan, aby zobaczyć, czy ostateczna komenda powinna zostać wykonana i czy wiadomość powinna kontynuować.Jeśli wiadomość jest dozwolona do kontynuacji, tekst jest wysyłany za pośrednictwem innego zestawu procesorów o nazwie Zakończone procesory.Jeśli którykolwiek z tych procesorów zwraca prawdę, wiadomość przestaje być wysyłana.W przeciwnym razie wiadomość jest wysyłana na serwer.

Gdy wiadomość dotrze do serwera, przechodzi przez kolejną serię procesorów komend.Tak jak procesory Zakończone na klientzie, jeśli którykolwiek z tych procesorów zwraca prawdę, wiadomość przestaje się wykonywać.W przeciwnym razie wiadomość przechodzi przez szereg filtrów (w tym domyślny filtr czatu Roblox).Gdy wszystko to zostanie zrobione, wiadomość jest wysyłana do wszystkich kanałów i odpowiednich mówców.

Moduły serwera

Moduły umieszczone w ChatModule mogą być wykorzystywane do różnych celów.Te moduły mogą być używane do zarządzania kanałami czatu i mówcami, dodawania funkcji filtrowania i poleceń, uruchamiania chatbotów lub czegokolwiek innego, co należy obsługiwać na serwerze.Aby wejść w interakcję z systemem czatu, każdy moduł otrzymuje obiekt ChatService.

Kiedy uruchamia się ChatServiceRunner , wymaga każdego modułu w środku ChatModule .Oczekuje, że każdy moduł zwróci funkcję, gdy następnie wezwie każdy z modułów w kolejności, przekazując obiektowi ChatService swoją funkcję.Niezależnie od tego, co ma zamiar zrobić moduł (uruchomienie bota, dodanie funkcji filtrowania itp.), musi przestrzegać tej formy, aby działać.

Próbny modułowy framework

local function Run(ChatService)
-- Kod trafia tutaj
end
return Run

Dodaj kanały

Jedną z najprostszych rzeczy, jakie może zrobić moduł czatu jest zarządzanie kanałami .Obiekty kanału mogą być tworzone za pomocą metody AddChannel() z ChatService.Zauważ, że obiekt kanału powinien być używany tylko wtedy, gdy wzywane są członkowie tego kanału (takie jak jego właściwości i funkcje).Mówiąc o kanałach z kontekstu ChatService lub ChatSpeakers, nazwa kanału jest używana do jego odniesienia.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
end
return Run

Podstawowa konfiguracja kanału

Kanały mają kilka właściwości, które można wykorzystać do lekkiej modyfikacji.Na przykład, ten moduł tworzy kanał i ustawia wiadomość powitalną oraz powoduje, że użytkownicy automatycznie dołączają do kanału, gdy wchodzą do doświadczenia.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- Ustaw wiadomość, która jest wyświetlana, gdy użytkownik dołącza do kanału
myChannel.WelcomeMessage = "Welcome to my channel!"
-- Spowoduje, że gracze automatycznie dołączą do kanału, gdy wejdą do gry
myChannel.AutoJoin = true
end
return Run

Wydarzenia kanału

Kanały mają wiele wydarzeń, do których można się subskrybować.Wydarzenia te występują, gdy wiadomość czatu zostanie opublikowana na kanale, gdy mówca wychodzi lub dołącza lub gdy mówca jest wyciszony lub odblokowany.Na przykład, ten moduł utworzy kanał o nazwie MyChannel.Za każdym razem, gdy głośnik dołącza lub opuszcza kanał, wysyłany jest wiadomość systemową do wszystkich głośników w kanale informując ich o wydarzeniu.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
local function onSpeakerJoined(speakerName)
myChannel:SendSystemMessage(speakerName .. " has joined the channel.")
end
local function onSpeakerLeft(speakerName)
myChannel:SendSystemMessage(speakerName .. " has left the channel.")
end
myChannel.SpeakerJoined:Connect(onSpeakerJoined)
myChannel.SpeakerLeft:Connect(onSpeakerLeft)
end
return Run

Funkcje poleceń

Kolejną potężną rzeczą, którą ChatModule może zrobić, są komendy czatu .Gdy wiadomość zostanie wysłana na serwer, czat wyśle wiadomość za pośrednictwem każdej funkcji polecenia, która została zarejestrowana w ChatService i odpowiednim kanale.Funkcje te są wysyłane do głośnik, wiadomości i kanału, do którego wysyłana jest wiadomość.Funkcja może wykonać dowolną akcję, której potrzebuje, a następnie zwrócić prawdę lub fałsz.Jeśli funkcja zwraca prawdę, wiadomość przestaje być przetwarzana przez system czatu.Nie zostanie wysłany do żadnych kolejnych funkcji poleceń ani nie zostanie wyświetlony w oknie czatu.Jeśli funkcja zwraca fałsz, wiadomość kontynuuje się przez wszystkie inne funkcje komendy.Jeśli żadna z funkcji polecenia nie zwraca prawdy, wiadomość zostanie wysłana przez filtry i następnie wyświetlona.

Funkcje poleceń są często używane do wdrażania poleceń administratora, które są poleceniami tekstowymi, które niektórzy użytkownicy mogą używać do manipulowania stanem doświadczenia za pomocą określonego tekstu powiedzianego w czacie.

W tym przykładzie użyto modułu czatu , aby utworzyć Part, jeśli użytkownik wprowadzi /part w czacie.Zauważ, że ta funkcja zwraca prawdę, jeśli utworzono część, która zatrzyma wysyłanie wiadomości i żadna wiadomość nie zostanie wyświetlona.Jeśli część nie zostanie utworzona, ta funkcja musi zwrócić fałsz, aby wiadomość mogła nadal działać poprzez system.


local Workspace = game:GetService("Workspace")
local function Run(ChatService)
local function createPart(speakerName, message, channelName)
if string.sub(message, 1, 5) == "/part" then
local newPart = Instance.new("Part")
newPart.Parent = Workspace
return true
end
return false
end
ChatService:RegisterProcessCommandsFunction("createPart", createPart)
end
return Run

Zarówno Kanały czatu i ChatService sam mogą mieć komendy czatu. Procesory komendy ChatService będą uruchamiane za każdą wysłaną wiadomość, która zostanie wysłana na serwer, podczas gdy komendy kanałów będą uruchamiane tylko wtedy, gdy wiadomość została wysłana do kanału, do którego jest zarejestrowana komenda.

Funkcje filtrowania

Wiadomości, które nie są zatrzymywane przez funkcję komendy przejdą przez wszystkie funkcje filtrowania, które są zarejestrowane w ChatService i odpowiednich kanałach.Każda funkcja filtra otrzymuje nazwę głośnika, obiekt wiadomości i nazwę kanału.Wszelkie zmiany dokonane w obiekcie wiadomości będą trwać, a każda następna funkcja filtrowania zobaczy zaktualizowaną wiadomość.Zauważ, że funkcje filtrowania nie muszą zwracać wartości.

W tym przykładzie zarejestrowano prostą funkcję filtrowania, aby każda wiadomość pojawiała się w małej literze.


local function Run(ChatService)
local function makeLowercase(sender, messageObject, channelName)
messageObject.Message = string.lower(messageObject.Message)
end
ChatService:RegisterFilterMessageFunction("makeLowercase", makeLowercase)
end
return Run

Moduły klienta

Moduły umieszczone w modułach czatu klienta mogą być używane do tworzenia niestandardowego zachowania dla klientów.Te moduły są podzielone na dwa różne foldery: moduły komendy i moduły twórcy wiadomości.

Moduły komend

Moduły komendowe działają bardzo podobnie do modułów na serwerze, które rejestrują funkcje komendowe.Te moduły określają funkcje, które zostaną uruchomione po wpisaniu tekstu przez użytkownika.Tekst ten może być odczytany, a polecenie może albo przekazać wiadomość do serwera, albo zatrzymać postęp wiadomości.Komendy, które są oceniane pod koniec wiadomości, są oznaczane COMPLETED_MESSAGE_PROCESSOR, podczas gdy komendy, które są oceniane po każdym znaku, są oznaczane IN_PROGRESS_MESSAGE_PROCESSOR.

W obu typach poleceń moduł musi zwrócić słownik, który mówi, jaki typ procesora powinna używać polecenie i jaką funkcję należy wykonać, gdy procesor jest wzywany.Na przykład procesor wiadomości zakończony powinien przyjąć formę:


local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Zauważ, że enumeracja jest zdefiniowana w Util w środku katalogu CommandModule .

Zrealizowane komendy wiadomości

Ukończone komendy wiadomości są oceniane, gdy użytkownik skończył pisać i dotarł do Enter.Funkcja procesora przekazuje obiekt Wiadomość czatu, ChatWindow klienta oraz tabelę Ustawienia czatu.Jeśli funkcja zwraca prawdę, wiadomość przestaje być przetwarzana i nie zostanie wysłana na serwer.W przeciwnym razie zostanie wysłany do wszystkich innych procesorów i ostatecznie do serwera, jeśli żaden z pozostałych procesorów go nie zatrzyma.

Na przykład poniższy procesor usunie najstarszą wiadomość w obecnym kanale, jeśli użytkownik wprowadzi komendę /last.


local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
if string.sub(message, 1, 5) == "/last" then
local currentChannel = ChatWindow:GetCurrentChannel()
if currentChannel then
currentChannel:RemoveLastMessageFromChannel()
end
return true
end
return false
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Komendy w toku

Bieżące polecenia są oceniane za każdym razem, gdy użytkownik wpisuje znak w pole czatu.Na przykład następujący kod odtwarza dźwięk po każdym naciśnięciu klawiszu, aby brzmiał, jakby użytkownik pisał na maszynie do pisania:


local util = require(script.Parent:WaitForChild("Util"))
local keyEffect = Instance.new("Sound")
keyEffect.SoundId = "rbxassetid://12221976"
keyEffect.Parent = script
function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
keyEffect:Play()
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Komendy w toku są często używane do tworzenia niestandardowego stanu dla czatu, aby wysyłać wiadomości do konkretnych użytkowników zamiast tylko obecnego kanału.Na przykład systemy Whisper i Team Chat sprawdzają, czy użytkownik wpisał /whisper lub /team odpowiednio i wysyłają skończoną wiadomość tylko do odpowiednich użytkowników.

Oczekuje się, że niestandardowy stan będzie tablicą z następującymi funkcjami:

  • TextUpdated() — Wzywany, gdy zmienia się tekst w polu wprowadzenia.
  • GetMessage() — Wezwany po tym, jak użytkownik zakończył wpisywanie wiadomości i trafi na Enter. Ta funkcja ma zwrócić ciąg.
  • ProcessCompletedMessage() — Wezwany, gdy wiadomość jest przetwarzana.Procesor stanu niestandardowego zawsze będzie wystrzeliwany przed ukończonymi procesorami wiadomości.Podobnie jak inne procesory, ta funkcja powinna zwrócić prawdę, jeśli wiadomość powinna przestać być wysyłana, w przeciwnym razie powinna zwrócić fałsz.
  • Destroy() — Wezwane po wysłaniu wiadomości. Powinno być używane do oczyszczenia wszystkiego, co zostało skonfigurowane przez niestandardowy stan.

Aby korzystać z niestandardowego stanu, funkcja ProcessMessage() modułu komendy musi zwrócić stan.Podstawowy niestandardowy stan przyjmie następną formę:


local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Jedną z głównych zalet korzystania z niestandardowego stanu jest to, że moduł może edytować pasek czatu i jego zawartość tekstu, gdy użytkownik pisze zarówno pod względem funkcji, jak i wyglądu, a następnie łatwo go zresetować później (po wysłaniu wiadomości niestandardowy stan jest automatycznie usuwany i wszystko jest resetowane z powrotem do normy).Na przykład ten kod tworzy niestandardowy stan, który pozwala wyświetlać tylko 20 znaków w polu tekstowym na raz.Jeśli użytkownik nadal pisze, znaki na początku ciągu są tymczasowo usuwane.Gdy użytkownik wysyła wiadomość, wszystkie usunięte znaki zostają dodane z powrotem do wiadomości.


local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Jak wspomniano wcześniej, po wysłaniu wiadomości usunięto dowolny niestandardowy stan i przywrócono czat do normy.Jeśli konieczne jest zresetowanie niestandardowego stanu przed wysłaniem wiadomość, stan można zresetować za pomocą ChatBar:ResetCustomState().Zauważ, że to usunie również pole tekstowe z paska czatu.

Moduły twórców wiadomości

Innym typem modułu, który można używać w komponentzie klienta, jest moduł Twórca wiadomości .Ten typ modułu jest używany do tworzenia elementów interfejsu użytkownika w oknie czatu, aby wyświetlić wiadomość.Każdy typ twórcy wiadomości definiuje nowy wpisywaćwiadomości, więc różne wiadomości mogą być tworzone z różnym formatowaniem.Ponadto elementy interfejsu można dodać do wyświetlania wiadomości w ten sposób, co pozwala na dodawanie obrazów, przycisków i więcej.

Te moduły wymagają konfiguracji w kilku różnych lokalizacjach.Dla każdego wpisywaćwiadomości musi istnieć ModuleScript wewnątrz MessageCreatorModules .Ponadto Chatს ModuleScript musi zostać edytowany, aby uwzględnić nowy wpisywaćwiadomości.Na koniec, moduły są używane tylko wtedy, gdy komponent serwera czatu tworzy nową wiadomość z danym wpisywaćwiadomości.

Poniższy przykład przejdzie przez tworzenie botu, który mówi czas co 5 sekund, a wysyłana wiadomość otrzymuje czerwony tłok.

Aby rozpoczynać, Chatს ModuleScript musi dodać pole dla nowego typu wiadomość.


-- Statystyki czatu
local module = {}
--[[ typy wiadomości ]]
module.MessageTypeDefault = "Message"
module.MessageTypeSystem = "System"
module.MessageTypeMeCommand = "MeCommand"
module.MessageTypeWelcome = "Welcome"
module.MessageTypeSetCore = "SetCore"
module.MessageTypeWhisper = "Whisper"
module.MessageTypeTime = "Time"
module.MajorVersion = 0
module.MinorVersion = 2
return module

Sam bot jest tworzony w nowym ChatModule na serwerze.Zauważ, że funkcja filtra jest używana do dodania nowego typu wiadomości do wiadomości, które wysyła bot.


-- Nowe ModuleScript, które należy umieścić w ChatModules
local Chat = game:GetService("Chat")
local ReplicatedModules = Chat:WaitForChild("ClientChatModules")
local ChatConstants = require(ReplicatedModules:WaitForChild("ChatConstants"))
local function Run(ChatService)
local timeBot = ChatService:AddSpeaker("TimeBot")
timeBot:JoinChannel("All")
local function addMessageType(speaker, messageObject, channelName)
if speaker == "TimeBot" then
messageObject.MessageType = ChatConstants.MessageTypeTime
end
end
ChatService:RegisterFilterMessageFunction("TimeBotFilter", addMessageType)
task.spawn(function()
while task.wait(5) do
timeBot:SayMessage("The current time is: " .. os.time(), "All", {})
end
end)
end
return Run

Na koniec musi zostać stworzony moduł twórcy wiadomości.Ten moduł musi zwrócić słownik z dwoma elementami: typ wiadomość, indeksowany za pomocą KEY_MESSAGE_TYPE , i funkcję do wezwania, gdy tworzone są elementy interfejsu GUI wiadomości, indeksowane za pomocą KEY_CREATOR_FUNCTION .

Funkcja przechowywana przez KEY_CREATOR_FUNCTION musi zwrócić słownik z kilkoma komponentami.Po pierwsze, musi zawierać Frame i TextLabel, które zostaną wyświetlone w oknie czatu.Można je utworzyć za pomocą funkcji util:CreateBaseMessage().Słownik musi również zawierać funkcję, która zostanie uruchomiona, jeśli tekst wiadomości zostanie zaktualizowany.Kiedy wiadomości pojawiają się po raz pierwszy w klientzie, mają pusty tekst zastępczy, gdy wiadomość jest przetwarzana i filtrowana, więc obiekty wiadomości takie jak ten muszą radzić sobie z tym, co się stanie, gdy otrzymają wezwanie do aktualizacji.Następnie słownik musi zawierać funkcję określającą wysokość ramy.Funkcja ta często wzywa funkcję util:GetMessageHeight().Wreszcie słownik musi zawierać kilka funkcji, które określają, jak elementy powinny zniknąć, gdy okno zniknie (funkcja użytkowa do tego jest util:CreateFadeFunctions() ).


-- nowy ModuleScript, który ma być włączony do MessageCreatorModules
local messageCreatorModules = script.Parent
local util = require(messageCreatorModules:WaitForChild("Util"))
local clientChatModules = messageCreatorModules.Parent
local ChatSettings = require(clientChatModules:WaitForChild("ChatSettings"))
local ChatConstants = require(clientChatModules:WaitForChild("ChatConstants"))
local function CreateMessageLabel(messageData, channelName)
-- Stwórz obiekty interfejsu użytkownika dla ramki i etykiety tekstowej, aby utrzymać wiadomość
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- Zmień tło ramki na czerwone
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- Ręczne aktualizowanie tekstu wiadomości zastępczej
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- Użyj funkcji util, aby określić wysokość ramy
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- Twórz funkcje zanikania, które są wywoływane, gdy okno czatu zanika
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- Powrót słownika, który określa etykietę wiadomości
return {
[util.KEY_BASE_FRAME] = BaseFrame,
[util.KEY_BASE_MESSAGE] = BaseMessage,
[util.KEY_UPDATE_TEXT_FUNC] = UpdateTextFunction,
[util.KEY_GET_HEIGHT] = GetHeightFunction,
[util.KEY_FADE_IN] = FadeInFunction,
[util.KEY_FADE_OUT] = FadeOutFunction,
[util.KEY_UPDATE_ANIMATION] = UpdateAnimFunction
}
end
return {
[util.KEY_MESSAGE_TYPE] = ChatConstants.MessageTypeTime,
[util.KEY_CREATOR_FUNCTION] = CreateMessageLabel
}