Balkan SA:MP

San Andreas Multiplayer - www.sa-mp.com => Tutorijali u vezi SA-MPa => Temu započeo: LuKsA poslato Januar 14, 2014, 00:26:49 PRE PODNE

Naslov: [TUT] Poboljšanje u Vašem skriptanju
Poruka od: LuKsA poslato Januar 14, 2014, 00:26:49 PRE PODNE
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).
Naslov: Odg: [TUT] Poboljšanje u Vašem skriptanju
Poruka od: Kunnaâ„¢ poslato Januar 14, 2014, 17:58:01 POSLE PODNE
Svaka cast jedan od boljih tutorijala koji sam vidio ovdje.
Naslov: Odg: [TUT] Poboljšanje u Vašem skriptanju
Poruka od: xyzcod2 poslato Januar 17, 2014, 11:48:20 PRE PODNE
Citat: KuNNaâ,,¢ poslato Januar 14, 2014, 17:58:01 POSLE PODNE
Svaka cast jedan od boljih tutorijala koji sam vidio ovdje.