Balkan SA:MP

San Andreas Multiplayer - www.sa-mp.com => Tutorijali u vezi SA-MPa => Temu započeo: P47R14RCH poslato Januar 02, 2020, 14:18:08 POSLE PODNE

Naslov: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 14:18:08 POSLE PODNE
- 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 :-\
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: daddyDOT poslato Januar 02, 2020, 14:21:18 POSLE PODNE
Šta da kažem..., bravo  :-*
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 14:22:40 POSLE PODNE
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.
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: 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    ;)
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 14:28:35 POSLE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: 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.
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 14:38:45 POSLE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: __vedran.xyz77 poslato Januar 02, 2020, 14:59:36 POSLE PODNE
najs
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 15:04:49 POSLE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: andr00- 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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: P47R14RCH poslato Januar 02, 2020, 15:52:34 POSLE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: rane 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?
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: PabloK poslato Maj 08, 2020, 03:44:45 PRE PODNE
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! :)
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: rane 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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: PabloK poslato Maj 08, 2020, 03:51:55 PRE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: rane poslato Maj 08, 2020, 04:05:36 PRE PODNE
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
Naslov: Odg: Kako je kreirana optimizovana verzija ProxDetector funkcije
Poruka od: PabloK poslato Maj 08, 2020, 04:08:23 PRE PODNE
Poslao sam fix u PM, falio je #define _FOREACH_STREAMED 1 pre y_iterate-a

Sutra će biti verzija bez ove matematike, još brže :D