←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

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

Zablokowany

  • +
  • -
Pan PrO - zdjęcie 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 ??
Użytkownik Pan PrO edytował ten post 18.11.2012 18:33
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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ę.
Odpowiedz

  • +
  • -
Pan PrO - zdjęcie 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
}

Użytkownik Pan PrO edytował ten post 18.11.2012 18:54
Odpowiedz

  • +
  • -
Pan PrO - zdjęcie 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
}
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.
Odpowiedz

  • +
  • -
Pan PrO - zdjęcie 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ś ??
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 18.11.2012

http://amxx.pl/pastebin/4s736dz5tam8/
Nie testowano :P
Użytkownik HubertTM edytował ten post 18.11.2012 19:51
Odpowiedz

  • +
  • -
nPaul - zdjęcie nPaul 18.11.2012

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

  • +
  • -
dasiek - zdjęcie 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.
Odpowiedz

  • +
  • -
Pan PrO - zdjęcie Pan PrO 18.11.2012

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

  • +
  • -
Kawon - zdjęcie 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
Odpowiedz
Zablokowany