Ö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
Timer sonunda 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.
Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50Timer sonunda 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
Alıntı yapılan: HasanEfe - 06 Haziran 2020, 22:55:06Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50Timer sonunda 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.
Alıntı yapılan: Cherry - 06 Haziran 2020, 22:57:22Alıntı yapılan: HasanEfe - 06 Haziran 2020, 22:55:06Alıntı yapılan: Cherry - 06 Haziran 2020, 22:48:50Timer sonunda 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;
}
Hata varsa yazarsın düzeltip tekrardan atarım.
Modun başına;
new TecavuzTimer[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, "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;
}
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;
}
Alıntı yapılan: Cherry - 06 Haziran 2020, 23:06:53Hata 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
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;
new artansayi[MAX_PLAYERS];
Tecavüz komutunu şöyle değiştir;
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;
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;
}
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.
Alıntı yapılan: Cherry - 06 Haziran 2020, 23:26:50Timer 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:52Ayrı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ü
Alıntı yapılan: HasanEfe - 06 Haziran 2020, 23:35:04Alıntı yapılan: Cherry - 06 Haziran 2020, 23:26:50Timer 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
if(artansayi[playerid] > 15) return SetPVarInt(playerid, "TecavuzeUgradim", 0), KillTimer(TecavuzTimer[playerid]);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.
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;
}