# Advanced Chatbox

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/Advanced_Chatbox
- **Çeviri tarihi:** 2025-09-30

## Basit Sohbet Kutusuna Göre Avantajları

Bu yöntemi kullanarak bir sohbet kutusu yapmak, [Basit Sohbet Kutusu](https://gmod.tr/wiki/Basic_Chatbox) 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.

```lua
myChat = {}

myChat.dFrame = ...
myChat.dTextEntry = ...
myChat.dRichText = ...
```

İşte Facepunch kullanıcısı [PortalGod](http://facepunch.com/member.php?u=235325) tarafından hazırlanan bu tür bir sohbet kutusunun nasıl çalıştığına dair temel bir özet.

- [GM:PlayerBindPress](https://gmod.tr/wiki/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](https://gmod.tr/wiki/TextEntry:OnKeyCodeTyped) ile enter tuşunu kontrol ederek), `RunConsoleCommand( "say", myChat.dTextEntry:GetText() )` komutunu çalıştırın ve sohbet kutusunu gizleyin.
- [chat.AddText](https://gmod.tr/wiki/chat.AddText) fonksiyonunu ele geçirin ve argümanları kendiniz işleyin ([RichText](https://gmod.tr/wiki/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.

```lua
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.

```lua
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.

```lua
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).

```lua
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.

```lua
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.

```lua
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.

```lua
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

- Earu's Chatbox - [https://github.com/Earu/EasyChat](https://github.com/Earu/EasyChat)
- Exho's Chatbox - [https://github.com/Exho1/eChat](https://github.com/Exho1/eChat)
- Custom chat by StyledStrike - [https://github.com/StyledStrike/gmod-custom-chat](https://github.com/StyledStrike/gmod-custom-chat)

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/Advanced_Chatbox
