Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

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


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
5 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 11.05.2015 16:31

	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?


  • +
  • -
  • 0

#2 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 12.05.2015 01:52

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;
}

  • +
  • -
  • 1

#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 12.05.2015 05:39

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

#4 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 12.05.2015 11:07

no to ustaw rozmiar na np. 512


  • +
  • -
  • 1

#5 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 12.05.2015 11:33

Dobra ale dlaczego ten touch jest 2 razy?
  • +
  • -
  • 0

#6 Ossal

    Wszechwidzący

  • Użytkownik

Reputacja: 20
Życzliwy

  • Postów:273
  • GG:
  • Lokalizacja:Warszawa
Offline

Napisano 13.06.2015 00:02


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

  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych