Bu derste sourcemod'da nasıl kullanıcı ve admin komudu oluşturmayı göstereceğim.Şimdi kullanıcının kendi ipsini öğrenmesini sağlayan bir eklenti yazalım.!myip yazınca kullanıcı kendi ipsini öğrensin.Bunun için bir konsol komudu oluşturmamız gerekiyor.RegConsoleCmd komudunu kullanarak oluşturalım.
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "IP",
author = "Anil Can",
description = "Kullanıcı Kendi IP ogrenir",
version = "1.0",
url = "https://forum.webdiyo.com/newthread.php?fid=99"
}
public void OnPluginStart( )
{
RegConsoleCmd( "sm_myip", MyIp, "Kendi ip numaranızı öğrenirsiniz" );
}
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "IP",
author = "Anil Can",
description = "Kullanıcı Kendi IP ogrenir",
version = "1.0",
url = "https://forum.webdiyo.com/newthread.php?fid=99"
}
public void OnPluginStart( )
{
RegConsoleCmd( "sm_myip", MyIp, "Kendi ip numaranızı öğrenirsiniz" );
}
public Action MyIp( int client, int args )
{
if( args > 1 )
{
ReplyToCommand( client, "Kullanımı <sm_myip>" );
return Plugin_Handled;
}
char buffer[ 32 ];
GetClientIP( client, buffer, sizeof( buffer ) );
PrintToChat( client, "Senin IP NO : %s", buffer );
return Plugin_Handled;
}
Böylece pluginimiz bitti.Kullanıcı !myip yazınca kendi ipsini öğrendiği bir eklenti yazdım.Şimdi ise bir admin komutu nasıl yapılacağına dair bir örnek plugin yazalım.Şimdi bir respawn plugini yazalım.Bunun için RegAdminCmd komudunu kullanacağız.
PHP Kod:
#include < sourcemod >
public Plugin myinfo =
{
name = "Revive",
author = "Anil Can",
description = "Ölü oyuncuları canlandırma",
version = "1.0",
url = "https://forum.webdiyo.com/newthread.php?fid=99"
}
public void OnPluginStart( )
{
RegAdminCmd( "sm_rev", Admn_Revive, ADMFLAG_SLAY, "Ölü oyuncuları revlemenizi sağlar" );
}
PHP Kod:
#include < sourcemod >
#include < cstrike >
public Plugin myinfo =
{
name = "Revive",
author = "Anil Can",
description = "Ölü oyuncuları canlandırma",
version = "1.0",
url = "https://forum.webdiyo.com/newthread.php?fid=99"
}
public void OnPluginStart( )
{
RegAdminCmd( "sm_rev", Admn_Revive, ADMFLAG_SLAY, "Ölü oyuncuları revlemeniz sağlar" );
}
public Action Admn_Revive( int client, int args )
{
if( args < 1 )
{
ReplyToCommand( client, "<sm_rev> nick " );
return Plugin_Handled;
}
char arg[ 32 ], name[ MAX_NAME_LENGTH ];
GetCmdArg( 1, arg, sizeof( args ) );
int target = FindTarget( client, arg );
if( target == -1 )
{
ReplyToCommand( client, "Oyuncu bulunamadı." );
return Plugin_Handled;
}
if( IsPlayerAlive( target ) || !IsClientConnected( target ) )
{
ReplyToCommand( client, "Sadece ölü oyuncuları canlandırabilirsin." );
return Plugin_Handled;
}
CS_RespawnPlayer( target );
GetClientName( client, name, sizeof( name ) );
PrintToChatAll( "%s %N adlı yetkili tarafından canlandırıldı.", name, client );
return Plugin_Handled;
}
Örnek vererek anlatıyım. Kullanıcı sm_haydar ali 3 diye komut girdi.Dediğim örnek yukarıdaki örnekten bağımsızdır.Fonkisyonun içindeki int args girilen tüm ifadeyi alır.GetCmdArg ile biz bunu parçalara ayırırız.İlk parametreyi 0 girersek "sm_haydar", 1 girersek "ali" 2 girersek ise "3" ü alır.Dikkat etmeniz gereken durum ise tüm ifadeler string türünde alınır.2. parametre ise depolanacağı değişken ve 3. değişken ise stringin maksimum uzunluğu.sizeof otomatik stringin uzunluğunu hesaplar.
Burada kafanızı karıştırabilecek kısım %N olan bölüm olabilir.Çünkü bu format şekli 1.6'da mevcut değil.%N clientin ismini çevirmemizi sağlayan bir dönüşümdür.Şimdi komudumuz düzgünce çalışıyor fakat pratik değil.Eğer topluca canlandırmak isteğimizde bu komut işe yaramazdır.Bunu yapmamızı sağlayan tek bir komut vardır.ProcessTargetString komuduyla hem tek tek hemde topluca komud uygulamamız sağlar.Bu şekile dönüştürmeden önce multiplelanguage( çokludil ) pluginlerin uzantısı olan translation dosyaları nasıl oluşurulur onu anlatmam gerekiyor.
MultiLanguage Pluginler
MultiLanguage pluginler eklentinizdeki chat menu vs. kısmı bir çok dilde görüntülenmesini sağlar. Plugine entegre etmeden önce bir translation textin nasıl olması gerektiğini anlatacağım.Bu dosyalar key-value( anahtar değer ) formatındadır.
Şeklinde oluşturulur.Eğer döndürelecek bir kısım varsa ( %s %i ) gibi bunu eklemenin yöntemi ise
Bu şekilde format yapısı yapılır bu formatların numaralandırması pluginde yazılan sıraya bağlıdır.Şimdi ise pluginde nasıl yapılcağını anlatalım.İlk Önce bu dosyları yükletmemiz gerekir.Bunun için ise LoadTranslations( "Dosya İsmi" ) komudunu kullanacağız.Print ederken ise ilk örnekteki "Welcome" bizim anahtar kelimemizdir.Pluginde şu şekilde olacaktır.PrintToChat( client, "%t", "Welcome" ). Görüldüğü üzere %t Translation kısmını döndürür.
Şimdi örneğimize geri dönersek şimdi pluginimize translation kısımlarını ve toplu komut ekliyoruz.
PHP Kod:
#include < sourcemod >
#include < cstrike >
public Plugin myinfo =
{
name = "Revive",
author = "Anil Can",
description = "Ölü oyuncuları canlandırma",
version = "1.0",
url = "https://forum.webdiyo.com/newthread.php?fid=99"
}
public void OnPluginStart( )
{
RegAdminCmd( "sm_rev", Admn_Revive, ADMFLAG_SLAY, "Ölü oyuncuları revlemeniz sağlar" );
LoadTranslations( "respawn.phrases" );
LoadTranslations( "common.phrases" );
}
public Action Admn_Revive( int client, int args )
{
if( args < 1 )
{
ReplyToCommand( client, "<sm_rev> nick " );
return Plugin_Handled;
}
char arg[ 32 ], target_name[ MAX_NAME_LENGTH ], name[ MAX_NAME_LENGTH ];
int target_list[ MAXPLAYERS ], target_count;
bool tn_is_ml;
GetCmdArg( 1, arg, sizeof( arg ) );
if( ( target_count = ProcessTargetString( arg,
client,
target_list,
MAXPLAYERS,
COMMAND_FILTER_DEAD,
target_name,
sizeof( target_name ),
tn_is_ml ) ) <= 0 )
{
ReplyToTargetError( client, target_count );
return Plugin_Handled;
}
for( int i = 0; i < target_count; i++ )
{
CS_RespawnPlayer( target_list[ i ] );
}
GetClientName( client, name, sizeof( name ) );
if( tn_is_ml )
{
PrintToChatAll( "%t", "Revive", target_name, client );
}
else
{
PrintToChatAll( "%s %N yetkili tarafından canlandırıldı." );
}
return Plugin_Handled;
}
ProcessTargetString Kullanımı
Bu yapı ileride çok kullancağımızı gelişmiş ve kullanımı kolay bir yapıdır.Paramterlerini tek tek açıklamya başlayalım.1. parametre hedefimizi belirlememizi sağlar.2. parametre komudu çalıştıran kişi, 3. parametre hedefin kaç kişi olduğunu belirler,4. parametre hedeflenebilecek maksimum oyuncu sayısı, 5. parametre hedefleri geçirebilidğimiz bazı filtereler örneğin COMMAND_FILTER_DEAD ile sadece ölü oyuncuların geçebilceği bir filtre, 6. parametre hedefin ismi, 7. parametre ise hedef isminin maksimum uzunluğu ve son parametre ise dil dosyasının var olup olmadığını kontrol eder.
COMMAND_FILTER_ALIVE Canlı oyuncular filtrrden geçer.
COMMAND_FILTER_DEAD Ölü oyuncular filtreden geçer.
COMMAND_FILTER_CONNECTED Servere bağlı oyuncular filtreden geçer.
COMMAND_FILTER_NO_IMMUNITY Dokunulmazlığı yok sayar.
COMMAND_FILTER_NO_MULTI Toplu komud filtreden geçmez
COMMAND_FILTER_NO_BOTS Botlar filtreden geçmez.
Yaptığım tüm pluginleri eke koydum inceleyebilirsiniz.