Miras Koltuğu 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.

Hierarchi

Miras kayıt sistemi, 클ライアント-sunucu modeli kullanır. Sunucu tarafı sohbet modülü komponentleri ChatChannel ve ChatSpeaker yönetimi 1>ChatService1> üzerindeki sunucudan, 4>Class.RemoteEvent|RemoteEvents4> kullanarak otomatik olarak işlen

Class.Sohbet motoru kendisi, sohbet sistemi için gerekli depolama birimi: bir Roblox yerini yüklediğinde (either in the client or in Studio when running or playing), şu komponentler otomatik olarak Chat hizmetine yüklenecektir, if Chat.LoadDefaultChat doğruysa.

  • ChatModuleleri — Bu Folder bir modül koleksiyonu, ChatServiceRunner tarafından gerektirildiği için. Tüm içerikler bu klasörün içeriği tarafından kullanılır ve sunucuda özelleştirilmiş davranış oluşturmak için kullanılır.
  • ClientChatModuleScript — Bu klasör, ModuleScripts tarafından gerektirilen çeşitli Class.ModuleScript|ModuleScripts içerir.
    • Komut Modülleri — İçerisinde kullanıcı tarafından gerçekleştirilen sohbet komutlarını uygulayan modüller bulunur.
    • Mesaj Oluşturucu Modülleri — Mesajları işleyen ve biçimlendiren modülleri içerir.
    • Sohbet — Sunucu ve istemci tarafından paylaşılan konstantları içerir.
    • ChatSettingsSohbet Penceresi ile ilgili farklı yönlendirmeleri yapılandırmak için çeşitli ayarları depolar.
  • ChatLocalization — Teks terimlerini depolayan veritabanı.
  • ChatServiceRunner — Bu, Script sunucu bileşenini çalıştırır. Genel olarak, özel sohbet davranışı ve işlevselliği oluşturmak için değiştirilmesi gerekmez.
  • Konuşma balonu — Oyun içi avatarınızın üzerinde kullanıcı sohbet mesajlarını gösterir (aktifleştirildiğinde).
  • ChatScript — Bu, sohbetin klien bileşenini çalıştırır. Like ChatServiceRunner, bu'nun klien'i özelleştirmek için değiştirilmesi gerekmez. Oyun bu getirilir otomatik olarak LocalScript ile.

Sohbet Sistemini Modifikasyon

Miras kayıt sistemini modifiye etmek veya özelleştirmek için, önce yukarıdaki hiyerarşi kopyasını yapmalısınız.

  1. In the Explorer window, locate TextChatService . Then, in the Properties window, set the 1> ChatVersion1> property to 4> LegacyChatService4> .

  2. Deneyimi Oyna düğmesini kullanarak (F5).

  3. Eklenenleri seç ve kopyala ( CtrlC veya C ) 2>Class.Sohbet2> .

  4. Stop deneyimini durdurmak için Dur düğmesini kullanın ( ShiftF5 ).

  5. Select Chat ve Ctrl 0> Shift0> 2> V2> veya 5> ⌘5> 7> Shift7> 9> V9>). 2>Kopyalanan nesneler2> deneyim çalışırken

  6. Class.Sohbet.LoadDefaultChat ın etkinleştirildiğinden emin olun.

Sohbet İşlemleri

Sohbeti özelleştirmek için modül oluşturmak önce, bir sohbet mesajının iş akışını anlamak önemlidir. Tekst mesajları göndermekle birlikte, sohbet sistemine birçok komut oluşturulmuştur, bu yüzden her mesajın bir komut olarak veya sadece bir metin mesajı olarak işlenmesi gerektiğini görmek için her mesajın kontrol ed

Bir kullanıcı sohbet alanına odaklanır ve bir karakter girer, birkaç kontrol derhal kullanıcının işlemci üzerinde yapılır. Eğer karakter Esc

Sohbetin klien tarafındaki iki tür işlemci vardır: Devam Ediyor ve Tamamlandı. Bu, her karakterin yazıldıktan sonra değerlendirilir, bu nedenle kullanıcının yazıp Enter tuşuna basmasıyla sadece değerlendirilir.

Kullanıcının metni yazdıktıktan sonra Enter tuşuna basınca, girdiği metinin üzerindeki birkaç komut işlemcisi tarafından gönderilir. Eğer bir Yapımda komutu yapıldıysa, sunucu,

Mesaj sunucuya ulaştığında, bir başka komut işlemcisi setiyle ilerler. Tıpkı Tamamlandı işlemcilerinde olduğu gibi, bu işlemcilerin her biri geri döndüğünde, mesaj durur. Aksi takdirde, mesaj bir dizi filtre (varsayılan Roblox sohbet filtresi dahil) aracılığıyla gönderilir. Bu i

Sunucu Modülleri

Modüller SohbetModülleri içine koyulabilir, çeşitli amaçlar için kullanılabilir. Bu modüller, sohbet kanallarını ve konuşmacıları yönetmek, filtre ve komut işlevlerini eklemek, sohbet botlarını veya sunucudaki herhangi bir şeyi işlemek için gereken her şeyi işlemek için kullanılabilir. Chat sistemi ile etkile

ChatServiceRunner başladığında, ChatModule içindeki her modül gerekir. Her modülün bir işlevi döndürmesi beklenir, böylece her modülün sırasıyla ChatService nesnine bir işlevi döndürür. Bot'u çalıştırmak, filtre işlevini eklemek vb. gibi her modül

Örnek Modül Çerçevesi

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

Kanallar Ekleme

Bir SohbetModülü nin yapabileceği en basit şeylerden biri, kanalları yönetmektir. Kanal objeleri, AddChannel() metoduyla, 1>ChatService1> veya 4>ChatSpeakers4> konumlar


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

Basit Kanal Yapılandırması

Kanalların birkaç özelliği vardır ki onları hafif modifiye etmek için kullanılabilir. Örneğin, bu modül bir kanal oluşturur ve Giriş Mesajını ayarlar ve kullanıcılar deneyime girerken otomatik olarak kanala katılır.


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- Kullanıcı bir kanala katıldığında gösterilen mesajı ayarlar
myChannel.WelcomeMessage = "Welcome to my channel!"
-- Oyuncular oyuna girdiğinde kanala otomatik olarak katılmasını sağlar
myChannel.AutoJoin = true
end
return Run

Kanal Etkinlikleri

kanalbirden fazla etkinliği vardır. Bu etkinlikler bir SohbetMesajı yayınlandığında, bir Sohbet Konuşmacısı ayrıldığında veya katıldığında, veya bir konuşmacı susturulduğunda, tüm konuş


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?

Sohbet Modülü bununla birlikte, sohbet ile ilgili diğer işlevleri de komutlar olarak

Komut işlevleri genellikle Yönetici Komutları uygulamak için kullanılır, bu, belirli kullanıcıların sohbette belirtilen metin komutlarını kullanarak deneyim devletini manipüle etmesine izin veren metin komutlarıdır.

Bu örnekte bir SohbetModülü kullanılarak bir Part oluşturulur, bir kullanıcı sohbette /part yazarsa. Bu işlevin geri dönüşü doğru olduğunu gösterir ve hiçbir mesaj gösterilmez. Bir işlev oluşturulmadıysa, bu iş


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 ChatChannels hem de ChatService kendisi sohbet komutları olabilir. 0>ChatService0> komut işlemcisi, sunucuya gönderilen her mesajda çalışacakken, kanal komutları sadece kaydedilen kanal için çalışacaktır.

Fonksiyonları Filtrele

Bir Komut Fonksiyonu tarafından durdurulmayan mesajlar, ChatService ve ilgili kanallara kaydedilen tüm filtre işlevleri aracılığıyla geçecektir. Her filtre işlevi hoparlöradlı mesajın, mesajın nesnesi ve kanal ismi içerir. Herhangi bir mesajın 1>mesajı1>

Bu örnekte, her mesajın büyük harf olmadan görünmesi için basit bir filtre işlevi kaydedilmiştir.


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

ClientChatModule içine koyulan modüller, müşteriler için özel davranışlar oluşturmak için kullanılabilir. Bu modüller iki farklı klasöye ayrılır: Komut Modülleri ve Mesaj Oluşturucu Modülleri.

Komut Modülleri

Komut Modülleri çok benzer şekilde çalışır modüller sunucuda Komut Fonksiyonları kaydolur. Bu modüller, kullanıcının metni girmeye başladıktan sonra ateşlenen işlev

Her iki türde de komutun kullandığı işlemci türü ve çağrıldığında hangi işlevi yerine getireceğini belirten bir sözlük döndürmelidir. Örneğin, bir tamamlanmış mesaj işlemcisi şu 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 edin ki KEY_COMMAND_PROCESSOR_TYPE kütüphanesi Util ModuleScript içindeki 1>CommandModuleScript1> kütüphanesine işaret edilmiştir.

Mesaj Komutları Tamamlandı

Mesaj Komutları Tamamlandığında Değerlendirilir Mesajın yazıldığında ve Enter tuşuna basıldığında işlem tamamlanır. Prosesin işlevi ChatMessage objesine, sunucu0>Chat

Örneğin, aşağıdaki işlemci, kullanıcının komutu /last girdiğinde mevcut kanalda en eski mesajı kaldırı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
}

Yapımda Komutlar

Devam eden komutlar her kullanıcının bir karaktere sohbete yazdığında değerlendirilir. Örneğin, aşağıdaki kod her tuşa basıldığında bir çıkır çıkartır yapar ve bir kullanıcının bir tip yazıcısında yazdığı gibi ses çıkarır:


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
}

Gerçekleştirilen komutlar genellikle sohbetin sadece mevcut kanalın yerine belirli kullanıcılara mesaj göndermesi için bir Özel Durum oluşturmak için kullanılır. Örneğin, Söze ve Takım sohbet sistemleri, kullanıcının /whisper veya /team y

Özel bir devlet, aşağıdaki işlevlerle tabloyu olmalıdır:

  • TextUpdated() — Giriş kutusundaki metin değiştirildiğinde çağrılır.
  • GetMessage() — Mesajın girildiğinden sonra çağrılır ve Enter’e vurur. Bu işlev, bir dizi dönüştürür.
  • ProcessCompletedMessage() — Mesaj işleniyor olarak adlandırıldı. Özel bir durum işlemcisi, mesaj işleniyor işlemcileri tamamlandığında hemen önce ateşlenir. Diğer işlemciler gibi, bu işlev geri döndüğünde doğru olmalıdır, aksi takdirde yanlış olmalıdır.
  • Destroy() — Mesaj gönderildikten sonra çağrılır. Özelleştirilmiş devlet tarafından kurulan her şeyi temizlemek için kullanılmalıdır.

Özel bir devleti kullanmak için, komut modülünün ProcessMessage() işlevi devleti geri vermelidir. Temel bir özel devlet şu şekilde görünecektir:


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
}

Özelleştirilmiş bir devlet kullanmanın bir başka avantajı, modülün sohbet kutusunu ve içeriğini kullanıcı tarafından her iki kullanıcı tarafından da dahil olmak üzere her iki kullanıcı tarafından da düzenleyebilmesidir


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önderildiğinde herhangi bir özel durum kaldırılır ve sohbet normalleştirilir. Mesaj gönderilmeden önce bir özel durumu sıfırlamak gerekiyorsa, özel durum ChatBar:ResetCustomState() ile sıfırlanabilir. Chat barının metin kutusundaki odak kaldırılır.

Mesaj Oluşturucu Modülleri

Kullanıcı bileşeninde kullanılan başka bir modül ise bir Mesaj Oluşturucu modülü. Bu tip modül, mesajı görüntülemek için sohbet penceresindeki GUI elemanlarını oluşturur. Her türlü mesaj yapıcının kullanıcı arayüzleriyle görüntülenebileceği gibi, bu tür bir

Bu modüller birkaç farklı yerde kurulması gerekir. Her mesaj yaziçin, ModuleScript içinde bir ChatCreatorModule olmalıdır. Ayrıca, ChatConstructors içindeki 2>Sohbet Sınırları2> 5>Class.ModuleScript5> içine değiştir

Aşağıdaki örnek, her 5 saniyede bir saat zamanını söyleyen bir bot yapacağız ve gönderilen mesajın kırmızı bir arka plan almasını sağlayacağız.

Başlamak için, ChatCommands ModuleScript yeni mesaj türü için bir alan gerekir.


-- Sohbet Etme
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

Bot kendisi yeni bir ChatModule üzerinde oluşturulmuştur. Ayrıca, bir filtre işlevi kullanılarak bot'un gönderdiği mesajların mesajlarına eklenir.


-- ChatModule'a yerleştirilecek yeni ModülScript
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 oluşturucu modülü yapılmalıdır. Bu modül, mesajın türünü içeren bir sözlük ile geri döndümelidir: KEY_MESSAGE_TYPE ve mesaj GUI elemanlarını oluştururken çağrılan işlevi KEY_CREATOR_FUNCTION .

KEY_CREATOR_FUNCTION tarafından depolanan işlev, bir sözlüğü birkaç bileşenle birlikte gösterir. İlk olarak, Class


-- MessageCreatorModules'da yer alacak yeni bir 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 GUI nesnelerini oluşturun
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- Çerçevenin arka planını kırmızıya değiştir
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- Yerleştirici mesajı metnini güncellemeyi ele al
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- Çerçevenin 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 solgunma efektleri 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üğü döndür
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
}