Hierarch
Hệ thống trò chuyện thừa kế sử dụng mô hình client-server. Các thành phần của modul trò chuyện máy chủ ChatChannel và ChatSpeaker được xử lý bởi 1> ChatService1> trên máy chủ, trong khi client là chịu trách n
Các dịch vụ Chat của chính các máy chủ là đơn vị lưu trữ cần thiết cho hệ thống trò chuyện: khi một máy chủ Roblox được tải (ở đó bằng cách nào đó hoặc trong Studio khi chạy hoặc chơi), các thành phần sau đây sẽ tự đ
- ChatModuleScript — This Folder is a collection of modules that are required by the ChatServiceRunner 1>All of the contents of this folder are required by the script and are used to create custom behavior on the máy chủ.
- ClientChatModule — Thư mục này chứa các ModuleScripts yêu cầu bởi ChatScript .
- CommandModule — Bao gồm các module được sử dụng để thực hiện các lệnh trò chuyện bên client.
- MessageCreatorModule — Bao gồm các mô-đun được sử dụng để xử lý và định dạng tin nhắn.
- ChatCommands — Contains các biến được chia sẻ bởi máy chủ và client.
- Cài đặt trò chuyện — Lưu trữ các cài đặt khác nhau để tùy chỉnh các khía cạnh khác nhau của Cửa sổ trò chuyện .
- ChatLocalization — Cấu hình dữ liệu lưu trữ dịch văn bản.
- ChatServiceRunner — This Script runs the server component of the chat. In general this does not need to be modified to create custom chat behavior and functionality.
- BubbleChat — Hiển thị tin nhắn trò chuyện của người dùng trên avatar trò chơi của họ (nếu được bật).
- ChatScript — This LocalScript runs the client component of the chat. Like ChatServiceRunner, this should not need to be modified to customize chat. When the game runs this gets cloned automatically to the StarterPlayerScripts .
Đang chỉnh sửa hệ thống trò chuyện
Để điều chỉnh hoặc tùy chỉnh hệ thống trò chuyện thừa kế, bạn phải đầu tiên sao chép cấp độ hierarchical ở trên.
Trong Cửa sổ Explorer, tìm kiếm TextChatService . Sau đó, trong Cửa sổ Properties, hãy cài đặt thuộc tính 1> ChatVersion1> lên 4> LegacyChatService4> .
Chạy trải nghiệm bằng nút Chơi ( F5 ).
Chọn và sao chép ( CtrlC hoặc ⌘C ) những thống kê đã thêm vào 2> Class.Trò chuyện2> .
Dừng trải nghiệm bằng nút Dừng ( ShiftF5 ).
Chọn Chat và dán vào ( Ctrl 0> Shift0> 2> V2> hoặc 5> ⌘5> 7> Shift7> 9> V9>) những thống kê đã
Đảm bạn rằng Chat.LoadDefaultChat đã được kích hoạt.
Workflow trò chuyện
Trước khi tạo các module để tùy chỉnh cuộc trò chuyện, làm hiểu quy trình làm việc mà một tin nhắn trò chuyện đi qua. Cùng với việc gửi tin nhắn văn bản, có một loạt các lệnh được xây dựng vào hệ thống chat, vì vậy mọi tin nhắn đều phải được ki
Sau khi một người có tập trung vào nhập mục trong trò chuyện và nhập một nhân vật, một loạt các kiểm tra đượ
Ở phía client của cuộc trò chuyện, có hai loại chipset: Đang thực hiện và Hoàn thành . Các loại còn lại đánh giá sau mỗi nhân vật đã được nhập, trong khi loại cuối cùng chỉ đánh giá khi người dùng đã kết thúc nhập và đã nhấn Enter</
Khi người dùng hoàn thành việc nhập chữ và nhấn Enter chữ, họ đã gửi trả lời trong một vài hành động khác nhau của hệ máy chủ. Nếu một lệnh In
Một khi thông điệp đến máy chủ, nó đi qua một loạt các bộ xử lý command. Giống như các Completed bộ xử lý trên máy chủ, nếu bất kỳ trong những bộ lọcxử lý này trở lại true, thì thông điệp sẽ không được thực hiện. Nế
Các bộ phận của máy chủ
Các module được đặt vào ChatModule có thể được sử dụng cho một loạt các mục đích. Các module này có thể được sử dụng để quản lý các kênh trò chuyện và người nói chuyện, thêm các chức năng lọc và command, thiết lập chatbots hoặc bất kỳ đ
Khi ChatServiceRunner bắt đầu, nó yêu cầu mỗi module bên trong ChatModule . Nó mong đợi mỗi module để trả lại một chức năng khi sau đó gọi mỗi module trong lượt, truyền đối tượng ChatService của mỗi module vào mỗ
Khung Cấu Tạo Mô-đun Thí Dụ
local function Run(ChatService)
-- Mã đi đây
end
return Run
Thêm các kênh
Một trong những điều đơn giản nhất mà một ChatModule có thể làm là quản lý kênh . Các thống kê kênh có thể được tạo bằng cách sử dụng phương
local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
end
return Run
Cài đặt kênh cơ bản
Các kênh có nhiều thuộc tính có thể được sử dụng để chỉ sửa chững nhỏ. Ví dụ, module này tạo một kênh và đặt Thông điệp 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")
-- Đặt tin nhắn được hiển thị khi một người tham gia kênh
myChannel.WelcomeMessage = "Welcome to my channel!"
-- Khiến người chơi tự động tham gia kênh khi họ tham gia trò chơi
myChannel.AutoJoin = true
end
return Run
Sự kiện Kênh
Các kênh có nhiều sự kiện mà thuộc tính có thể được subscribe đến. Các sự kiện này bắt đầu khi một Tin nhắn Chat được đăng vào kênh, khi một Speaker để lại ho
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
Hành động chức năng
Một cái gì đó mạnh mẽ khác mà ChatModule có thể làm là chat commands . Khi một
Các chức năng Command thường được sử dụng để thực hiện Admin Commands, which are text commands that some users can use to manipulate the state of experience through specific text said in the chat.
Trong ví dụ này, một ChatModule được sử dụng để tạo một Part nếu một người nhập /part trong cuộc trò chuyện. Ghi nhớ rằng chức năng này trả về true nếu một phần đã được tạ
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ả ChatChannels và ChatService có thể có các lệnh trò chuyện. ChatService lệnh xử lý sẽ chạy trên mọi thông điệp được gửi đến máy chủ, trong khi 2> lệnh trò chuyện2> chỉ được chạy nếu thông điệp được gửi đến kênh mà lệnh đã đ
Chức Năng Lọc
Các tin nhắn mà không được ngăn chặn bởi một Hành động Hệ thống sẽ đi qua tất cả các chức năng lọc đã đăng ký với ChatService và các kênh liên quan. Mỗi chức năng lọc sẽ được truyền cho người nó
Trong ví dụ này, một chức năng lọc đơn giản đã được đăng ký để làm cho mọi thông điệp xuất hiện bằng chữ viết 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
Các Kết Quả
Các module được đặt vào ClientChatModule có thể được sử dụng để tạo hành vi tùy chỉnh cho khách hàng. Các module này được chia thành hai thư mục khác nhau: Command Modules và Message Creator Modules .
Các mô-đun command
Các mô-đun Command hoạt động rất tương tự với các mô-đun trên máy chủ đăng nhập Hành động Của Người dùng . Các mô-đun n
Trong cả hai loại lệnh, module phải trả lại một từ điển nói rằng loại处理器 nào nên sử dụng và những chức năng nào để thi hành khi máy chủ được gọi. Ví dụ, một máy chủ tin nhắn hoàn thành nên lấy hình 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
}
Ghi chú rằng KEY_COMMAND_PROCESSOR_TYPE hệ thống đã được định nghĩa trong Util ModuleScript ở trong thư mục 1>CommandModuleScript1> bên trong thư mục 4>CommandModuleScript4> .
Các lệnh tin nhắn đã hoàn tất
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 nhập và đã nhấn Enter . Ứng dụng của máy chủ đ
Ví dụ, /last 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
}
Biểu tượng Đang thực hiện
Các lệnh đang thực hiện trong trình duyệt chat được đánh giá mỗi lần một người nhập một nhân vật vào trình duyệt chat. Ví dụ, mã sau đây chơi một cú đập sau mỗi lần nhấn phím để làm cho nó có vẻ như người dùng đang gõ trên một máy chủ typewriter:
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 trong giai đoạn tiến hành thường được sử dụng để tạo một trạng thái tùy chỉnh cho chat để gửi tin nhắn đến các người dùng cụ thể thay vì chỉ là kênh hiện tại. Ví dụ, các hệ thống Whisper và Team Chat kiểm tra xem
Một trạng thái tùy chỉnh được mong đợi phải là bảng với các chức năng sau đây:
- TextUpdated() — Gọi khi văn bản trong hộp nhập thay đổi.
- GetMessage() — Gọi sau khi người dùng đã kết thúc việc nhập tin nhắn và nhấn Enter . Đây là hành động được mong đợi để trả lại một chuỗi.
- ProcessCompletedMessage() — Gọi là thông điệp đang được xử lý. Một người xử lý trạng thái tùy chỉnh sẽ luôn bắt đầu lửa trước khi xử lý thông điệp đã hoàn thành. Như các ngườc khác trình xử lý trạng thái này nên trả lại true nếu thông điệp không dừng được gửi, nế
- Destroy() — Gọi sau khi thông điệp đã được gửi. Nên được sử dụng để làm sạch 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 modul command phải trả về trạng thái. Một trạng thái tùy chỉnh cơ bản sẽ được thực hiện như 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 module có thể chỉnh sửa thanh trò chuyện và nội dung trong trang bị của người dùng trong khi người dùng đang
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 một thông điệp đã được gửi bất kỳ trạng thái tùy chỉnh nào cũng được xóa và chat được đặt lại bình thường. Nếu cần thiết để đặt lại trạng thái tùy chỉnh trước khi gửi thông tin nhắn, trạng th
Các mô-đun Người sáng tạo tin nhắn
Một loại module khác có thể được sử dụng trong thành phần client là một Message Creator module. 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ị thông tin nhắn. Mỗi loại module message creator định một loại message đánh máym
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 MessageCreatorModule . Đồng thời, ChatAmount 1> Class.ModuleScript
Các bước tiếp theo sẽ đi qua việc tạo một bot nói thời gian mỗi 5 giây và thông điệp được gửi đi có một nền màu đỏ.
Để bắt đầu, ChatSeconds ModuleScript cần thêm một lĩnh vực cho loại thông tin nhắnmới.
-- Hội thoạilocal module = {}---[[ Các 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 = 0module.MinorVersion = 2return module
Bot chính được tạo trong một ChatModule mới trên máy chủ . Lưu ý rằng một chức năng lọc được sử dụng để thêm loại tin nhắn mới này vào các tin nhắn mà bot gửi.
-- ModuleScript mới để được đặt trong ChatModule
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 người dùng tạo thông điệp phải được tạo. Mô-đun này phải trả về một bảng từ điển với hai thành phần: loại thông tin nhắn, liên kết với KEY_MESSAGE_TYPE và chức năng gọi khi tạo các thành phần GUI thông đ
Hàm được lưu bởi KEY_CREATOR_FUNCTION đều cần phả
-- 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 thống kê GUI để lưu trữ thông tin nhắn
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- Đổi màu nền của Khung thành đỏ
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- Làm cho nội dung tin nhắn đã được cập nhật
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 các chức năng mờ dần mà đượ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 các từ điển định nghĩa nhãn tin
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
}