تقدم Roblox ميزة الدردشة النصية بين اللاعبين في الجلسات المباشرة من خلال TextChatService، وهي فئة مفردة مسؤولة عن إدارة نظام الدردشة بشكل عام، بما في ذلك تصفية رسائل الدردشة، والاعتدال، وإذن المستخدمين. تتمتع هذه الخدمة بوظائفها القياسية وتوفر أيضًا مجموعة من الطرق والأحداث لتمديد وتخصيص الدردشة، مثل تسليم الرسائل استنادًا إلى متطلبات مخصصة، وإضافة إذن خاص أو اعتدال للاعبين محددين، وإنشاء أوامر مخصصة لتنفيذ إجراءات معينة.
تكوين واجهة المستخدم
توفر TextChatService واجهة مستخدم افتراضية يمكن تخصيصها لتناسب احتياجات لعبتك. قم بإيقاف أي من هذه التكوينات لإخفاء عنصر واجهة المستخدم المرتبط بها. إذا رغبت في ذلك، يمكنك أيضًا استبدال هذه العناصر بواجهات مخصصة:
للمزيد من المعلومات، انظر نافذة الدردشة والدردشة الفقاعة.
القنوات والرسائل والأوامر
TextChannel — تمر قنوات النص الرسائل التي يرسلها المستخدم من العميل إلى الخادم، الذي يعرضها بعد ذلك للمستخدمين الآخرين بناءً على الأذونات. يجب أن تكون قنوات النص مرتبطة بـ TextChatService لكي تعمل.
TextSource — مستخدم في قناة نصية TextChannel. يتم ربط مصادر النص مباشرة بقناة النص عند استدعاء AddUserAsync(). تحتوي مصادر النص على أذونات تفصيلية للمستخدم في القناة، مثل قدرته على إرسال الرسائل. إذا كان هناك مستخدم واحد في عدة قنوات نصية، فسيتم ربطه بمصادر نصوص متعددة.
TextChatMessage — رسالة في قناة نصية. تحتوي رسائل الدردشة على معلومات أساسية مثل مرسل الرسالة، الرسالة الأصلية، الرسالة المصفاة، وتاريخ ووقت الإنشاء.
TextChatCommand — يسمح للمستخدمين باستدعاء إجراءات أو سلوكيات محددة عن طريق إرسال رسائل تتطابق مع خصائص PrimaryAlias أو SecondaryAlias. يجب ربط أوامر الدردشة بـ TextChatService لكي تعمل.
مخطط تدفق الدردشة
تستخدم الدردشة النصية نموذج العميل-الخادم، مع عميل الإرسال، والخادم، والعملاء المتلقين.

يقوم لاعب بإرسال رسالة من جهازه المحلي، مما يؤدي إلى استدعاء طريقة TextChannel:SendAsync(). تقوم هذه الطريقة بمعالجة الرسالة وتحديد ما إذا كانت أمر دردشة أو رسالة دردشة عادية.
إذا كانت الرسالة أمر دردشة، يتم استدعاء الحدث TextChatCommand.Triggered لأداء الإجراء المحدد. لا توجد خطوات إضافية مطلوبة.
إذا كانت الرسالة عبارة عن رسالة دردشة عادية، يتم استدعاء الحدث TextChatService.SendingMessage لعرض الرسالة على المرسل في عميل الإرسال. في نفس الوقت، تقوم TextChannel:SendAsync() بتمرير الرسالة إلى الخادم.
يقوم الخادم بإطلاق TextChannel.ShouldDeliverCallback لتحديد ما إذا كان يجب تسليم الرسالة للاعبين الآخرين بناءً على الأذونات ومتطلبات تصفية مجتمع Roblox.
إذا كان TextChannel.ShouldDeliverCallback يحدد أن الرسالة مؤهلة للتسليم إلى لاعبين آخرين، يقوم الخادم بتطبيق أي مرشحات ويطلق TextChannel.OnIncomingMessage مرتين:
المرة الأولى تكون على عميل الإرسال وتوضح أن الخادم يقوم بمعالجة الرسالة من خلال حدث TextChatService.MessageReceived. هذا الحدث يستبدل الرسالة المحلية على عميل الإرسال بالرسالة المعالجة من الخادم. تكون الرسالة متطابقة إذا لم تتطلب الأصل تصفية.
المرة الثانية تكون على العملاء المتلقين، مما يؤدي إلى استدعاء حدث TextChatService.MessageReceived لعرض الرسالة على لاعبين آخرين.
روابط الدردشة النصية والاسترجاعات
تشجع واجهة برمجة التطبيقات TextChatService على فصل واضح بين مظهر ورسائل الدردشة. توفر نسخ متعددة من نظام الدردشة النصية روابط واسترجاعات لتنسيق في مواقع مركزية وواضحة.

تسليم الرسائل بشكل شرطي
يجب تعريف استرجاع TextChannel.ShouldDeliverCallback على الخادم فقط. يتم استدعاء الاسترجاع لكل عنصر فرعي TextSource لقناة النص عند إرسال رسالة لتحديد ما إذا كان يجب تسليم الرسالة. يمكن استخدام هذا الاسترجاع لتنفيذ منطق تسليم رسائل مخصص قد يعتمد على سياق اللعب الإضافي، مثل:
- الدردشة القريبة حيث يمكن للمستخدمين إرسال رسائل فقط لأولئك القريبين منهم.
- منع المستخدمين الذين لديهم سمات معينة من إرسال رسائل للآخرين.
تخصيص عرض الرسائل
تعتمد واجهة مستخدم TextChatService الافتراضية على نص غني لتنسيق وتخصيص كيفية عرض الرسائل. يمكنك استخدام الاسترجاعات التالية لتنسيق الرسائل قبل عرضها على المستخدمين، على سبيل المثال لإضافة ألوان أو علامات دردشة إلى أسماء المستخدمين أو تنسيق محتوى الرسالة.
يتم استدعاء الاسترجاعات التالية على كل TextChatMessage جاهز للعرض، مما يتيح لك تخصيص مظهر نافذة الدردشة بناءً على محتوى TextChannel و TextSource أو TextChatMessage. عندما يرسل عميل رسالة، يتم استدعاء هذه الاسترجاعات مرة واحدة عندما يتم إرسال الرسالة إلى الخادم وتكون قيمة TextChatMessage.Status هي Enum.TextChatMessageStatus.Sending. بمجرد استلام الرسالة بواسطة الخادم وتكون قيد التسليم للمستخدمين الآخرين، يتلقى عميل المرسل الرسالة مرة أخرى مع قيمة محدثة لـ Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — يجب تعريف هذا الاسترجاع على العميل فقط. يتم استدعاء الاسترجاع عندما يتم استلام رسالة، سواء من الخادم أو إذا كان العميل المحلي قد أرسل للتو رسالة. يتم استدعاء الاسترجاع على كل TextChatMessage تم استلامه من جميع حالات TextChannel ويكون الأول في معالجة الرسالة قبل عرضها على المستخدم.
- TextChannel.OnIncomingMessage — يجب تعريف هذا الاسترجاع على العميل فقط. يتم استدعاء الاسترجاع عندما يتم استلام رسالة من الخادم. يتم استدعاء الاسترجاع على كل TextChatMessage تم استلامه من TextChannel. حالات TextChannel الافتراضية التي تم إنشاؤها من TextChatService.CreateDefaultTextChannels لديها هذا الاسترجاع المحدد ويمكن الكتابة فوقه.
- TextChatService.OnBubbleAdded — يجب تعريف هذا الاسترجاع على العميل فقط. استخدمه لتخصيص مظهر فقاعات الدردشة بشكل مستقل عن مظهر الرسالة في واجهة مستخدم نافذة الدردشة.
- TextChatService.OnChatWindowAdded — يجب تعريف هذا الاسترجاع على العميل فقط. استخدمه لتخصيص مظهر رسائل الدردشة في واجهة مستخدم نافذة الدردشة بشكل مستقل عن مظهر الرسالة في فقاعات الدردشة.
الانتقال من الدردشة القديمة
تساعدك هذه الفقرة في الانتقال من نظام الدردشة القديم من خلال توفير طرق بديلة لتنفيذ وظائف وسلوكيات الدردشة الشائعة باستخدام TextChatService.
في نافذة Explorer، حدد TextChatService.
في نافذة Properties، ابحث عن قائمة المنسدلة ChatVersion وحدد TextChatService.

الوظائف الأساسية
على الرغم من أن كلا النظامين يتشاركان نفس وظائف الدردشة الأساسية، إلا أن تنفيذات TextChatService عادةً ما تكون أكثر استدامة وأسهل في التكرار.
| الوظيفة | الدردشة القديمة | TextChatService | الاختلافات |
|---|---|---|---|
| إرسال رسالة دردشة | Players:Chat() | TextChannel:SendAsync() | تدعم طريقة SendAsync() ميزات دردشة أكثر تقدمًا، مثل تنسيق النص الغني وأولوية الرسائل. كما أنها تتضمن تصفية مدمجة للمساعدة في منع إرسال الرسائل غير اللائقة. |
| تنفيذ استرجاعات الرسائل | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | يربط نظام الدردشة القديم وظيفة بأحداث نظام الدردشة لتسليم الرسائل. تقدم الطريقتان من TextChatService مرونة وتخصيصًا أفضل. |
| إضافة أوامر دردشة مخصصة | وحدة ChatService/ChatCommand | TextChatCommand | تحتوي TextChatService على فئة مخصصة للأوامر النصية بدلاً من استخدام وحدة دردشة قديمة. |
| عرض رسالة نظام | StarterGui:SetCore() باستخدام ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | يمكن أن يُرجع استرجاع TextChannel.OnIncomingMessage مثيلاً من TextChatMessageProperties لتخصيص مظهر الرسالة. |
| تعطيل الدردشة | إعدادات التجربة في Studio ووحدة ChatWindow/ChatSettings لإخفاء نافذة الدردشة | ChatWindowConfiguration.Enabled |
تصفية الرسائل
تقوم TextChatService بتصفية رسائل الدردشة تلقائيًا بناءً على معلومات حساب كل لاعب، لذا لا تحتاج إلى تنفيذ تصفية النص يدويًا لجميع أنواع رسائل الدردشة.
| الوظيفة | الدردشة القديمة | TextChatService |
|---|---|---|
| تصفية رسالة دردشة للاعب الفردي | Chat:FilterStringAsync() | تلقائي |
| تصفية الرسائل المبثوثة | Chat:FilterStringForBroadcast() | تلقائي |
نافذة الدردشة والدردشة الفقاعة
سلوك وخيارات تخصيص كل من نافذة الدردشة والدردشة الفقاعة لـ TextChatService متطابقة مع تلك الخاصة بنظام الدردشة القديم. حيث إن نظام الدردشة القديم يسمح فقط بالتخصيص باستخدام وحدات الدردشة أو حاوية Players، توفر الخدمة فئات مخصصة (ChatWindowConfiguration و BubbleChatConfiguration) لإدارة جميع خصائص نافذة الدردشة والدردشة الفقاعة. بالإضافة إلى ذلك، يمكنك بسهولة ضبط ومعاينة مظهر الدردشة الفقاعة وسلوكها باستخدام إعدادات Studio بدلاً من الحاجة إلى كتابة برنامج نصي لها جميعًا.
| الوظيفة | الدردشة القديمة | TextChatService |
|---|---|---|
| تمكين نافذة الدردشة | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| تمكين دردشة الفقاعة | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| تعيين خصائص نافذة الدردشة | Players:SetChatStyle() | ChatWindowConfiguration |
| تعيين خصائص دردشة الفقاعة | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| تمكين فقاعات NPC | Chat:Chat() | TextChatService:DisplayBubble() |
نقل "بيانات إضافية" المتحدث
سمح نظام الدردشة Lua القديم للمطورين باستخدام SetExtraData على فئة Speaker. تم استخدام هذه البيانات لتنسيق لون الاسم، لون الدردشة، أو لتطبيق علامات الاسم لمتحدث معين.
نظام الدردشة القديمة SetExtraData
-- مثال على تعيين بيانات إضافية لمتحدث في نظام الدردشة القديم
ChatService.SpeakerAdded:Connect(function(playerName)
local speaker = ChatService:GetSpeaker(playerName)
speaker:SetExtraData("NameColor", Color3.fromRGB(255, 255, 55))
speaker:SetExtraData("ChatColor", Color3.fromRGB(212, 175, 55))
speaker:SetExtraData("Tags", {{TagText = "YourTagName", TagColor = Color3.fromRGB(0, 255, 0)}, {TagText = "OtherTagName", TagColor = Color3.fromRGB(255, 0, 0)}})
end)
لا تحتوي TextChatService على معادل مباشر لـ SetExtraData. بدلاً من ذلك، استخدم الاسترجاعات مثل OnWindowAdded لتخصيص مظهر الرسائل باستخدام النص الغني استنادًا إلى TextSource للرسالة.
فيما يلي مثال على محاكاة "البيانات الإضافية" لنظام دردشة Lua القديم من خلال الوصول إلى السمات على كائنات Player:
TextChatService SetAttributes
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
player:SetAttribute("NameColor", Color3.fromRGB(255, 255, 55))
player:SetAttribute("ChatColor", Color3.fromRGB(212, 175, 55))
player:SetAttribute("isYourTag", true)
player:SetAttribute("isOtherTag", true)
end)
ثم يمكنك استخدام الاسترجاع OnChatWindowAdded لتخصيص مظهر نافذة الدردشة استنادًا إلى السمات التي تم تعيينها على اللاعب:
TextChatService OnChatWindowAdded
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
TextChatService.OnChatWindowAdded = function(textChatMessage)
local textSource = textChatMessage.TextSource
if textSource then
local player = Players:GetPlayerByUserId(textSource.UserId)
if player then
local overrideProperties = TextChatService.ChatWindowConfiguration:DeriveNewMessageProperties()
overrideProperties.PrefixText = textChatMessage.PrefixText
overrideProperties.Text = textChatMessage.Text
local nameColor = player:GetAttribute("NameColor")
if nameColor and typeof(nameColor) == "Color3" then
overrideProperties.PrefixTextProperties.TextColor3 = nameColor
end
local chatColor = player:GetAttribute("ChatColor")
if chatColor and typeof(chatColor) == "Color3" then
overrideProperties.TextColor3 = chatColor
end
local isYourTag = player:GetAttribute("isYourTag")
if isYourTag == true then
overrideProperties.PrefixText = `<font color='rgb(0, 255, 0)'>[YourTag]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[OtherTag]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end