Kako je kreirana optimizovana verzija ProxDetector funkcije

Započeo P47R14RCH, Januar 02, 2020, 14:18:08 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

- 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)
[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 :-\
Poslednja Izmena: Januar 02, 2020, 14:20:10 POSLE PODNE od P47R14RCH


Citat: daddy. poslato Januar 02, 2020, 14:21:18 POSLE PODNE
Šta da kažem..., bravo  :-*
Ma da, nego evo Vam na ENGLESKOM objašnjenje jer sam pokušao naći sliku i našao ovu sexy poruku (kod sam pisao ja, niko drugi da se zna):
Citat: VinceProxDetector is an old and outdated function from gf to send messages to players that are in a specified range, in different colors dependent on how far they are away from the center of the range. With that in mind, you can just look it up in the GodFather script, although I strongly advise to not use it.

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    ;)

Citat: Galardo poslato Januar 02, 2020, 14:25:21 POSLE PODNE
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    ;)
Nije beskorisna, jer umesto da kreirate simple radius check Vi i dalje koristite ovo, čemu onda sva ova matematika ako je nećete koristiti, onda samo usporava...?

I nije beskorino, veruj mi, kada uđeš na server i kada neko napiše poruku u IC chatu ili /me /do tačno se vidi po boji poruke da li je blizu tebe ili dalje, da znaš dal treba da bežiš ili RPa sa nekim drugim :D

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.

Citat: Galardo poslato Januar 02, 2020, 14:36:57 POSLE PODNE
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.
Ma ja sam ovo objavio samo iz razloga jer već koristite ProxDetector, slobodno vi nastavite koristiti 5 PROX boja, nije to poenta nego je stvar da je mnogo brže zbog iteratora i ne proveravaš VW/INT, bar može poslužiti kao primer ako ništa :D


Citat: //>> Vedran poslato Januar 02, 2020, 14:59:36 POSLE PODNE
najs
Of course.

Imam i bolju, bržu koja uopće ne koristi matematiku i mnogo je realnija ali to je priv8 jbg :D

welcome back xd
na coi sam vidio da ja boja chata drugacija kada se udaljis od igraca al nisam znao kako su to napravili.. dobar tutorijal

Citat: androo poslato Januar 02, 2020, 15:49:20 POSLE PODNE
welcome back xd
na coi sam vidio da ja boja chata drugacija kada se udaljis od igraca al nisam znao kako su to napravili.. dobar tutorijal
Ne mora da znači da je tako, može i dosta bolje ali ovo nije poenta tog tutoriala haha :D

[pawn]cR = float(color >> 24 & 0xFF);
cG = float(color >> 16 & 0xFF);
cB = float(color >> 8 & 0xFF);[/pawn]
I onda posle floatround sa range & ratio but priv8 :D

[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?

[Filterscript] Simple Treasure Hunt
[Filterscript] Sistem pecanja
[Filterscript] Meditacija
[Filterscript] Molitva
[Include] Alarm
[Include] Posao Taxi

Citat: Slav poslato Maj 08, 2020, 02:39:38 PRE PODNE
[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?
Moraš da imaš y_iterare included ali ne preporučujem da koristiš ovo jer ću sutra da release-am sve što imam! :)
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.

Probao sam sve verzije y_iterate nekoliko puta sam mjenjao komplet pawno i opet isto, pricekat cu sutra :D

[Filterscript] Simple Treasure Hunt
[Filterscript] Sistem pecanja
[Filterscript] Meditacija
[Filterscript] Molitva
[Include] Alarm
[Include] Posao Taxi

Citat: Slav poslato Maj 08, 2020, 03:48:53 PRE PODNE
Probao sam sve verzije y_iterate nekoliko puta sam mjenjao komplet pawno i opet isto, pricekat cu sutra :D
Uh, poprilično sam siguran da je ovo default iterator tj da ga YSI po defaultu poseduje...
Svakako čekaj sutra ujutru da ne palim PC sada
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.