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

AFK kontrolü nasıl yapılır?

Başlatan chinohead, 18 Nisan 2020, 23:55:56

« önceki - sonraki »

0 Üye ve 3 Ziyaretçi konuyu incelemekte.

chinohead

AFK kontrolü nasıl yapılır?

Herkese merhaba, az önce hapis sisteminde kullanmak için böyle bir şey yaptım. Sistemin mantığı oyuncu uzun süre koordinat değiştirmezse, sabit kalırsa onu AFK varsayıyor. Bunu nasıl yapacağımı düşünürken fikri bana veren Özkan Hocamdı, bende yaptım sizlerle de paylaşmak istedim.

Öncelikle oyuncunun ekran başından uzak kaldığını koruyacak bir değişken oluşturacağız. Aynı anda birden çok oyuncu AFK olabileceği için değişkenin dizisini MAX_PLAYERS olarak gireceğiz.

PAWN Kodu: Seç
new AFK[MAX_PLAYERS];
new Float:SonPos[MAX_PLAYERS][3];


Oyuncu oyuna girdiği andan itibaren pozisyonlarını değişkene kaydetmek ve konumunu değiştirip değiştirmediğine bakmak istiyoruz. OnGameModeInit publicine timerımızı oluşturuyoruz. https://wiki.sa-mp.com/wiki/SetTimer

PAWN Kodu: Seç
SetTimer("AFK_Kontrol", 1000, 1);

Şimdiyse geriye oyuncunun AFK olup olmadığını kontrol edecek timer halkasını oluşturmaya geldi. Bu kısımın anlatımı kodların içerisinde yapıldı.

PAWN Kodu: Seç
forward AFK_Kontrol();
public AFK_Kontrol()
{
new Float: X, Float: Y, Float: Z; // oyuncunun pozisyonlarını değişkene ata
for(new i = 0; i < MAX_PLAYERS; i++) // tüm oyuncular arasında döngü kur
{
new string[128], name[24];
GetPlayerName(i, name, sizeof(name)); // oyuncunun adını çek
GetPlayerPos(i, X, Y, Z); // oyuncunun pozisyonlarını çeker

if(SonPos[i][0] == X && SonPos[i][1] == Y && SonPos[i][2] == Z)
{
AFK[i]++;
}
else
{
AFK[i] = 0;
}

GetPlayerPos(i, SonPos[i][0], SonPos[i][1], SonPos[i][2]);

if(AFK[i] == 30) // oyuncu aynı yerde 30 saniye durduysa
{
AFK[i] = 0; // afk değişkenini sıfırla
format(string, sizeof(string), "%s isimli oyucu uzun süre hareket etmediği için oyundan atıldı.", name);
SendClientMessageToAll(-1, string);

Kick(i); // oyuncuyu at

}
}
return 1;
}


Artık her şey tamam oyuncu eğer 30 saniye hareket etmezse AFK sayılacak ama 30 saniye dolmadan geri dönerse hiçbir işlem yapılmadan oyuna devam edecek.
Son düzenlenme: 19 Nisan 2020, 01:29:30 manhunt
ücret karşılığında filterscript, gamemode yaptırmak için: chinohead@yahoo.com

Jawié

Oyuncu esc veya alt+tab ile oyundan ayrılırsa OnPlayerUpdate geçici süreliğine çalışmaz, bu mantıkla hareket etsen daha iyi bir algoritma oluşturursun. OnPlayerPause buna örnek olarak verilebilir.


chinohead

Alıntı yapılan: Jawié - 19 Nisan 2020, 00:42:49
Oyuncu esc veya alt+tab ile oyundan ayrılırsa OnPlayerUpdate geçici süreliğine çalışmaz, bu mantıkla hareket etsen daha iyi bir algoritma oluşturursun. OnPlayerPause buna örnek olarak verilebilir.
Sen bu mesajı yazmadan önce bu olayı değiştirmiştim zaten, teşekkür ederim.

ücret karşılığında filterscript, gamemode yaptırmak için: chinohead@yahoo.com

Eamon

Zamanında bu sistemi yaparken bende bu yöntemi düşündüm fakat oyuncular rol vs yaptıklarında aynı yerde sabit kalabiliyor  o yüzden en mantıklısı OnPlayerUpdate ile bağlantılı bir şekilde yapmak olur.

Bugünün güzel zamanları, yarının üzücü düşünceleridir.

chinohead

Alıntı yapılan: Metafor - 20 Nisan 2020, 06:16:15
Zamanında bu sistemi yaparken bende bu yöntemi düşündüm fakat oyuncular rol vs yaptıklarında aynı yerde sabit kalabiliyor  o yüzden en mantıklısı OnPlayerUpdate ile bağlantılı bir şekilde yapmak olur.
AFK süresini 60 saniyeye ayarlayarak yapılabilir aslında, rol ortamını bilmiyorum ama 60 saniye hareketsiz kalmıyorlardır herhalde. Bu açıdan sistemin roleplay konsepti içinde uygun olduğunu düşünüyorum. Jawié'nin de dediği gibi gerçekten OnPlayerUpdate sıkıntı yaratan bir halka ve kullanmamayı tercih ediyorum.

Bu arada 60 saniye hareket etmezse AFK olarak varsayması için şu şekilde değiştirin.
PAWN Kodu: Seç
if(AFK[i] == 60)

ücret karşılığında filterscript, gamemode yaptırmak için: chinohead@yahoo.com

Bojnâ