O Äemu se radi?
Svaki skripter bi morao znati kako i zaÅ¡to koristi odreÄ'ene metode skriptanja, trebao bi koristiti najkraće metode sa dobrom optimizacijom. Ovaj tutorijal se može primjeniti na druge prog. jezike.
1. Brisanje stringova
Funkcija 'strdel' se inaÄe koristi za brisanja cijelog niza / stringa, prvu "ćeliju" možete lako obrisati sa null terminatorom;
string[0] = '\0';
"\0" se indicira kao završetak niza / stringa, zato ako želite obrisati array, morate koristiti loop;
for (new i = 0; i < sizeof(gArray); i ++)
{
gArray[i] = '\0';
}
2. Bool arrayevi
Boolean arrayevi se mogu koristiti i kao normalne varijable (s time štedimo puno memorije - oko 20x puta manje), sa y_bitom od YSI-a možemo koristiti navedeno za spremanje 2.147.483.647 vrijednosti unutar booleana;
new BitArray:gUsingPhone<MAX_PLAYERS>;
je toÄno ovo;
new bool:gUsingPhone[MAX_PLAYERS];
Za stavljanje vrijednosti se koristi jednostavno Bit_Set;
Bit_Set(gUsingPhone, playerid, true/false);
(Može se koristiti i Bit_Let za true i Bit_Vet za false, ali nećemo komplicirati.)
3. Smanjenje vrijednosti
Umjesto ovog (koristimo foreach funkciju u ovom primjeru - Link (http://forum.sa-mp.com/showthread.php?t=92679));
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo[i][pVariable] > 0)
{
PlayerInfo[i][pVariable]--;
if (PlayerInfo[i][pVariable] < 1)
{
// ...
}
}
}
return 1;
}
Bez problema možemo koristiti ovo (da pojednostavimo);
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo[i][pVariable] > 0 && --PlayerInfo[i][pVariable] < 1)
{
// ...
}
}
return 1;
}
4. MySQL loadanje podataka
Koristimo G-sTyLeZzZ-ov MySQL plugin.
stock LoadHouses()
{
new query[64];
for (new i = 0; i < MAX_HOUSES; i ++)
{
format(query, sizeof(query), "SELECT * FROM `Houses` WHERE `houseID` = '%d'", i);
mysql_query(query);
mysql_store_result();
if (mysql_num_rows())
{
while (mysql_retrieve_row())
{
// Ostalo..
}
}
}
return 1;
}
Bez problema zamjenimo sa (time "štedimo" querieve a samim time i memoriju, tj. u gornjem primjeru bi koristili 400 querieva što bi mogao biti problem);
stock LoadHouses()
{
mysql_query("SELECT * FROM `Houses`");
mysql_store_result();
if (mysql_num_rows())
{
while (mysql_retrieve_row())
{
new houseid = mysql_fetch_int();
// Ostalo..
}
}
}
5. Re-korištenje stringova
new
string[30+MAX_PLAYER_NAME],
vehicle[32];
GetVehicleName(vehicleid, vehicle, sizeof(vehicle));
format(string, sizeof(string), "Vozite %s.", vehicle);
SendClientMessage(playerid, COLOR_WHITE, string);
Ne morate stvarati vehicle string, bespotrebno je; Možete ga samo "upakirati" u već postavljeni string;
new string[50+MAX_PLAYER_NAME];
GetVehicleName(vehicleid, string, sizeof(string));
format(string, sizeof(string), "Vozite %s.", string);
SendClientMessage(playerid, COLOR_WHITE, string);
6. Unix timestampovi
Na primjeru;
new gUsedChat[MAX_PLAYERS];
CMD:chat(playerid, params[])
{
if (gUsedChat[playerid])
return SendClientMessage(playerid, -1, "Molimo pricekajte 30 sekundi da biste opet pisali.");
// ...
gUsedChat[playerid] = 1;
SetTimerEx("CanUseChat", 30000, false, "d", playerid);
return 1;
}
forward CanUseChat(playerid);
public CanUseChat(playerid)
{
gUsedChat[playerid] = 0;
return 1;
}
To prelagano napravimo sa gettime() funkcijom, puno je brža i lakša za korištenje;
new gUsedChat[MAX_PLAYERS];
CMD:chat(playerid, params[])
{
if ((gettime() - gUsedChat[playerid]) > 0)
return SendClientMessage(playerid, -1, "Molimo pricekajte 30 sekundi da biste opet pisali.");
// ...
gUsedChat[playerid] = gettime() + 30;
return 1;
}
7. Player loopovi
Umjesto korištenja ovog;
for (new i = 0; i != MAX_PLAYERS; i ++)
Bolji naÄin bi bio;
for (new i = 0, j = GetMaxPlayers(); i != j; i ++)
//ili korištenje foreacha
U funkcijama gdje se u loopu provjerava da li je igraÄ RCON Admin (IsAdmin) i u loopu se nalazi 'IsPlayerConnected' funkcija, nju ne moramo koristiti, jer igraÄ koji nije na serveru nemože niti biti admin (tipiÄno kod GF-a).
8. Random funkcija
switch (random(5))
{
case 0: SetPlayerSkin(playerid, 253);
case 1: SetPlayerSkin(playerid, 117);
case 2: SetPlayerSkin(playerid, 299);
case 3: SetPlayerSkin(playerid, 1);
case 4: SetPlayerSkin(playerid, 17);
}
Umjesto navedene funkcije možemo si olakšati posao;
static const
gRandomSkins[] = {253, 117, 299, 1, 17};
SetPlayerSkin(playerid, gRandomSkins[random(sizeof(gRandomSkins))]);
9. Jednostavnije varijable
enum gPlayerEnum
{
pWeapon1,
pWeapon2,
pWeapon3,
pWeapon4,
pWeapon5
};
Umjesto ovog;
enum gPlayerEnum
{
pWeapons[5]
};
Å tedimo sebi vrijeme i kopiranje.
10. Smanjenje vrijednosti varijable
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo[i][pVariable] > 0)
{
PlayerInfo[i][pVariable]--;
if (PlayerInfo[i][pVariable] < 1)
{
// ...
}
}
}
return 1;
}
Ovo si možemo olakšati stavljanjem decrementa u if funkciju;
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo[i][pVariable] > 0 && --PlayerInfo[i][pVariable] < 1)
{
// ...
}
}
return 1;
}
11. Return u funkciji
stock IsPlayerNearCoords(playerid)
{
if (IsPlayerInRangeOfPoint(playerid, 5.0, 1.0000, 2.0000, 3.0000))
{
return 1;
}
return 0;
}
Ovu funkciju možemo lako zamjeniti sa ovom (return se ponaÅ¡a kao if funkcija u odreÄ'enim uvjetima);
stock IsPlayerNearCoords(playerid)
{
return IsPlayerInRangeOfPoint(playerid, 5.0, 1.0000, 2.0000, 3.0000);
}
Ili macro;
#define IsPlayerNearCoords(%0) \
(IsPlayerInRangeOfPoint((%0), 5.0, 1.0000, 2.0000, 3.0000))
12. Y-Less
Jedan od važnijih ljudi kad govorimo o PAWN-u, napravio je puno stvari, pojednostavnio, poboljšao rad u PAWN jeziku (sscanf, foreach, y_bit, ycmd).
Koristite njegov YSI i ostale pluginove / inc-ove koje je napravio, olakšat će vam posao i automatski će vam skripta biti bolja i optimiziranija (ako znate šta radite).
Svaka cast jedan od boljih tutorijala koji sam vidio ovdje.