- ProxDetector -
ProxDetectorKrajnji 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)[pawn]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;
}[/pawn]
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 :D
ProxDetector koji sam ja napisao (matematika je ista!!)[pawn]ProxDetector(Float:radius, playerid, const input[], c1, c2, c3, c4, c5, va_args<>)
{
new
string[YSI_MAX_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[playerid])
{
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;
}[/pawn]
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 :D
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 :D
EDIT: Ako budeš koristio ostavi neki kredit il' se za'fali, nemo si cig... ovaj cicija :-\
Ako ćemo gledati po roleplay-u funckija za boje nije uopste potrebna,to je totalno beskorisno za rpere,ali dobro posto su nasi svi serveri "rp" moze proći.
Što se tice ostalog dijela,svakako gj za to ;)
Nisi me baš najbolje shvatio,sto se tice radiusa,to je okej,kad vec mozes proći kroz 5 igraca a ne kroz sve...
Za rp kod nas to ne bi proslo,jer nasi "rperi" bi rpali sa likom koji je u drugom gradu,a kamoli da je blizu njega,ovo treba strancima,nazalost,ne nama.
[pawn]C:\Users\waz_d\Desktop\Server\gamemodes\mode.pwn(4272) : error 017: undefined symbol "StreamedPlayer@YSII_Ag"
C:\Users\waz_d\Desktop\Server\gamemodes\mode.pwn(4272) : warning 215: expression has no effect
C:\Users\waz_d\Desktop\Server\gamemodes\mode.pwn(4272) : error 001: expected token: ")", but found ";"
C:\Users\waz_d\Desktop\Server\gamemodes\mode.pwn(4272) : error 036: empty statement
C:\Users\waz_d\Desktop\Server\gamemodes\mode.pwn(4272) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
4 Errors.[/pawn]Zna neko do cega je?
Probao sam sve verzije y_iterate nekoliko puta sam mjenjao komplet pawno i opet isto, pricekat cu sutra :D
Nezz fkt ja ti kazem da sam probao compile i svaki put isto, probavao sam i 3.1 i 4.0.2 i 5.1