GTAMulti - GTA Türkiye

San Andreas Multiplayer => PAWN Kodlama => Anlatımlar => Konuyu başlatan: chinohead - 18 Nisan 2020, 23:55:56

Başlık: AFK kontrolü nasıl yapılır?
Gönderen: chinohead - 18 Nisan 2020, 23:55:56
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.
Başlık: Ynt: AFK kontrolü nasıl yapılır?
Gönderen: 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.
Başlık: Ynt: AFK kontrolü nasıl yapılır?
Gönderen: chinohead - 19 Nisan 2020, 00:45:20
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.
Başlık: Ynt: AFK kontrolü nasıl yapılır?
Gönderen: Eamon - 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.
Başlık: Ynt: AFK kontrolü nasıl yapılır?
Gönderen: chinohead - 20 Nisan 2020, 06:48:07
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)
Başlık: Ynt: AFK kontrolü nasıl yapılır?
Gönderen: Bojnâ - 01 Mayıs 2020, 16:27:18
Basit, güzel paylaşım.