Advanced Chatbox

Basit Sohbet Kutusuna Göre Avantajları

Bu yöntemi kullanarak bir sohbet kutusu yapmak, Basit Sohbet Kutusu kullanmaktan biraz daha zordur ve detaylara biraz daha fazla dikkat gerektirir, ancak sohbet kutusunu sadece yeniden tasarlamanın aksine size tam kontrol sağlar. Sohbet kutusunu temelden kodlayarak düğmeler, resim panelleri ve daha fazlasını ekleyebilirsiniz.

Başlarken

Kurulum

Basit sohbet kutusuyla aynı kurulum... DFrame, DTextEntry, RichText ve bir tablo.

myChat = {} myChat.dFrame = ... myChat.dTextEntry = ... myChat.dRichText = ...

İşte Facepunch kullanıcısı PortalGod tarafından hazırlanan bu tür bir sohbet kutusunun nasıl çalıştığına dair temel bir özet.

  • GM:PlayerBindPress içinde "messagemode"u devre dışı bırakın, bunun yerine vgui sohbet kutusunu açın ve metin girişine odaklanın.
  • myChat.dTextEntry:OnEnter içinde (veya OnKeyCodeTyped ile enter tuşunu kontrol ederek), RunConsoleCommand( "say", myChat.dTextEntry:GetText() ) komutunu çalıştırın ve sohbet kutusunu gizleyin.
  • chat.AddText fonksiyonunu ele geçirin ve argümanları kendiniz işleyin (RichText'e bakın), ancak renkli konsol metni için içinde orijinal chat.AddText'i çağırın.

Hook Ekleme

Yapmanız gereken ilk şey, oyuncunun sohbet tuşlarına basıldığında çağrılan fonksiyonu geçersiz kılmaktır, bunu bir PlayerBindPress hook'u içinde yaparsınız. Bu, oyuncu sohbet tuşlarına bastığında varsayılan sohbet kutusunun görünmesini engelleyecektir. Bu fonksiyonda sohbet kutunuzu açarsınız ve takım sohbeti için bir boolean argümanı eklemenizi şiddetle tavsiye ederim. Oyuncularınızın takımlarıyla konuşmaya çalışıp bunun genele gitmesi kötü olurdu.

hook.Add( "PlayerBindPress", "overrideChatbind", function( ply, bind, pressed ) local bTeam = false if bind == "messagemode" then print( "global chat" ) elseif bind == "messagemode2" then print( "team chat" ) bTeam = true else return end myChat.openChatbox( bTeam ) return true -- Bu tuş ataması için başka fonksiyonların çağrılmasına izin vermez end )

Şimdi, sv_cheats'in değiştirilmesi veya bir oyuncunun oyundan ayrılması gibi şeyler için mesajlar göstermek istersiniz, bu tür şeyler önemlidir.

hook.Add( "ChatText", "serverNotifications", function( index, name, text, type ) if type == "joinleave" or type == "none" then myChat.dRichText:AppendText( text .. "\n" ) end end )

Son olarak, kendi sohbet kutunuza kendi mesajlarınızı ekleyeceğiniz için varsayılan sohbet mesajlarını da gizlemelisiniz.

hook.Add( "HUDShouldDraw", "noMoreDefault", function( name ) if name == "CHudChat" then return false end end )

chat.AddText

Eğer chat.AddText'i geçersiz kılmazsanız, o fonksiyona yapılan tüm çağrılar gizlediğiniz varsayılan sohbet kutusunda görünecektir. Oyuncunun bunu görmesini istiyoruz, bu yüzden orijinal fonksiyonu kendimizinkiyle geçersiz kılacağız. Bu fonksiyonun kaynak kodu mevcut değildir, muhtemelen Lua'da yazılmamıştır, bu yüzden eski fonksiyonu kaydedip sadece onu çağıracağız. Argümanların üç nokta ... olduğunu fark edebilirsiniz - bu, temel olarak o fonksiyona hemen hemen her sayıda argüman gönderebileceğiniz anlamına gelen bir varargs'tır (değişken sayıda argüman).

local oldAddText = chat.AddText function chat.AddText( ... ) local args = {...} -- Değişken argümanlardan bir tablo oluştur for _, obj in ipairs( args ) do if type( obj ) == "table" then -- Bize bir renk nesnesi gönderildi myChat.dRichText:InsertColorChange( obj.r, obj.g, obj.b, 255 ) elseif type( obj ) == "string" then -- Bu sadece bir metin myChat.dRichText:AppendText( obj ) elseif obj:IsPlayer() then local col = GAMEMODE:GetTeamColor( obj ) -- Oyuncunun takım rengini al myChat.dRichText:InsertColorChange( col.r, col.g, col.b, 255 ) -- İsimlerini o renkte yap myChat.dRichText:AppendText( obj:Nick() ) end end -- Bu mesaj için satırı sonlandırmalıyız myChat.dRichText:AppendText( "\n" ) -- Orijinal fonksiyonu çağır oldAddText( ... ) end

İşlevselliği Geri Yükleme

Varsayılan sohbet kutusunu kendimizinkiyle geçersiz kıldığımıza göre, varsayılan sohbet kutusu tarafından çağrılan hook'lar artık çağrılmayacak. Bunu düzeltmemiz gerekiyor.

Sohbet kutunuzun metin girişinde, oyuncuya metni söylemesini belirtmelisiniz ki bunun için uygun oyun modu hook'ları çağrılsın. Ayrıca Escape tuşunun sohbet kutunuzu kapattığından emin olmak iyi bir fikir olur, bu yüzden bunu da hesaba katıyoruz.

myChat.dTextEntry.OnKeyCodeTyped = function( self, code ) if code == KEY_ESCAPE then -- İstemci escape tuşuna bastığında sohbet kutusunu gizlemek için geçici bir çözüm myChat.closeChatbox() gui.HideGameUI() elseif code == KEY_ENTER then -- İstemcinin enter tuşuna basmasını taklit et if string.Trim( self:GetText() ) != "" then LocalPlayer():ConCommand( "say " .. self:GetText() ) end myChat.closeChatbox() end end

Sohbet kutusunu açarken, o olay için olan fonksiyonu çağırmak ve ardından DTextEntry'nizin yazılabilir olduğundan emin olmak istersiniz.

function myChat.openChatbox() -- Diğer kodlar -- MakePopup, girdi fonksiyonlarını çağırır, bu yüzden bizim onları çağırmamıza gerek yok myChat.dFrame:MakePopup() myChat.dTextEntry:RequestFocus() hook.Run( "StartChat" ) -- Diğer kodlar end

Oyuncu sohbet kutunuzu kapattığında, tekrar hareket edebildiklerinden ve yine uygun oyun modu fonksiyonlarının çağrıldığından emin olmanız gerekir.

function myChat.closeChatbox() -- Diğer kodlar -- Oyuncuya kontrolü geri ver myChat.dFrame:SetMouseInputEnabled( false ) myChat.dFrame:SetKeyboardInputEnabled( false ) gui.EnableScreenClicker( false ) -- Sohbeti bitirdik hook.Run( "FinishChat" ) -- Metin girişini temizle myChat.dTextEntry:SetText( "" ) hook.Run( "ChatTextChanged", "" ) -- Diğer kodlar end

Sonuç

Özet

Bu hızlı ve kodlama açısından çok az şey kapsasa da, umarım kendi sohbet kutusunu kodlamak ve ona kendi yorumunu katmak isteyen herkes için yararlı bir araç olur. Herhangi bir görsel kod olmadan, bir nevi arka plan (backend) olarak bu ölçekte bir sohbet kutusu oluşturmak için kullanılan temelleri içerir. Bu, varsayılan olarak gömülebilir resimlere sahip olmak gibi süslü bir şey yapmaz, ancak bunu bir temel olarak kullanarak mümkündür.

Örnekler

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord