Eklenti yazılırken yapılan hatalar & çözümleri
Gönderilme zamanı: Çrş Tem 31, 2019 4:06 pm
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;]
Defalarca oyuncunun takımını algılıyor ve ölü olmadığını algılıyor.
Bunun yerine bir değişken oluşturacağız.
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
Bunun yerine değişken oluşturacağız.
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.
Doğru kullanımı;
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]
Bool kullanılmalı;
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]
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...
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ı]
tag bir daha değiştirilemeyeceği için const eklemeliyiz.
+
Aklıma geldikçe ekleme yapacağım. Bunları kullanalım. Eklenti sunucu için çok önemli bir şey.
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
}
}
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;
}
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
}
Kod: Tümünü seç
new key = str_to_num(data);
switch(key)
{
//blabla
}
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.");
}
}
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.");
}
}
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;
}
}
Kod: Tümünü seç
new bool:bot[33];
public client_putinserver(id)
{
if(is_user_bot(id))
{
bot[id] = true;
}
}
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
}
}
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);
}
}
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);
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.