Jak wykryć Double-headshoot
PrezydenT
11.09.2014
Witam, czy dałoby radę sprawdzić jakoś czy gracz trafił dwóch wrogów w głowę jednym pociskiem?
No Chance
11.09.2014
Zaciekawil mnie troche twoj temat bo lubie nad czyms posiedziec i sie zastanowic troche.
I tak siedzialem az w końcu chcialem zwatpic az nagle cos zablyslo.
Nie wiem jakie beda tego efekty (nie wiem jak zareaguje przy fullauto). Nie testowalem prosto z mojej glowy.
Nawet jak nie zadziala kod to moze temat ruszy i reszta da jakis pomysl moze cos poprawi zmieni i uda ci sie pomoc.
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #include <fakemeta> #include <hamsandwich> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "author" new ilosc_strzalow[33]; new bool:strzelil_hs[33]; new numer_naboju[33]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1); register_event("DeathMsg","deathmsg","ae") register_event("CurWeapon", "CurWeapon", "be", "1=1"); } public Odrodzenie(id) { if(!is_user_alive(id) || !is_user_connected(id)) return PLUGIN_CONTINUE; ilosc_strzalow[id] = 0; numer_naboju[id] = 0; strzelil_hs[id] = false; return PLUGIN_CONTINUE; } public deathmsg(id) { new id = read_data(1) new victim = read_data(2) new headshot = read_data(3) if (!is_user_alive(id) || !headshot ) return PLUGIN_CONTINUE if (get_user_team(id) != get_user_team(victim) && strzelil_hs[id]){ if(ilosc_strzalow[id] == numer_naboju[id]){ client_print(id,print_chat,"Prawdopodobnie ustrzeliles Double Headshooooot !!!"); strzelil_hs[id] = false; } } if (get_user_team(id) != get_user_team(victim)){ strzelil_hs[id] = true; numer_naboju[id] = ilosc_strzalow[id]; } return PLUGIN_CONTINUE } public CurWeapon(id) { if(!is_user_connected(id)) return PLUGIN_CONTINUE if(pev(id, pev_button) & IN_ATTACK) ilosc_strzalow[id]++; return PLUGIN_CONTINUE; }
MAGNET
11.09.2014
public Curweapon(id) { if(button blabla) { stare_strzały[id] = strzały[id] strzały[id]++ } } public Deathmsg() { if(hs) Headshot[id]++ else Headshot[id] = 0 if(Headshot[id] == 2 && stare_strzały[id] == ++strzały[id]) ////Masz double HS }Sory za brak tabulacji i w tak okrojonym wydaniu. Mam nadzieję że sama idea jest zrozumiała. Jeśli powyżej jest zastosowana taka sama metoda to przepraszam, ale nie wglebialem się w kod.
No Chance
11.09.2014
public Deathmsg() { if(hs) Headshot[id]++ else Headshot[id] = 0 if(Headshot[id] == 2 && stare_strzały[id] == ++strzały[id]) ////Masz double HS }
Wydaje mi sie ze to nie przejdzie poniewaz najwazniejsze jest na poczatku sprawdzenie ilosci strzalow gracz w evencie death.
A u ciebie sprawdza czy po prostu strzelil HS. I to by wynikalo ze plugin by nie zadziala.
I bylbym pewny na 100% lecz nie wiem jak to do konca dziala a nie mam czasu aby sprawdzic
if(Headshot[id] == 2 && stare_strzały[id] == ++strzały[id])
stare_strzaly[id] == 1+strzaly[id] ??
Zreszta nie wiem chyba nie. Wytlumacz mi to a moze cos sie wymysli
MAGNET
12.09.2014
GwynBleidD
12.09.2014
Oj absolutnie nie!1+ ? To dokładnie to samo co ++
a = 3 b = 2 if (a == b) { // false, z oczywistych przyczyn } if (a == ++b) { // true, gdyż ++b zwróci 3, gdy b było równe 2 } if (a == b) { // true, gdyż b jest teraz równe 3! }
a = 3 b = 2 if (a == b) { // false, z oczywistych przyczyn } if (a == 1+b) { // true, gdyż 1+b zwróci 3, gdy b było równe 2 } if (a == b) { // nadal false, b dalej jest równe 2 }Tak wygląda różnica w praktyce. Dodatkowo:
a = 3 b = 2 if (a == b) { // false, z oczywistych przyczyn } if (a == b++) { // false, gdyż b++ zwróci STARĄ wartość b } if (a == b) { // true, nowa wartość b to 3! }++b jest nazywane pre-inkrementacją, gdyż inkrementacja zmiennej (czyli zwiększenie jej wartości o 1) następuje przed zwróceniem wartości zmiennej. b++ nazywane jest post-inkrementacją, gdyż inkrementacja następuje PO zwróceniu wartości zmiennej.
I jeszcze jedna uwaga, w pętli for warto jest użyć ++i zamiast i++, czyli:
for (new i=0; i<a;++i)dlaczego?
b++ w praktyce jest reprezentowane następującymi składowymi operacjami:
1. zapamiętaj wartość zmiennej b
2. zwiększ b o 1
3. zwróć zapamiętaną wartość zmiennej b
natomiast ++b:
1. zwiększ b o 1
2. zwróć wartość zmiennej b
czyli mamy o jedną operację MNIEJ! I to przy każdej iteracji! Gdy pętla ma przejść 1000 razy to już jest 1000 operacji mniej. Mądre kompilatory jednak zauważą, że b++ jest użyte niepotrzebnie i kod automatycznie zoptymalizują przy kompilacji, jednak nie każdy kompilator jest mądry i nie każdy ma włączoną optymalizację.
Rivit
12.09.2014
czyli mamy o jedną operację MNIEJ! I to przy każdej iteracji! Gdy pętla ma przejść 1000 razy to już jest 1000 operacji mniej. Mądre kompilatory jednak zauważą, że b++ jest użyte niepotrzebnie i kod automatycznie zoptymalizują przy kompilacji, jednak nie każdy kompilator jest mądry i nie każdy ma włączoną optymalizację.
A kompilator PAWN'a wykryje takie coś?
MAGNET
12.09.2014
Edited by MAGNET, 12.09.2014 15:38.
GwynBleidD
12.09.2014
A kompilator PAWN'a wykryje takie coś?
Przy maksymalnej optymalizacji ( -d0) tak, przy domyślnej: nigdy nie sprawdzałem.
Rivit
13.09.2014
No niby tak, ale jak ustrzelić double headshoot? To graniczy z cudem
Zamrażasz boty i biegniesz na spawn.
Przez 2 pkt może przejść tylko jedna prosta
No Chance
13.09.2014
Nie musi to byc akurat 2x hs. Mozesz event death zamienic na cos innego przy wpisaniu nawet komendy przez gracza...lecz wszystkie zmienne warunki i reszta publicow powinno zostac taka sama.
grankee
14.09.2014
new Float:last_hs[33] public deathmsg(id) { new id = read_data(1) new victim = read_data(2) new headshot = read_data(3) if (!is_user_alive(id) || !headshot ) return PLUGIN_CONTINUE //celowo nie daje warunków czy jest z przeciwnego teamu, podwójny headshot to podwójny headshot, nie wa¿ne czy swojemu :D chcesz to sobie dodaj if(last_hs[id]+0.3>get_gametime())//no chyba ze ktos umie ustrzelic dwie glowy dwoma strzalami w ciagu 0.3 sek albo mnie, jesli tak to skroc ten czas. { client_print(id,print_chat,"Ustrzeliles dwie glowy") } else { last_hs[id]=get_gametime() } return PLUGIN_CONTINUE }