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

Hırsız Polis : Tecavuz Sistem

Başlatan HasanEfe, 06 Haziran 2020, 22:36:31

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

HasanEfe

Öncelikle Selamunaleykum sıfırdan mod yapıyorum tecavüz konusu bayağı bi yordu ama beceremedim

şöyle yapmaya çalıştım fakat kullanıcıya 5 saniye sonra -3 damage geliyor fakat durmuyor sürekli -3 -3 geliyor bunu durduramadım komutları şöyle

CMD:tecavuz(playerid, params[])
{
   if(gTeam[playerid] != TECAVUZCU) return hataMesaji(playerid, "{FF0000}Bu komutu kullanmak için Tecavüzcü mesleğinde olmalısınız");
   new edilen;
   if(sscanf(params, "i[24]", edilen)) return SendClientMessage(playerid, 0x7491D6FF, "[BILGI] {FFFFFF}/tecavuz [oyuncu-id]");
   SetPVarInt(edilen, "TecavuzDurum", 1);
   return 1;
}

OnPlayerUpdate kısmınada

if(GetPVarInt(playerid, "TecavuzDurum") == 1)
{
      SetTimerEx("TecavuzUgradim", 5000, false, "i", playerid);
}

bunları yazdım fakat olmadı nerede yanlış yaptığımı anlamadım sabahtan beri kod yazıyorum kafam biraz karıştı

tecavüz ediliyor fakat damage  5 saniye sonra seri olarak geliyor durmuyor
Son düzenlenme: 06 Haziran 2020, 22:37:41 HasanEfe

Cherry

Timer sonunda
PAWN Kodu: Seç
SetPVarInt(playerid, "TecavuzDurum", 0);
yapman gerekiyor. Ayrıca OnPlayerUpdate publicinde kontrol ettirmen pek sağlıklı olmaz. Zaten tecavuzdurum'u 1 yapmışsın şansa bağlı değil, timer'de o komutta çalışabilir.

- Ayrıca bunun için player enumuna bool:TecavuzDurum diye bir değişken tanımlasan işlemler daha hızlı gerçekleşir, normal değişkenler pvarint'den daha hızlı çalışıyor.
Son düzenlenme: 06 Haziran 2020, 22:54:58 Cherry

HasanEfe

Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50
Timer sonunda
PAWN Kodu: Seç
SetPVarInt(playerid, "TecavuzDurum", 0);
yapman gerekiyor. Ayrıca OnPlayerUpdate publicinde kontrol ettirmen pek sağlıklı olmaz. Zaten tecavuzdurum'u 1 yapmışsın şansa bağlı değil, timer'de o komutta çalışabilir.

OnPlayerUpdate de 5 saniyeyi tamamladıktan sonra -3 can vericek sonra yeniden sayıcak -3 can vericek gibi gibi ayarlamayı düşündüm fakat olmadı

SetTimerEx("TecavuzUgradim", 5000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 10000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 15000, false, "i", playerid);

gibi yapmakta sistemi yorucağı için fazla ellemek istemedim


Cherry

Alıntı yapılan: HasanEfe - 06 Haziran 2020, 22:55:06
Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50
Timer sonunda
PAWN Kodu: Seç
SetPVarInt(playerid, "TecavuzDurum", 0);
yapman gerekiyor. Ayrıca OnPlayerUpdate publicinde kontrol ettirmen pek sağlıklı olmaz. Zaten tecavuzdurum'u 1 yapmışsın şansa bağlı değil, timer'de o komutta çalışabilir.

OnPlayerUpdate de 5 saniyeyi tamamladıktan sonra -3 can vericek sonra yeniden sayıcak -3 can vericek gibi gibi ayarlamayı düşündüm fakat olmadı

SetTimerEx("TecavuzUgradim", 5000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 10000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 15000, false, "i", playerid);

gibi yapmakta sistemi yorucağı için fazla ellemek istemedim
Timer süresini 15 saniye yaparsın, timere bir değişken tanımlarsın. Değişkene timer her çalıştığında +1 eklenir. eğer timerdeki değişken değeri 5 olur ise oyuncuya -3 can verir ve değişken değerini sıfırlarsın, tekrar çalışır 5 saniye olur ve -3 can verir. Timer içeriğini atarsan yardimci olabilirim.


HasanEfe

Alıntı yapılan: Cherry - 06 Haziran 2020, 22:57:22
Alıntı yapılan: HasanEfe - 06 Haziran 2020, 22:55:06
Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50
Timer sonunda
PAWN Kodu: Seç
SetPVarInt(playerid, "TecavuzDurum", 0);
yapman gerekiyor. Ayrıca OnPlayerUpdate publicinde kontrol ettirmen pek sağlıklı olmaz. Zaten tecavuzdurum'u 1 yapmışsın şansa bağlı değil, timer'de o komutta çalışabilir.

OnPlayerUpdate de 5 saniyeyi tamamladıktan sonra -3 can vericek sonra yeniden sayıcak -3 can vericek gibi gibi ayarlamayı düşündüm fakat olmadı

SetTimerEx("TecavuzUgradim", 5000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 10000, false, "i", playerid);
SetTimerEx("TecavuzUgradim", 15000, false, "i", playerid);

gibi yapmakta sistemi yorucağı için fazla ellemek istemedim
Timer süresini 15 saniye yaparsın, timere bir değişken tanımlarsın. Değişkene timer her çalıştığında +1 eklenir. eğer timerdeki değişken değeri 5 olur ise oyuncuya -3 can verir ve değişken değerini sıfırlarsın, tekrar çalışır 5 saniye olur ve -3 can verir. Timer içeriğini atarsan yardimci olabilirim.

+1 falan eklemeyi unuttum yardımcı olursan sevinirim

forward TecavuzUgradim(playerid);
public TecavuzUgradim(playerid)
{
   new Float:HP;
   GetPlayerHealth(playerid, HP);
   SetPlayerHealth(playerid, HP-3);
   return 1;
}


Cherry

Hata varsa yazarsın düzeltip tekrardan atarım.

Modun başına;
PAWN Kodu: Seç
new TecavuzTimer[MAX_PLAYERS];
PAWN Kodu: Seç
CMD:tecavuz(playerid, params[])
{
  if(gTeam[playerid] != TECAVUZCU) return hataMesaji(playerid, "{FF0000}Bu komutu kullanmak için Tecavüzcü mesleğinde olmalısınız");
  new edilen;
  if(sscanf(params, "i[24]", edilen)) return SendClientMessage(playerid, 0x7491D6FF, "[BILGI] {FFFFFF}/tecavuz [oyuncu-id]");
  SetPVarInt(edilen, "TecavuzDurum", 1);
  TecavuzTimer[playerid] = SetTimerEx("TecavuzUgradim", 1000, true, "i", playerid);
  return 1;
}
PAWN Kodu: Seç

forward TecavuzUgradim(playerid);
public TecavuzUgradim(playerid)
{
  new Float:HP, artansayi = 0;
  GetPlayerHealth(playerid, HP);
  artansayi++;
  if(artansayi > 15) return SetPVarInt(playerid, "TecavuzeUgradim", 0), KillTimer(TecavuzTimer[playerid]); // 15 saniye olursa tecavüze uğraması sıfırlanacak ve KillTimer ile timer'i durduracağız.
  switch(artansayi)
  {
case 5: SetPlayerHealth(playerid, HP-3); // 5 saniye olduğunda.
case 10: SetPlayerHealth(playerid, HP-3); // 10 saniye olduğunda.
case 15: SetPlayerHealth(playerid, HP-3); // 15 saniye olduğunda.
  }
  return 1;
}


HasanEfe

Alıntı yapılan: Cherry - 06 Haziran 2020, 23:06:53
Hata varsa yazarsın düzeltip tekrardan atarım.

Can gitmiyor muhtemelen public de sıkıntı olabilir bu arada bunu ölene kadar yapabiliyormuyuz çünkü case 20 case 25 gibi gibi devam ederse modun optimizasyonu düşebilir yinede teşekkürler


Cherry

Timer 15 saniye boyunca çalışıyor, saniye 5-10-15 olduğunda HP -3 azalıyor. Saniye 15'den büyük olduğunda tecavüz durumu 0 oluyor ve timeri durduruyoruz. case yapısı ise optimizasyonu etkilemez. Eğer ölene kadar yaptırtmak istiyorsan kişinin HP'sini çekip HP 0 olana kadar çalışmasını sağlayabilirsin.

Modun başına şunuda ekle;

PAWN Kodu: Seç
new artansayi[MAX_PLAYERS];
Tecavüz komutunu şöyle değiştir;

PAWN Kodu: Seç
CMD:tecavuz(playerid, params[])
{
  new edilen;
  if(sscanf(params, "i[24]", edilen)) return SendClientMessage(playerid, 0x7491D6FF, "[BILGI] {FFFFFF}/tecavuz [oyuncu-id]");
  SetPVarInt(edilen, "TecavuzDurum", 1);
  TecavuzTimer[edilen] = SetTimerEx("TecavuzUgradim", 1000, true, "i", edilen);
  artansayi[edilen] = 0;
  return 1;
}

Fonksiyonuda şöyle değiştir;

PAWN Kodu: Seç
forward TecavuzUgradim(playerid);
public TecavuzUgradim(playerid)
{
  new Float:HP;
  GetPlayerHealth(playerid, HP);
  artansayi[playerid] += 1;
  printf("%d", artansayi[playerid]);
  if(artansayi[playerid] > 15) return SetPVarInt(playerid, "TecavuzeUgradim", 0), KillTimer(TecavuzTimer[playerid]); // 15 saniye olursa tecavüze uğraması sıfırlanacak ve KillTimer ile timer'i durduracağız.
  switch(artansayi[playerid])
  {
case 5: SetPlayerHealth(playerid, HP-3); // 5 saniye olduğunda.
case 10: SetPlayerHealth(playerid, HP-3); // 10 saniye olduğunda.
case 15: SetPlayerHealth(playerid, HP-3); // 15 saniye olduğunda.
  }
  return 1;
}


Cherry

Ayrıca şimdi fark ettim, tecavuz komutunda i[24] yanlış bir kullanım onu i olarak değiştirmelisin. Integer bir değere uzunluk tanımlayamazsın.


HasanEfe

Alıntı yapılan: Cherry - 06 Haziran 2020, 23:26:50
Timer 15 saniye boyunca çalışıyor, saniye 5-10-15 olduğunda HP -3 azalıyor. Saniye 15'den büyük olduğunda tecavüz durumu 0 oluyor ve timeri durduruyoruz. case yapısı ise optimizasyonu etkilemez. Eğer ölene kadar yaptırtmak istiyorsan kişinin HP'sini çekip HP 0 olana kadar çalışmasını sağlayabilirsin.

Modun başına şunuda ekle;

https://www.upload.ee/image/11835474/cmd.PNG

bunu durmayı nasıl yapıcam anlamadım timerle ile ilgili fazla bilgim yok bide case 5, case 10 gibi şey yapmak yerine her 5 saniyede yapma gibi birşey yapamaz mıyız

Alıntı yapılan: Cherry - 06 Haziran 2020, 23:29:52
Ayrıca şimdi fark ettim, tecavuz komutunda i[24] yanlış bir kullanım onu i olarak değiştirmelisin. Integer bir değere uzunluk tanımlayamazsın.

panelde sscanf uyarı veriyordu i[24] olan yere u yazdım sıkıntı çözüldü


Cherry

Alıntı yapılan: HasanEfe - 06 Haziran 2020, 23:35:04
Alıntı yapılan: Cherry - 06 Haziran 2020, 23:26:50
Timer 15 saniye boyunca çalışıyor, saniye 5-10-15 olduğunda HP -3 azalıyor. Saniye 15'den büyük olduğunda tecavüz durumu 0 oluyor ve timeri durduruyoruz. case yapısı ise optimizasyonu etkilemez. Eğer ölene kadar yaptırtmak istiyorsan kişinin HP'sini çekip HP 0 olana kadar çalışmasını sağlayabilirsin.

Modun başına şunuda ekle;

https://www.upload.ee/image/11835474/cmd.PNG

bunu durmayı nasıl yapıcam anlamadım timerle ile ilgili fazla bilgim yok bide case 5, case 10 gibi şey yapmak yerine her 5 saniyede yapma gibi birşey yapamaz mıyız
TecavüzTimer'i KillTimer ile bitirdim kendim denediğimde 16'ya kadar çalışıyordu. Her 5 saniyede yapman için o timer'in sürekli çalışması gerekiyor ölene kadar. Ben senin anlatımından anladığım kadarıyla 15 saniye içinde 5 saniye oldukça -3 HP vermesini istiyorsun diye düşünerek böyle bir şey yaptım. printf komutunu silersen onları yazdırmayı engelleyebilirsin. :)

Edit:
Şu kodu
PAWN Kodu: Seç
if(artansayi[playerid] > 15) return SetPVarInt(playerid, "TecavuzeUgradim", 0), KillTimer(TecavuzTimer[playerid]);
PAWN Kodu: Seç
if(artansayi[playerid] > 15) return SetPVarInt(playerid, "TecavuzeUgradim", 0), artansayi[playerid] = 0, KillTimer(TecavuzTimer[playerid]); Olarak değiştirirsen her çalıştığında 0'dan başlar ve 16'ya kadar çalışır 16 olduğunda durur, gözümden kaçmış. Üsttede dediğim gibi printf komutunu silerek konsola yazdırmasını engelleyebilirsin test etmek için yazdırmıştım.
Son düzenlenme: 06 Haziran 2020, 23:40:58 Cherry

Radless

PAWN Kodu: Seç
new pTecavuzTimer[MAX_PLAYERS];

CMD:tecavuz(playerid, params[])
{
if (gTeam[playerid] != TECAVUZCU)
return hataMesaji(playerid, "{FF0000}Bu komutu kullanmak için Tecavüzcü mesleğinde olmalısınız");
   
new edilen;
if (sscanf(params, "d", edilen))
return SendClientMessage(playerid, 0x7491D6FF, "[BILGI] {FFFFFF}/tecavuz [oyuncu-id]");
   
if (!IsPlayerConnected(edilen))
return SendClientMessage(playerid, 0xFF0000FF, "[HATA] {FFFFFF}Oyuncu bulunamadı.");
   
SetPVarInt(edilen, "TecavuzDurum", 1);
pTecavuzTimer[edilen] = SetTimerEx("TecavuzeUgradi", 5000, true, "d", edilen);
return 1;
}

forward TecavuzeUgradi(playerid);
public TecavuzeUgradi(playerid)
{
if (GetPVarInt(playerid, "TecavuzDurum") == 1)
{
new Float: HP;

GetPlayerHealth(playerid, HP);
SetPlayerHealth(playerid, HP - 5);
}
return 1;
}

public OnPlayerConnect(playerid)
{
KillTimer(pTecavuzTimer[playerid]);
SetPVarInt(playerid, "TecavuzDurum", 0);
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
if (GetPVarInt(playerid, "TecavuzDurum") == 1)
{
KillTimer(pTecavuzTimer[playerid]);
SetPVarInt(playerid, "TecavuzDurum", 0);
}
return 1;
}
Son düzenlenme: 06 Haziran 2020, 23:55:41 Radless
"Life's too short to hold grudges."