hlmod.hu
https://hlmod.hu/

Hatékony scriptelés 1. - Lekérések
https://hlmod.hu/viewtopic.php?f=14&t=26490
Oldal: 1 / 1

Szerző:  mforce [ 2016.10.22. 07:14 ]
Hozzászólás témája:  Hatékony scriptelés 1. - Lekérések

Hatékony scriptelés 1. -Lekérések

Elsősorban ezzel a segédlettel szeretném eloszlatni a kételyeket, és megoldani az első számú problémát, mikor 1 függvényen belül lekérjük ugyanazt a dolgot többször, FELESLEGESEN.
Ellenpéldákat fogok bemutatni amiket az oldalon láttam visszatérően.

Rossz példa, mikor 2x lekérjük ugyanazt a natívot feleslegesen 1 függvényen belül (ezt milliószor láttam chat módosított pluginokban):
  1. new CsTeams:iTeam = cs_get_user_team(id);
  2.  
  3. switch(iTeam) {
  4.     case CS_TEAM_T: client_print_color(id, print_team_red, "^1Te ^3Terrorista^1 vagy, ezért pirosan írsz.");
  5.     case CS_TEAM_CT: client_print_color(id, print_team_blue, "^1Te ^3CT^1 vagy, ezért kéken írsz.");
  6. }
  7.  
  8. if(cs_get_user_team(id) == CS_TEAM_SPECTATOR) {
  9.     client_print_color(id, print_team_grey, "^1Te ^3Spectator^1 vagy, ezért szürkén írsz.");
  10. }


Helyette használjuk rendeltetésszerűen az elsőnek létrehozott változónkat, ha már elkezdtük.
  1. new CsTeams:iTeam = cs_get_user_team(id);
  2.  
  3. switch(iTeam) {
  4.     case CS_TEAM_T: client_print_color(id, print_team_red, "^1Te ^3Terrorista^1 vagy, ezért pirosan írsz.");
  5.     case CS_TEAM_CT: client_print_color(id, print_team_blue, "^1Te ^3CT^1 vagy, ezért kéken írsz.");
  6.     case CS_TEAM_SPECTATOR: client_print_color(id, print_team_grey, "^1Te ^3Spectator^1 vagy, ezért szürkén írsz.");
  7. }



Következő problémás dolog az if ágak kezelése.
Vegyük figyelembe itt a sorrendet, logikázzuk ki a dolgokat fejben többször.
Ezt egy deathmsg eventtel fogom szemléltetni az oldalon látott példákból kiindulva.
Rossz példa mikor a returnokat nem az event befolyásolására használjuk, csak feleslegesen és mikor visszatérően ugyanazt hívjuk meg az if ágban.
  1. public Halal() {
  2.     new iKiller = read_data(1);
  3.     new iVictim = read_data(2);
  4.     new iHeadshot = read_data(3);
  5.  
  6.     if(iKiller == iVictim)
  7.         return PLUGIN_HANDLED;
  8.  
  9.     if(iKiller != iVictim) {
  10.         new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
  11.         client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
  12.     }
  13.  
  14.     if(iKiller != iVictim && iHeadshot) {
  15.         new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
  16.         client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
  17.     }
  18.    
  19.     return PLUGIN_HANDLED;
  20. }



Ez helyett van 2 helyesebb megoldás, mikor okosan használjuk a return-t
  1. public Halal() {
  2.     new iKiller = read_data(1);
  3.     new iVictim = read_data(2);
  4.     new iHeadshot = read_data(3);
  5.  
  6.     if(iKiller == iVictim) return;
  7.  
  8.     new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
  9.    
  10.     if(iHeadshot) {
  11.         client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
  12.     }
  13.     else {
  14.         client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
  15.     }
  16. }

vagy 1x kérünk le valamit if-ben, és azon belül folytatjuk.
  1. public Halal() {
  2.     new iKiller = read_data(1);
  3.     new iVictim = read_data(2);
  4.     new iHeadshot = read_data(3);
  5.  
  6.     if(iKiller != iVictim) {
  7.         new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
  8.    
  9.         if(iHeadshot) {
  10.             client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
  11.         }
  12.         else {
  13.             client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
  14.         }
  15.     }
  16. }


Ugye itt máris érvényesült az a dolog, hogy ha úgyis le kell kérni, akkor lekérjük 1x a nevet, nem külön minden ágban.

Következő a tömbök használata lesz, megnézzük az előző függvényen mit lehetne ritkítani.
Mivel csak az iVictim tömb van 2x használva a lekért id-k közül, ezért ezt a függvényt is ritkíthatjuk.
  1. public Halal() {
  2.     new iVictim = read_data(2);
  3.  
  4.     if(read_data(1) != iVictim) {
  5.         new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
  6.    
  7.         if(read_data(3)) {
  8.             client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
  9.         }
  10.         else {
  11.             client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
  12.         }
  13.     }
  14. }

Mivel minden más 1x van lekérve, ezért nem muszáj nekik tömb.


Egyenlőre ennyi volna, még ha eszembe jut, vagy meglátok pár ellenpéldát akkor ide sorolom.
Remélem sikerült mindenkivel tisztázni ezt a témát, ha ilyen szarvashibákat láttok, nyugodtan linkeljétek ezt a posztot nekik oda. :lol:
Eleget volt már ez a téma vesézve.

Oldal: 1 / 1 Minden időpont UTC+02:00 időzóna szerinti
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/