SA:MP Destek Blogu
Samp Destek Sitesi

Pawn Anlatım

 

Pawn derslerinin içerisinde 9 adet başlık yer alıyor. Bu dersin tamamında sadece Pawn dilinin temeline odaklanıldı. Pawn dilini ilk kez öğreneceklere yönelik bir makaledir. Pawn dilinin temellerini öğrenmek istiyorsanız bu makale size muhtemelen iyi bir rehber olacaktır.

Giriş Yazısı - Pawn Nedir?

Pawn öğrenilmesi kolay bir dildir. Yapı bakımından C diline benzer. Pawn'ın C diline benzemesi sizi yanıltmasın, Pawn kuvvetle muhtemel yeryüzünün en basit dillerindendir. C dili ile yazılan açık kaynaklı bir yazılım, kodlama alanında yetkin olmayan kişiler için sadece karmakarışık satırlarla dolu olmaktan ibarettir. Pawn, C dili gibi karmakarışık değildir. Kodlamada deneyimsiz olanlar bile sadece bir haftanın içinde basit scriptler oluşturabilir.

Ders 1 - Include Nedir?

Include, Türkçeye "dahil etmek" olarak tercüme edilir. Include, oyun modunun veya filterscriptin kaynak kodlarına ekleme yapmak için kullanılır. Kısacası, kaynak kodlarına ilave edilecek kodları kaynak kodlarına direkt olarak eklemek yerine include kullanarak dolaylı olarak ekliyoruz.

Kaynak kodlarına eklenen ilave kodları tanımlamak için #include <include ismi> kodlarını kullanırız. Include genellikle kaynak kodlarında kalabalık olmaması için kullanılır. Oyun moduna dahil edilen kodlar da oyun modunun boyutuna etki eder. Oluşturulan ".inc" formatındaki dosyalar, Pawno >  Includes dizinine kaydedilir. Kaynak kodlarını compile etmek için kullanılan Pawno da oyun modunun dosyalarında yer alan Pawno klasörünün içindeki pawno.exe ile açılmalıdır.

Küçük, önemsiz kodlar için include kullanmanızı önermiyorum. Ben sadece örnek olması açısından kullanmak istiyorum. İlk olarak bir kod editörü açalım. Kod editörü olarak isterseniz not defteri (Windows'ta dahili olarak gelen klasik notepad) bile kullanabilirsiniz. Kod editörüne şu kodları yazalım:

#define HATARENK 0xCC4E7CFF
#define RENK_KIRMIZI 0xFF0000FF
#define RENK_KOYUMAVI 0x0B26D6FF
#define RENK_KOYUYESIL 0x146E02FF

Bu kodları oyun moduna veyahut oyun scriptine dahil etmek için ilk olarak ".inc" formatında bir dosya oluşturmamız gerekiyor. "Farklı Kaydet" seçeneğini kullanarak dosyayı "dosyaismi.inc" şeklinde oyun modunun dosyalarının içinde yer alan Pawno klasörünün içindeki Includes klasörüne kaydedin. Birinci işlemi tamamlar tamamlamaz kodların dahil olacağı kaynak kodlarını açın ve kaynak kodlarının başına #include <dosyaismi> olarak ekleme yapın. "dosyaismi" isteğe bağlı olarak değiştirilebilir, Includes klasörüne kaydedilen isim ile aynı olmalıdır. Include oluşturmak için başka bir kodlama dilini bilmek zorunda değilsiniz.


Ders 2 - Define Nedir?


Define ise Türkçeye tanımlama olarak tercüme edilir. Türkçe karşılığında olduğu gibi, bazı kavramları tanımlamak için kullanırız. #define HATARENK 0xCC4E7CFF şeklinde kullanılır. #include <a_samp> tanımından önce zaten kullanılamaz ama include içerisinde yer alan kodlarla çakışma olmaması için a_samp'ın dışındaki include tanımlarından sonra kullanılması önerilir.

SendClientMessage(playerid,HATARENK,"[HATA]: Bu komutu görüntülemek için yeterli yetkiniz yok.");

Ders 3 - Yorumlama

Yorumlama, yazılımcılar tarafından çok sık kullanılır. Yazılımcıların bazıları kodlamada kaldıkları kısmı belirtmek için bazıları da küçük notlar almak için bunu kullanılır. 90.000 satırlık bir oyun modumuzun olduğunu varsayalım. Kaynak kodlarının karmakarışık bir hâle bürünmemesi için yorumlama kullanmamız şart gibi görünüyor, değil mi?

Yorumlama ikiye ayrılır: Bir satırda geçerli yorumlama ve birden fazla satırda geçerli yorumlama.

Bir satırda geçerli yorumlamanın kullanım:

Bir satırlık yorum satırı genellikle kodların sonunda kullanılır. Yorum satırı açmak için // işaretini kullanıyoruz. Bu işaretten sonrası geçersiz sayılmaktadır. Pawno bu işaretten sonrasını okumaz, o yüzden dikkatli olmanız gerekiyor. Örnek kullanımını şu biçimde verebiliriz:

SendClientMessage(playerid,1,""); // Yorum satırı...

Hatalı bir kullanıma örnek olarak da şu ikisini örnek verebiliriz:

SendClientMessage// Yorum satırı...(playerid,1,""); Hatalı çünkü kodun sonunda değil başında kullanıldı.
// Yorum satırı... SendClientMessage(playerid,1,"");
Hatalı çünk kodun en sonunda değil en başında kullanıldı.

Birden fazla satırda geçerli yorumlamanın kullanımı:

Birden fazla kullanımda iki işaret kullanırız. Bunlar /* (Yorumlamanın başlamasını sağlar) ve */ (Yorumlamanın bitmesini sağlar) işaretleridir. Yorum satırı bu iki işaretin arasındadır. Örnek olarak şu kodu birden fazla satırda geçerli yorumlamayı kullanarak geçersiz hâle getirelim: #define eniyisite samp-destek-sitesi

/*
#define eniyisite samp-destek-sitesi
Kodlar bu işaretlerin arasında olduğu sürece istediğinizi yazabilirsiniz.
İstediğiniz kadar alta inebilirsiniz.

*/

Ders 4 - Komut Yapmak

Komut yapmak için OnPlayerCommandText callbackini kullanıyoruz. ZCMD vb. komut istemcilerini kullanmıyorsanız sizin de OnPlayerCommandText callbackini kullanmaya ihtiyacınız var. İlk olarak OnPlayerCommandText'i kullanarak komut oluşturmanın açıklamasını yapalım.

if(strcmp("/benimkomutum", cmdtext, true, 10) == 0) // Benimkomutum yerine komutun ismi yazılıyor.
{
/* Burası kodun işlevidir.
Komut yazılınca olmasını istediklerinizi buraya yazıyorsunuz.
Örneğin, bu komutu kullanan oyunculara hediye olarak 5.000$ ve Deagle silahını verelim.
Bunu yapmak için önce yorum satırımızı kapatalım! (:
*/

GivePlayerMoney(playerid,5000);
/* Burada 5000 yazan yer paranın değeri, playerid yazan yer ise kime gideceğidir. Eğer komut oyuncuya özel ise playerid kullanılır. */
GivePlayerWeapon(playerid,24,500);
/* Burada ise playerid aynı şekilde kime gideceği,
24 değeri ise silahın ıdı,
500 ise silahın mermisi.
*/

return 1;
}


OnPlayerCommandText callbackinde bir komut tanımlamak bu şekilde oluyor. ZCMD kullananlar için de çok ayrıntılı olmayacak şekilde malumat verelim.

Oyun moduna veyahut oyun scriptine ZCMD dahil edilince OnPlayerCommandText kullanılamıyor. Komut oluşturmak için ZCMD'nin kendi komut oluşturma biçimine ihtiyacımız var. ZCMD ile oluşturulan kod hiçbir callbackin içine yerleştirilemez. Modun ortasına ya da sonuna, siz neresini elverişli bulursanız oraya koyabilirsiniz.

ZCMD için de örnek bir komut yapalım:

CMD:komutismi(playerid, params[])
{
GivePlayerWeapon(playerid, 24,500);
return 1;
}

Ders 5 - Giriş ve Çıkışa Yazı Eklemek

Girişler için OnPlayerConnect callbackini, çıkışlar için OnPlayerDisconnect callbackini kullanırız. OnPlayerConnect callbackine oyuncu oyuna girince olmasını istediğiniz şeyleri eklersiniz, OnPlayerDisconnect callbackine oyuncu oyundan çıkınca olmasını istediğiniz şeyleri eklersiniz.

OnPlayerConnect için küçük bir örnek verelim. Oyuncu sunucunuza bağlandığında sohbet bölümüne basitçe bir mesaj ekleyelim.

public OnPlayerConnect(playerid)
{
/* Ekrana bir "hoş geldin" yazısı yazdırmak istiyoruz. */
SendClientMessage(playerid,0x70E858FF,"Hoş geldin!");
/* Burada playerid değeri giriş yapan oyuncu,
0x70E858FF değeri yazımızın rengini,
"Hoş geldin" ise mesajımız.
Burada mesajı değiştirirken tırnağın kalmasına dikkat etmelisiniz.
Sadece tırnak içerisi değişmelidir. */

return 1;
}


OnPlayerDisconnect callbacki için de küçük bir örnek verelim. Oyuncunun sunucudan ayrıldığına dair herkese bir bilgilendirme gönderelim.

public OnPlayerDisconnect(playerid)
{
/* Burada, oyuncu çıkış yaptığı için mesajı kendisi görmeyecektir ancak sunucuda oynamaya devam eden oyuncular görebilir. */
new str[128];
new sname;
GetPlayerName(playerid, sname, 24);
format(str,sizeof(str),"%s(%d) en kaliteli destek sitesinden ayrıldı.",sname,playerid);
SendClientMessageToAll(0x70E858FF,str);

return 1;
}

Ders 6 - Oyun Modunun Güvenliği

Sunucu içerisinde yer alan scriptler kadar oyun modunun güvenliği de önemlidir. Siz her ne kadar oyun modunun sadece .amx dosyasını paylaşsanız bile oyun modunuz .pwn formatına küçük hatalar ile çevirilebilir. Oyun modunuza veya oyun scriptinize Anti-DeAMX kodlarını ilave ederek.oyun modunun çıktısının .pwn formatına çevirilmesini önleyebilirsiniz.

Ders 7 - Diyaloglar

Son sürüm ile birlikte 7 çeşit diyalog tipi bulunuyor:

DIALOG_STYLE_MSGBOX: En basit diyalog tipidir. Bilgilendirme ekranıdır.
DIALOG_STYLE_INPUT: Oyuncunun doldurması için bir kutucuk vardır. En basit örneğiyle nick değişme sisteminde kullanılabilmektedir. Şifre için de kullanılabilir, ancak onun için password tipini kullanacağız. Yani, görünmemesi açısından password tipi vereceğiz.
DIALOG_STYLE_PASSWORD: INPUT diyaloğu ile aynıdır. Ancak burada, görünmemesi için kutucuğa yazılanlar "•" halini almaktadır.
DIALOG_STYLE_LIST: Adından anlaşılabileceği gibi, liste diyaloğudur. Bu diyalog ile en basitinden /shop komutu yapılabilir.
DIALOG_STYLE_MSGBOX: En basit diyalog tipidir. Bilgilendirme ekranıdır.
DIALOG_STYLE_TABLIST: Son versiyon ile gelen bir ek diyalog tipidir. 3 tane sütünu vardır. Bu diyalog tipiyle nick rengi satın alma gibi sistemler yapabilirsiniz.
DIALOG_STYLE_TABLIST_HEADERS: Son versiyon ile gelen başka bir diyalog tipidir. 3 tane sütünü vardır. Bir önceki TABLIST diyaloğundan farkı, bunda sütünların başlığının olmasıdır.

Diyalog Stillerinin Kullanımı

DIALOG_STYLE_MSGBOX Kullanımı:

Bu diyalog kodlarını istediğimiz yerde kullanabiliriz. En küçük örneğiyle yaptığınız komutta kullanabilirsiniz.

if(strcmp("/diyalog", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_MSGBOX,"Başlık","İçerik\nİçerik\nve içerik!","Tamam","Geri");
return 1;
}


Burada DIALOG_ID yerine diyaloğun ıdını girmeniz gerekiyor. Dikkat etmeniz gereken yer, modunuzda veya sistemlerinizde diğer diyaloglarda o diyaloğun numarasının olmamasıdır. Yani her diyaloğun numarası ayrı olmalıdır. Aynı numara birden fazla diyalogda kullanılır ise çakışma olur. Benzer şekilde, bu bölümde sadece sayıları kullanabilirsiniz.

DIALOG_STYLE_MSGBOX yerine ise diyaloğun tipini girmelisiniz. Diğer örneklerle de hepsinin nasıl olduğunu anlayacaksınız. Bu sayede hangisinin, nasıl kullanıldığını öğreneceksiniz.

Başlık ise anlaşılacağı üzere diyaloğun başlığıdır.

İçerik ise diyaloğun içeriğidir. Bilgilendirme vs. herhangi bir şey yazabilirsiniz. \n kodu ise alta geçme komutudur. Şu an bu satırdan devam ediyorken birden alta inebilirsiniz.

"Tamam" ve "Geri" ise butonlardır. Eğer sadece 1 buton olmasını istiyorsanız, sadece "Tamam" butonunu alırsak şöyle yapabiliriz:

if(strcmp("/asd", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_MSGBOX,"Başlık","İçerik\nİçerik\nve içerik!","Tamam",""); // Yani burada tırnak kalmak zorunda, ama içi boş olmak zorunda.
return 1;
}


DIALOG_STYLE_INPUT Kullanımı:

Tekrar bir komut ile açılmasını sağlayalım.

if(strcmp("/acilsusamacil", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_INPUT,"Başlıksız Diyalog","Boşluğa 1'den 3'e kadar bir sayı yaz.","Tamam","Geri");
return 1;
}



Burada "Boşluğa 1'den 3'e kadar sayı yaz..." kısmı kutucuktan önceki çıkan yazıdır. Yazdıktan sonra "Tamam" butonuna basmasında bir işlev gerçekleşmesi için OnDialogResponse callback'ini kullanacağız.

if(dialogid == DIALOG_ID) // Eğer diyalog ıdı DIALOG_ID ise...
{
if(response) // Eğer "Tamam" butonuna basmış ise...
{
Kick(playerid); 
// Sürprizzz! Oyuncu beklenmedik bir şey ile karşılaşır ve kick yer.
/* Burada { ve } işaretleri arası işlevlerdir. Yazıldıktan sonra ne gerçekleşmesini istiyorsanız onu yazacaksınız.
*/

}
}


DIALOG_STYLE_PASSWORD Kullanımı:

INPUT değeri ile aynıdır. Fakat burada sadece şifreler için kullanmaktayız. Kutucuğa yazılanlar ise "•" olarak görünmektedir.

if(strcmp("/yo", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_INPUT,"Başlıksız Diyalog","Şifreni yaz ve geç.","Tamam","Geri");
return 1;
}


DIALOG_STYLE_LIST Kullanımı:

Tanımında açıkladığım gibi, listeler için kullanılmaktadır.

if(strcmp("/yo", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_LIST,"Başlıksız Liste","Secenek 1\nSecenek 2\nSecenek 3","Tamam","Geri");
return 1;
}


Burada MSGBOX kullanımında anlattığım gibi \n alta geçmek için kullanılmakta. Şimdi biz direkt olarak herhangi bir seçeneğe basıldığında ne gerçekleşeceğini anlayacağız.

if(dialogid == DIALOG_ID) // Eğer diyalog ıdı DIALOG_ID ise...
{
if(response) // Eğer "Tamam" butonuna basmış ise...
{
if(listitem == 0) // 1. seçenek seçildiğinde olacaklar... 0'dan başlamaktadır. Ne kadar varsa o kadar artacaktır.
// Burası ise işlevidir.
}
if(listitem == 1) // 2. seçenek seçildiğinde olacaklar... 
// Burası ise işlevidir.
}
if(listitem == 2) // 3. seçenek seçildiğinde olacaklar... 
// Burası ise işlevidir.
}

}
}


DIALOG_STYLE_TABLIST Kullanımı:

Normal listeden farkı sütunlu olmasıdır.

if(strcmp("/yo", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_TABLIST,"Başlıksız Liste","Sütun 1\tSütun 2\tSütun 3\nSütun 1\tSütun 2\tSütun 3","Tamam","Geri");
return 1;
}


Her \n bir satır aşağı inmek demektir. Sütunları farklı farklı kullanmış olabiliriz, ama seçenekler yine aynı şekilde işlemektedir. Her \n den bir öncesi, bir seçenek demektir.

if(strcmp("/silahsatinal", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_TABLIST,"Başlıksız Liste","M4A1\t3000$\t500 Mermi\nDeagle\t3000$\t5000 Mermi","Tamam","Geri");
return 1;
}


DIALOG_STYLE_TABLIST_HEADERS Kullanımı:


Bir öncekinden farkı sütunların başlığının olmasıdır. Başlıkları ise örnek ile net bir şekilde anlayacaksınız.

if(strcmp("/yo", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_TABLIST,"Başlıksız Liste","Sütun başlık 1\tSütun başlık 2\tSütun başlık 33\nSütun 1\tSütun 2\tSütun 3\nSütun 1\tSütun 2\tSütun 3","Tamam","Geri");
return 1;
}


Burada ilk yazacağımız şeyler başlıklardır. Daha sonra seçenekler işleve girecektir. "Başlıksız Liste" ise bütün bunların başlığıdır, en baştaki isim.

if(strcmp("/silahsatinal", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,DIALOG_ID,DIALOG_STYLE_TABLIST,"Başlıksız Liste","Silah\tFiyat\tMermi\nM4A1\t3000$\t500 Mermi\nDeagle\t3000$\t5000 Mermi","Tamam","Geri");
return 1;
}


Ders 8 - IF ve ELSE

If şart bağlamanıza, else ise şartın aksi durumunda olacakları ayarlamanıza yardımcı olur. If ve else kullanımına küçük örnekler verelim.

if(GetPlayerMoney(playerid) == 2000)

Burada bizim şartımız parası 2000$ ise oluyor. "==" gibi işaretler ise şu anlamlara geliyor:

> Eğer şart belirtilen şarttan büyükse
< Eğer şart belirtilen şarttan küçükse
>= Eğer şart belirtilen şartla eşit ve büyükse
<= Eğer şart belirtilen şartla eşit ve küçükse
!= Eğer şart eşit değilse
== Eğer şart eşitse


İşaretlerin anlamlarını öğrendikten sonra artık şart bağlama işlemine başlayabiliriz.

if(GetPlayerMoney(playerid) == 2000)
{
// Burada parası 2000 ise olacakları ayarlıyoruz.
Kick(playerid); // Oyuncunun parası 2000$ ise sunucudan tekmeleniyor.
}


Şartın aksi durumunda olacakları ayarlamak için de else kullanımına örnek verelim.

if(GetPlayerMoney(playerid) == 2000)
{
// Burada parası 2000 ise olacakları ayarlıyoruz.
Kick(playerid);
}else{
// Burada ise parası 2000$ değilse olacakları yapıyoruz.
print("Kişinin parası yokmuş.");
}


Yukarıda anlamlarını öğrendiğimiz işaretlerden birisini kullanalım.

if(GetPlayerMoney(playerid) >= 2000) // Parası 2000 ve 2000'den fazla ise olacaklar...
{
// Burada parası 2000 ve 2000'den fazla ise olacakları ayarlıyoruz.
Kick(playerid);
}else{
// Burada ise parası 2000$ ve üzerinde değilse olacakları ayarlıyoruz.
GivePlayerWeapon(playerid,24,500);
}

Ders 9 - Döngüler ve Anlamları

Döngüler kodlamanın olmazsa olmazıdır. En olmadık yerlerde karşımıza çıkarak yardıma koşarlar. En küçüğünden bir if döngüsü. Sen şartsız bir hayat düşünebilir misin? En basitinden doğduğumuzdan itibaren başlar. Yaşamı sürdürmek için karnımızı doyurmamız ve su içmemiz gerekmekte. Eğer bunu yapmazsak kısa süre içerisinde ölürüz. Bu olay da ona benzemekte. Daha önce anlattığım döngüler ve anlamlarına aşağıdaki linkten ulaşabilirsiniz.

Pawn dilinde de for, while gibi döngüler vardır. Bu döngülerin kullanımı diğer yazılım dillerinde kullanıldığı gibi kullanılır. Kodlama ile alakanız yoksa Döngüler ve Anlamları adlı makalemi okuyarak döngüler hakkında bilgi sahibi olabilirsiniz.


Pawn hakkında daha detaylı bir bilgi kaynağına ulaşmak mı istiyorsunuz? SA:MP Destek ekibince ölçüldü, SA:MP Destek bloguna özel olarak hazırlanan Pawn Dersleri ile parmaklarınızın arasında sadece bir tık mesafe var. Tavsiye ediyoruz... Girmeli, görmeli ve okumalısınız!
Mesaj At
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol