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?
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;
}
Alıntı yapılan: deksdeveloper - 09 Şubat 2025, 01:21:57new 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 ?
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
senin kodunu inceledim. vereceğim kodu test et ve buradan bana bildir. eğer çalışırsa tüm mantığı anlatacağım.
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;
}
Max_soygunlar'ı new soygunlar[MAX_SOYGUNLAR][2]; şeklinde tanımlayabilirsin.
Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04Max_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 ?
Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04Max_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.
Alıntı yapılan: Krips Je - 09 Şubat 2025, 03:19:54Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04Max_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 ?
cevap verebilecek var mı
Alıntı yapılan: magnet00 - 09 Şubat 2025, 15:39:21Alıntı yapılan: Krips Je - 09 Şubat 2025, 03:19:54Alıntı yapılan: magnet00 - 09 Şubat 2025, 02:04:44Alıntı yapılan: Krips Je - 09 Şubat 2025, 01:52:04Max_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.
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.
Alıntı yapılan: Backup - 10 Şubat 2025, 08:51:11new 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.
Alıntı yapılan: magnet00 - 10 Şubat 2025, 13:12:31Alıntı yapılan: Backup - 10 Şubat 2025, 08:51:11new 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.
Eğer yardımcı olacaksa benim yapıp paylaştığım soygun sistemini indirip referans alabilirsin veya kullanabilirsin.