ระบบแชทมรดก

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ลำดับชั้น

ระบบแชทมรดกใช้โมเดล ไคลเอนต์-เซิร์ฟเวอร์ส่วนประกอบของโมดูลแชทด้านเซิร์ฟเวอร์ ChatChannel และ ChatSpeaker จัดการโดย ChatService บนเซิร์ฟเวอร์ในขณะที่ไคลเอนต์เป็นผู้รับผิดชอบในการใส่และแสดงข้อความการสื่อสารระหว่างเซิร์ฟเวอร์และลูกค้าจะจัดการโดยอัตโนมัติโดยใช้ RemoteEvents

บริการเครื่องยนต์ Chat เองเป็นหน่วยเก็บข้อมูลที่จำเป็นสำหรับระบบแชท: เมื่อสถานที่ Roblox โหลด (ไม่ว่าจะในไคลเอนต์หรือในสตูดิโอระหว่างการโหลดหรือเล่น) ส่วนประกอบต่อไปนี้จะโหลดอัตโนมัติเข้าสู่บริการ Chat หาก Chat.LoadDefaultChat เป็นจริง

  • โมดูลแชท — โมดูลนี้ Folder เป็นคอลเลกชันของโมดูลที่จำเป็นสําหรับ ChatServiceRunner เนื้อหาทั้งหมดของโฟลเดอร์นี้จำเป็นต้องใช้โดยสคริปต์และใช้สร้างพฤติกรรมที่กําหนดเองบนเซิร์ฟเวอร์
  • โมดูลการแชทของไคลเอนต์ — โฟลเดอร์นี้มีตัวเลือกต่างๆ ModuleScripts ที่จำเป็นสําหรับ ChatScript * โมดูลคำสั่ง — มีโมดูลที่ใช้ในการดําเนินการคําสั่งแชทด้านไคลเอนต์
    • MessageCreatorModules — มีโมดูลที่ใช้จัดการและรูปแบบข้อความ
    • Chatſ Constantes — มีคอนสแตนต์ที่แชร์ระหว่างเซิร์ฟเวอร์และไคลเอนต์
    • การตั้งค่าแชท — เก็บการตั้งค่าต่างๆ เพื่อกำหนดค่าด้านต่างๆ ของ หน้าต่างแชท
  • การแปลภาษาแชท — โครงสร้างข้อมูลที่เก็บการแปลข้อความ
  • ChatServiceRunner — สิ่งนี้ Script ดำเนินการส่วนเซิร์ฟเวอร์ของการแชทโดยทั่วไปนี้ไม่จำเป็นต้องแก้ไขเพื่อสร้างพฤติกรรมและฟังก์ชันการแชทที่กำหนดเอง
  • BubbleChat — แสดงข้อความแชทของผู้ใช้เหนืออวตารในเกมของพวกเขา (ถ้าเปิดใช้งาน)
  • ChatScript — สิ่งนี้ LocalScript เรียกส่วนประกอบไคลเอนต์ของการแชทเช่นเดียวกับ ChatServiceRunner ควรไม่จำเป็นต้องปรับแต่งเพื่อปรับแต่งการแชทเมื่อเกมทำงานสิ่งนี้จะถูกโคลนอัตโนมัติไปยัง StarterPlayerScripts

ปรับแต่งระบบแชท

เพื่อแก้ไขหรือปรับแต่งระบบแชทมรดกคุณต้องทำสำเนาของชั้นวางด้านบนก่อน

  1. ในหน้าต่าง Explorer ค้นหา TextChatService จากนั้นในหน้าต่าง คุณสมบัติ ตั้งค่าคุณสมบัติ ChatVersion เป็น LegacyChatService

  2. เรียกประสบการณ์โดยใช้ปุ่ม เล่น ( F5 ).

  3. เลือกและคัดลอก ( CtrlC หรือ C ) วัตถุที่เพิ่มลงใน Chat

  4. หยุดประสบการณ์โดยใช้ปุ่ม หยุด ( ShiftF5 ).

  5. เลือก Chat และ วางลงใน ( CtrlShiftV หรือ ShiftV ) วัตถุที่คัดลอก (พวกเขาต้องถูกผูกกับ Chat ในขณะที่ประสบการณ์กำลังดำเนินอยู่)

  6. ตรวจสอบให้แน่ใจว่า Chat.LoadDefaultChat ถูกเปิดใช้งาน

กระบวนการทำงานแชท

ก่อนที่จะสร้างโมดูลเพื่อปรับแต่งการแชท เป็นสิ่งสำคัญที่ต้องเข้าใจกระบวนการทำงานที่ข้อความแชทผ่านไปนอกจากการส่งข้อความข้อความแล้วยังมีคำสั่งต่างๆ ที่สร้างขึ้นในระบบแชทดังนั้นทุกข้อความจะต้องได้รับการตรวจสอบเพื่อดูว่าจะต้องถูกแปลเป็นคำสั่งหรือเพียงแค่ข้อความแม้แต่ข้อความข้อความสามารถแก้ไขและกรองได้ในกระบวนการ

หลังจากที่ผู้ใช้มุ่งเน้นไปที่การใส่ข้อความแชทและใส่ตัวละครแล้ว จะมีการตรวจสอบหลายอย่างทันทีบนไคลเอนต์หากตัวละครเป็น Esc กล่องใส่ข้อมูลจะปิดและไม่มีการดำเนินการใดๆหากตัวละครเป็นอะไรอื่นนอกเหนือจาก Enter ข้อความจะผ่านกระบวนการคำสั่ง กําลังดําเนินการใช้เพื่อประเมินข้อความเพื่อดูว่าจำเป็นต้องดำเนินการใดๆ หรือไม่ตัวอย่างเช่น เมื่อผู้ใช้เริ่มการกระซิบด้วยคําสั่ง /whisper ทันทีที่ชื่อผู้ใช้ถูกป้อนหลังจากคําสั่ง กล่องใส่ข้อมูลจะเปลี่ยนเพื่อระบุว่าผู้ใช้กำลังเข้าสู่ช่องกระซิบในขณะนี้

ในด้านไคลเอนต์ของการแชทมีสองประเภทของโปรเซสเซอร์: กําลังดําเนินการ และ สําเร็จอดีตจะประเมินหลังจากที่ตัวละครทุกตัวถูกพิมพ์แล้ว ในขณะที่อันหลังจะประเมินเฉพาะเมื่อผู้ใช้พิมพ์เสร็จและกด Enter

เมื่อผู้ใช้เสร็จสิ้นการพิมพ์และกด Enter ข้อความแล้ว การป้อนข้อมูลของพวกเขาจะถูกส่งผ่านผ่านตัวประมวลผลคำสั่งอีกหลายตัวหากคำสั่ง กําลังดําเนินการ ทำสถานะแชทที่กําหนดเองการตรวจสอบสถานะจะตรวจสอบสถานะเพื่อดูว่าคําสั่งสุดท้ายควรถูกดําเนินการและหากข้อความควรดําเนินต่อหากข้อความสามารถดำเนินต่อไปได้ ข้อความจะถูกส่งผ่านชุดประมวลผลอื่นที่เรียกว่า สําเร็จ โปรเซสเซอร์หากมีการประมวลผลใดๆ เหล่านี้กลับเป็นจริง ข้อความจะหยุดถูกส่งมิฉะนั้นข้อความจะถูกส่งไปยังเซิร์ฟเวอร์

เมื่อข้อความถึงเซิร์ฟเวอร์แล้ว มันจะผ่านกระบวนการคำสั่งอีกชุดหนึ่งเช่นเดียวกับโปรเซสเซอร์ สําเร็จ บนไคลเอนต์หากโปรเซสเซอร์ใดๆ กลับเป็นจริง ข้อความจะหยุดดําเนินการมิฉะนั้นข้อความจะถูกส่งผ่านผ่านชุดกรอง (รวมถึงตัวกรองแชท Roblox เริ่มต้น)เมื่อทำทั้งหมดเสร็จแล้วข้อความจะถูกส่งไปยังช่องทางและผู้พูดที่เหมาะสมทั้งหมด

โมดูลเซิร์ฟเวอร์

โมดูลที่อยู่ใน ChatModules สามารถใช้สำหรับวัตถุประสงค์ที่หลากหลายได้โมดูลเหล่านี้สามารถใช้เพื่อจัดการช่องแชทและผู้พูด เพิ่มฟังก์ชันกรองและคําสั่ง เรียกบอทแชท หรือสิ่งอื่นใดที่ต้องจัดการบนเซิร์ฟเวอร์เพื่อโต้ตอบกับระบบแชท แต่ละโมดูลจะได้รับวัตถุ ChatService

เมื่อ ChatServiceRunner เริ่มต้นขึ้น จะต้องมีแต่ละโมดูลภายใน ChatModules มันคาดว่าแต่ละโมดูลจะส่งฟังก์ชันกลับเมื่อเรียกแต่ละโมดูลในแต่ละครั้งโดยส่งวัตถุ ChatService ของมันไปยังแต่ละฟังก์ชันไม่ว่าโมดูลจะมีจุดประสงค์เพื่อทำอะไร (การเรียกใช้บอท, การเพิ่มฟังก์ชันตัวกรอง, ฯลฯ) จะต้องทำตามแบบฟอร์มนี้เพื่อให้ทำงานได้

กรอบรูปแบบโมดูลตัวอย่าง

local function Run(ChatService)
-- โค้ดไปที่นี่
end
return Run

เพิ่มช่อง

หนึ่งในสิ่งที่ง่ายที่สุดที่ ChatModule สามารถทำได้คือการจัดการช่อง **** วัตถุช่องสามารถสร้างได้ด้วยวิธี AddChannel() ของ ChatServiceโปรดทราบว่าวัตถุช่องเพียงต้องใช้เมื่อเรียกสมาชิกของช่องนั้น (เช่นคุณสมบัติและฟังก์ชันของมัน)เมื่ออ้างถึงช่องจากบริบทของ ChatService หรือ ChatSpeakers ชื่อช่องจะถูกใช้เพื่ออ้างอิง


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

การกำหนดค่าช่องพื้นฐาน

ช่องมีคุณสมบัติหลายอย่างที่สามารถใช้เพื่อปรับแต่งเล็กน้อยได้ตัวอย่างเช่น โมดูลนี้สร้างช่องและตั้งข้อความต้อนรับและทำให้ผู้ใช้เข้าร่วมช่องโดยอัตโนมัติเมื่อพวกเขาเข้าสู่ประสบการณ์


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- ตั้งค่าข้อความที่แสดงเมื่อผู้ใช้เข้าร่วมช่อง
myChannel.WelcomeMessage = "Welcome to my channel!"
-- ทำให้ผู้เล่นเข้าร่วมช่องโดยอัตโนมัติเมื่อพวกเขาเข้าสู่เกม
myChannel.AutoJoin = true
end
return Run

อีเวนต์ช่อง

ช่องมีหลายเหตุการณ์ที่สามารถสมัครได้เหตุการณ์เหล่านี้จะเกิดขึ้นเมื่อโพสต์ ChatMessage ไปยังช่องเมื่อ ChatSpeaker ออกหรือเข้าร่วม หรือเมื่อ Speaker ถูกปิดหรือยกเลิกการปิดตัวอย่างเช่น โมดูลนี้จะสร้างช่องด้วยชื่อ MyChannelทุกครั้งที่ผู้พูดเข้าร่วมหรือออกจากช่อง ระบบจะส่งข้อความไปยังผู้พูดทั้งหมดในช่องแจ้งให้พวกเขาทราบเกี่ยวกับเหตุการณ์


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

ฟังก์ชันคำสั่ง

สิ่งที่ทรงพลังอีกอย่างหนึ่งที่ ChatModules สามารถทำได้คือคําสั่งแชท **** เมื่อส่งข้อความไปยังเซิร์ฟเวอร์แล้ว แชทจะส่งข้อความผ่านฟังก์ชันคําสั่งที่ลงทะเบียนไว้ใน ChatService และช่องที่เกี่ยวข้องฟังก์ชันเหล่านี้ส่งไปยังลำโพง ข้อความ และช่องที่ข้อความถูกส่งไปฟังก์ชันสามารถดำเนินการใดๆ ที่ต้องการแล้วจึงคืนค่าเป็นจริงหรือเท็จหากฟังก์ชันส่งคืนค่าเป็นจริงแล้วข้อความจะหยุดถูกประมวลผลโดยระบบแชทมันจะไม่ถูกส่งไปยังฟังก์ชันคำสั่งอื่น ๆ เพิ่มเติม หรือจะไม่แสดงในหน้าต่างแชทหากฟังก์ชัน返回 false ข้อความจะดำเนินต่อผ่านฟังก์ชันคำสั่งอื่น ๆ ทั้งหมดหากไม่มีฟังก์ชันคำสั่งใดกลับเป็นจริง ข้อความจะถูกส่งผ่านตัวกรองและจะแสดงขึ้น

ฟังก์ชันคําสั่งมักใช้เพื่อใช้งาน คําสั่งผู้ดูแลระบบ ซึ่งเป็นคําสั่งข้อความที่ผู้ใช้บางคนสามารถใช้เพื่อควบคุมสถานะประสบการณ์ผ่านข้อความที่กำหนดเฉพาะในแชท

ในตัวอย่างนี้ ChatModule ถูกใช้เพื่อสร้าง Part หากผู้ใช้พิมพ์ /part ในการแชทโปรดทราบว่าฟังก์ชันนี้จะคืนค่าเป็นจริงหากส่วนถูกสร้างขึ้นซึ่งจะหยุดการดำเนินการของข้อความและข้อความจะไม่แสดงขึ้นหากส่วนไม่ถูกสร้างขึ้น ฟังก์ชันนี้จะต้องส่งคืนค่าเท็จเพื่อให้ข้อความสามารถดำเนินการต่อผ่านระบบได้


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

ทั้ง ช่องแชท และ บริการแชท เองสามารถมีคำสั่งแชทได้ตัวประมวลผลคำสั่ง ChatService จะทำงานในทุกข้อความที่ส่งไปยังเซิร์ฟเวอร์ในขณะที่ตัวควบคุมช่องจะทำงานเฉพาะในข้อความที่ส่งไปยังช่องที่คำสั่งลงทะเบียนอยู่

ฟังก์ชันการกรอง

ข้อความที่ไม่ถูกหยุดโดยฟังก์ชันคําสั่ง จะผ่านฟังก์ชันตัวกรองทั้งหมดที่ลงทะเบียนกับ ChatService และช่องทางที่เกี่ยวข้องฟังก์ชันตัวกรองแต่ละครั้งผ่านผู้พูด วัตถุข้อความ และชื่อช่องทางการเปลี่ยนแปลงใดๆ ที่ทำกับวัตถุข้อความจะยังคงอยู่และฟังก์ชันการกรองต่อไปจะเห็นข้อความที่อัปเดตโปรดทราบว่าฟังก์ชันการกรองไม่จำเป็นต้องส่งค่ากลับ

ในตัวอย่างนี้ฟังก์ชันการกรองง่ายจะลงทะเบียนเพื่อทำให้ข้อความทั้งหมดปรากฏในตัวเลขเล็กลง


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

โมดูลลูกค้า

โมดูลที่อยู่ใน ClientChatModules สามารถใช้เพื่อสร้างพฤติกรรมที่กําหนดเองสําหรับลูกค้าโมดูลเหล่านี้ถูกแบ่งออกเป็นสองโฟลเดอร์ที่แตกต่างกัน: โมดูลคำสั่ง และ โมดูลผู้สร้างข้อความ

โมดูลคำสั่ง

โมดูลคำสั่ง ทำงานคล้ายกับโมดูลบนเซิร์ฟเวอร์ที่ลงทะเบียน ฟังก์ชันคำสั่ง มากโมดูลเหล่านี้กำหนดฟังก์ชันที่จะยิงหลังจากที่ผู้ใช้ป้อนข้อความข้อความดังกล่าวสามารถอ่านได้และคำสั่งสามารถปล่อยข้อความผ่านไปยังเซิร์ฟเวอร์หรือหยุดความคืบหน้าของข้อความได้คําสั่งที่ได้รับการประเมินในตอนท้ายของข้อความจะถูกแท็กด้วย COMPLETED_MESSAGE_PROCESSOR ในขณะที่คําสั่งที่ได้รับการประเมินหลังจากแต่ละตัวอักษรจะถูกแท็กด้วย IN_PROGRESS_MESSAGE_PROCESSOR

ในทั้งสองประเภทของคำสั่ง โมดูลต้องส่งคืนสารานุกรมที่ระบุประเภทของโปรเซสเซอร์ที่คำสั่งควรใช้และฟังก์ชันที่จะดำเนินการเมื่อโปรเซสเซอร์ถูกเรียกตัวอย่างเช่น ตัวประมวลผลข้อความสําเร็จ ควรมีรูปแบบ:


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
}

โปรดทราบว่ารายการเอนทิตี KEY_COMMAND_PROCESSOR_TYPE ถูกนิยามไว้ในไดเรกทอรี Util ModuleScript ภายในไดเรกทอรี CommandModules

คำสั่งข้อความสําเร็จ

คําสั่งข้อความที่สําเร็จ จะถูกประเมินเมื่อผู้ใช้เสร็จสิ้นการพิมพ์และได้ตี Enterฟังก์ชันของโปรเซสเซอร์จะส่งวัตถุ ChatMessage ของไคลเอนต์ ChatWindow และตาราง ChatSettingsหากฟังก์ชันส่งคืนค่าเป็นจริงแล้วข้อความจะหยุดการประมวลผลและจะไม่ถูกส่งไปยังเซิร์ฟเวอร์มิฉะนั้นจะถูกส่งผ่านทุกโปรเซสเซอร์อื่นและในที่สุดไปยังเซิร์ฟเวอร์หากไม่มีโปรเซสเซอร์อื่นหยุดมัน

ตัวประมวลผลต่อไปนี้จะลบข้อความที่เก่าที่สุดในช่องปัจจุบันหากผู้ใช้ใส่คำสั่ง /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
}

คำสั่งที่กําลังดําเนินการ

คำสั่งที่กําลังดําเนินการอยู่ จะถูกประเมินทุกครั้งที่ผู้ใช้พิมพ์ตัวอักษรลงในช่องแชทตัวอย่างเช่น โค้ดต่อไปนี้เล่นคลักหลังจากทุกการกดปุ่มเพื่อให้เสียงเหมือนว่าผู้ใช้กำลังพิมพ์บนเครื่องพิมพ์:


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
}

คำสั่งที่กําลังดําเนินการมักใช้เพื่อสร้างสถานะที่กําหนดเอง สําหรับการส่งข้อความไปยังผู้ใช้เฉพาะ แทนที่จะเป็นช่องทางปัจจุบันเท่านั้นตัวอย่างเช่น ระบบ Whisper และ Team Chat ตรวจสอบว่าผู้ใช้พิมพ์ /whisper หรือ /team ตามลำดับและส่งข้อความที่เสร็จสมบูรณ์ไปยังผู้ใช้ที่เหมาะสมเท่านั้น

คาดว่าสถานะที่กําหนดเองจะเป็นตารางที่มีฟังก์ชันต่อไปนี้:

  • TextUpdated() — เรียกเมื่อข้อความในกล่องใส่เปลี่ยนแปลง
  • GetMessage() — เรียกหลังจากที่ผู้ใช้เสร็จสิ้นการป้อนข้อความและตี Enter คุณสมบัตินี้คาดว่าจะส่งคืนสตริง
  • ProcessCompletedMessage() — เรียกเมื่อข้อความกําลังถูกประมวลผลโปรเซสเซอร์สถานะที่กำหนดเองจะยิงเสมอก่อนโปรเซสเซอร์ข้อความที่สมบูรณ์แล้วเช่นเดียวกับโปรเซสเซอร์อื่นๆ ฟังก์ชันนี้ควรส่งคืนค่าเป็นจริงหากข้อความควรหยุดส่ง มิฉะนั้นควรส่งคืนค่าเป็นเท็จ
  • Destroy() — เรียกหลังจากส่งข้อความแล้ว ควรใช้เพื่อล้างสิ่งที่ติดตั้งโดยสถานะที่กําหนดเอง

เพื่อใช้สถานะที่กําหนดเอง ฟังก์ชัน ProcessMessage() ของโมดูลคําสั่งจะต้องส่งคืนสถานะสถานะที่กำหนดเองพื้นฐานจะใช้แบบฟอร์มต่อไปนี้:


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
}

หนึ่งในข้อดีหลักของการใช้สถานะที่กําหนดเองคือมอดูลสามารถแก้ไขแถบแชทและข้อความที่มีอยู่ในขณะที่ผู้ใช้กําลังพิมพ์ทั้งในแง่ของฟังก์ชันและรูปลักษณ์ แล้วจะรีเซ็ตได้ง่ายหลังจากนั้น (เมื่อส่งข้อความแล้วสถานะที่กําหนดเองจะถูกลบออกอัตโนมัติและทุกอย่างจะรีเซ็ตกลับเป็นปกติ)ตัวอย่างเช่น รหัสนี้ตั้งค่าสถานะที่กำหนดเองที่อนุญาตให้แสดงตัวอักษรเพียง 20 ตัวในช่องข้อความในแต่ละครั้งหากผู้ใช้ยังคงพิมพ์ต่อไป ตัวอักษรที่อยู่ตรงต้นของสตริงจะถูกลบชั่วคราวเมื่อผู้ใช้ส่งข้อความ ตัวอักษรทั้งหมดที่ถูกลบจะถูกเพิ่มกลับไปในข้อความ


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
}

ตามที่กล่าวไว้ก่อนหน้านี้เมื่อส่งข้อความแล้วสถานะที่กําหนดเองใดๆ จะถูกลบออกและการแชทจะถูกฟื้นฟูกลับเป็นปกติหากต้องรีเซ็ตสถานะที่กําหนดเองก่อนส่งข้อความ สถานะสามารถรีเซ็ตได้ด้วย ChatBar:ResetCustomState()โปรดทราบว่าสิ่งนี้จะลบความสนใจออกจากกล่องข้อความบนแถบแชทเช่นกัน

โมดูลผู้สร้างข้อความ

อีกประเภทของโมดูลที่สามารถใช้ในส่วนประกอบไคลเอนต์ได้คือโมดูล สร้างข้อความ ชนิดของโมดูลนี้ใช้สร้างองค์ประกอบ GUI ในหน้าต่างแชทเพื่อแสดงข้อความแต่ละประเภทของผู้สร้างข้อความจะกำหนดประเภทข้อความใหม่ดังนั้นข้อความที่แตกต่างกันสามารถสร้างได้ด้วยรูปแบบที่แตกต่างกันนอกจากนี้ องค์ประกอบ GUI สามารถเพิ่มลงในการแสดงข้อความได้อย่างนี้ซึ่งช่วยให้สามารถใส่รูปภาพ ปุ่ม และอื่นๆ ได้

พิมพ์ModuleScript ภายใน MessageCreatorModules นอกจากนี้ Chatſtandards ModuleScript พิมพ์พิมพ์

ตัวอย่างต่อไปนี้จะผ่านการสร้างบอทที่พูดถึงเวลาทุกๆ 5 วินาทีและข้อความที่ส่งได้รับพื้นหลังสีแดง

เพื่อเริ่มต้น, Chatſtandards ModuleScript จำเป็นต้องเพิ่มฟิลด์สําหรับประเภทข้อความใหม่


-- แชทConstants
local module = {}
--[[ประเภทข้อความ]]
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

บอทเองถูกสร้างใน ChatModule ใหม่บนเซิร์ฟเวอร์โปรดทราบว่าฟังก์ชันตัวกรองจะใช้เพื่อเพิ่มประเภทข้อความใหม่ลงในข้อความที่บอทส่ง


-- ModuleScript ใหม่ที่จะวางใน 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

สุดท้ายต้องสร้างโมดูลผู้สร้างข้อความโมดูลนี้ต้องส่งคืนสารานุกรมที่มีสององค์ประกอบ: ประเภทของข้อความที่ได้รับการจัดระเบียบด้วย KEY_MESSAGE_TYPE และฟังก์ชันที่จะเรียกเมื่อสร้างองค์ประกอบ GUI ของข้อความที่ได้รับการจัดระเบียบด้วย KEY_CREATOR_FUNCTION

ฟังก์ชันที่เก็บโดย KEY_CREATOR_FUNCTION ต้องส่งคืนสารานุกรมที่มีหลายส่วนก่อนอื่นต้องรวม Frame และ TextLabel ซึ่งจะแสดงในหน้าต่างแชทสิ่งเหล่านี้สามารถสร้างได้ด้วยฟังก์ชัน util:CreateBaseMessage()สารานุกรมยังต้องรวมฟังก์ชันที่จะดำเนินการหากข้อความของข้อความอัปเดตเมื่อข้อความปรากฏครั้งแรกในไคลเอนต์ พวกเขามีข้อความชั่วคราวว่างเปล่าในขณะที่ข้อความกําลังถูกประมวลผลและกรอง ดังนั้นวัตถุข้อความเช่นนี้จึงต้องจัดการสิ่งที่เกิดขึ้นเมื่อได้รับการโทรเพื่ออัปเดตต่อไป สารานุกรมจะต้องรวมฟังก์ชันเพื่อกำหนดความสูงของกรอบฟังก์ชันนี้มักเรียกฟังก์ชัน util:GetMessageHeight() บ่อยสุดท้าย สารานุกรมต้องรวมถึงหลายฟังก์ชันที่กำหนดวิธีที่องค์ประกอบควรจางไปเมื่อหน้าต่างจาง (ฟังก์ชันความสามารถสำหรับสิ่งนี้คือ util:CreateFadeFunctions() )


-- ModuleScript ใหม่ที่จะรวมอยู่ใน 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)
-- สร้างวัตถุ GUI สำหรับกรอบและ TextLabel เพื่อจัดเก็บข้อความ
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- เปลี่ยนพื้นหลังของกรอบเป็นสีแดง
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- จัดการข้อความป้อนชั่วคราวของการอัปเดต
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- ใช้ฟังก์ชัน util เพื่อกำหนดความสูงของกรอบ
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- สร้างฟังก์ชันเลือนที่เรียกเมื่อหน้าต่างแชทจาง
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- คืนสารานุกรมที่กำหนดฉลากข้อความ
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
}