Hatékony scriptelés 1. -LekérésekElső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):
new CsTeams:iTeam = cs_get_user_team(id);
switch(iTeam) {
case CS_TEAM_T: client_print_color(id, print_team_red, "^1Te ^3Terrorista^1 vagy, ezért pirosan írsz.");
case CS_TEAM_CT: client_print_color(id, print_team_blue, "^1Te ^3CT^1 vagy, ezért kéken írsz.");
}
if(cs_get_user_team(id) == CS_TEAM_SPECTATOR) {
client_print_color(id, print_team_grey, "^1Te ^3Spectator^1 vagy, ezért szürkén írsz.");
}
Helyette használjuk rendeltetésszerűen az elsőnek létrehozott változónkat, ha már elkezdtük.
new CsTeams:iTeam = cs_get_user_team(id);
switch(iTeam) {
case CS_TEAM_T: client_print_color(id, print_team_red, "^1Te ^3Terrorista^1 vagy, ezért pirosan írsz.");
case CS_TEAM_CT: client_print_color(id, print_team_blue, "^1Te ^3CT^1 vagy, ezért kéken írsz.");
case CS_TEAM_SPECTATOR: client_print_color(id, print_team_grey, "^1Te ^3Spectator^1 vagy, ezért szürkén írsz.");
}
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.
public Halal() {
new iKiller = read_data(1);
new iVictim = read_data(2);
new iHeadshot = read_data(3);
if(iKiller == iVictim)
return PLUGIN_HANDLED;
if(iKiller != iVictim) {
new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
}
if(iKiller != iVictim && iHeadshot) {
new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
}
return PLUGIN_HANDLED;
}
Ez helyett van 2 helyesebb megoldás, mikor okosan használjuk a return-t
public Halal() {
new iKiller = read_data(1);
new iVictim = read_data(2);
new iHeadshot = read_data(3);
if(iKiller == iVictim) return;
new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
if(iHeadshot) {
client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
}
else {
client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
}
}
vagy 1x kérünk le valamit if-ben, és azon belül folytatjuk.
public Halal() {
new iKiller = read_data(1);
new iVictim = read_data(2);
new iHeadshot = read_data(3);
if(iKiller != iVictim) {
new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
if(iHeadshot) {
client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
}
else {
client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
}
}
}
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.
public Halal() {
new iVictim = read_data(2);
if(read_data(1) != iVictim) {
new szVictimName[32]; get_user_name(iVictim, szVictimName, charsmax(szVictimName));
if(read_data(3)) {
client_print_color(iKiller, print_team_default, "Fejbe lőtted ^3%s^1-t.", szVictimName);
}
else {
client_print_color(iKiller, print_team_default, "Megölted ^3%s^1-t.", szVictimName);
}
}
}
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. ![nevet :lol:](./images/smilies/icon_lol.gif)
Eleget volt már ez a téma vesézve.