Widzę jednego babola...
odrzut(attacker,victim,Float:value)
{
new Float:vOrigin[3],Float:aOrigin[3];
new Float:Vec[3];
pev(attacker,pev_origin,aOrigin);
pev(victim,pev_origin,vOrigin);
for(new i=0;i<3;i++)
Vec[i]=(vOrigin[i]-aOrigin[i])
new Float:odleglosc
odleglosc=floatsqroot(Vec[0]*Vec[0]+Vec[1]*Vec[1]+Vec[2]*Vec[2])
new Float:przelicznik=value/odleglosc
for(new i=0;i<3;i++)
Vec[i]*=przelicznik
set_pev(victim,pev_velocity,Vec);
}
linie 2006-2009 - tutaj obliczamy kierunek w jakim gracz powinien zostać odrzucony. Jednak takie obliczanie daje nam po prostu wektor będący odległością między graczem A, a graczem B. Wektor ten będzie więc tym dłuższy, im odległość większa.
Linie 2011-2012 - pięknie obliczona długoś wektora.
Linie 2014-2017 - tutaj przemnażamy nasz wektor przez przelicznik. Ten kod może również wyglądać tak:
//
for(new i=0;i<3;i++)
Vec[i] *= value/odleglosc
set_pev(victim,pev_velocity,Vec);
Teraz widać dokładnie co robimy z wektorem, tj mnożymy go przez jakąś stałą i dzielimy przez jego długość. Jeśli stałą pominiemy, to mamy samo dzielenie czyli otrzymujemy ni mniej, ni więcej jak wektor jednostkowy!
Wektor jednostkowy to nic innego, jak wektor o długości 1. Wektor jest skierowany w stronę, w którą chcemy ale ma ZAWSZE odległość 1!
Teraz weźmy spowrotem pod uwagę naszą stałą i wychodzi na to, że za każdym razem, niezależnie od odległości nasz wektor posiada długość równą value!
A chyba miał maleć wraz z odległością, prawda?
Więc skoro chcemy, aby malał z odległością to podzielmy go jeszcze raz przez odległość:
new Float:przelicznik=value/odleglosc
for(new i=0;i<3;i++)
Vec[i]*=przelicznik/(odleglosc-1)
set_pev(victim,pev_velocity,Vec);
Dlaczego -1? już to wyjaśniłem