←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

id gracza który znajduje się najbliżej entu

Locked

  • +
  • -
Pan PrO's Photo Pan PrO 18.11.2012

Witam. Jak wyłapać id gracza który znajduje się najbliżej entu w promieniu x unitów oczywiście pomijając właściciela entu ??
Edited by Pan PrO, 18.11.2012 18:33.
Quote

  • +
  • -
GwynBleidD's Photo GwynBleidD 18.11.2012

Pętla po wszystkich graczach, sprawdzająca ich odległość od entu, wykluczająca właściciela. Tylko tak to widzę.
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 18.11.2012

coś takiego ??


new entlist[33];
new numfound = find_sphere_class(ent, "player", 300.0, entlist, 32);

for (new i=0; i < numfound; i++)
{
new pid = entlist[i];
new id = pev(ent, pev_owner);
new Float:gfOrigin[2];

entity_get_vector(pid, EV_VEC_origin, gfOrigin[1]);
entity_get_vector(ent, EV_VEC_origin, gfOrigin[0]);

new dystans = gfOrigin[1]-gfOrigin[0];

if(!is_user_alive(pid) || is_user_alive(id) || get_user_team(attacker) == get_user_team(pid))
continue;

// kod
}

Edited by Pan PrO, 18.11.2012 18:54.
Quote

  • +
  • -
Droso's Photo Droso 18.11.2012

http://amxx.pl/dokum.../get-distance-f
To powinno pomóc.
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 18.11.2012

http://amxx.pl/dokum.../get-distance-f
To powinno pomóc.


Skierowało mnie na dobrą drogę i nie wiem co dalej



new entlist[33];
new numfound = find_sphere_class(ent, "player", 300.0, entlist, 32);

for (new i=0; i < numfound; i++)
{
new pid = entlist[i];
new id = pev(ent, pev_owner);
new Float:gfOrigin[2][3];

entity_get_vector(pid, EV_VEC_origin, gfOrigin[0]);
entity_get_vector(ent, EV_VEC_origin, gfOrigin[1]);

new Float:dis = get_distance_f(gfOrigin[0], gfOrigin[1]);

if(!is_user_alive(pid) || is_user_alive(id) || get_user_team(attacker) == get_user_team(pid))
continue;

// kod
}
Quote

  • +
  • -
GwynBleidD's Photo GwynBleidD 18.11.2012

Kilka uwag:
  • Sprawdzanie, czy właściciel entu żyje wyrzuć przed pętlę... Szkoda przeczesywać wszystkich graczy, jeśli nie żyje
  • rozbij ten warunek z continue na kilka ifów, poprawi czytelność.
  • Warunki wyjścia z pętli analizuj przed wykonaniem pobrania odległości itp... przynajmniej te, do których tego nie potrzebujesz.
  • find_sphere_class może lepiej odpuść. Wydajniej będzie przeczesać WSZYSTKICH graczy i sprawdzić, czy są w wymaganej minimalnej odległości

A co dalej? Utwórz 2 zmienne: 1 będzie przechowywać id najbliższego gracza, 2 odległość. W pętli po odczytaniu odległości 2 warunki: jeśli ID najbliższego = 0, zapisujesz dane bieżącego gracza do zmiennych i wychodzisz. Jeśli id>0 porównujesz czy id bieżącego jest mniejsze od najbliższego, jeśli jest to nadpisujesz nowymi danymi.

Po wyjściu z pętli będziesz miał id najbliższego gracza, bądź 0 jeśli nie ma żadnego w wymaganym zasięgu.
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 18.11.2012

Kilka uwag:

  • Sprawdzanie, czy właściciel entu żyje wyrzuć przed pętlę... Szkoda przeczesywać wszystkich graczy, jeśli nie żyje
  • rozbij ten warunek z continue na kilka ifów, poprawi czytelność.
  • Warunki wyjścia z pętli analizuj przed wykonaniem pobrania odległości itp... przynajmniej te, do których tego nie potrzebujesz.
  • find_sphere_class może lepiej odpuść. Wydajniej będzie przeczesać WSZYSTKICH graczy i sprawdzić, czy są w wymaganej minimalnej odległości

A co dalej? Utwórz 2 zmienne: 1 będzie przechowywać id najbliższego gracza, 2 odległość. W pętli po odczytaniu odległości 2 warunki: jeśli ID najbliższego = 0, zapisujesz dane bieżącego gracza do zmiennych i wychodzisz. Jeśli id>0 porównujesz czy id bieżącego jest mniejsze od najbliższego, jeśli jest to nadpisujesz nowymi danymi.

Po wyjściu z pętli będziesz miał id najbliższego gracza, bądź 0 jeśli nie ma żadnego w wymaganym zasięgu.


Możesz napisać tę funkcję w miarę możliwości bo się pogubiłem w tym co napisałeś ??
Quote

  • +
  • -
Droso's Photo Droso 18.11.2012

http://amxx.pl/pastebin/4s736dz5tam8/
Nie testowano :P
Edited by HubertTM, 18.11.2012 19:51.
Quote

  • +
  • -
nPaul's Photo nPaul 18.11.2012

A ja ci po prostu powiem żebyś zajrzał w kod CodModa a dokładnie ApteczkaThink
Quote

  • +
  • -
dasiek's Photo dasiek 18.11.2012

@up - apteczka ma określoną wielkość w Codzie (postawiona na Respie CT nie uzdrowi na respie TT - nie sięga) i to nie przejdzie.
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 18.11.2012

Można Zamknąć nie będę wam zajmował czasu.
Quote

  • +
  • -
Kawon's Photo Kawon 18.11.2012

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Temat zamknięty na prośbę użytkownika.


Z pozdrowieniami,
Zespół AMXX.PL
Quote
Locked