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.