GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi
21 Nisan 2025, 16:41:40

soyugun sistemi hk.

Başlatan magnet00, 09 Şubat 2025, 00:25:22

« önceki - sonraki »

0 Üye ve 2 Ziyaretçi konuyu incelemekte.

magnet00

bir soygun sistemi yazıyorum enum içinde soygun_durum isminde bir değişkenim var yer soyulduktan sonra bunu 90 olarak ayarlıyorum
ancak daha sonra bunu her saniyede 1 eskiltmesini istiyorum bunu nasıl yapabilirim timer ile mi yapılıyor yapılıyorsa bir örnek kod atabilir misiniz?


deksdeveloper

PAWN Kodu: Seç
new soygundurum = 0;
new soygunsure = 0;
new soyguntimer;

// örnek soygun başlangıcı
CMD:soygun(playerid, const params[])
{
    if(soygundurum != 0) return SendClientMessage(playerid, -1, "Yakin zamanlarda banka soyulmus, bir daha soyamazsin.");
    #pragma unused params
    SendClientMessage(playerid, -1, "Soygun yaptin");
    soygundurum = 1; // soygundurum değişkenini 1 yapıyoruz
    soygunsure = 90; // soygunsure değişkenini 90 yapıp süreyi belirliyoruz
    soyguntimer = SetTimer("SoygunTimer", 1000, true);
    return 1;
}

forward SoygunTimer();
public SoygunTimer()
{
    if(soygundurum != 0) // eğer soygun durum 0'a eşit değilse yani soygun gerçekleşmişse
    {
      if(soygunsure <= 1) // eğer soygunsure 1'den küçükse veya eşitse
      {
          soygundurum = 0; // soygundurum sıfırlanıyor ve tekrardan soygun yapılabilir
          soygunsure = 0;
          KillTimer(soyguntimer);
      }
      else // 1 küçük veya eşit değilse
      {
          soygunsure--; // soygunsure'yi birer birer azaltıyoruz
      }
    }
    return 1;
}




magnet00

Alıntı yapılan: deksdeveloper - 09 Şubat 2025, 01:21:57
PAWN Kodu: Seç
new soygundurum = 0;
new soygunsure = 0;
new soyguntimer;

// örnek soygun başlangıcı
CMD:soygun(playerid, const params[])
{
    if(soygundurum != 0) return SendClientMessage(playerid, -1, "Yakin zamanlarda banka soyulmus, bir daha soyamazsin.");
    #pragma unused params
    SendClientMessage(playerid, -1, "Soygun yaptin");
    soygundurum = 1; // soygundurum değişkenini 1 yapıyoruz
    soygunsure = 90; // soygunsure değişkenini 90 yapıp süreyi belirliyoruz
    soyguntimer = SetTimer("SoygunTimer", 1000, true);
    return 1;
}

forward SoygunTimer();
public SoygunTimer()
{
    if(soygundurum != 0) // eğer soygun durum 0'a eşit değilse yani soygun gerçekleşmişse
    {
      if(soygunsure <= 1) // eğer soygunsure 1'den küçükse veya eşitse
      {
          soygundurum = 0; // soygundurum sıfırlanıyor ve tekrardan soygun yapılabilir
          soygunsure = 0;
          KillTimer(soyguntimer);
      }
      else // 1 küçük veya eşit değilse
      {
          soygunsure--; // soygunsure'yi birer birer azaltıyoruz
      }
    }
    return 1;
}



tam anlayamadım sunucuda 100 tane soygun mekanı var bu sistem nasıl çalışıcak ?


magnet00

PAWN Kodu: Seç
if(checkpointid == soygunlar[i][soygunBaslatCpID] && soygunlar[i][soygunDurum] < 1){
SendClientMessage(playerid , -1 , "Soydunuz +2 Skor Ve Bir Miktar Para");
soygunlar[i][soygunDurum] = 90;
break;
}
kodum böyle


Krips Je

senin kodunu inceledim. vereceğim kodu test et ve buradan bana bildir. eğer çalışırsa tüm mantığı anlatacağım.

PAWN Kodu: Seç
public OnGameModeInit()
{
    SetTimer("SoygunTimer", 1000, true);
    return 1;
}

forward SoygunTimer();
public SoygunTimer()
{
    for (new i = 0; i < MAX_SOYGUNLAR; i++)
    {
        if (soygunlar[i][soygunDurum] > 0)
        {
            soygunlar[i][soygunDurum]--;
        }
    }
    return 1;
}

if (checkpointid == soygunlar[i][soygunBaslatCpID] && soygunlar[i][soygunDurum] < 1)
{
    SendClientMessage(playerid, -1, "Soydunuz +2 Skor Ve Bir Miktar Para");
    soygunlar[i][soygunDurum] = 90;
}

"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı
    

Krips Je

Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.

"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı
    

magnet00

Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04
Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.

galiba çalışıcak 1 saniyede bir tüm soygunları kontrol edip soygundurum 0 danbüyük olanları 1 eksiltiyorsun ancak optimizasyon problemi çıkartır mı acaba ?


Krips Je

Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44
Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04
Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.

galiba çalışıcak 1 saniyede bir tüm soygunları kontrol edip soygundurum 0 danbüyük olanları 1 eksiltiyorsun ancak optimizasyon problemi çıkartır mı acaba ?

çıkaracağını pek sanmıyorum, ancak test etmekte fayda var çıkartırsa düzeltilir.

"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı
    

magnet00

Alıntı yapılan: Krips Je - 09 Şubat 2025, 03:19:54
Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44
Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04
Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.

galiba çalışıcak 1 saniyede bir tüm soygunları kontrol edip soygundurum 0 danbüyük olanları 1 eksiltiyorsun ancak optimizasyon problemi çıkartır mı acaba ?

çıkaracağını pek sanmıyorum, ancak test etmekte fayda var çıkartırsa düzeltilir.


şuan çalışıyor zaten çalışması muhtemeldi , peki oyuncu checkpointe girince 30 saniye süre olucak ve 30 saniyenin sonunda oyuncuya 2 skor ve rastgele para vericek daha sonrasında checkpointin yenilenmesine 90 saniye olacak bunu nasıl kontrol ettiririm mantıgını kuramadım ?


magnet00

cevap verebilecek var mı


Krips Je

Alıntı yapılan: magnet00 - 09 Şubat 2025, 15:39:21
Alıntı yapılan: Krips Je - 09 Şubat 2025, 03:19:54
Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44
Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04
Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.

galiba çalışıcak 1 saniyede bir tüm soygunları kontrol edip soygundurum 0 danbüyük olanları 1 eksiltiyorsun ancak optimizasyon problemi çıkartır mı acaba ?

çıkaracağını pek sanmıyorum, ancak test etmekte fayda var çıkartırsa düzeltilir.


şuan çalışıyor zaten çalışması muhtemeldi , peki oyuncu checkpointe girince 30 saniye süre olucak ve 30 saniyenin sonunda oyuncuya 2 skor ve rastgele para vericek daha sonrasında checkpointin yenilenmesine 90 saniye olacak bunu nasıl kontrol ettiririm mantıgını kuramadım ?


kodu yazmaya üşendim ancak mantığı anlatayım kendin yaz.

bir cp belirliyorsun ve adam iste haraketsiz 30 saniye bekledikten sonra time ayarla 30 saniye olarak 30 saniye sonunda time bitince adama otomatik düşsün para. sonrada limit ekle işte playerdata ile bir oyuncu 30 saniye sonra para ve exp aldıysa auto adamın playerdatasına kayıt etsin ve 2 ci kez tekrarında 90 saniye olsun.

"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı
    

Backup

PAWN Kodu: Seç
new soygunDurum;

public OnGameModeInit()
{
    soygunDurum = GetTickCount(); // Oyun başlarken başlangıç zamanı atanır
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/soygun", true) == 0)
    {
        new elapsedTime = (GetTickCount() - soygunDurum) / 1000; // Geçen süreyi saniyeye çevir

        if(elapsedTime >= 90) // Eğer 90 saniye geçtiyse
        {
            SendClientMessage(playerid, -1, "Soygun başarılı!");
            soygunDurum = GetTickCount(); // Yeni süreyi kaydet
        }
        else
        {
            new remaining = 90 - elapsedTime;
            new msg[64];
            format(msg, sizeof(msg), "Soygun yapamazsın! Kalan süre: %d saniye", remaining);
            SendClientMessage(playerid, -1, msg);
        }
        return 1;
    }
    return 0;
}

Timer'e ihtiyacın olmadan bu şekilde kontrol edebilirsin.


magnet00

Alıntı yapılan: Backup - 10 Şubat 2025, 08:51:11
PAWN Kodu: Seç
new soygunDurum;

public OnGameModeInit()
{
    soygunDurum = GetTickCount(); // Oyun başlarken başlangıç zamanı atanır
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/soygun", true) == 0)
    {
        new elapsedTime = (GetTickCount() - soygunDurum) / 1000; // Geçen süreyi saniyeye çevir

        if(elapsedTime >= 90) // Eğer 90 saniye geçtiyse
        {
            SendClientMessage(playerid, -1, "Soygun başarılı!");
            soygunDurum = GetTickCount(); // Yeni süreyi kaydet
        }
        else
        {
            new remaining = 90 - elapsedTime;
            new msg[64];
            format(msg, sizeof(msg), "Soygun yapamazsın! Kalan süre: %d saniye", remaining);
            SendClientMessage(playerid, -1, msg);
        }
        return 1;
    }
    return 0;
}

Timer'e ihtiyacın olmadan bu şekilde kontrol edebilirsin.

Kodun anlaşılabilirliği için timer daha iyi değil mi hocam , tabiki arasında bir performans farkı yok ise diye diyorum ayrıca ben 30 saniye içinde 2 saniyede bir rastgele para verdiriyorum hocam.
Son düzenlenme: 10 Şubat 2025, 16:49:07 magnet00

Backup

Alıntı yapılan: magnet00 - 10 Şubat 2025, 13:12:31
Alıntı yapılan: Backup - 10 Şubat 2025, 08:51:11
PAWN Kodu: Seç
new soygunDurum;

public OnGameModeInit()
{
    soygunDurum = GetTickCount(); // Oyun başlarken başlangıç zamanı atanır
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/soygun", true) == 0)
    {
        new elapsedTime = (GetTickCount() - soygunDurum) / 1000; // Geçen süreyi saniyeye çevir

        if(elapsedTime >= 90) // Eğer 90 saniye geçtiyse
        {
            SendClientMessage(playerid, -1, "Soygun başarılı!");
            soygunDurum = GetTickCount(); // Yeni süreyi kaydet
        }
        else
        {
            new remaining = 90 - elapsedTime;
            new msg[64];
            format(msg, sizeof(msg), "Soygun yapamazsın! Kalan süre: %d saniye", remaining);
            SendClientMessage(playerid, -1, msg);
        }
        return 1;
    }
    return 0;
}

Timer'e ihtiyacın olmadan bu şekilde kontrol edebilirsin.

Kodun anlaşılabilirliği için timer daha iyi değil mi hocam , tabiki arasında bir performans farkı yok ise diye diyorum ayrıca ben 30 saniye içinde 2 saniyede bir rastgele para verdiriyorum hocam.

Timerler kaynakları çok tüketir. Doğru organize etmezsen ram kullanımın artar. 2 saniyede bir para verme olayını da timer kullanmadan onplayerupdate MOD alarak yapabilirsin.

Kodun okunabilirliği tamamen sana kalmış bir şey. Performanslı ve okunabilir kod yazmak mümkün.