GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

Sayrox - Wiki - Değişkenler ? MAX_PLARES ? PVars ?

Başlatan Sayrox, 15 Ekim 2019, 20:06:37

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Sayrox

Selamlar, arkadaşlar şimdi Max_players ve Pvar değişkenlerini ele alalım.

Şu konuya bir açıklık getirelim değişken sadece değişkendir Max_players olduğu için playera özel bir değişken değildir. örnek bir değişken atalım şimdi.
PAWN Kodu: Seç
new OrnekbirDegisken;
Şimdide Max_Players üzerinden örnek bir değişken atalım.
PAWN Kodu: Seç
new OrnekDegisken[MAX_PLAYERS];
Sizce iki değişkenin arasındaki fark nedir?

Devam Edelim Max_Players değilde belirlediğimiz sayı kadar değişken atalım.
PAWN Kodu: Seç
new OrnDegisken[250]; // 250 bölümlük bir değişken.

Şimdide biraz daha derine inelim hepimiz değil velakin bir kaçımız MAX_PLAYERS attığımızda o değişkenin oyuncuya özel olduğunu düşünürdük öyle değilmi?

Peki MAX_PLAYERS yazdığımızda değişken bizim kendisine MAX_PLAYERS kadar bölüm verdiğimizi nasıl biliyor? tabikide <a_samp> includesi içerisinde #define MAX_PLAYERS(1000) yatıyor modun en başında ilk kullanılan kütüphane a_samp kütüphanesi olduğu için atadığımız değişkeni nerede atarsak atayalım MAX_PLAYERS yazdığımızda otomatik olarak 1000 parça bölümden oluşuyor.


Şimdi 50 kişilik bir sunucu kuracağımızı düşünelim ve 50 kişilik sunucu kuracağımız için. Değişkenlerden bakiye tasarrufu yapalım kendi MAX_PLAYERS definemizi oluşturalım.

PAWN Kodu: Seç
#define TURKISH_MAXOYUNCU (50) // bu mutlaka yeni oluşturacağımız değişkenlerin en üstünde olmalı.
PAWN Kodu: Seç
new OyuncuPara[TURKISH_MAXOYUNCU]; // Turkısh_Maxoyuncu definesi 50 sayı barındırdığı için 50 oyuncuyu destekleyecek bir değişken atadık

PAWN Kodu: Seç
Devam edelim şimdi değişken ile bir anti para hilesi oluşturalım.
OnGameModeInıte timerimizi ekleyelim
PAWN Kodu: Seç
SetTimer("SaniyeTimer", 1000, true); // Sırasıyla timerin gideceği public adı saniyesi ,timer çalıştıktan sonra tekrarlanıp tekrarlanmayacağı yani true yazarsak bu timer otomatik olarak 1 saniyede bir tekrarlar false yazarsak sadece 1 kez çalışır. Bizim amacımız bir saniyede bir oyuncunun parasını kontrol etmek olacağı için bu timeri modumuza bir saniyede bir tekrarlayacak şekilde ekleyecem. Zaten her sunucuda mutlaka bir saniye timer vardır.
PAWN Kodu: Seç
forward SaniyeTimer();
public SaniyeTimer()
{
  // Nimetlerden faydalanalım madem bu timeri sunucuda bir saniyede bir çalıştırıyoruz
 faydasını görelim makinamızı yoracak öyle değilmi?
 // Modun en başına gidin ve new globalsaniye = 0; değişkeni oluşturun.

 new globalsaniye++; // ++ demek bu sayıyı bir arttır demek.
 if(globalsaniye >= 60) // dedikki eğer global saniye büyük veya eşitse 60 sayısına
 {
   globalsaniye = 0; // globalsaniyeyi bunun altındaki kodları durmadan yapıp sunucuyu yormaması için sıfırladık
  new saat,dakika,saniye;
gettime(saat,dakika,saniye);
SetWorldTime(saat); // Sunucu saatinide bu sayede 1 dakikada bir real zamana eşitlemiş olduk ve timerin nimetinden faydalandık.
 }
 // şimdide kısaca konumuzun özeti olan players değişkeninden oyuncunun gerçek parasını bulup eğer hile kullandıysa ona geri verelim.
// Öncelikle global bir timer ve public içerisinde olduğumuz için foreach ile önce buradan bir çıkalım yoksa sadece id 0 üzerinde işlem yapma ihtimali olabilir.
 foreach(Player,i)
 {
  if(IsPlayerConnected(i) // Eğer oyuncu id bağlı ise
  {
    ParaKontrolPublic(i); // foreach ile 1 saniyede bir saniyede bulunduğumuz publice
    gelen timer ile şuanda sunucuda bağlı bulunan playerları yeni bir public e yönlendirdik ve orada para değişkenini kontrol edeceğiz.
  }
 
 }
 return true;
}


ParaKontrolPublici oluşturalım timerin altında olsun simetrik açıdan bu daha sağlıklıdır.

PAWN Kodu: Seç
forward ParaKontrolPublic(playerid);
public ParaKontrolPublic(playerid)
{
 if(GetPlayerMoney(playerid) != OyuncuPara[playerid]) // Eğer getiroyuncuparası  eşit değilse oyuncupara değişkenine
{
   ResetPlayerMoney(playerid); // Oyuncu kendinde gözüktüğü parayı sıfırla
   GivePlayerMoney(playerid,OyuncuPara[playerid]); // Oyuncu para değişkeninde id sayısına ait stokladığın değeri oyuncuya geri ver
 // Kick(playerid); // isteğe bağlı ilgili oyuncuyu sunucudan atalım
 // isteğe bağlı return true; // bu işi burada bitir aşağıda kod varsa dahi artık okumana gerek yok
}

 return true;
}


Son düzenlenme: 15 Ekim 2019, 21:53:30 Sayrox

Sayrox

Öyle durumlar olurki bir sistem yapmak istersiniz gidersiniz Samp Wikiye bakarsınız , bakarsınız yok arkadaş bu adamlar bunu düşünüp bunun için bir kütüphane oluşturmamış.

Nereden örnek verelim Apolet sisteminden ne yazıkki apolet sistemi için pawno bizi ne yaparsak yapalım desteklemiyor gelin biz onun dediğinin tam tersini şimdi MAX_PLAYERS TURKISH_MAX_PLAYERS mantığı ile uygulamaya devam edelim.

PAWN Kodu: Seç
#define MAX_APOLET (50) // mantık yürütmek gerekirse bir sunucuda apolet takacak kişi sayısı maximum 50 dir samp camiasında daha fazlasını oluşturup elimizdeki Create3dTextLabell stoklarını tüketmemizin bir maksadı yok.
OngameModeinitin tam üstüne
PAWN Kodu: Seç
new Text3D:apoletimiz[MAX_APOLET]; // yeni bir text3d:degiskeninismi kaç adet oluşturacağımız.

PAWN Kodu: Seç
public OnGameModeInit()
{
for(new i=0; i< MAX_APOLET; i++) // çevir yeni i eşittir 0 değeri i küçükse max apolet definesi içindeki sayıdan; i++ max apolet olana kadar altındakinleri uygula
{
    apoletimiz[i] = Create3DTextLabel("Sakli_Koye", -1, 30.0, 40.0, 50.0, 40.0, -1, 1); // Ne yaptık for uzerinden pawno oyuncunun kendi kafasının üstündeki göremeyeceğini izin vermediği player apoletlerini oluşturduk hepsine i  ile belirlenmiş 0,50 arası sayı verdik. // Bunlar pasif olduklarında sampın buglu köyünde direğin altında saklanacaktır
}
return true;
}

Şimdide sıra geldik bu apoletleri oyuncuya nasıl takacağımıza artık alttaki kodları kopyalayıp modun her hangi bir noktası olur işbaşı konumu vb kafanızın estiği bir noktada oyuncunun kafasının üstüne aşağıdaki kodlar ile apoleti takabilirsiniz.
PAWN Kodu: Seç
new string[60];
format(string,sizeof(string),"{FA8072}Apoletde Yazacak Yazı ?");
Attach3DTextLabelToPlayer(apoletimiz[playerid], playerid, 0,0,0.3);
Update3DTextLabelText(apoletimiz[playerid],-1,string); // Update apoletimiz id üzerinden renk kodu üstteki string yani yazısı
Ne Kaldı tabikide tedbirini almak ? öyle değilmi farzedinki bir oyuncuya apoleti taktınız o oyuncu çıkış yaptı yeni bir oyuncu giriş yaptı birde baktınızki yeni oyuncunun kafasının üstünde gözükmemesi gereken apolet ondada çıkmış ? neden kaynaklabilir apoletin playerid üzerinde gezdiği için gelin birde bu apoletleri temizleyelim. Ne olur, ne olmaz.

OnPlayerConnect(playerid) nin müsait bir konumuna.
PAWN Kodu: Seç
ApoletSil(playerid);
OnPlayerConnect altına veya müsait bir konuma
PAWN Kodu: Seç
forward ApoletSil(playerid);
public ApoletSil(playerid)
{
new string[60];
format(string,sizeof(string)," ");
Attach3DTextLabelToPlayer(apoletimiz[playerid], playerid,0,0,0.3);
Update3DTextLabelText(apoletimiz[playerid],-1,string);
return true;
}
Bir üstteki anlatımlar ileri sürüş tekniği tarzında bir anlatımdır acemilerin for döngüleri ile pek fazla haşır neşir olması tavsiye edilmez.
Son düzenlenme: 15 Ekim 2019, 20:37:28 Sayrox

Sayrox

Pvarslar ile değişkenler arasındaki farklar
Geçmiş zamanda ackslimitin çıkışından ve patlamaların hemen sonra SA-MP 0.3a R5 sürümü ile birlikte getirilmiştir.

İstediğiniz her konumda değişken atamadan anında bir Pvar yaratabilirsiniz.

Avantajları
1. Pvarslar oyuncu çıkış yaptığında otomatik olarak silinir. Bellek tasaruffu sağlar kendiniz Pvarsları silmekle uğraşmanıza gerek yoktur.

2. MAX_PLAYERS boyutunda değişken oluşturmak yerine ufak çaplı sorgularda ve sistemlerde Pvars kullanmak daha mantıklıdır.

3. Bellek tasaruffu sağlar.

4. Tekrarlayalım oyuncu çıkış yaptığında otomatik olarak tüm pvarslar silinir. Kendiniz ekstra bir kod girmenize gerek yoktur.

DezAvantajları
Normal değişkenlere göre daha yavaşlar. MYSQL fonksiyonlarında kullanmak tehlikeli. basit işlerde Pvarslar en iyi ram,cpu ve sizin dostunuzdur.

Örnek kullanımlar;
Integer - rakamsal değer depolar.
Float - Rakamsal pos kordinatları noktalı rakamları vb depolar.
Varchar - string yazısal metinsel değişkenleri depolar.

Üstteki durumlara göre pvarslar bu şekilde kullanılabilir.
[/b]

SetPVarInt(playerid,"param",GetPlayerMoney(playerid); // oluşturulacak p var adı param pvara atılacak sayı ister elle yazılır istersede bir kısım çekilir.

new cekyazdir = GetPVarInt(playerid,"param");
new string[60];
format(string(sizeof(string),"%d miktarında parası var.",cekyazdir);
printf(string);
DeletePvar(playerid,"param"); // isteğe bağlı zaten çıkış yaptığında silinecek
[/pawn]

PvarString ve PvarInt Kullanım örneği
PAWN Kodu: Seç
// Önce bunu modun alt köşesine bir yere
stock OyuncuAdiGetir( playerid ) {

new Name[ MAX_PLAYER_NAME ];
GetPlayerName( playerid, Name, sizeof( Name ) );
return Name;
}

PAWN Kodu: Seç
SetPVarString(playerid,"oyuncununadi",OyuncuAdiGetir(playerid));
SetPVarInt(playerid,"oyuncununparasi",GetPlayerMoney(playerid));

PAWN Kodu: Seç
new string [60];
format(string,sizeof(string),%s isimli kisinin %d miktarında parası var.",GetPVarString(playerid,"oyuncununadi"),GetPVarInt(playerid,"oyuncununparasi"));
printf(string);
DeletePvar(playerid,"silinecekpvaradi"); // isteğe bağlıdır zaten oyuncu çıkış yaptığında otamatik silinecek.
PvarFlot kullanım örneği.

Diyelimki roleplay sunucusu kodluyorsunuz ve oyuncu öldü tekrar spawn olduğunda öldüğü konumda spawn olmasınız istiyorsunuz.

PAWN Kodu: Seç
OlumPosKaydet(playerid);  // OnPlayerDeathın içine
PAWN Kodu: Seç
// OnPlayerDeathın altında boş bir yere

forward OlumPosKaydet(playerid);
public OlumPosKaydet(playerid)
{
    new Float:x,Float:y,Float:z,a;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    SetPVarFloat(playerid,"xKordinati",x);
    SetPVarFloat(playerid,"yKordinati",y);
    SetPVarFloat(playerid,"zKordinati",z);
    SetPVarFloat(playerid,"aKordinati",a);
    return true;
}

[pawn]PosYukle(playerid); // OnPlayerSpawn'ın en başına hızlı olsun
[/pawn]

PAWN Kodu: Seç
// OnPlayerSpawn publicinin en altına koyulması daha sağlıklı olur

forward PosYukle(playerid);
public PosYukle(playerid)
{
    SetPlayerPos(playerid, GetPVarFloat(playerid,"xKordinati"), GetPVarFloat(playerid,"yKordinati"), GetPVarFloat(playerid,"zKordinati"));
    SetPlayerFacingAngle(playerid,GetPVarFloat(playerid,"aKordinati"));
    return true;
}
Son düzenlenme: 15 Ekim 2019, 21:52:52 Sayrox

laéx

Güzel anlatım olmuş, anlatım için teşekkürler.


Wisdom

youtube videosu çekmelisin bence, Türkçe olarak hiçbir sağlam kaynak yok çünkü. Ellerine sağlık bu arada.