FONKSİYONLAR
Bu yapıyı bir önceki derste anlamıştım.Anlamayanlar bir öncekir derse bakabilir.Şimdi konsol komudu eklemek için RegConsoleCmd komudunu kullanacağız.
Şimdi bu komut 1.6 register_clcmd ye göre daha gelişmiştir.Bu komudu konsola direk sm_degree ile çalışmakla beraber chata !degree /degree ile çalışmaktadır.Yani ilave bir chat komudu eklemenize gerek yoktur.Kullanıcı sm_degree komudunu çalıştırdığında CommandDegree publicini çalıştıracak.
İlk parametre kullanıcının indexi ikinci parametre ise sm_degree komudundan sonraki kaç adet terim kullanıldığına döner.Örnek vermek gerekirse kullanıcı sm_degree ali 23 webdiyo diyo bir komud girerse args değeri 3'e eşit olacaktır.Şimdi kullanıcı eğer eksik veya fazla parametre girerse eklentiyi durdurup kullanıcıya hata mesajı verelim.
Şimdi Plugin_Handled plugini durdurmamızı sağlar ve kodun ileriye gitmesini engeller.4 çeşit return değerimiz vardır.
Plugin_Continue Çağrıyı durdurur ama plugini çalışması devam eder.
Plugin_Changed Koddaki girdi veya çıktı değerleri yeniden değer vermenizi sağlar.
Plugin_Handled Çağrıyı durdurur hem de plugin çalışması durdurur.
Plugin_Stop Plugin_Handled farkı ilerideki komutları da durdurmanızı sağlar.
Kullanıcının yazdığı değeri bir değişkene kaydedelim.Kullanıcının yazdığırı değeri almak için GetCmdArg komudunu kullanacağız.
Şimdi komuttaki ilk paramtere kaçıncı argümanı aldığımızı belirler.Örnek verelim ss_heal nick 100 diye bir komut girildi.Eğer ilk parametreyi 2 olarak girersek 100 argümanı alıcaktır.2.parametre argümanın depolanacağı değişken, 3. parametre ise argümanın uzunluğu hesaplar.Not bu komut argümanı otomatik string olarak alır.sizeof otomatik stringin uzunluğunu hesaplanmasını sağlar. Değerimiz string olduğundan değişkeni float türüne çevirmemiz gerekiyor. Bunun için 2. değişken oluşturup bunu floata çevireceğiz.
Şimdi kodumuzun son kısmına geldik. Derece değerini grada çevirip kullanıcıyı bilgilendiren bir bilgi mesajı verelim.
İşte basit bir komutla girdiğmiz dereceyi grada çeviren bir plugin yazdık.Bu plugini eke koycam isteyenler incelebilir.
DÖNGÜLER( While, for, do while yapısı )
Bazen fonskiyonlardan işlemleri tekrar tekrar yapılması gerekir.Bunun için biz döngüleri kullanırız.Şimdi 0 dan 10 a kadar olan tüm doğal sayıların toplamını yazan bir fonksiyon yazacağım.Bunu ilkini döngü kulllanmadan yazacağım.
Şimdi bu şeklide yazılan scriptte fonkisyonun 10 kere çağırılmasına neden olur ve hafızda fazla yer kaplamsına neden olur.Böyle tekrar içeren yapılarda döngüleri kullanırız.Aynı fonksiyonu şu şekilde yazabiliriz.
Gördüğünüz gibi fonksiyonu birden fazla çağırmak yerine tek bir çağırmada hallettik.Şimdi döngünü nasıl yaıldığını ve nasıl çalıştığını anlatacağım.1. parametre değişkeni tanımladığımız bölümdür.2. paramtere ise durumun kontrol edildiği parametredir.Son parametre ise 2. paramteredeki durum sağlanıyorsa işlenen paramteredir.Şimdi örneği açıklamak gerekirse 10 a kadar sayıların toplamını veren değeri bir değişkene atadım.İlk eleman 0 son eleman ise kullanıcının girdiği değer şeklinde yazıldı.For yapısında 1. dönüşünde sum değişekininin i değeri kadar artti( yani i++= 1 ).Yani sum değişkeni değeri 1 oldu.2. dönüşünde gene aynı şekilde olacaktır. sum değereri i kadar artacak( 1 +2 = 3).Şeklinde devam edecektir.En sonunda döngünden çıkınca bir bilgi mesajı verdik ve g_sum global bir değişken olduğundan değerini 0 atadık.
while yapısı for döngüsüne göre daha basittir sadece tek bir paramtereye sahiptir.Parametetredeki değer false olana kadar döngü devam eder.
while( durum koşulu )
{
//Kod block kısmı
}
do while döngüsü tek farkı değeri false olsa bile en az içerisindeki 1 kez çalıştırır.
do
{
//Kod block kısmı
}
while( durum koşulu )
Bir önceki derste fonksiyonların ne olduğunu anlatmıştım. Eğer o dersi okumadaysanız Ders 1 linkine tıklayarak ulaşabilirsiniz.Şimdi yapacağımız kendi fonsiyonlarımızı nasıl kurabiliceğimizi göstereceğim.
Şimdi elimizdeki bir derece cinsinden açıyı bir grada dönüşütüren bir fonksiyon yazalım.Fonksiyonun döneceği değeri float ( integerde olabilir ama açılarda float almak daha ksin sonuç verir.) cinsinden olacağı için fonsiyon şu şeklide başlıyacak.
float DegreeToGrad(float degree )
{
}
Fonksiyonumuzu oluşturduk.Şimdi bir grad değeri veren bir değişken yaratalım.Sonra degree parametresini kullanarak gradı bulalım.
float DegreeToGrad( float degree)
{
float grad = ( degree * 10.0 ) / 9.0
}
Şeklinde grad değerini bulduk.Son yapacağmız işlem ise fonksiyonu bu değere döndürmesini sağlamaktır.
float DegreeToGrad( floar degree )
{
float grad = ( degree * 10.0 ) / 9.0
return grad
}
Şimdi oluşturduğumuz fonksiyonu nasıl kullanacağımıza dair bir örnek plugin yazalım.Konsolo sm_degree diye bir konsol komudu oluşturup bu fonksiyonu kullanalım.PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "Functions",
author = "Anil Can",
description = "Sample of Functions",
version = "1.0.0",
url = "https://forum.webdiyo.com"
}
public void OnPluginStart( )
{
}
Bu yapıyı bir önceki derste anlamıştım.Anlamayanlar bir öncekir derse bakabilir.Şimdi konsol komudu eklemek için RegConsoleCmd komudunu kullanacağız.
PHP Kod:
public void OnPluginStart( )
{
RegConsoleCmd( "sm_degree", CommandDegree );
}
PHP Kod:
public Action TestFloat( int client, int args )
{
}
İlk parametre kullanıcının indexi ikinci parametre ise sm_degree komudundan sonraki kaç adet terim kullanıldığına döner.Örnek vermek gerekirse kullanıcı sm_degree ali 23 webdiyo diyo bir komud girerse args değeri 3'e eşit olacaktır.Şimdi kullanıcı eğer eksik veya fazla parametre girerse eklentiyi durdurup kullanıcıya hata mesajı verelim.
PHP Kod:
public Action TestFloat( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
}
Plugin_Continue Çağrıyı durdurur ama plugini çalışması devam eder.
Plugin_Changed Koddaki girdi veya çıktı değerleri yeniden değer vermenizi sağlar.
Plugin_Handled Çağrıyı durdurur hem de plugin çalışması durdurur.
Plugin_Stop Plugin_Handled farkı ilerideki komutları da durdurmanızı sağlar.
Kullanıcının yazdığı değeri bir değişkene kaydedelim.Kullanıcının yazdığırı değeri almak için GetCmdArg komudunu kullanacağız.
PHP Kod:
public Action CommandDegree( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
char arg[ 32 ];
GetCmdArg( 1, arg, sizeof( arg ) )
}
Şimdi komuttaki ilk paramtere kaçıncı argümanı aldığımızı belirler.Örnek verelim ss_heal nick 100 diye bir komut girildi.Eğer ilk parametreyi 2 olarak girersek 100 argümanı alıcaktır.2.parametre argümanın depolanacağı değişken, 3. parametre ise argümanın uzunluğu hesaplar.Not bu komut argümanı otomatik string olarak alır.sizeof otomatik stringin uzunluğunu hesaplanmasını sağlar. Değerimiz string olduğundan değişkeni float türüne çevirmemiz gerekiyor. Bunun için 2. değişken oluşturup bunu floata çevireceğiz.
PHP Kod:
public Action CommandDegree( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
char arg[ 32 ];
GetCmdArg( 1, arg, sizeof( arg ) )
float degree = StringToFloat( arg );
}
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "Functions",
author = "Anil Can",
description = "Sample of Functions",
version = "1.0.0",
url = "https://forum.webdiyo.com"
}
public void OnPluginStart( )
{
RegConsoleCmd( "sm_degree", CommandDegree );
}
public Action CommandDegree( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
char arg[ 32 ];
GetCmdArg( 1, arg, sizeof( arg ) )
float degree = StringToFloat( arg );
PrintToChat( client, "%f degree is equal to %f grad", degree, DegreeToGrad( degree ) );
return Plugin_Handled;
}
float DegreeToGrad( float degree )
{
float grad = ( degree * 10.0 ) / 9.0;
return grad;
}
İşte basit bir komutla girdiğmiz dereceyi grada çeviren bir plugin yazdık.Bu plugini eke koycam isteyenler incelebilir.
DÖNGÜLER( While, for, do while yapısı )
Bazen fonskiyonlardan işlemleri tekrar tekrar yapılması gerekir.Bunun için biz döngüleri kullanırız.Şimdi 0 dan 10 a kadar olan tüm doğal sayıların toplamını yazan bir fonksiyon yazacağım.Bunu ilkini döngü kulllanmadan yazacağım.
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "Fonkisyonlar",
author = "Anil Can",
description = "Fonksiyon Ornegi 2",
version = "1.0.0",
url = "https://forum.webdiyo.com"
}
int g_sum = 0;
int g_count = 0;
public void OnPluginStart( )
{
RegConsoleCmd( "sm_sum", CommandSum );
}
public Action CommandSum( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
char arg[ 32 ];
GetCmdArg( 1, arg, sizeof( arg ) );
int value = StringToInt( arg );
SumInteger( value );
return Plugin_Handled;
}
int SumInteger( int g_value )
{
g_count += 1;
g_sum += g_count;
if( g_count == g_value )
{
PrintToChatAll( "%i'a kadar sayilarin toplami %i'dir.", g_value, g_sum );
g_sum = 0
}
else
{
SumInteger( g_value );
}
}
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "Fonkisyonlar",
author = "Anil Can",
description = "Fonksiyon Ornegi 3",
version = "1.0.0",
url = "https://forum.webdiyo.com"
}
int g_sum = 0;
public void OnPluginStart( )
{
RegConsoleCmd( "sm_sum", CommandSum );
}
public Action CommandSum( int client, int args )
{
if( args != 1 )
{
ReplyToCommand( client, "Eksik veya fazla terim yazdiniz" );
return Plugin_Handled;
}
char arg[ 32 ];
GetCmdArg( 1, arg, sizeof( arg ) );
int value = StringToInt( arg );
SumInteger( value );
return Plugin_Handled;
}
int SumInteger( int g_value )
{
for( int i = 0; i <= g_value; i++ )
{
g_sum += i;
}
PrintToChatAll( "%i'a kadar sayilarin toplami %i'dir.", g_value, g_sum );
g_sum = 0
}
while yapısı for döngüsüne göre daha basittir sadece tek bir paramtereye sahiptir.Parametetredeki değer false olana kadar döngü devam eder.
while( durum koşulu )
{
//Kod block kısmı
}
do while döngüsü tek farkı değeri false olsa bile en az içerisindeki 1 kez çalıştırır.
do
{
//Kod block kısmı
}
while( durum koşulu )
Son Düzenleme: 03-02-2020, 23:50, Düzenleyen: Anıl Can
)

