Would you like to react to this message? Create an account in a few clicks or log in to continue.

2 posters

    Učíme sa robiť s PVary !

    avatar
    QWER
    Znalec


    Posts : 60
    Join date : 28.04.2011

    Učíme sa robiť s PVary ! Empty Učíme sa robiť s PVary !

    Odoslať pre QWER So apríl 30, 2011 10:42 am

    Čaute PVary boli pridané od sa-mp verzie 0.3a
    Celá SAMP scéna prešla na PVary iba SK/CZ scéna nie Very Happy (teda vačšina).

    Čo to PVary sú ?
    Pvary sú tiež premeny ale iba pre hráča (global PVars existujú iba ako plugin...). Čiže žiadne new Admin[MAX_PLAYERS];

    Výhody PVarov sú?
    Hlavná výhoda je, že neexistujú "prázdne miesta" ktoré "žerú" RAM-ku.
    Lebo ak dáte new a[MAX_PLAYERS] = {-1,...}; tak to vytvorí 500 premien s hodnotou -1. A keď máte na servery 5 ľudí, tak aj tak je na servery 500 premien... No pri PVaroch je iba 5. Pretože každému hráčovy vytvorí automaticky vlastnú, a pri odchode ju zmaže (Takže žiadne nulovanie premien v OnPlayerConnect (a DisConnect)).

    Nevýhody PVarov sú?
    Výrazne pomalšie ako obyčajné premeny hlavne pri cykloch (kde sa to opakuje). Ale zase šetríte RAM ku...

    Funkcie

    Nastavovacie funkcie (Set)

    SetPVarInt(playerid, varname[], int_value)
    playerid = id hráča, ktorému chceme uložiť hodntu
    varname = string, toto je hlavná časť ! Podľa názvu sa ukladajú hodnoty čiže npr. "Admin"
    int_value = hodnota npr. 5

    SetPVarString(playerid, varname[], string_value[])
    playerid = id hráča, ktorému chceme uložiť hodntu
    varname = string, toto je hlavná časť ! Podľa názvu sa ukladajú hodnoty čiže npr. "Nick"
    string_value = text, npr. "QWER"

    SetPVarFloat(playerid, varname[], Float:float_value)
    playerid = id hráča, ktorému chceme uložiť hodntu
    varname = string, toto je hlavná časť ! Podľa názvu sa ukladajú hodnoty čiže npr. "Health"
    float_value = float hodnota... (desatinné číslo) npr. GetPlayerHealthEx(playerid);

    Zistovacie funkcie (Get)

    GetPVarInt(playerid, varname[])
    playerid = id hráča, ktorému chceme zistiť návratovú hodnotu
    varname = názov uloženej hodnoty ako sme použili "Admin"

    GetPVarString(playerid, varname[], string_return[], len)
    playerid = id hráča, ktorému chceme zistiť návratovú hodnotu
    varname = názov uloženej hodnoty ako sme použili "Nick"
    string_return = názov stringového pola (new string[100]Wink
    len = max. počet znakov

    GetPVarFloat(playerid, varname[])
    playerid = id hráča, ktorému chceme zistiť návratovú hodnotu
    varname = názov uloženej hodnoty ako sme použili "Health"

    Mazacie funkcie (Del)

    DeletePVar(playerid, varname[])
    playerid = id hráča, ktorému chceme zistiť návratovú hodnotu
    varname = názov uloženej hodnoty ako sme použili "Health"
    Deletne premenu, takže nebude existovať (ani zaberať miesto v RAM-ke) BTW Pri odchode zo serveru (disconnect) sa automaticky zmažú, takže ich nemusíte mazať manuálne.

    Využitie

    Využitie je také obrovske, ako pri obyčajných premenách pre všetkých hráčov... npr. taký príkaz loc & toloc (často objavovaný v módoch (myslím súkromný teleport))
    Cez obyčajné premeny
    kód:

    Hore medzi new
    new Float:pos[4][MAX_PLAYERS];

    public OnPlayerCommandText...

    if(!strcmp("/loc",cmdtext,true)){
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    GetPlayerAngle(playerid,pos[3]);
    }
    if(!strcmp("/toloc",cmdtext,true)){
    SetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    SetPlayerAngle(playerid,pos[3]);
    }
    by cez PVary vyzeral takto
    kód:

    if(!strcmp("/loc",cmdtext,true)){
     new Float:x,Float:y,Float:z,Float:a;
        GetPlayerPos(playerid,x,y,z);
        GetPlayerAngle(playerid,a)
        SetPVarFloat(playerid,"PosX",x);
        SetPVarFloat(playerid,"PosY",y);
        SetPVarFloat(playerid,"PosZ",z);
        SetPVarFloat(playerid,"PosA",a);

    }
    if(!strcmp("/toloc",cmdtext,true)){
    SetPlayerPos(playerid,GetPVarFloat(playerid,"PosX"),GetPVarFloat(playerid,"PosY"),GetPVarFloat(playerid,"PosZ"));
    SetPlayerAngle(playerid,GetPVarFloat(playerid,"PosA"));
    }
    Teraz si poviete, "Načo to je, aj tak vytvoril premeny x,y,z,a"
    Áno, ale tie sú iba lokálne a existujú iba niekoľko milisekund (presnejšie 6 milisekund) no pri prvej možnosti existovaly celý chod servera (od zapnutia po vypnutie) a bolo ich 500 (32 bytových premien) a tu sme vytvorili 4 (32 bytové premena) na 6 milisekund.

    Jednoduché nie ?

    Pri stringu vám sem dám jeden stock, čo uľahčí prácu s GetPVarString...

    kód:

    stock ReturnPVarString(playerid, msg[]){
    new ReturnMSG[256];
    GetPVarString(playerid, msg, ReturnMSG,256);
    return ReturnMSG;
    }

    Dajú sa ukladať stringy, takže nemusíte stále používať GetPlayerName alebo pawn ekvivalent PlayerName (== Jmeno)
    a to týmto spôsobom
    kód:
    public OnPlayerConnect...{
    new nick[MAX_PLAYER_NAME];
    GetPlayerName(playerid,nick,MAX_PLAYER_NAME);
     SetPVarString(playerid,"Name",nick);
    }
    a potom už iba použiť
    kód:
    if(strcmp(...)){
    new s[100];
    format(s,100,"%s sa smeje lamám (/lol)",ReturnPVarString(playerid,"Nick"));
    }
    a pošle to

    QWER sa smeje lamám (/lol)

    SetPVarInt je ako obyčajná premena... takže dúfam nemusím vysvetlovať.

    Toto je pre túto chvíľu všetko. Dúfam že ste sa niečomu priučili, a začnete používať PVary.

    S pozdravom
    QWER
    ylleron
    ylleron
    Admin


    Posts : 82
    Join date : 26.04.2011

    Učíme sa robiť s PVary ! Empty Re: Učíme sa robiť s PVary !

    Odoslať pre ylleron So apríl 30, 2011 7:46 pm

    dik za vysvetlenie a asi to začnem využívať Smile
    avatar
    QWER
    Znalec


    Posts : 60
    Join date : 28.04.2011

    Učíme sa robiť s PVary ! Empty Re: Učíme sa robiť s PVary !

    Odoslať pre QWER So apríl 30, 2011 8:43 pm

    Typy Triky

    Typ č.1

    Keď budete používať PVary pravdepodobne vás nasere (keď ich budete mať veľa). Že si budete musieť pametať názov... npr.

    SetPVarInt(playerid, "AdminLevel", 5);

    Napadlo ma Použiť define, ukážem vám

    #define AdminLevel "AdminLevel"

    a už iba
    SetPVarInt(playerid, AdminLevel,5);

    Typ č.2

    Tento typ vás určite poteší
    PVary SA Môžu PREPOJIŤ S FS ! Máte npr. v FS npr. "AdminLevel" a v GM ho môžete používať ! (a hodnotu si zachová !)


    Ak chcete Testnúť či to nazoaj funguje, použite toto ako FS
    kód:

    public OnPlayerCommandText(playerid, cmdtext[])
    {
       new cmd[256];
       new   tmp[256];
       new gMessage[256];
       new   idx;
       
       cmd = strtok(cmdtext, idx);

       if(strcmp("/test", cmd, true) == 0)
       {
          tmp = strtok(cmdtext,idx);
          new id = strval(tmp);
            gMessage = strrest(cmdtext,idx);
           
         SetPVarInt(playerid, "AdminLevel", id);
      SetPVarString(playerid, "Text", gMessage);
          return 1;
       }

       return 0;
    }

    A GM
    kód:

    public OnPlayerCommandText(playerid, cmdtext[])
    {
       new idx;
       new cmd[256];
       
       cmd = strtok(cmdtext, idx);

       if(strcmp(cmd, "/qwer", true) == 0) {
       
       new s[100];
     format(s,100,"Číslo: %d Text: %s",GetPVarInt(playerid, "AdminLevel"),ReturnPVarString(playerid,"Text"));
     SendClientMessage(playerid,0xFFFF00,s);
        //     SetPVarInt(playerid, "AdminLevel", id);
     //  SetPVarString(playerid, "Text", gMessage);
          return 1;
       }

       return 0;
    }
    stock ReturnPVarString(playerid, msg[]){
    new ReturnMSG[256];
    GetPVarString(playerid, msg, ReturnMSG,256);
    return ReturnMSG;
    }

    Funguje to ! (Dá sa to zneužiť, aj využiť Pozor na to !)
    Preto pre prípad odsudzenia (síce to napadne málo koho) Tak pomocou Triku č1 by ste mohli dať "krkolomné" názvy (hlavne na niake dôležité veci npr. anti money cheat, admin level, vip... npr

    #define VIP "KokotoveVIP"

    Trik č.3

    Toto je trik, a je podľa mňa dobrý, Nemusíte stále používať SetPVarInt... môžete si urobiť definíciu ktorá vám to uľahčí ukažem príklad

    #define AdminLevel(%0,%1) SetPVarInt(%0,"AdminKokotaLevel",%1);
    a potom používate iba
    AdminLevel(playerid,5);

    môžete si tak nastaviť na všetko... je to lepšie (podľa mňa) ako obyčajne PVars...

    Typ č.4

    A teraz ešte jeden stock... GivePVars(Int)
    #define GivePVars GivePVarsInt

    stock GivePVarsInt(playerid,name[],nume){
    SetPVarInt(playerid,name,GetPVarInt(playerid, name)+nume);
    }

    a potom iba
    #define Skill "PlayerSkillLevel"
    if(killerid != playerid){
    GivePVarsInt(killerid,Skill,2);
    GivePVars(playerid,Skill,-1);
    }

    To je dúfam všetko...

    Sponsored content


    Učíme sa robiť s PVary ! Empty Re: Učíme sa robiť s PVary !

    Odoslať pre Sponsored content


      Práve je Pi apríl 26, 2024 5:21 am