id gracza który znajduje się najbliżej entu
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
Użytkownik Pan PrO edytował ten post 18.11.2012 18:33
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ę.
Pan PrO
18.11.2012
coś takiego ??
Użytkownik Pan PrO edytował ten post 18.11.2012 18:54
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
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
}
GwynBleidD
18.11.2012
Kilka uwag:
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.
- 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.
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ś ??
Droso
18.11.2012
http://amxx.pl/pastebin/4s736dz5tam8/
Nie testowano
Użytkownik HubertTM edytował ten post 18.11.2012 19:51
Nie testowano
Użytkownik HubertTM edytował ten post 18.11.2012 19:51
nPaul
18.11.2012
A ja ci po prostu powiem żebyś zajrzał w kod CodModa a dokładnie ApteczkaThink
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.
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
Ten temat został zamknięty przez moderatora.
Powód: Temat zamknięty na prośbę użytkownika.
Z pozdrowieniami,
Zespół AMXX.PL