GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi
07 Temmuz 2024, 14:05:55

Kullanışlı Fonksiyonlar

Başlatan EvoturK, 28 Şubat 2017, 23:17:40

« önceki - sonraki »

0 Üye ve 28 Ziyaretçi konuyu incelemekte.

squarepants

String veya Integer veri tipi dizi değişkenlerinde aramak istediğiniz herhangi bağımsız bir değerin veya metinin Index türünden karşılığını döndürür.

stock Dizi_Index_Ara_Int(d_dizi[], hucre = sizeof(d_dizi), adeger){
 for(new i = 0; i < hucre; i++){
 if(d_dizi[i] != adeger)
     continue;
 else
     return printf("Deger :%d",i);
 }
 return print("Aradiginiz Deger Bulunamadi (!)");
}
stock Dizi_Index_Ara_String(d_dizim[][], hucrem = sizeof(d_dizim), adegerm[]){
 for(new i = 0; i < hucrem; i++){
 if(strcmp(d_dizim[i], adegerm) != 0)
     continue;
 else
     return printf("Deger :%d",i);
 }
 return print("Aradiginiz Metin Bulunamadi (!)");
}
Hadi bir örnekle açıklayalım , Aşağıdaki şekilde iki farklı dizi değişkeniniz olduğunu düşünün.
new dizi[4] = {1, 3, 5, 7}; // Integer Dizi
new s_dizi[][] = {"merhaba", "gta", "multi"}; // String Dizi
Daha sonra ise kullanıma geçiyoruz :
main()
{
        Dizi_Index_Ara_Int(dizi, sizeof(dizi), 5); // 5 değerini arar ve Index numarasını döndürür.  Çıktı : Deger:2
        Dizi_Index_Ara_String(s_dizi, sizeof(s_dizi), "merhaba"); // "merhaba" adlı metni arar ve Index numarasını döndürür. Çıktı : Deger:0
}
Son düzenlenme: 18 Haziran 2020, 18:18:47 ThePosition

squarepants

Aşağıdaki fonksiyon ile herhangi bir metinsel ifadenin içerisinde yer alan bir karakterin, metin içerisinde tekrar edip etmediğini kontrol edebilirsiniz :
#define MAX_TKARAKTER    29
// Max. Tekrar Eden Karakter - Alfabe Sayisi ; Kendinize Göre Düzenleyebilirsiniz
stock Tekrar_Karakter(metin[]){
 new
    k = 0,
    d_harf = 0,
    u = strlen(metin) - 1,
    bool:k_varmi,
    bool:k_dolu[MAX_TKARAKTER char]
 ;
 while(k < u){
    k++;
    if(k == d_harf)
        k = d_harf + 1;
    if(metin[d_harf] == metin[k] && metin[d_harf] != ' '){
      metin[k] = ' ';
      k_varmi = true; k_dolu{d_harf} = true;
     }
     if(k == u){
      if(metin[d_harf] != ' ' && k_dolu{d_harf}) { printf("Tekrarlanan Karakter : %c", metin[d_harf]); }
      d_harf++; k = -1;
     }
     if(d_harf == u)
        break;
 }
 if(!k_varmi)
    print("[UYARI] : Tekrarlanan Karakter Yok (!)");
}
Örnek Kullanım :
main()
{
  new k_Bul[] = "merhaba gta multi"; // Tekrar Eden Karakter : m, a ve t
  Tekrar_Karakter(k_Bul);
}
/* Çıktı :  Tekrarlanan Karakter : m
            Tekrarlanan Karakter : a
            Tekrarlanan Karakter : t
*/
Son düzenlenme: 25 Haziran 2020, 18:14:01 ThePosition

squarepants

Aşağıdaki fonksiyon, kullanılmasını istemediğiniz Türkçe karakterleri, kullanılmasını istediğiniz diğer karakterler ile değiştirerek tanımlanan metinsel ifadeyi döndürür :

new const Karakterler[][] = {
{'Ç', 'C'}, {'ç', 'c'},
{'İ', 'I'}, {'ı', 'i'},
{'Ş', 'S'}, {'ş', 's'},
{'Ğ', 'G'}, {'ğ', 'g'},
{'Ü', 'U'}, {'ü', 'u'},
{'Ö', 'O'}, {'ö', 'o'}
};
stock Turkce_Karakter(metin[]){
new
b_harf = 0,
k = -1,
  kar = sizeof(Karakterler) - 1,
  mu = strlen(metin)
;

while(k < kar){
    k++;
    if(metin[b_harf] == Karakterler[k][0]){
        metin[b_harf] = Karakterler[k][1];
          b_harf++;   k = -1;
      }
      if(b_harf == mu)
  break;
      if(k == kar && metin[b_harf] != Karakterler[k][0]){ b_harf++; k = -1; }
}
return metin;
}
Örnek Kulanım :
main()
{
    new Turkce_Metin[] = "Türkçe Öğreniyorum";
    printf("Yeni Metin : %s", Turkce_Karakter(Turkce_Metin));
    // Çıktı : Yeni Metin : Turkce Ogreniyorum
}
Son düzenlenme: 06 Temmuz 2020, 20:13:50 ThePosition

squarepants

Aşağıdaki fonksiyon, herhangi bir metinsel ifade içerisinde silinmesini istediğiniz karakteri silerek düzenlenen metinsel ifadeyi döndürür :
stock Kar_Sil(metin[], karakter[], ku = sizeof(metin))
{
new
    IndexNum,
    mu = strlen(karakter)
;
if(mu == 1)
{
    for(new i; i < ku - 1; i++)
    {
if((IndexNum = strfind(metin, karakter, false)) != -1)
strdel(metin, IndexNum, IndexNum + 1);
    }
}
return metin;
}
Örnek Kullanım :
main()
{
    new karak[] = "merhaba gta multi";
    printf("Yeni Metin : %s", Kar_Sil(karak, "m"));
    /* Eğer 'm' adlı karakter varsa siler.
    Çıktı : Yeni Metin : erhaba gta ulti */
}


squarepants

Aşağıdaki fonksiyon RCON - Adminler için bir sohbet kayıt metin belgesi oluşturarak RCON - Adminler arasında geçen dialogları kayıt altına almanızı sağlar :
#define sohkay "sohbetkayit.txt"  // metin belgesi ismi
stock Sohbet_Kayit(playerid = 0xFFFF, const metin[])
{
if(IsPlayerAdmin(playerid))
{
                new
ymetin[30 + 128],
  File:mdosya=fopen(#sohkay, io_append),
  Isim[30]
;
GetPlayerName(playerid, Isim, sizeof Isim);
format(ymetin, sizeof ymetin, "%s: %s\r\n", Isim, metin);
Turkce_Karakter(ymetin), fwrite(mdosya, ymetin);
        fclose(mdosya);
}
}
Dikkat edilmesi gerekenler listesinde sadece "scripfliles" klasörü içerisine "sohbetkayit" adlı bir metin belgesi oluşturmaktır. Ayırca Turkce_Karakter() adlı fonksiyon yukarıda tanımlı olmaktadır.

Örnek Kullanım :
public OnPlayerText(playerid, text[])
{
Sohbet_Kayit(playerid, text);
return 1;
}


squarepants

Aşağıdaki fonksiyon yardımı ile iki nokta arasındaki mesafeyi yaklaşık olarak KM cinsinden hesaplayabilirsiniz :
stock Float:KM_Hesapla(Float:X2, Float:X1, Float:Y2, Float:Y1)
{
new
        Float:Islem,
Float:Metre,
Float:MesafeX,
Float:MesafeY,
Float:Hipo
;
Metre = floatdiv(85, 100); // Yaklaşık bir adım birim uzunluk
MesafeX = floatabs(X2 - X1); MesafeY = floatabs(Y2 - Y1);
Hipo = floatsqroot((MesafeX * MesafeX) + (MesafeY * MesafeY));
Islem = floatdiv(Hipo, Metre); // Metre Çevir
return floatdiv(Islem , 100); // KM Çevir
}
Örnek Komut :
CMD:birimkm(playerid)
{
new
    Float:X,
    Float:Y,
    Float:Z,
            Float:X1,
    Float:Y1,
    mGon[256]
;
GetPlayerPos(playerid, X, Y, Z);
X1=X+500; Y1=Y+500;
format(mGon, 256, "Koord X: %0.2f Koord Y: %0.2f Koord X1: %0.2f Koord Y1:%0.2f KM:%0.2f",X,Y,X1,Y1,KM_Hesapla(X1,X,Y1,Y));
SendClientMessage(playerid, -1, mGon);
SetPlayerPos(playerid,X1,Y1,Z+2);
return 1;
}
Son düzenlenme: 10 Ekim 2020, 17:11:52 ThePosition

squarepants

Bir proje için hazırlamış olduğum bir fonksiyon ; Girilen Ay'ın sahip olduğu Max. gün sayısını döndürür :
stock MaxAyGun(ay)
{
new snc, a, g, y;
  getdate(y, a, g);
switch(ay)
{
case 1, 3, 5, 7, 8, 10, 12:
    snc = 31 ;
                case 4, 6, 9, 11:
    snc = 30;
                case 2:
    snc = ((y % 4) == 0) ? (29) : (28);
default:
    snc = 0;
}
return snc;
}
Örnek Kullanım :
main()
{
   printf("Max. Gun : %d", MaxAyGun(2)); //Şubat , Çıktı : Max. Gun : 29
}
Son düzenlenme: 23 Ekim 2020, 16:18:11 ThePosition

squarepants

Yine bir proje için hazırlamıştım ; Bu fonksiyon, İki tarih arasındaki gün sayısını almanızı sağlar :
stock GunHesabi(y, a, g, y2, a2, g2)
{
new ysnc, asnc, sncg , i = 1, j = (a2 - a);
ysnc = (y2 - y) * 365;
if(ysnc >= 365 && (a == a2) && (g == g2))
    return ysnc;
if(j == 0 && ysnc < 365)
    return asnc = g2 - g;
for( ; i <= j; i++)
{
asnc = asnc + MaxAyGun(a + i);
}
asnc = asnc + (MaxAyGun(a) - g) - (MaxAyGun(a + j) - g2);
sncg = ysnc + asnc;
return sncg;
}
Örnek Kullanım :
main()
{
  new yil, ay, gun;
  getdate(yil, ay, gun);
  printf("Gun Sayisi %d ", GunHesabi(yil, ay, gun, 2022, 11, 25));
  //Çıktı : Gun Sayisi : 773
}
DipNot : MaxAyGun() adlı fonksiyon yukarıda tanımlı olmaktadır.
Son düzenlenme: 24 Ekim 2020, 15:02:14 ThePosition

squarepants

Aşağıdaki fonksiyon, kullandığınız benzersiz tamsayı bir dizi içeriğini, büyükten küçüğe veya küçükten büyüğe belirtilen limit koşulu altında sıralamanızı sağlar. Bazı arkadaşlar MySQL sorgusu kullanmadan direkt olarak oyun içerisinden veri sıralaması yapmak isterse kullanışlı olabileceğini düşünüyorum :

stock Sirala(dizi[], u = sizeof (dizi), bool:tip = false, limit = 10)
{
new
    kukla[MAX_PLAYERS + 1],
    kukIndex
;
for(new i; i < u; i++)
{
for(new j; j < u; j++)
{
if(dizi[i] < dizi[j])
{
    kukIndex = kukIndex + 1;
}
if(j == (u - 1))
{
        if(kukIndex == 0)
    {
        kukla[0] = dizi[i];
    }
    else
    {
kukla[kukIndex] = dizi[i];
  kukIndex = 0;
          }
}
}
if(i == (u - 1))
{
    if(!tip)
    {
                         for(new k; k < u ; k++)
         {
    if(k > (limit - 1))
        continue;
    else
printf("Sayi : %i", kukla[k]);
}
    }
    else
    {
                         for(new k = (u - 1), m = k; k > -1; k--)
         {
    if(k <= (m - limit))
        continue;
    else
printf("Sayi : %i", kukla[k]);
        }
           }
       }
       }
}

boo:tip :
false - Büyükten Küçüğe.
true - Küçükten Büyüğe
Varsayılan false
limit :
Sıralama Limiti - Varsayılan 10

Aşağıdaki dizi örneklerinde Tamsayı ifade ve ASCII karakter kodlarını içeren 2 dizi bulunmakta. Bunları kullanarak örnek bir uygulama yapalım :

new Sira_Dizi[12] = {11, 10, 12, 2, 4, 5, 6, 7, 3, 8, 1, 9};
new Sira_Dizi2[5] = {
'M', // 77
'U', // 85
'L', // 76
'T', // 84
'I'  // 73
};

main()
{
    Sirala(Sira_Dizi, sizeof (Sira_Dizi), false, 6);
    // Çıktı : 12, 11, 10, 9, 8, 7
    Sirala(Sira_Dizi2, sizeof (Sira_Dizi2), false, 4);
    // Çıktı : 85, 84, 77, 76
}
Son düzenlenme: 29 Kasım 2020, 21:24:05 ThePosition

squarepants

Aşağıdaki fonksiyon yardımı ile yaklaşmakta olan yılbaşı gecesi için kalan zamanı gün, saat, dakika, saniye cinsinden alabilmenizi sağlar :

stock YB_Geri_Sayim(const bgun = 1440, const bsaat = 60, const bdakika = 60)
{
new msg[72],
saat, dakika, saniye,
yil, ay, gun,
kalan_gun
;
gettime(saat, dakika, saniye);
getdate(yil, ay, gun);
kalan_gun = GunHesabi(yil, ay, gun, 2020, 8, 31);
format(msg, 64, "Kalan Zaman : Gun %i, Saat %i, Dakika %i, Saniye %i", kalan_gun, (((bgun / 60) - saat) - 1), ((bsaat - dakika) - 1),(bdakika - saniye));
return msg;
}
Örnek Kullanım :
main()
{
    printf(YB_Geri_Sayim());
    // Çıktı : Kalan Zaman Gun 23, Saat 4, Dakika 42, Saniye 54
}
DipNot : GunHesabi() ve MaxAyGun() adlı fonksiyonlar yukarıda tanımlı olmaktadır.
Son düzenlenme: 08 Aralık 2020, 19:48:27 ThePosition

squarepants

Aşağıdaki fonksiyon yardımı ile girilen ip adresinin diğer oyuncular ile karşılaştırılmasını ve aynı ip adresini kullanan oyuncu sayısını almanızı sağlar:
stock IP_AL(ip_adresi[])
{
 new
     ip_sayim = 0,
     i = 0, j = GetMaxPlayers(),
     ip_adres[32+1]
 ;
 for( ; i < j; i++)  if(IsPlayerConnected(i))
 {
            GetPlayerIp(i,ip_adres,32);
            if(!strcmp(ip_adres, ip_adresi)) ip_sayim++;
 }
 return ip_sayim;
}
Örnek Kullanım:
#define MAX_GIRIS (2)
public OnPlayerConnect(playerid)
{
        new ip_ad[32+1];
        GetPlayerIp(playerid,ip_ad,32);
        new ip_say = IP_AL(ip_ad);
        if(ip_say > MAX_GIRIS)
          return SendClientMessage(playerid,-1,"Aynı IP üzerinden girilen limit sınırını aştınız(!)"), Kick(playerid);
 return 1;
}
Son düzenlenme: 23 Aralık 2020, 13:30:17 ThePosition

squarepants

Basit ama kullanışlı olduğunu düşünerek oluşturmuş olduğum bu fonksiyon, 2D koordinat düzlemi üzerinde bölgesel olarak çalışabilmenize olanak sağlar.
stock Duzlem_Bolgesi(Float:mX, Float:mY, Float:X, Float:Y)
{
new sonuc = (X > mX && Y > mY) ? (1) : ((X < mX && Y > mY) ? (2) : ((X < mX && Y < mY) ? (3) : (4)));
return sonuc;
}

Örneğin:

Bilindiği üzere 30  veya 150 dereceye ait sinus değerleri, birim çember üzerinde aynı değeri ifade etmektedir (0.5 veya 1 / 2). Bu yüzden ters trigonometrik fonksiyonlar ile açı hesabı yapabilmek arcsinus fonksiyonu için [-1, 1] arasında kısıtlanmaktadır. Bu kısıtlamayı kaldırabilmek ve doğru açı hesabını yapabilmek için aşağıdaki örneği inceleyebilirsiniz:

main()
{
        new Float: ax = 0.0, Float:by = 0.0, Float: cx = ax - 0.866, Float:dy = by + 0.5, Float:hipo, Float:Aci[2];
        hipo = floatsqroot((floatabs(cx - ax) * floatabs(cx - ax)) + (floatabs(dy - by) * floatabs(dy - by)));
        switch(Duzlem_Bolgesi(ax, by, cx, dy))
{
case 1:
{
Aci[0] = asin(floatabs(dy - by) / hipo);
Aci[1] = acos(floatabs(ax - cx) / hipo);
}
case 2:
{
Aci[0] = 180 - asin(floatabs(dy - by) / hipo);
Aci[1] = 180 - acos(floatabs(ax - cx) / hipo);
}
case 3:
{
                        Aci[0] = 270 - asin(floatabs(dy - by) / hipo);
Aci[1] = 270 - acos(floatabs(ax - cx) / hipo);
}
case 4:
{
                        Aci[0] = 360 - asin(floatabs(dy - by) / hipo);
Aci[1] = 360 - acos(floatabs(ax - cx) / hipo);
}
}
        printf("sinus aci degeri : %f", Aci[0]); //sinus aci degeri : 149.999267
printf("cosinus aci degeri : %f", Aci[1]); //cosinus aci degeri : 149.999267
}
Görüldüğü üzere asin(0.5 / hipo), bize istediğimiz açı değerini verecektir. Ancak bu açı - 0.866 değeri nedeni ile 2. bölgede ise 150 değeri yerine 30 değeri ile sabit kalacaktır. Bu nedenle 180  - asin(0.5 / hipo) işlemi ile istenilen bölgede istenilen açı değerini çekmiş bulunuyoruz (149.999267), yaklaşık olarak 150 derece floatround() fonsiyonu ile istenilen tamsayı değerine yuvarlanabilir.
Son düzenlenme: 23 Şubat 2021, 12:52:52 ThePosition

mojo

İki oyuncunun birbirine yakın koordinatlarda olup olmadığını kontrol eder. Yakınsa 1 değilse 0 değerini döndürür.

PAWN Kodu: Seç
stock IsPlayerNearPlayer(playerid, targetid, Float: radius)
{
    new Float: x, Float: y, Float: z;
    GetPlayerPos(targetid, x, y, z);
    if(IsPlayerInRangeOfPoint(playerid, radius, x, y, z))
    {
        return 1;
    }
    return 0;
}

Örnek kullanım (targetid tanımlanmış olmalıdır):

PAWN Kodu: Seç
if(!IsPlayerNearPlayer(playerid, targetid, 30.0)) return SendClientMessage(playerid, -1, "aranızdaki mesafe 30.0'dan fazla");


R4IN

Parametre dönüşlerinin veya diğer anlamıyla argümanların aktif olup olmadığını kontrol etmeden önce belirli parametreler içerisinde döngü oluşturur ve çalışıp çalışmadığını konsola yazdırır.



PAWN Kodu: Seç
stock GetMaxIndexArgs(Float:index, args[])
{
for(new i = 0; i < index; i++)
{
    if(!args[0])
    {
args[0] = args[1];
while(index < 4)
{
                args[0] = args[1];
if(args[1] != args[2]) return 1;
else
{
    if(args[3])
    {
args[3] = args[4];
index++;
}
else
{
    return args[0];
}
}
}
}
else
{
    for(index = 1; index < args[0]; i++)
    {
switch (index)
{
case 0:
{
        return i + 1 / args[1];
}
case 1:
{
    return i - 1 / args[2];
}
case 2:
{
    return i * 1 / args[3];
}
    case 3:
    {
        return i / 1 / args[3];
    }
    default:
    {
        args[0] = args[1];
    }
}
    }
}
}
return true;
}

* Ne işe yarar? *

- Parametre olarak argümanların optimizasyon sorunu bir nevi iyileştirir. Ayrıca index numaralarını öğrenebilirsiniz.

Örnek kullanım;


PAWN Kodu: Seç
main() {

new Float:dex, arguman[32];
printf("GetMaxIndexArgs: %d", GetMaxIndexArgs(dex, arguman));
}
Son düzenlenme: 28 Şubat 2022, 17:40:08 R4IN