Eski sohbet sistemi

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Hiyerarşi

Miras sohbet sistemi istemci-sunucu modelini kullanır.Sunucu tarafı sohbet modül bileşenleri ChatChannel ve ChatSpeaker yönetimi, sunucuda istemci tarafından giriş ve mesajların görüntülenmesinden sorumluken, müşteri mesajların girişinden ve görüntülenmesinden sorumludur.Sunucu ve istemciler arasındaki iletişim otomatik olarak RemoteEvents kullanılarak yönetilir.

motor hizmetinin kendisi sohbet sistemi için gerekli depolama birimi: bir Roblox yeri yüklendiğinde (istemci veya çalışırken veya oynarken Studio'da), aşağıdaki bileşenler otomatik olarak servise yüklenir, eğer doğruysa.

  • Sohbet Modülleri — Bu Folder , Sohbet Hizmet Yürütücüsü tarafından gerekli olan modül koleksiyonudur.Bu klasörün tüm içeriği, senaryo tarafından gerekli ve sunucuda özel davranış oluşturmak için kullanılır.
  • Müşteri Sohbet Modülleri — Bu klasör, ChatScript tarafından gerekli olan çeşitli içerir.
    • Komut Modülleri — Müşteri tarafı sohbet komutlarını uygulamak için kullanılan modüller içerir.
    • Mesaj Oluşturucu Modülleri — Mesajları işlemek ve biçimlendirmek için kullanılan modüller içerir.
    • SohbetStandartları — Sunucu ve istemci tarafından paylaşılan sabitleri içerir.
    • Sohbet Ayarları — Farklı Sohbet Penceresi yönlerini yapılandırmak için çeşitli ayarlar depolar.
  • Sohbet Yerelleştirme — Metin çevirilerini depolayan veri yapısı.
  • ChatServiceRunner — Bu Script sohbetin sunucu bileşenini çalıştırır.Genel olarak, özel sohbet davranışı ve işlevselliği oluşturmak için değiştirilmesi gerekmez.
  • BubbleChat — Oyun avatarlarının üzerinde kullanıcı sohbet mesajlarını görüntüler (eğer etkinleştirilmişse).
  • Sohbet Kodu — Bu LocalScript sohbetin kliant bileşenini çalıştırır.ChatServiceRunner gibi, sohbeti özelleştirmek için modifiye edilmesi gerekmez.Oyun çalıştığında, bunlar otomatik olarak StarterPlayerScripts 'ye klonlanır.

Sohbet sistemini modifiye et

Miras sohbet sistemini değiştirmek veya özelleştirmek için, önce yukarıdaki hiyerarşinin bir kopyasını yapmalısınız.

  1. Kâşif penceresinde, TextChatService 'yi bulun.Sonra, Özellikler penceresinde, Sohbet Sürümü özelliğini LegacyChatService 'e ayarlayın.

  2. Deneyimi Oyna düğmesini kullanarak çalıştırın (F5).

  3. Seç ve kopyala ( CtrlC veya C ) Chat 'e eklenen nesneleri seç ve kopyala.

  4. Deneyimi Durdur düğmesini kullanarak durdur (ShiftF5).

  5. Seç ve kopyalanmış nesneleri yapıştır ( veya ) kopyalanmış nesneleri (deneyim çalışırken ebeveyn olmaları gerekir).

  6. Chat.LoadDefaultChat etkin olduğundan emin olun.

Sohbet iş akışı

Sohbeti özelleştirmek için modüller oluşturmadan önce, bir sohbet mesajının geçtiği iş akışını anlamak önemlidir.Metin mesajları göndermekle birlikte, sohbet sistemine yerleştirilen çeşitli komutlar var, bu nedenle her mesajın bir komut veya sadece bir metin mesajı olarak yorumlanması gereip geremediğini kontrol etmek gerekiyor.Metin mesajları bile süreçte değiştirilebilir ve filtrelenebilir.

Bir kullanıcı sohbet girişine odaklanır ve bir karakter girerse, istemci üzerinde hemen birkaç kontrol yapılır.Karakter Esc ise, giriş kutusu kapanır ve herhangi bir eylem yapılmaz.Karakter Enter dışında herhangi bir şeyse, metin İlerlemede Olanlar komut işlemcilerinden geçer.Bunlar, herhangi bir eyleme ihtiyaç olup olmadığını görmek için metni değerlendirmek için kullanılır.Örneğin, bir kullanıcı /whisper komutuyla fısıldamaya başladığında, komutun ardından bir kullanıcı adı girildiğinde, giriş kutusu değişir ve kullanıcının şimdi bir fısıldama kanalına girdiğini belirtmek için değişir.

Sohbetin müşteri tarafında, iki tür işlemci bulunur: Devam ediyor ve Tamamlandı.İlki, her karakter yazıldıktan sonra değerlendirilir, ancak ikincisi sadece kullanıcı yazmayı bitirdiğinde ve Enter 'e ulaştığında değerlendirilir.

Kullanıcı yazmayı bitirdiğinde ve Enter metni vurduğunda, girişleri birkaç daha fazla komut işlemcisi aracılığıyla gönderilir.Bir İlerlemede çoklu komut bir özel sohbet durumu oluşturduysa, sohbet son bir komutun yürütülmesi ve mesajın devam etmesi gereip geremediğini görmek için durumu kontrol eder.Mesaj devam etmesine izin veriliyorsa, metin Tamamlandı işlemler olarak adlandırılan başka bir dizi işlemci aracılığıyla gönderilir.Bu işlemcilerden herhangi biri true döndürürse, mesaj gönderilmez.Aksi takdirde, mesaj sunucuya gönderilir.

Mesaj sunucuya ulaştıktan sonra, başka bir dizi komut işlemcisinden geçer.Müşterideki Tamamlandı işlemciler gibi, bu işlemcilerden herhangi biri gerçek dönerse, mesajın çalışması durur.Aksi takdirde mesaj bir dizi filtreden geçer (varsayılan Roblox sohbet filtresi dahil).Bütün bunlar yapıldıktan sonra mesaj tüm kanallara ve uygun konuşmacılara gönderilir.

Sunucu modülleri

SohbetModülleri içine yerleştirilen modüller çeşitli amaçlar için kullanılabilir.Bu modüller, sohbet kanallarını ve konuşmacıları yönetmek, filtre ve komut işlevleri eklemek, sohbet botlarını çalıştırmak veya sunucuda ele alınması gereken başka her şey için kullanılabilir.Sohbet sistemiyle etkileşim kurmak için, her modül bir ChatService nesnesine geçer.

ChatServiceRunner başladığında, ChatModuleler içindeki her modül gerekir.Her modülün bir işlev döndürmesini bekler, ardından her modülü birbirine çevirerek çağırır ve her modülün içine ChatService nesnesini geçirir.Modülün yapmak istediği şey ne olursa olsun (bot çalıştırmak, bir filtre işlevi eklemek vb.), çalışabilmesi için bu formu takip etmesi gerekir.

Örnek Modül Framework'ü

local function Run(ChatService)
-- Kod buraya gider
end
return Run

Kanalları ekle

Bir ChatModülü nin yapabileceği en basit şeylerden biri, kanalları yönetmektir .Kanal nesneleri ChatService 'in AddChannel() yöntemi ile oluşturulabilir.Kanal nesnesinin yalnızca bu kanalın üyelerini çağırırken kullanılması gerektiğini unutmayın (örneğin özellikleri ve işlevleri).ChatService veya ChatSpeakers contextinden kanallara referans verirken, kanalın adı referans olarak kullanılır.


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

Temel kanal yapılandırması

Kanalların biraz değiştirilmesi için kullanılabilecek birkaç özelliği vardır.Örneğin, bu modül bir kanal oluşturur ve Hoşgeldin Mesajını ayarlar ve kullanıcıların deneyime girdiklerinde otomatik olarak kanala katılmasına neden olur.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- Bir kullanıcı kanala katıldığında gösterilen mesajı ayarlayın
myChannel.WelcomeMessage = "Welcome to my channel!"
-- Oyuncuların oyuna girdiklerinde kanala otomatik olarak katılmasına neden olur
myChannel.AutoJoin = true
end
return Run

Kanal olayları

Kanalların abone olunabilecek birçok etkinliği vardır.Bu olaylar, bir Sohbet Mesajı kanala yayınlandığında, bir Sohbet Konuşmacısı ayrıldığında veya katıldığında veya bir Konuşmacı susturulduğunda veya susturulmadığında ateşlenir.Örneğin, bu modül, adı MyChannel olan bir kanal oluşturacaktır.Bir konuşmacı kanala katılır veya kanaldan ayrılır her seferinde, bir sistem mesajı tüm konuşmacılara kanaldaki olayı bildirerek gönderilecektir.


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

Komut fonksiyonları

ChatModülleri yapabileceği diğer güçlü şeyler sohbet komutları dır.Bir mesaj sunucuya gönderildiğinde, sohbet ChatService ve ilgili kanala kaydedilen her bir komut işlevi aracılığıyla mesajı gönderecektir.Bu işlevler, mesajın gönderildiği hoparlör, mesaj ve kanala gönderilir.İşlev, ihtiyaç duyduğu herhangi bir eylemi yapabilir ve ardından doğru veya yanlış döndürebilir.Eğer işlev doğru dönerse, mesaj sohbet sistemi tarafından işlenmeyi bırakır.Hiçbir komut işlevine gönderilmeyecek veya sohbet penceresinde görüntülenmeyecek.Eğer işlev false dönerse, mesaj diğer tüm komut işlevleri aracılığıyla devam eder.Komut işlevlerinden hiçbiri gerçek dönmezse, mesaj daha sonra filtreler aracılığıyla gönderilecek ve ardından görüntülenecektir.

Komut işlevleri genellikle Yönetici Komutları uygulanması için kullanılır, ki bunlar, deneyim durumunu sohbette belirtilen belirli metinler aracılığıyla manipüle etmek için belirli kullanıcıların kullanabileceği metin komutlarıdır.

Bu örnekte, bir kullanıcı sohbette ChatModülü yazarsa bir Part oluşturmak için kullanılan bir /part.Bu işlevin, mesajın devam etmesini durduracak bir parça oluşturulduğunda doğru döndürdüğünü ve hiçbir mesajın görüntülenmediğini unutmayın.Bir parça oluşturulmazsa, bu işlevin geri dönmesi gerekir false, böylece mesaj sistem aracılığıyla çalışmaya devam edebilir.


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

Hem Sohbet Kanalları hem de Sohbet Hizmeti kendisi sohbet komutlarına sahip olabilir. ChatService komut işlemcileri, sunucuya gönderilen her mesaja çalışacak, ancak kanal komutları yalnızca komutun kayıtlı olduğu kanala gönderildiğinde çalışacaktır.

Filtre işlevleri

Bir Komut İşlevi tarafından durdurulmayan mesajlar, ChatService ve ilgili kanallara kaydedilen tüm filtre işlevlerinden geçecektir.Her filtre işlevi hoparlör, mesaj nesnesi ve kanal adı geçer.Mesaj nesnesine yapılan herhangi bir değişiklik kalıcı olacak ve her bir sonraki filtre işlevi güncellenmiş mesajı görecek.Filtre işlevlerinin bir değer dönüştürmesi gerekmediğini unutmayın.

Bu örnekte, her mesajın küçük harfli görünmesi için basit bir filtre işlevi kaydedilir.


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

Müşteri modülleri

İstemciChatModülleri içine yerleştirilen modüller, müşteriler için özel davranış oluşturmak için kullanılabilir.Bu modüller iki farklı klasöre bölünür: Komut Modülleri ve Mesaj Yaratıcı Modülleri.

Komut modülleri

Komut Modülleri sunucudaki Komut Fonksiyonlarını kaydeden modüllere çok benzer şekilde çalışır.Bu modüller, kullanıcı metne girdikten sonra ateşlenecek işlevleri tanımlar.Bu metin okunabilir ve komut, mesajı sunucuya iletebilir veya mesajın ilerlemesini durdurabilir.Mesajın sonunda değerlendirilen komutlar COMPLETED_MESSAGE_PROCESSOR ile etiketlenirken, her karakterden sonra değerlendirilen komutlar IN_PROGRESS_MESSAGE_PROCESSOR ile etiketlenir.

Her iki komut türünde, modül, komutun hangi işlemci türünü kullanması ve işlemci çağrıldığında hangi işlevin yürütülmesi gerektiğini söyleyen bir sözlük döndürmelidir.Örneğin, bir bitirilmiş mesaj işlemcisi formu almalıdır:


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
}

Not that the KEY_COMMAND_PROCESSOR_TYPE enum is defined in the KullanıcıModülleri ModuleScript içindeki KomutModülleri klasöründe.

Tamamlanmış mesaj komutları

Tamamlanmış Mesaj Komutları , kullanıcı yazmayı bitirdiğinde ve Enter 'a vurduğunda değerlendirilir.İşlemcinin işlevi, ChatMessage nesnesini, müşterinin ChatWindow ve ChatSettings tablosunu geçer.Eğer işlev doğru dönerse, mesaj işlenmeyi bırakır ve sunucuya gönderilmez.Aksi takdirde diğer tüm işlemciler aracılığıyla ve sonunda sunucuya gönderilecektir, eğer diğer işlemcilerden hiçbiri onu durdurmaz.

Örneğin, aşağıdaki işlemci, kullanıcı /last komutunu girerse, mevcut kanaldaki en eski mesajı kaldıracaktır.


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
}

Devam eden komutlar

Devam eden Komutlar her kullanıcı sohbet girişine bir karakter yazdığında değerlendirilir.Örneğin, aşağıdaki kod, kullanıcının bir daktilo üzerinde yazdığı gibi görünmesi için her tuşa bastıktan sonra bir tıklama çalar:


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
}

Devam eden komutlar genellikle sohbetin sadece mevcut kanaldan mesaj göndermek yerine belirli kullanıcılara özel bir özel durum oluşturmak için kullanılır.Örneğin, Whisper ve Takım Sohbet sistemleri kullanıcının /whisper veya /team sırasıyla yazdığını kontrol eder ve bitmiş mesajı yalnızca uygun kullanıcılara gönderir.

Özel bir durum, aşağıdaki işlevlerle tablo olması beklenir:

  • TextUpdated() — Giriş kutusundaki metin değiştiğinde çağrılır.
  • GetMessage() — Kullanıcı mesajı girmeyi bitirdikten sonra ve Enter 'a vurduktan sonra çağrılır. Bu işlev bir dizidöndürmesi beklenir.
  • ProcessCompletedMessage() — Mesaj işlenirken çağrılır.Özel bir durum işlemcisi daima bitirilmiş mesaj işlemcilerinden önce ateşlenecektir.Diğer işlemciler gibi, bu işlev mesajın gönderilmesi durdurulursa doğru döndürmeli, aksi takdirde yanlış döndürmeli.
  • Destroy() — Mesaj gönderildikten sonra çağrılmalıdır. Özel durum tarafından kurulan herhangi bir şeyi temizlemek için kullanılmalıdır.

Özel bir durumu kullanmak için, komut modülünün ProcessMessage() fonksiyonu durumu geri vermelidir.Temel özel durum aşağıdaki formu alacaktır:


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
}

Özel bir devlet kullanmanın en önemli avantajlarından biri, bir modülün kullanıcının hem işlev hem de görünüm açısından her ikisini yazarken sohbet çubuğunu ve içindeki metni düzenleyebilmesi ve ardından kolayca sıfırlayabilmesidir (bir mesaj gönderildikten sonra özel bir devlet otomatik olarak kaldırılır ve her şey normale döner).Örneğin, bu kod sadece bir seferde metin kutusunda 20 karakterin gösterilmesine izin veren özel bir durum oluşturur.Kullanıcı yazmayı sürdürürse, dize başındaki karakterler geçici olarak kaldırılır.Kullanıcı mesajı gönderdiğinde, kaldırılan tüm karakterler mesaja geri eklenir.


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
}

Daha önce de belirtildiği gibi, bir mesaj gönderildikten sonra herhangi bir özel durum kaldırılır ve sohbet normal hale getirilir.Mesaj gönderilmeden önce özel bir durumu sıfırlamak gerekiyorsa, durum ChatBar:ResetCustomState() ile sıfırlanabilir.Lütfen unutmayın ki bu, sohbet çubuğunun metin kutusundan da odaklanmayı kaldıracaktır.

Mesaj yaratıcı modülleri

Client bileşeninde kullanılabilecek başka bir modül türü bir Mesaj Yaratıcısı modülüdür.Bu tür bir modül, mesajı görüntülemek için sohbet penceresinde GUI öğeleri oluşturmak için kullanılır.Her tür mesaj yaratıcısı yeni bir mesaj yaztanımlar, böylece farklı biçimlendirmelerle farklı mesajlar oluşturulabilir.Ayrıca, GUI öğeleri bu şekilde mesaj görüntüsüne eklenebilir, böylece resimler, düğmeler ve daha fazlasına izin verir.

Bu modüllerin birkaç farklı yerde kurulması gerekir.Her mesaj yaziçin, ModuleScript içinde Mesaj Yaratıcı Modülleri içinde olmalıdır.Ayrıca, SohbetStandartları ModuleScript yeni mesaj yaziçerecek şekilde düzenlenmelidir.Son olarak, modüller yalnızca bir sohbet sunucu bileşeninin verilen mesaj yazyeni bir mesaj oluşturması durumunda kullanılır.

Aşağıdaki örnek, her 5 saniyede bir kez zamanı söyleyen bir bot yapmayı geçecek ve gönderilen mesaj kırmızı bir arka plan alacak.

Başlamak için, SohbetStandartları ModuleScript yeni mesaj türü için bir alan eklemelidir.


-- SohbetStandartları
local module = {}
--[[Mesaj Türleri]]
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

Botun kendisi sunucuda yeni bir SohbetModülü üzerinde oluşturulur.Bir filtre işlevinin, botun gönderdiği mesajlara yeni mesaj türünü eklemek için kullanıldığını unutmayın.


-- SohbetModüllerine yerleştirilecek yeni ModülScripti
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

Son olarak, bir mesaj yaratıcı modülü yapılmalıdır.Bu modül, iki elemanla bir sözlük döndürmelidir: mesajın türü, KEY_MESSAGE_TYPE ile indekslenmiş ve mesaj GUI öğelerini oluştururken çağırılacak işlev, KEY_CREATOR_FUNCTION ile indekslenmiş.

KEY_CREATOR_FUNCTION tarafından depolanan işlev birkaç bileşen içeren bir sözlük döndürmelidir.Öncelikle, sohbet penceresinde görüntülenecek bir Frame ve TextLabel dahil etmelidir.Bunlar util:CreateBaseMessage() ile oluşturulabilir.Sözlüğün ayrıca mesajın metnini güncellendiğinde çalışacak bir işlev de dahil etmesi gerekir.Mesajlar ilk olarak istemciye girdiğinde, mesaj işlenirken ve filtrelenirken boş bir yer tutucu metin var, bu yüzden bu tür mesaj nesnelerinin güncelleme çağrısı aldığında neler olacağını ele alması gerekiyor.Sonra, sözlüğün çerçevenin yüksekliğini belirleyen bir işlev içermesi gerekir.Bu işlev sıklıkla util:GetMessageHeight() işlevini çağırır.Son olarak, sözlüğün pencere kaybolduğunda elemanların nasıl kaybolması gerektiğini tanımlayan birkaç işlev içermesi gerekir (bunun için yarar işlevi util:CreateFadeFunctions() ).


-- MessageCreatorModules'a dahil edilecek yeni ModülScript
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)
-- Mesajı tutmak için Çerçeve ve TextLabel için GUI nesnelerini oluştur
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- Çergenin arka planını kırmızıya değiştir
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- Doldurucu mesaj metnini güncelleme işlemini ele alma
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- Kare yüksekliğini belirlemek için kullanıcı işlevini kullanın
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- Sohbet penceresi kaybolduğunda çağrılan soluk fonksiyonlar oluştur
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- Mesaj etiketini tanımlayan sözlüğü geri dönün
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
}