Jump to content

Tutorial variabile in una singura


Mister

Recommended Posts

Tutorial salvarea datelor prin slash in string

 

Mai demult un user a spus ca vrea sa faca o salvare a mai multor variabile de tip integer in o singura variabila de tip string, iar la extragerea variabilelor, acestea sa fie deosebite prin caracterul ' / ' .

Nu am avut timp sa ii fac atunci acest tutorial cum nici acum nu prea am avut dar totusi m-am hotarat sa il postez.

Variabila in baza de date va arata cam asa

0000/0000/0021/0000

unde 0021 va fi extrasa intr-o variabila cu valoarea 21.

 

Sa incepem, eu voi face salvarea armelor playerului.

 

  • Vom crea niste variabile in gm

La enumul pinfo sau cum aveti voi in gm, unde este pLevel,pMoney si ce mai aveti adaugati aceste variabile

pMelle,// Melle de la arma alba, va stoca idul armei, care poate fi  crossa, bata, cutitul, sabia etc.
pPistol,// va stoca idul pistolul, deagle 9mm sau silencer
pShootgun,// shootgunl sawn-offul sau combat shootgun 
pAMelle,// aceasta variabila va stoca gloantele armei
pAPistol,// la fel doar ca pentru pistol
pAShootgun// iar aceasta pentru shootgun

 

  • Acum vom adauga in baza de date a playerilor o variabila numita WeaponsSlot, de tip varchar si conform definitiei,  0/00/00   un singur 0 pentru ca armele albe au idul mai mic decat 9 apoi 2 zerouri pentru ca celelalte arme au idul din 2 cifre, deagleul are id 24 sunt 2 cifre.

http://i.imgur.com/CVIuuao.png

Vom adauga si o variabila pentru gloante numita WeaponsAmmo de tip string si conform definitiei

0000/0000/0000

4 de zero pentru ca vom putea avea maxim 9999 de gloante si de 4 ori vom adauga 0000/ pentru ca avem 3 arme, melle shootgun si pistol

 

http://i.imgur.com/4EnqnJY.png

 

 

  • Acum vom face extragerea variabilei

 

Unde aveti si celelalte variabile extrase vom adauga urmatorul cod
 

new storea[100],storevar[100];//storevar va extrage idul armei iar storea va fi stringul din sql adica 0/00/00

cache_get_field_content(0, "WeaponsSlot", temp),     format(storea, 128, temp);// eu am tmp ca string voi puteti avea result sau altcumva
//vom folosi strmid care extrage un sir de caractere dintr-un string, adica vom extrage idul armei din stringul sql 0/00/00

strmid(storevar, storea, 0, 1, 255);// vom extrage in variabila storea, din stringul storevar, incepand de la caracterul 0 pana la caracterul 1 adica 0 fara ' / '
PlayerInfo[playerid][pMelle] = strval(storevar);// variabila storevar este un string care este 0, asa ca il vom converti in integer folosind strval, acum variabila noastra pMelle este 0, daca in sql este 2 atunci va fi 2 logic

strmid(storevar, storea, 2, 4, 255);// acum incepem de la caracterul 2 pentru a evita ' / '  si extragem pana la 4 adica +2 caractere pentru ca in sql arma a doua are 2 caractere '00' adica
PlayerInfo[playerid][pPistol] = strval(storevar);// la fel convertim stringul in integar si ii atribuim valoarea

strmid(storevar, storea, 5, 7, 255);  // incepem de la un caracter in plus fata de celalalt ca sa evitam ' / ' si terminam cu +2 caractere de unde am inceput
PlayerInfo[playerid][pShootgun] = strval(storevar);//ii atribuim valoarea 00 sau cum este in sql

 

  • Vom extrage si gloantele armelor 

               

// variabilele storea si storevar sunt create mai sus 

 cache_get_field_content(0, "WeaponsAmmo", temp),     format(storea, 128, temp);

 strmid(storevar, storea, 0, 4, 255);  //vom folosi strmid incepand de la caracterul 0 pana la 4 pentru ca glaontele pot fi maxim 9999 
PlayerInfo[playerid][pAMelle] = strval(storevar);//  ii vom atribui variabilei de gloante valoare din string convertita in integer
               
strmid(storevar, storea, 5, 9, 255);//acum vom incepe de la caracterul de mai sus 4 +1 deci 5, +1 ca sa evitam ' / ' si vom termina peste +4 caractere adica 9
PlayerInfo[playerid][pAPistol] = strval(storevar);//  atribuim iar stringul convertit in integer
              
strmid(storevar, storea, 10, 14, 255);  //extragem iar de la 9+1 caractere si terminam peste 4  
PlayerInfo[playerid][pAShootgun] = strval(storevar);// si atribuim si ultimul string ultimei variaible

 

  • Acum vom face ca playerul sa primeasca arme si sa ii fie inserate pe variabile, adica vom apasa CTRL+H sus vom scrie GivePlayerWeapon si jos vom scrie ServerWeapon   vom inlocui toate functiile cu functia de dat arme care vor fi salvate

 

forward ServerWeapon(playerid, weaponid, ammo);

si

public ServerWeapon(playerid, weaponid, ammo)

{

return 1;

}

 

In interiorul functie vom adauga asta
 

   if(weaponid >= 1 && weaponid <= 9)//idul de arma alba adica melle
    {
        PlayerInfo[playerid][pMelle] = weaponid;// variabila care este idul armei va lua idul dat
        PlayerInfo[playerid][pAMelle] = ammo;//iar variabila care stocheaza gloantele va lau valoarea gloantelor date
        GivePlayerWeapon(playerid, weaponid, ammo);// si ii vom si da arma pentru ca nu o putem da in alt fel
    }
    if( weaponid >= 22 && weaponid <= 24 ) // acelasi lucru dar pentru pistoale deagle silencer si 9mm
    {
        PlayerInfo[playerid][pPistol] = weaponid;
        PlayerInfo[playerid][pAPistol] = ammo;
        GivePlayerWeapon(playerid, weaponid, ammo);
    }
    if( weaponid >= 25 && weaponid <= 27 ) // si pentru shootgun
    {
        PlayerInfo[playerid][pShootgun] = weaponid;
        PlayerInfo[playerid][pAShootgun] = ammo;
        GivePlayerWeapon(playerid, weaponid, ammo);
    }

    Si vom apela o functie pentru a salva gloantele si armele

 
    SetTimerEx("UpdateWeapons",1000,0,"ii",playerid,1);//1 pentru idul armei
    SetTimerEx("UpdateWeapons",1000,0,"ii",playerid,2);//2 pentru glaonte
}

 

 

  • Si in final functia care salveaza amele si este putin mai complexa,

 

forward UpdateWeapons(playerid,type);

public UpdateWeapons(playerid,type)

{

 return 1;

}

In interiorul ei va fi asta

new weaponid,ammo,text1[20],text2[20],text3[20],strings[200];// cream variabilele de stocare pentru glaonte id arma si pentru salvarea in mysql
 

if(type == 1)

{
	weaponid=0;//ii atribuim 0 pentru ca daca playerul nu are nici o arma va returna null nu 0
    
	GetPlayerWeaponData(playerid, 1, weaponid, ammo);// luam idul si glaontele playerului
	format(text1,20,"%d",weaponid);// formatam textul cu idul 0
    weaponid=0;//ii atribuim iar 0, nu am testat sa vad ce se intampla daca nu ii atribui dar nu vreau sa risc
    
	GetPlayerWeaponData(playerid, 2, weaponid, ammo);
    format(text2,20,"%s%d",(weaponid < 10) ? ("0") : (""),weaponid);// iar acum vom adauga un mic if. %s pentru el iar acum sa va explic ce face (weaponid < 10) ? ("0") : (""), iful spune daca weaponid mai mic decat 10 va return " 0 " altfel spatiu liber, avem nevoie de el pentru ca in mysql va arata asa 0/0/0 inloc de 0/00/00 
	weaponid=0;//ii atribuim iar 0

   	GetPlayerWeaponData(playerid, 3, weaponid, ammo);// luam idul shootgun
    format(text3,20,"%s%d",(weaponid < 10) ? ("0") : (""),weaponid); // si formatam la fel cu 0 inainte daca idul e mai mic de 10    
	

   	format(strings, sizeof(strings), "%s/%s/%s",text1,text2,text3);/*acum avem stringul de arma alba pistol si shootgun 
    mysql_format(handle, strings, sizeof(strings), "UPDATE `players` SET `WeaponsSlot`='%s' WHERE `username`='%e'", achvar, playerName);// acuma aici veti modifica voi cum aveti in mysql
    mysql_query(handle, strings);// si executam functia mysql

}

if(type == 2)

{

	ammo=0;//setam 0 gloantele in caz ca playerul nu are glaonte sa nu returneze null ci 0
    GetPlayerWeaponData(playerid, 1, weaponid, ammo);
    format(text1, 20,"%s%s%s%d",(ammo < 1000) ? ("0") : (""),/./ iful este la fel ca cel de sus doar ca noi in baza de date avem 9999 maximul de glaonte si trebuie sa facem ca in caz ca avem 987 de glaonte in sql sa nu se salveze 0000/987/0000 ci 0000/0987/000 
//(ammo < 100) ? ("0") : ("") acelasi lucru doar ca pentru cazul in care avem 24 de gloante sa nu se salveze 024 ci 0024
//(ammo < 10) ? ("0") : (""),ammo) si cazul in care avem 3 glaonte sa se salveze 0003 nu 003
                  
	ammo=0;// 
	GetPlayerWeaponData(playerid, 2, weaponid, ammo);// pentru pistol
    format(text2, 20,"%s%s%s%d",(ammo < 1000) ? ("0") : (""),(ammo < 100) ? ("0") : (""),(ammo < 10) ? ("0") : (""),ammo);// aceleasi " ifuri de verificare numar" 
    
                                                                                   
  	ammo=0;
    GetPlayerWeaponData(playerid, 3, weaponid, ammo);// pentru shootgun
   	format(text3, 20,"%s%s%s%d",(ammo < 1000) ? ("0") : (""),(ammo < 100) ? ("0") : (""),(ammo < 10) ? ("0") : (""),ammo);/ si incheiam la fel pentru 0000
                    
    format(strings, sizeof(strings), // acum vom formata stringul pentru mysql   "%s/%s/%s/%s",text1,text2,text3);
    mysql_format(handle, strings, sizeof(strings), "UPDATE `players` SET `WeaponsAmmo`='%s' WHERE `username`='%e'", achvar, playerName);// modificati cum aveti voi in gm
  	mysql_query(handle, var);// si executam functia
}

 

  • Si acum pentru ca armele sa ii fie date playerului vom adauga la onplayerspawn

SetTimerEx("SetPlayerWeapons",1000,0,"i",playerid);// dupa ce se spawneaza sa nu ia crash sau alte buguri va primi armele dupa o secunda
 

forward SetPlayerWeapons(playerid);
public SetPlayerWeapons(playerid)
{
    GivePlayerWeapon(playerid, PlayerInfo[playerid][pMelle], PlayerInfo[playerid][pAMelle]);// setam gloantele si arma
    GivePlayerWeapon(playerid, PlayerInfo[playerid][pPistol], PlayerInfo[playerid][pAPistol]);// la fel pentru pistol
    GivePlayerWeapon(playerid, PlayerInfo[playerid][pShootgun], PlayerInfo[playerid][pAShootgun]); // si pentri shootgun
    // daca playerul nu are arme acestuia i se va da arma cu id 0 cu 0 gloante adica nu va primi nimic daca are ceva va primi arma

   
    return 1;
}

 

  • Si ultima chesti la OnPlayerDisconnect

Actualizam armele ca playerul sa ii fie salvate armele ramase nu cele de cand le-a cumparat pentru ca altfel, acesta cumapra arme termina gloantele da relog si  va avea acelasi arme nu pe cele conmsumate


   UpdateWeapons(playerid,1);//1 pentru idul armei
   UpdateWeapons(playerid,2);//2 pentru glaonte

 

Si cam asta a fost tot sper sa va ajute si nu postati aici reply cu nu imi merge sau am eroare, si asa mi-a dat ceva batai de cap pentru ca la extragere daca dau printf la variabila nu se afiseaza si daca dau direct la strval merge :) deci fiti atenti la tutorial

 

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

  • WopsS pinned this topic
  • 1 month later...

Ai auzit de sscanf?

new testSlots[ 16 ];
cache_get_value_name( row, "playerSlots", testSlots, sizeof( testSlots) );
sscanf( testSlots, "p<:>ddd", valoare[ 0 ], valoare[ 1 ], valoare[ 2 ] );

 

Edited by SoNNy.sys

Sinner.png

Link to comment
Share on other sites

On 9/8/2016 at 7:06 PM, SoNNy.sys said:

Ai auzit de sscanf?


new testSlots[ 16 ];
cache_get_value_name( row, "playerSlots", testSlots, sizeof( testSlots) );
sscanf( testSlots, "p<:>ddd", valoare[ 0 ], valoare[ 1 ], valoare[ 2 ] );

 

Ba merge? merge! taci acolo :)

Tutorialul e facut pentru incepatori sau spre mediu, si trebuie luat ca atare, eu l-am facut pe intelesul tuturor, ei nu ar fi inteles daca l-as fi facut cu functia ta.

Si termina cu prostiile astea de postari ca nu esti clasa a II-a.

Daca ei sunt atat de destepti incat sa vada ca am folosit strmid atunci nu au nevoie de serviciile mele ca pot rezolva singuri desteptule

Daca esti atat de destept de ce nu faci tu acest tutorial?

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

In primul rand, report pentru limbaj ca nu te-am jignit. Invata-i o metoda mai buna daca tot s-au chinuit altii, net superiori intregii comunitati de sa-mp din Romania, sa faca plugin-uri si librarii :) Daca vine un newbie si te vede pe tine Moderator Scripting si "servicii scripting de calitate" si tu vii si ii prezinti coduri cu strmid nu crezi ca o sa te ia drept model gresit?

Un mic edit daca-mi permiti o mica sugestie pentru tutorialul tau :)

switch( weaponid )
{
	case 1..9:
	{
		PlayerInfo[playerid][pMelle] = weaponid;// variabila care este idul armei va lua idul dat
		PlayerInfo[playerid][pAMelle] = ammo;//iar variabila care stocheaza gloantele va lau valoarea gloantelor date
		GivePlayerWeapon(playerid, weaponid, ammo);// si ii vom si da arma pentru ca nu o putem da in alt fel
	}
	case 22..24: // acelasi lucru dar pentru pistoale deagle silencer si 9mm
	{
		PlayerInfo[playerid][pPistol] = weaponid;
		PlayerInfo[playerid][pAPistol] = ammo;
		GivePlayerWeapon(playerid, weaponid, ammo);
	}
	case 25..27: // si pentru shootgun
	{
		PlayerInfo[playerid][pShootgun] = weaponid;
		PlayerInfo[playerid][pAShootgun] = ammo;
		GivePlayerWeapon(playerid, weaponid, ammo);
	}
}

 

Sinner.png

Link to comment
Share on other sites

4 minutes ago, MAXYMUSS said:

Suneti amuzanti :)))

Stiu adica totul a pornit de la un sfat, ctrl+h decat sa faca un stock cu numele vechi iar el credea ca ctrl+h e ctrl+f :))

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

47 minutes ago, SoNNy.sys said:

Deci @Spmn nu a avut dreptate si nu te-a lamurit cu nimic. Si in continuarea ai dreptate ca tu cu un ctrl+h poti face chestia de mai jos.


playerVariables[ playerid ][ pGasCan ] = cache_get_field_content_int( i, "playerGasCan", g_Handle );

// Sau asta:
cachet_get_data( Rows, Fields, g_Handle );

// In asta:
cache_get_row_count( Rows );
cache_get_field_count( Fields );

Aici este doar vina ta ca ai asa

playerVariables[ playerid ][ pGasCan ] = cache_get_field_content_int( i, "playerGasCan", g_Handle );

si nu ai facut cu cap de la inceput asa:

cache_get_value_name(i, "GasCan", g_Handle ),         PlayerInfo[playerid][pGasCan] = g_Handle ;

ca sa poti da direct ctrl+h. Nu vreau sa aud ca e gresit sau nu e normal ma doare undeva da?! puteai inlocui cu cache_get_value_name_int

iar aici

cachet_get_data( Rows, Fields, g_Handle );

teoretic daca te-ai gandit la functia asta in timp ai fi pus peste tot in gm unde ai folosit acelasi nume la variabila si spatiu Rows, Fields, g_Handle fix asa ca sa fie gasite cu ctrl f sau h

si vei modifica, in ctrl sa sa inlocuiasca cu asta peste tot cache_get_row_count( Rows ),cache_get_field_count( Fields );

 

Si acum incetezi? eu nu m-am uitat cum ai tu functia eu ti-am spus ce am facut eu. Si bine frate nu e super optimizat super ultra octa core full fps 1000 asta e, nu faci un gm sa fie full optimizat si acolo unpic ca playerii nu o  stiu ei ce ai in gm cand se joaca si nu e diferenta atat de mare la niste chestii marunte

 

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

32 minutes ago, Mister said:

Aici este doar vina ta ca ai asa

playerVariables[ playerid ][ pGasCan ] = cache_get_field_content_int( i, "playerGasCan", g_Handle );

si nu ai facut cu cap de la inceput asa:

cache_get_value_name(i, "GasCan", g_Handle ),         PlayerInfo[playerid][pGasCan] = strval(g_Handle );

ca sa poti da direct ctrl+h. Nu vreau sa aud ca e gresit sau nu e normal ma doare undeva da?! puteai inlocui cu cache_get_value_name_int

iar aici

cachet_get_data( Rows, Fields, g_Handle );

teoretic daca te-ai gandit la functia asta in timp ai fi pus peste tot in gm unde ai folosit acelasi nume la variabila si spatiu Rows, Fields, g_Handle fix asa ca sa fie gasite cu ctrl f sau h

si vei modifica, in ctrl sa sa inlocuiasca cu asta peste tot cache_get_row_count( Rows ),cache_get_field_count( Fields );

 

Si acum incetezi? eu nu m-am uitat cum ai tu functia eu ti-am spus ce am facut eu. Si bine frate nu e super optimizat super ultra octa core full fps 1000 asta e, nu faci un gm sa fie full optimizat si acolo unpic ca playerii nu o  stiu ei ce ai in gm cand se joaca si nu e diferenta atat de mare la niste chestii marunte

 

Codul din postarea asta e gresit (repet, NU, NU POTI INLOCUI CU  cache_get_value_name_int), dar nu mai are rost sa justific, asa ca trec la ce am de spus:

De ce e vina lui ca a folosit functiile respective care erau suportate de plugin? Vina principala e a dezvoltatorului pluginului care nu a pastrat consistent PAWN API (fapt ce s-a intamplat de mai multe ori in ultimii ani, btw)

 

Iar referitor la sscanf, de ce sa scrii nspe mii de linii de cod cand poti rezolva simplu si usor cu cateva linii.

Edited by Spmn
Link to comment
Share on other sites

 

Ma omu lu Dumnezeu @Spmn, tu vrei sa spui ca asa e gresit?

cache_get_value_name_int (i, "GasCan", g_Handle );         PlayerInfo[playerid][pGasCan] = g_Handle;// da am pus strval mai sus dar am editat, ma gandeam si eu ca intelegeti dar nu ai cu cine

, de ce am scris atatea linii cand puteam pune sscanf? pentru ca din linii pot explica sa se inteleaga fiecare in parte asa un cod 

cache_get_value_name( row, "playerSlots", testSlots, sizeof( testSlots) ); sscanf( testSlots, "p<:>ddd", valoare[ 0 ], valoare[ 1 ], valoare[ 2 ] );// ce puteai explica aici in parte, da e mai greu de explicat dar codul face toata treaba voi doar puneti asa nu trebuie sa intelegeti

 

O sa dau edit dupa ce raspunzi ca sa nu fac post counting asa cum faceti voi disperatilor

 

 

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

Deci sincer ma doare burta de ras :)) In primul rand g_Handle e conexiunea si nu o variabila. In al doilea rand: ESTI PROST SAU PROST?  Dupa 20 de reply capul ala al tau de mediocru tot n-a inteles ca  cache_get_value_name_int  nu mai returneaza absolut NIMIC? Si cum cacat egalezi tu o functie MySQL cu o variabila? =))))

new int_dest;
cache_get_value_name_int(2, "money", int_dest);
printf("The value in the third row and in the column 'money' is '%d'.", int_dest);

Sinner.png

Link to comment
Share on other sites

4 minutes ago, SoNNy.sys said:

Deci sincer ma doare burta de ras :)) In primul rand g_Handle e conexiunea si nu o variabila. In al doilea rand: ESTI PROST SAU PROST?  Dupa 20 de reply capul ala al tau de mediocru tot n-a inteles ca  cache_get_value_name_int  nu mai returneaza absolut NIMIC? Si cum cacat egalezi tu o functie MySQL cu o variabila? =))))


new int_dest;
cache_get_value_name_int(2, "money", int_dest);
printf("The value in the third row and in the column 'money' is '%d'.", int_dest);

alt destept, bine ba fie ca voi sunteti voi destepti,

stiu si eu ca  g_Handle  era conexiunea, dar tu desteptule ai pus codul asta mai sus vrei sa spui ca tu pui conexiunea aici? :))

cache_get_value_name_int(2, "money", int_dest);// inloc de  variabile int_dest pun baza mysql ca sunt smecher  g_Handle

eu am facut codul asa ca l-am luat drept variabila probleme ca eu vreau sa numesc variabila mea  g_Handle ?

 

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

@SoNNy.sys, @Mister trebuie să închid fiecare topic ca sa incetati? Ia vedeți cum faceți să nu mai închid alt topic.

**********************************

Servicii Scripting de calitate:

*********************************

Future Project: ExpertGame

*********************************

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.