[TUT] Poboljšanje u Vašem skriptanju

Započeo LuKsA, Januar 14, 2014, 00:26:49 PRE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

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

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).
Poslednja Izmena: Januar 14, 2014, 00:38:35 PRE PODNE od LuKsA
Aequam memento rebus in arduis servare mentem.

Svaka cast jedan od boljih tutorijala koji sam vidio ovdje.

Citat: KuNNaâ,,¢ poslato Januar 14, 2014, 17:58:01 POSLE PODNE
Svaka cast jedan od boljih tutorijala koji sam vidio ovdje.


[FS]Rent
[FS] Vremenska prognoza
[TuT] PayDay
[TuT]PayDay sistem[UPDATED]
Moja Biografija

Respect:Mr.Gagi,FlasH,Streetboy,David (Sabljak) A.k.A SABO(T)
ÄŒovjek nije stvoren za poraze, moze biti unisten, ali ne i pobjeÄ'en!