Hệ thống trò chuyện di sản

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Cấu trúc Hierarchy

Hệ thống trò chuyện di sản sử dụng mô hình khách hàng-máy chủ.Các thành phần mô-đun trò chuyện bên máy chủ ChatChannelChatSpeaker quản lý được xử lý bởi ChatService trên máy chủ, trong khi khách hàng chịu trách nhiệm cho việc nhập và hiển thị các tin nhắn.Giao tiếp giữa máy chủ và khách hàng được xử lý tự động bằng cách sử dụng RemoteEvents .

Dịch vụ động cơ Chat của riêng mình là đơn vị lưu trữ cốt lõi cho hệ thống trò chuyện: khi một nơi Roblox tải (trong khách hàng hoặc trong Studio khi chạy hoặc chơi), các thành phần sau đây sẽ tự động được tải vào dịch vụ Chat nếu Chat.LoadDefaultChat là đúng.

  • ChatModule — Cái này Folder là một bộ sưu tập các mô-đun cần thiết bởi ChatServiceRunner .Tất cả nội dung của thư mục này được yêu cầu bởi kịch bản và được sử dụng để tạo hành vi tùy chỉnh trên máy chủ.
  • ClientChatModules — Thư mục này chứa các ModuleScripts cần thiết bởi ChatScript .
    • CommandModule — Bao gồm các mô-đun được sử dụng để thực hiện lệnh trò chuyện bên khách.
    • MessageCreatorModules — Bao gồm các mô-đun được sử dụng để xử lý và định dạng tin nhắn.
    • ChatConstants — Bao gồm các tham số chung được chia sẻ bởi máy chủ và khách hàng.
    • Cài đặt trò chuyện — Lưu trữ các cài đặt khác nhau để cấu hình các khía cạnh khác nhau của Cửa sổ trò chuyện.
  • ChatLocalization — Cấu trúc dữ liệu lưu trữ bản dịch văn bản.
  • ChatServiceRunner — Cái này Script chạy thành phần máy chủ của trò chuyện.Nói chung, điều này không cần phải được thay đổi để tạo hành vi trò chuyện và chức năng tùy chỉnh.
  • BubbleChat — Hiển thị tin nhắn trò chuyện của người dùng trên avatar trong trò chơi của họ (nếu được bật).
  • ChatScript — Cái này LocalScript chạy thành phần khách hàng của trò chuyện.Giống như ChatServiceRunner, nó không cần phải được thay đổi để tùy chỉnh trò chuyện.Khi trò chơi chạy, điều này được sao chép tự động sang StarterPlayerScripts .

Sửa hệ thống trò chuyện

Để sửa đổi hoặc tùy chỉnh hệ thống trò chuyện di sản, bạn phải trước tiên tạo bản sao của cấu trúc trên.

  1. Trong cửa sổ Explorer, tìm TextChatService .Sau đó, trong cửa sổ Tính năng, hãy đặt thuộc tính ChatVersion thành LegacyChatService .

  2. Chạy trải nghiệm bằng nút Chơi ( F5 ).

  3. Chọn và sao chép ( CtrlC hoặc C ) các đối tượng được thêm vào Chat .

  4. Dừng trải nghiệm bằng nút Dừng ( ShiftF5 ).

  5. Chọn Chatdán vào ( CtrlShiftV hoặc ShiftV ) các đối tượng đã sao chép (chúng phải được cha truyền đến Chat như khi trải nghiệm đang diễn ra).

  6. Hãy chắc chắn rằng Chat.LoadDefaultChat được bật.

Quy trình làm việc trò chuyện

Trước khi tạo các mô-đun để tùy chỉnh trò chuyện, rất quan trọng để hiểu quy trình làm việc mà một tin nhắn trò chuyện đi qua.Ngoài việc gửi tin nhắn văn bản, có nhiều lệnh được xây dựng vào hệ thống trò chuyện, vì vậy mỗi tin nhắn phải được kiểm tra để xem liệu chúng có cần được giải thích như một lệnh hay chỉ là một tin nhắn văn bản.Ngay cả tin nhắn văn bản cũng có thể được chỉnh sửa và lọc trong quá trình.

Sau khi người dùng tập trung vào đầu vào trò chuyện và nhập một ký tự, một số kiểm tra được thực hiện ngay lập tức trên khách hàng.Nếu nhân vật là Esc, hộp nhập sẽ đóng và không có hành động nào được thực hiện.Nếu nhân vật là bất cứ thứ gì khác hơn Enter , văn bản sẽ được truyền qua qua quá trình xử lý lệnh Đang thực hiện.Chúng được sử dụng để đánh giá văn bản để xem liệu có cần phải thực hiện bất kỳ hành động nào không.Ví dụ, khi một người dùng bắt đầu thì thầm với lệnh /whisper, ngay khi tên người dùng đã được nhập sau lệnh, hộp nhập thay đổi để chỉ ra rằng người dùng đang bước vào kênh thì thầm.

Ở phía khách hàng của trò chuyện, có hai loại máy xử lý: Đang thực hiệnHoàn thành.Cái trước đánh giá sau khi mỗi nhân vật đã được nhập, trong khi cái sau chỉ đánh giá khi người dùng đã hoàn thành nhập và đã đánh vào Enter .

Khi người dùng hoàn thành việc gõ và nhấn vào Enter văn bản, nhập của họ được gửi qua nhiều máy xử lý lệnh hơn.Nếu một lệnh Đang thực hiện tạo ra một trạng thái trò chuyện tùy chỉnh, trò chuyện kiểm tra trạng thái để xem liệu lệnh cuối cùng có nên được thực hiện và nếu tin nhắn nên tiếp tục không.Nếu tin nhắn được phép tiếp tục, thì văn bản được gửi thông qua một bộ xử lý khác được gọi là Hoàn thành quá trình.Nếu bất kỳ một trong những máy xử lý này trả về true, tin nhắn sẽ ngừng được gửi.Nếu không, tin nhắn được gửi đến máy chủ.

Khi tin nhắn đến máy chủ, nó đi qua một loạt các máy xử lý lệnh khác.Tương tự như các quá trình hoàn thành trên máy khách, nếu bất kỳ quá trình nào trong số này trả về true, thì tin nhắn sẽ dừng thực thi.Nếu không, tin nhắn sẽ được truyền qua một loạt bộ lọc (bao gồm bộ lọc trò chuyện mặc định của Roblox).Khi tất cả điều này được hoàn thành, tin nhắn được gửi đến tất cả các kênh và nói phù hợp.

Mô-đun máy chủ

Các mô-đun được đưa vào ChatModule có thể được sử dụng cho nhiều mục đích khác nhau.Các mô-đun này có thể được sử dụng để quản lý kênh trò chuyện và người phát biểu, thêm chức năng bộ lọc và lệnh, chạy chatbot hoặc bất cứ điều gì cần được xử lý trên máy chủ.Để tương tác với hệ thống trò chuyện, mỗi mô-đun được truyền một đối tượng ChatService.

Khi ChatServiceRunner bắt đầu, nó yêu cầu mỗi mô-đun bên trong ChatModules .Nó mong đợi mỗi mô-đun trả về một chức năng như sau khi gọi mỗi mô-đun lần lượt, truyền đối tượng ChatService của nó cho mỗi chức năng.Bất kể mô-đun dự định làm gì (chạy một bot, thêm chức năng bộ lọc, v.v.), nó cần phải tuân theo dạng này để hoạt động.

Khung mô-đun mẫu

local function Run(ChatService)
-- Mã đi đây
end
return Run

Thêm kênh

Một trong những điều đơn giản nhất mà ChatModule có thể làm là quản lý kênh .Các đối tượng kênh có thể được tạo với phương pháp AddChannel() của ChatService.Lưu ý rằng đối tượng kênh chỉ cần được sử dụng khi gọi các thành viên của kênh đó (như các thuộc tính và chức năng của nó).Khi tham chiếu đến kênh từ bối cảnh ChatService hoặc ChatSpeakers, tên kênh được sử dụng để tham chiếu nó.


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

Cấu hình kênh cơ bản

Kênh có một số tính năng có thể được sử dụng để chỉnh sửa chúng một chút.Ví dụ, mô-đun này tạo một kênh và đặt Tin nhắn Chào mừng và khiến người dùng tự động tham gia kênh khi họ nhập vào trải nghiệm.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- Xác định tin nhắn được hiển thị khi người dùng tham gia kênh
myChannel.WelcomeMessage = "Welcome to my channel!"
-- Khiến người chơi tự động tham gia kênh khi họ vào trò chơi
myChannel.AutoJoin = true
end
return Run

Sự kiện kênh

Kênh có một số sự kiện có thể đăng ký.Các sự kiện này bắt lửa khi một Tin nhắn trò chuyện được đăng vào kênh, khi một Người phát biểu trò chuyện rời hoặc tham gia, hoặc khi một Speaker bị tắt hoặc bật.Ví dụ, mô-đun này sẽ tạo một kênh với tên MyChannel .Mỗi khi một người phát biểu tham gia hoặc rời khỏi kênh, một tin nhắn hệ thống sẽ được gửi đến tất cả các người phát biểu trong kênh thông báo về sự kiện.


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

Chức năng lệnh

Một điều mạnh mẽ khác mà ChatModule có thể làm là chat lệnh .Khi một tin nhắn được gửi đến máy chủ, trò chuyện sẽ gửi tin nhắn thông qua mỗi chức năng lệnh đã được đăng ký vào ChatService và kênh liên quan.Các chức năng này được gửi cho người loa, tin nhắn và kênh mà tin nhắn được gửi đến.Chức năng có thể thực hiện bất kỳ hành động nào nó cần và sau đó trả về true hoặc false.Nếu chức năng trả về true, thì tin nhắn sẽ ngừng được xử lý bởi hệ thống trò chuyện.Nó sẽ không được gửi đến bất kỳ chức năng lệnh nào khác hoặc sẽ không hiển thị trong cửa sổ trò chuyện.Nếu chức năng trả về false, thì tin nhắn tiếp tục thông qua tất cả các chức năng lệnh khác.Nếu không có chức năng lệnh nào trả về true, tin nhắn sẽ được gửi qua các bộ lọc và sau đó sẽ được hiển thị.

Chức năng lệnh thường được sử dụng để thực hiện Lệnh quản trị, đó là lệnh văn bản mà một số người dùng có thể sử dụng để thao tác trạng thái trải nghiệm thông qua văn bản cụ thể được nói trong trò chuyện.

Trong ví dụ này, một ChatModule được sử dụng để tạo ra một Part nếu người dùng nhập /part trong trò chuyện.Lưu ý rằng chức năng này trả về true nếu một phần được tạo ra sẽ ngăn chặn việc tiếp tục gửi tin nhắn và không có tin nhắn nào được hiển thị.Nếu một phần không được tạo, chức năng này cần phải trả về false để tin nhắn có thể tiếp tục hoạt động thông qua hệ thống.


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

Cả Kênh trò chuyệnDịch vụ trò chuyện có thể có lệnh trò chuyện. Quá trình xử lý lệnh của ChatService sẽ chạy trên mọi tin nhắn được gửi đến máy chủ, trong khi các lệnh kênh chỉ sẽ chạy nếu tin nhắn được gửi đến kênh lệnh mà lệnh được đăng ký.

Chức năng lọc

Các tin nhắn không bị ngăn chặn bởi một Chức năng Command sẽ đi qua tất cả các chức năng lọc được đăng ký vào ChatService và các kênh liên quan.Mỗi chức năng lọc được truyền cho người phát, đối tượng tin nhắn và tên kênh.Bất kỳ thay đổi nào được thực hiện cho đối tượng tin nhắn sẽ tồn tại và mỗi chức năng lọc tiếp theo sẽ xem tin nhắn được cập nhật.Lưu ý rằng các chức năng lọc không cần phải trả về một giá trị.

Trong ví dụ này, một chức năng lọc đơn giản được đăng ký để làm cho mọi tin nhắn xuất hiện bằng chữ thường.


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ô-đun khách hàng

Các mô-đun được đưa vào ClientChatModules có thể được sử dụng để tạo hành vi tùy chỉnh cho khách hàng.Các mô-đun này được chia thành hai thư mục khác nhau: Mô-đun lệnhMô-đun tạo tin nhắn.

Module lệnh

Mô-đun lệnh hoạt động rất giống với mô-đun trên máy chủ đăng ký chức năng lệnh .Các mô-đun này xác định chức năng sẽ bắt lửa sau khi người dùng đã nhập vào văn bản.Văn bản đó có thể được đọc và lệnh có thể cho phép tin nhắn đi qua đến máy chủ hoặc ngăn chặn tiến trình của tin nhắn.Các lệnh được đánh giá ở cuối tin nhắn được gắn thẻ với COMPLETED_MESSAGE_PROCESSOR trong khi các lệnh được đánh giá sau mỗi ký tự được gắn thẻ với IN_PROGRESS_MESSAGE_PROCESSOR .

Trong cả hai loại lệnh, mô-đun phải trả về một từ điển nói về loại bộ xử lý mà lệnh nên sử dụng và chức năng nào phải thực hiện khi bộ xử lý được gọi.Ví dụ, một quá trình xử lý tin nhắn hoàn thành phải có dạng:


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
}

Lưu ý rằng enum KEY_COMMAND_PROCESSOR_TYPE được định nghĩa trong Util ModuleScript bên trong thư mục CommandModules .

Hoàn thành lệnh tin nhắn

Các lệnh tin nhắn hoàn thành được đánh giá khi người dùng đã hoàn thành việc gõ và đã đánh đến Enter .Chức năng của máy xử lý là truyền đối tượng Tin nhắn trò chuyện , cửa sổ trò chuyện của khách hàng ChatWindow và bảng Cài đặt trò chuyện .Nếu chức năng trả về true, thì tin nhắn sẽ ngừng xử lý và sẽ không được gửi đến máy chủ.Nếu không, nó sẽ được gửi qua tất cả các máy xử lý khác và cuối cùng đến máy chủ nếu không có máy xử lý khác nào ngăn nó lại.

Ví dụ, máy xử lý sau đây sẽ xóa tin nhắn cũ nhất trong kênh hiện tại nếu người dùng nhập lệnh /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
}

Lệnh đang thực hiện

Các lệnh đang thực hiện được đánh giá mỗi khi người dùng nhập một ký tự vào đầu vào trò chuyện.Ví dụ, mã sau đây chơi một tiếng nhấp sau mỗi lần nhấn phím để làm cho nó nghe giống như người dùng đang gõ trên máy đánh chữ:


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
}

Các lệnh đang thực hiện thường được sử dụng để tạo một trạng thái tùy chỉnh cho trò chuyện gửi tin nhắn cho các người dùng cụ thể thay vì chỉ kênh hiện tại.Ví dụ, các hệ thống Whisper và Team Chat kiểm tra xem người dùng đã gõ /whisper hoặc /team lần lượt và gửi tin nhắn đã hoàn thành chỉ cho những người dùng thích hợp.

Một trạng thái tùy chỉnh được mong đợi là bảng với các chức năng sau:

  • TextUpdated() — Gọi khi văn bản trong hộp nhập thay đổi.
  • GetMessage() — Gọi sau khi người dùng đã hoàn thành việc nhập tin nhắn và đánh Enter . Chức năng này được mong đợi sẽ trả về một chuỗi.
  • ProcessCompletedMessage() — Gọi khi tin nhắn đang được xử lý.Một máy xử lý trạng thái tùy chỉnh sẽ luôn bắn trước khi hoàn thành quá trình xử lý tin nhắn.Giống như các máy xử lý khác, chức năng này nên trả về true nếu tin nhắn không còn được gửi, nếu không nó nên trả về false.
  • Destroy() — Gọi sau khi tin nhắn đã được gửi. Nên được sử dụng để xóa bất cứ thứ gì được cài đặt bởi trạng thái tùy chỉnh.

Để sử dụng một trạng thái tùy chỉnh, chức năng ProcessMessage() của mô-đun lệnh phải trả lại trạng thái.Một trạng thái tùy chỉnh cơ bản sẽ có dạng sau:


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
}

Một trong những lợi thế chính của việc sử dụng một trạng thái tùy chỉnh là một mô-đun có thể chỉnh sửa thanh trò chuyện và văn bản bên trong trong khi người dùng đang gõ cả về mặt chức năng và hình dáng, và sau đó dễ dàng đặt lại sau đó (một khi tin nhắn được gửi, trạng thái tùy chỉnh sẽ tự động bị xóa và mọi thứ được đặt lại về bình thường).Ví dụ, mã này thiết lập một trạng thái tùy chỉnh chỉ cho phép 20 ký tự được hiển thị trong hộp văn bản cùng một lúc.Nếu người dùng tiếp tục nhập, các ký tự ở đầu dòng sẽ bị xóa tạm thời.Khi người dùng gửi tin nhắn, tất cả các nhân vật bị xóa được thêm trở lại tin nhắn.


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
}

Như đã đề cập trước, một khi tin nhắn đã được gửi, bất kỳ trạng thái tùy chỉnh nào cũng đã bị xóa và cuộc trò chuyện được khôi phục lại bình thường.Nếu cần phải đặt lại một trạng thái tùy chỉnh trước khi gửi tin nhắn, trạng thái có thể được đặt lại với ChatBar:ResetCustomState() .Lưu ý rằng điều này cũng sẽ xóa sự tập trung khỏi hộp văn bản của thanh trò chuyện.

Mô-đun tạo tin nhắn

Một loại module khác có thể được sử dụng trong thành phần khách hàng là một module Tạo tin nhắn .Loại module này được sử dụng để tạo các thành phần GUI trong cửa sổ trò chuyện để hiển thị tin nhắn.Mỗi loại người gửi tin nhắn định nghĩa một đánh máytin nhắn mới, vì vậy các tin nhắn khác nhau có thể được tạo với các định dạng khác nhau.Hơn nữa, các yếu tố GUI có thể được thêm vào hiển thị tin nhắn theo cách này cho phép các hình ảnh, nút và nhiều hơn nữa.

Các mô-đun này yêu cầu cài đặt ở nhiều vị trí khác nhau.Đối với mỗi đánh máytin nhắn, phải có một ModuleScript bên trong MessageCreatorModules .Ngoài ra, Chat Становья ModuleScript cần được chỉnh sửa để bao gồm loại tin đánh máymới.Cuối cùng, các mô-đun chỉ được sử dụng nếu một thành phần máy chủ của trò chuyện tạo ra một tin nhắn mới với đánh máytin nhắn đã cho.

Ví dụ sau đây sẽ đi qua việc tạo một bot nói thời gian mỗi 5 giây, và tin nhắn được gửi nhận được nền đỏ.

Để bắt đầu, ChatConstants ModuleScript cần thêm một trường cho loại tin nhắn mới.


-- Biến thể trò chuyện
local module = {}
--[[ Loại tin nhắn ]]
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

Bot chính nó được tạo ra trong một ChatModule mới trên máy chủ.Lưu ý rằng chức năng lọc được sử dụng để thêm loại tin nhắn mới vào các tin nhắn mà bot gửi.


-- ModuleScript mới sẽ được đặt vào 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

Cuối cùng, một mô-đun tạo tin nhắn phải được tạo.Mô-đun này phải trả lại một từ điển với hai thành phần: loại tin nhắn, được lập chỉ mục với KEY_MESSAGE_TYPE , và chức năng để gọi khi tạo các thành phần GUI tin nhắn, được lập chỉ mục với KEY_CREATOR_FUNCTION .

Chức năng được lưu bởi KEY_CREATOR_FUNCTION cần trả về một bảng từ điển với nhiều thành phần.Trước tiên, nó cần bao gồm một FrameTextLabel mà sẽ được hiển thị trong cửa sổ trò chuyện.Chúng có thể được tạo với chức năng util:CreateBaseMessage().Từ điển cũng cần bao gồm một chức năng để chạy nếu văn bản của tin nhắn được cập nhật.Khi tin nhắn xuất hiện lần đầu tiên trong khách hàng, chúng có văn bản giữ chỗ trống trong khi tin nhắn đang được xử lý và lọc, vì vậy các đối tượng tin nhắn như thế này cần xử lý những gì xảy ra khi họ nhận được cuộc gọi để cập nhật.Tiếp theo, từ điển cần bao gồm một chức năng để xác định chiều cao của khung.Chức năng này thường gọi chức năng util:GetMessageHeight() .Cuối cùng, từ điển cần bao gồm một số chức năng xác định cách các yếu tố nên biến mất khi cửa sổ biến mất (chức năng tiện ích cho việc này là util:CreateFadeFunctions() ).


-- ModuleScript mới được bao gồm trong 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)
-- Tạo các đối tượng GUI cho Frame và TextLabel để giữ tin nhắn
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- Thay đổi nền của Khung thành đỏ
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- Xử lý lời chờ cập nhật văn bản thông báo
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- Sử dụng chức năng util để xác định chiều cao của khung
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- Tạo chức năng mờ dần được gọi khi cửa sổ trò chuyện mờ dần
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- Trả lại từ điển định nghĩa nhãn tin nhắ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
}