←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Touch wywołuje się 2 razy chociaż nie powi...

  • +
  • -
Rivit - zdjęcie Rivit 11.05.2015

	register_touch("spitter", "player", "fwd_touch")
public fwd_touch(ent, id)
{
	if(!pev_valid(ent) || !is_user_alive(id)) return;

        engfunc(EngFunc_RemoveEntity, ent);
        Uzyj(id)
}

W funkcji uzyj na razie jest tylko client_print().

 

Zauważyłem, że tekst pojawia się 2 razy! Nie wiem czy ten touch taki szybki, że zanim usunie entity to on jeszcze raz się wywoła czy jak?

Co może być nie halo?

Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 12.05.2015

new bool:g_bDelete[33];

public fwd_touch(ent, id)
{
	if(!pev_valid(ent) || !is_user_alive(id) || g_bDelete[ent]) return;

	engfunc(EngFunc_RemoveEntity, ent);
	Uzyj(id)
	g_bDelete[ent] = true;
}
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 12.05.2015

Będzie sypać index out of bounds bo indexy entity mają więcej niż 33...
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 12.05.2015

no to ustaw rozmiar na np. 512

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 12.05.2015

Dobra ale dlaczego ten touch jest 2 razy?
Odpowiedz

  • +
  • -
Ossal - zdjęcie Ossal 13.06.2015


Nie wiem czy ten touch taki szybki, że zanim usunie entity to on jeszcze raz się wywoła

Sam sobie odpowiedziałeś chyba :)
Pewien nie jestem, ale Touche wykonywane są w server_frame, a ta funkcja wywoływana jest 500-1000 razy na sekundę (zależy jaki serwer), czyli dość często jak się można domyślić :D
Przestawienie zmiennej logiczej (którą dodał kolega wyrzej) nie zabiera nic czasu, a jak widać usuniecie entu trochę zajmuję.
Co do tablicy to niestety lipa, bo tablica 512 nie zawsze da radę (np na de_piranesi jest chyba z 900 entów bazowych), poza tym szkoda zajmować pamięć tablicą, którą wykorzystamy w 1%.
Dlatego przy entach zazwyczaj korzysta się z nieużywanych pevów entu np tak:

public fwd_touch(ent, id)
{
	if(!pev_valid(ent) || !is_user_alive(id) || pev(ent,pev_fuser4) return;
	engfunc(EngFunc_RemoveEntity, ent);
	Uzyj(id)
	set_pev(ent,pev_fuser4,1.0)
}

Nie testowałem, ale powinno latać, jak nie śmiga, użyj tablicy, ewentualnie tablicy dynamicznej, albo znajdź sobie inny pev (byle był nie używany :P)

Edit: z tym server_frame to chyba mnie poniosło mocno, touche raczej są sprawdzane w osobistych thinkach entu, one są znacznie znacznie rzadziej ;)


Użytkownik Ossal edytował ten post 13.06.2015 00:08
Odpowiedz