←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak wykryć Double-headshoot

  • +
  • -
PrezydenT's Photo PrezydenT 11.09.2014

Witam, czy dałoby radę sprawdzić jakoś czy gracz trafił dwóch wrogów w głowę jednym pociskiem?

Quote

  • +
  • -
No Chance's Photo 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;

}
Quote

  • +
  • -
MAGNET's Photo MAGNET 11.09.2014

Musisz mi podarować ze pisze z telefonu, ale ja wpadłem na coś takiego:
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.
Quote

  • +
  • -
No Chance's Photo 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

Quote

  • +
  • -
G[o]Q's Photo G[o]Q 11.09.2014

zlapanie traceline ?

Quote

  • +
  • -
MAGNET's Photo MAGNET 12.09.2014

1+ ? To dokładnie to samo co ++... Ale wkradl mi się błąd bo powinno być strzaly[id]==++stare_strzały[id]. Sprawdza to czy został wystrzelony 1 pocisk i padły 2 HSy. Ale i tak najoptymalniejsze bd TraceLine.
Quote

  • +
  • -
GwynBleidD's Photo GwynBleidD 12.09.2014

1+ ? To dokładnie to samo co ++

Oj absolutnie nie!

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ę.
Quote

  • +
  • -
Rivit's Photo 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ś?

Quote

  • +
  • -
MAGNET's Photo MAGNET 12.09.2014

Nie wiedziałem ze wartość zmiennej przy warunku może ulec zmianie. Co do pre i post wiedziałem. Dzięki :D
Edited by MAGNET, 12.09.2014 15:38.
Quote

  • +
  • -
GwynBleidD's Photo GwynBleidD 12.09.2014


A kompilator PAWN'a wykryje takie coś?

Przy maksymalnej optymalizacji ( -d0) tak, przy domyślnej: nigdy nie sprawdzałem.

Quote

  • +
  • -
PrezydenT's Photo PrezydenT 13.09.2014

Panowie, wróćmy do tematu, bo chyba o wartości zmiennej tu nie chodzi. :)

Quote

  • +
  • -
MAGNET's Photo MAGNET 13.09.2014

Masz przykłady - sprawdz
Quote

  • +
  • -
PrezydenT's Photo PrezydenT 13.09.2014

No niby tak, ale jak ustrzelić double headshoot? To graniczy z cudem xD

Quote

  • +
  • -
Rivit's Photo Rivit 13.09.2014

No niby tak, ale jak ustrzelić double headshoot? To graniczy z cudem xD

 

 

Zamrażasz boty i biegniesz na spawn.

 

Przez 2 pkt może przejść tylko jedna prosta :)

Quote

  • +
  • -
No Chance's Photo 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.

Quote

  • +
  • -
grankee's Photo 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 
}
Quote