Discord sunucumuz açılmıştır, hepinizi bekleriz

https://discord.gg/43gGDQe6tS

Eklenti yazılırken yapılan hatalar & çözümleri

Hazır fonksiyonlar, kütüphaneler, düzenleme programları/araçları/gereçleri, editörler kısacası geliştirme ortamı

Moderatör: Moderatörler

Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Colditz »

Merhaba CSDurağı forumu sakinleri;
Eklentilerde yapılan hataları ve çözümlerini anlattım. Umarım daha güzel yazılmış eklentiler görürüm. :)


1. PreThink & PostThink gibi komutlar
PreThink komutu oyuncuya saniyede çok kez gönderildiği için çok önemli bir komuttur.

Yapılan büyük yanlış; [Oyuncuların ölü olup olmadığını vs tanıtma;]

Kod: Tümünü seç


public plugin_init()
{
	RegisterHookChain(RG_CBasePlayer_PreThink, "CBasePlayer_PreThink");
}

public CBasePlayer_PreThink(const id)
{
	if(get_user_team(id) == 2 && is_user_alive(id))
	{
		//blabla
	}
}
Defalarca oyuncunun takımını algılıyor ve ölü olmadığını algılıyor.
Bunun yerine bir değişken oluşturacağız.

Kod: Tümünü seç


new bool:ctveyasiyor[33];

public plugin_init()
{
	RegisterHookChain(RG_CBasePlayer_PreThink, "CBasePlayer_PreThink");
	RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn");
	RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed");
}

public CBasePlayer_PreThink(const id)
{
	if(ctveyasiyor)
	{
		//blabla
	}
}

public CBasePlayer_Spawn(const id)
{
	/*
	if(!is_user_alive(id))
	{
		return;
	}
	// Bunu kullanabilirsiniz. Bug olursa kesin çözümü
	*/

	if(get_member(id, m_iTeam) == TEAM_CT && is_user_alive(id)) // Reapi ile ct olduğunu tanıtmak
	{
		ctveyasiyor[id] = true;
	}
	
	// veya (fark etmez)  [reapi önerilir, biraz daha hızlı]

	if(get_user_team(id) == 2 && is_user_alive(id)) // Reapi ile ct olduğunu tanıtmak
	{
		ctveyasiyor[id] = true;
	}
	
}

public CBasePlayer_Killed(const victim, const attacker)
{
	// Bu komutu kullanmak zorunda değilsiniz. Attacker kullanmadığımız için yazdım.
	#pragma unused attacker

	ctveyasiyor[id] = false;
}
2. Switch
Switch komutu eklentide bir değişkenin veya komutun değerlerini algılamamızı sağlıyor.
İf ile tanıtmaktan daha iyi ve hızlı.

Yapılan hata [Bir değişken oluşturmadan değer algılatmak

Kod: Tümünü seç

switch(str_to_num(data))
{
	//blabla
}
Bunun yerine değişken oluşturacağız.

Kod: Tümünü seç

new key = str_to_num(data);
switch(key)
{
	//blabla
}
3. Set_Task
Aynı PreThink açıklamasındaki gibi yapılan bir hata.
'0.1' olarak ayarlanan bir task olayında ölü ve takım algılatması;
Bu sefer bot olup olmadığı şeklinde örnek vereceğim.

Kod: Tümünü seç

public bilmemne(id)
{
	set_task(0.1, "loc_pec_wec", id, _, _, "b"); // 0.1 saniyede bir gönderilecek
}

public loc_pec_wec(id)
{
	if(is_user_bot(id))
	{
		client_print_color(id, id, "Sen botsun.");
	}
}
Doğru kullanımı;

Kod: Tümünü seç

new bool:bot[33];

public client_putinserver(id)
{
	if(is_user_bot(id))
	{
		bot[id] = true;
	}
	
	// veya
	
	bot[id] = is_user_bot(id) ? true:false; // botsa true değilse false
}

public bilmemne(id)
{
	set_task(0.1, "loc_pec_wec", id, _, _, "b"); // 0.1 saniyede bir gönderilecek
}

public loc_pec_wec(id)
{
	if(bot[id])
	{
		client_print_color(id, id, "Sen botsun.");
	}
}
4. Bool nedir, nasıl kullanılır?
Eklentilerde pek çok gördüğümüz, bildiğimiz fakat kullanamadığımız veya bilmediğimiz bool?
Bir değişken eğer sadece 1-0 olarak ayarlanacaksa bool kullanılmalı.

Yapılan yanlış [degisken = 1 ; degisken = 0]

Kod: Tümünü seç

new bot[33];

public client_putinserver(id)
{
	if(is_user_bot(id))
	{
		bot[id] = 1;
	}
}
Bool kullanılmalı;

Kod: Tümünü seç

new bool:bot[33];

public client_putinserver(id)
{
	if(is_user_bot(id))
	{
		bot[id] = true;
	}
}
5. Cvar oluşturmak
1.8.3 e kadar bir sorun yoktu fakat değişti.
Artık kullanalım;

Yapılan yanlış [register_cvar & 0 - 1]

Kod: Tümünü seç

new lololol;

public plugin_init() {
	lololol = register_cvar("bh_enabled", "1");
}

public blabla(id)
{
	if(get_pcvar_num(lololol))
	{
		//blabla
	}
}
Burada yine bool kullanılmamakta. Ve register_cvar yerine bu komut daha kullanışlı ve hızlı.
Sunucuda olan cvarlar için get_cvar_pointer ve get_pcvar_ num,string...

Kod: Tümünü seç

new bool:lololol;
new normalcvar;
new mp_freeforall; // ff cvarı her sunucuda var (CSDURAGI)

public plugin_init() {
	bind_pcvar_num(create_cvar("bh_enabled", "1", _, "Cvar aciklamasi", true, 0.0, true, 1.0), lololol);
	bind_pcvar_num(create_cvar("normalcvar", "832", _, "Sonu yok", true, 0.0), normalcvar);

	mp_freeforall = get_cvar_pointer("mp_freeforall"); // Sunucudaki cvarı çekiyor.
}

public blabla(id)
{
	if(lololol)
	{
		//blabla
	}

	new deger = normalcvar;
	deger--;
	// değer 831 oldu. get_pcvar_num kullanmaya gerek kalmadi

	// burada kullanıyoruz
	if(get_pcvar_num(mp_freeforall))
	{
		set_pcvar_num(mp_freeforall, 0);
	}
}
6. Const nedir, nasıl kullanılır?
Const, bir değişkenin sabit olduğu durumlarda kullanılır. Örneğin tag;

Yapılan yanlış [Const kullanılmaması]

Kod: Tümünü seç

new tag[] = "LOLOLOL";

client_print_color(0, 0, "Tagimiz budur: %s", tag);
tag bir daha değiştirilemeyeceği için const eklemeliyiz.

Kod: Tümünü seç

new const tag[] = "LOLOLOL";

client_print_color(0, 0, "Tagimiz budur: %s", tag);


+
Aklıma geldikçe ekleme yapacağım. Bunları kullanalım. Eklenti sunucu için çok önemli bir şey.

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Yek'-ta
Mesajlar: 9624
Kayıt: Cmt Eyl 12, 2015 12:40 pm
İletişim:

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Yek'-ta »

Burada hata var.

Kod: Tümünü seç

public CBasePlayer_PreThink(const id)
{
	if(ctveyasiyor)
	{
		//blabla
	}
}
Birde...
bind_pcvar_num(get_cvar_pointer("mp_freeforall"), mp_freeforall) olması lazım.

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Colditz »

Çok işim olduğu için hızlı hızlı yazdım, düzeltir mısın doğrusunu?

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Erhan1232YARDIM
Mesajlar: 974
Kayıt: Pzr May 26, 2019 12:36 pm

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Erhan1232YARDIM »

Bilgiler için teşekkürler işime yarayacak.

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

By.King ►EmrullaH◄
Yasaklı Üye
Yasaklı Üye
Mesajlar: 4297
Kayıt: Cmt Şub 24, 2018 6:05 pm
Konum: İstanbul
İletişim:

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen By.King ►EmrullaH◄ »

@Colditz
New ile belirlenen bir değişkeni 0 ' a eşitlemekte gereksiz değil mi ?
Zaten bir değer belirtmessen 0 oluyor.

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Colditz »

By.King ►EmrullaH◄ yazdı: Cum Ağu 02, 2019 3:33 pm @Colditz
New ile belirlenen bir değişkeni 0 ' a eşitlemekte gereksiz değil mi ?
Zaten bir değer belirtmessen 0 oluyor.
0 yazsan da aynı yazmasan da hiçbir şey fark etmiyor.

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

By.King ►EmrullaH◄
Yasaklı Üye
Yasaklı Üye
Mesajlar: 4297
Kayıt: Cmt Şub 24, 2018 6:05 pm
Konum: İstanbul
İletişim:

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen By.King ►EmrullaH◄ »

Ben de diyom ya işte aynı olay o yüzden = 0 yapmak gereksiz olmaz mı ?

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Eklenti yazılırken yapılan hatalar & çözümleri

Mesaj gönderen Colditz »

By.King ►EmrullaH◄ yazdı: Cum Ağu 02, 2019 5:23 pm Ben de diyom ya işte aynı olay o yüzden = 0 yapmak gereksiz olmaz mı ?
Gereksiz fakat kullanılınca eklentiye bir yararı da yok zararı da. Kullanmanın sakıncası yok.

Link:
Linklerini gizle
Linki Kopyala
Cevapla