- ProxDetector -
ProxDetector
Krajnji cilj ove funkcije jeste da igračima u određenom radiusu u kom se neki igrač nalazi pošalje poruku (SendClientMessage).
Svi misle da je to obična poruka i oni je koriste sa ovim bojama: PROX, PROX, PROX, PROX, PROX
Zašto onda uopšte postoji ova funkcija i malo kompleksnija matematika unutar nje ako ćete vi samo roknuti 5 istih boja?
Cilj ove funkcije je RolePlay chat zapravo ima neki smisao pa umesto 5 istih boja, stavite PLUM (PROX) boju od svetlije ka tamnijoj.
Što je igrač bliže igraču - to je boja svetlija.
Što je igrač dalje od mete - to je boja tamnija i daje simboliku da je igrač udaljen.
y_colours.inc X11_PLUM_5, X11_PLUM_4, X11_PLUM_3, X11_PLUM_2, X11_PLUM_1
( možda je i obrnuto, testiraj, nisam odavno palio SAMP jbg a ne ide mi matematika hehe )
ProxDetector koji Vi koristite (UP/SA editori yay)
public ProxDetector(Float:radi, playerid, string[],c1,c2,c3,c4,c5)
{
if(IsPlayerConnected(playerid))
{
new Float:pPosX, Float:pPosY, Float:pPosZ;
new Float:oldpPosX, Float:oldpPosY, Float:oldpPosZ;
new Float:tmpPosX, Float:tmpPosY, Float:tmpPosZ;
GetPlayerPos(playerid, oldpPosX, oldpPosY, oldpPosZ);
foreach(Player,i)
{
if(IsPlayerConnected(i))
{
if(GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i))
{
GetPlayerPos(i, pPosX, pPosY, pPosZ);
tmpPosX = (oldpPosX -pPosX);
tmpPosY = (oldpPosY -pPosY);
tmpPosZ = (oldpPosZ -pPosZ);
if(((tmpPosX < radi/16) && (tmpPosX > -radi/16)) && ((tmpPosY < radi/16) && (tmpPosY > -radi/16)) && ((tmpPosZ < radi/16) && (tmpPosZ > -radi/16)))
{
SendClientMessage(i, c1, string);
}
else if(((tmpPosX < radi/8) && (tmpPosX > -radi/8)) && ((tmpPosY < radi/8) && (tmpPosY > -radi/8)) && ((tmpPosZ < radi/8) && (tmpPosZ > -radi/8)))
{
SendClientMessage(i, c2, string);
}
else if(((tmpPosX < radi/4) && (tmpPosX > -radi/4)) && ((tmpPosY < radi/4) && (tmpPosY > -radi/4)) && ((tmpPosZ < radi/4) && (tmpPosZ > -radi/4)))
{
SendClientMessage(i, c3, string);
}
else if(((tmpPosX < radi/2) && (tmpPosX > -radi/2)) && ((tmpPosY < radi/2) && (tmpPosY > -radi/2)) && ((tmpPosZ < radi/2) && (tmpPosZ > -radi/2)))
{
SendClientMessage(i, c4, string);
}
else if(((tmpPosX < radi) && (tmpPosX > -radi)) && ((tmpPosY < radi) && (tmpPosY > -radi)) && ((tmpPosZ < radi) && (tmpPosZ > -radi)))
{
SendClientMessage(i, c5, string);
}
} }
}
}
return 1;
}Ova funkcija je Veoma loše napisana ali matematičke funkcije unutar nje su sasvim u redu.
Samim tim sam odlučio da napišem mnogo bolju funkciju, pored OGROMNOG ubraznja, dobili ste i args deo da ne morate za svaku poruku praviti novi string i formatirati isti 😄
ProxDetector koji sam ja napisao (matematika je ista!!)
ProxDetector(Float:radius, playerid, const input[], c1, c2, c3, c4, c5, va_args<>)
{
new
string,
Float:pPosX,
Float:pPosY,
Float:pPosZ,
Float:oldpPosX,
Float:oldpPosY,
Float:oldpPosZ,
Float:tmpPosX,
Float:tmpPosY,
Float:tmpPosZ;
va_format(string, sizeof string, input, va_start<8>);
GetPlayerPos(playerid, oldpPosX, oldpPosY, oldpPosZ);
foreach(new i : StreamedPlayer)
{
GetPlayerPos(i, pPosX, pPosY, pPosZ);
tmpPosX = (oldpPosX -pPosX);
tmpPosY = (oldpPosY -pPosY);
tmpPosZ = (oldpPosZ -pPosZ);
if(((tmpPosX < radi/16) && (tmpPosX > -radi/16)) && ((tmpPosY < radi/16) && (tmpPosY > -radi/16)) && ((tmpPosZ < radi/16) && (tmpPosZ > -radi/16)))
{
SendClientMessage(i, c1, string);
}
else if(((tmpPosX < radi/8) && (tmpPosX > -radi/8)) && ((tmpPosY < radi/8) && (tmpPosY > -radi/8)) && ((tmpPosZ < radi/8) && (tmpPosZ > -radi/8)))
{
SendClientMessage(i, c2, string);
}
else if(((tmpPosX < radi/4) && (tmpPosX > -radi/4)) && ((tmpPosY < radi/4) && (tmpPosY > -radi/4)) && ((tmpPosZ < radi/4) && (tmpPosZ > -radi/4)))
{
SendClientMessage(i, c3, string);
}
else if(((tmpPosX < radi/2) && (tmpPosX > -radi/2)) && ((tmpPosY < radi/2) && (tmpPosY > -radi/2)) && ((tmpPosZ < radi/2) && (tmpPosZ > -radi/2)))
{
SendClientMessage(i, c4, string);
}
else if(((tmpPosX < radi) && (tmpPosX > -radi)) && ((tmpPosY < radi) && (tmpPosY > -radi)) && ((tmpPosZ < radi) && (tmpPosZ > -radi)))
{
SendClientMessage(i, c5, string);
}
}
return 1;
}Ovde je jedina promena koja je odgovorna za ovo ogromno ubrzanje StreamedPlayer iterator, njega već imate ukoliko koristite y_iterate.
To znači da umesto da loopujemo kroz sve igrače na serveru, mi ćemo loopovati samo kroz one u blizini igrača tj samo one koje igrač može da vidi (učitane/streamovane igrače)
Ovo nisam benchmarkovao jer je ubrzanje očigledno - umesto da loopujete kroz npr 283 igrača, Vi loopujete kroz 4 slota unutar iteratora, i budala vidi razliku 😄
Takođe, funkcija koju vi koristite ima proveru za VW i INT ali ovde to nije potrebno jer je u pitanju callback za streamovanje igrača tako da se podrazumeva da su u istom INT/VW, opet ogromno ubrzanje, možda čak i veće nego od ovog da ne morate loop kroz sve igrače 🙂
Nisam compile ali ako ne bude bacalo errore/warninge funkcija 99.9% radi, ovih 0.1% su da imate pogrešne verzije include-a 😄
EDIT: Ako budeš koristio ostavi neki kredit il' se za'fali, nemo si cig... ovaj cicija 😐



