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 ??
Edited by Pan PrO, 18.11.2012 18:33.
Edited by Pan PrO, 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 ??
Edited by Pan PrO, 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
}
Edited by Pan PrO, 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
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