hlmod.hu
https://hlmod.hu/

Fájl mentés
https://hlmod.hu/viewtopic.php?f=14&t=22736
Oldal: 1 / 2

Szerző:  mforce [ 2015.11.21. 22:41 ]
Hozzászólás témája:  Fájl mentés

[kozep]Fájl mentés tutorial
by mforce[/kozep]


Leírás:
Egyszerű fájl mentés tutorial, fvault-ból felhasznált stockokkal az egyszerűség kedvéért.
Így nem kell include és a fájl is akárhova helyezhető.


Fájl helyének meghatározása:
Alapértelmezettként a /configs/ mappa van megadva (amxx_configsdir), ezután szerkeszthető a fájlnév a format résznél.
A filename tömbnek fontos, hogy kívül legyen minden függvényből, mert a stockok is ez alapján azonosítanak, tehát a fájl elérési helyét letároljuk map indításkor a globális filename tömbbe, hogy többször ne kelljen utána járni.

SMA Forráskód: [ Mindet kijelol ]
  1. new filename[128];
  2.  
  3. public plugin_init() {
  4. // blabla
  5. get_localinfo("amxx_configsdir", filename, charsmax(filename))
  6. format(filename, charsmax(filename), "%s/mforce_fajlmentes.ini", filename)
  7. }


Persze lehet módosítani, ha nem a configs mappát szeretnénk, akkor segítség:
amxx_configsdir addons/amxmodx/configs ( ugye ez az alap )
amxx_datadir addons/amxmodx/data ( Ha erre módosítod: amxx_datadir, akkor a data mappába kerül a fájl. )

Alap stockok:

Ezek nélkül el se kezdjük. Be kell másolni ezeket a stockokat a pluginba.
SMA Forráskód: [ Mindet kijelol ]
  1. stock get_data(const key[], data[], len) {
  2. new vault = fopen(filename, "rt");
  3. new _data[512], _key[64];
  4.  
  5. while( !feof(vault) ) {
  6. fgets(vault, _data, charsmax(_data));
  7. parse(_data, _key, charsmax(_key), data, len);
  8.  
  9. if( equal(_key, key) ) {
  10. fclose(vault);
  11. return 1;
  12. }
  13. }
  14.  
  15. fclose(vault);
  16. copy(data, len, "");
  17.  
  18. return 0;
  19. }
  20.  
  21. stock set_data(const key[], const data[]) {
  22. static const temp_vault_name[] = "set_data.txt";
  23. new file = fopen(temp_vault_name, "wt");
  24.  
  25. new vault = fopen(filename, "rt");
  26. new _data[512], _key[64], _other[32];
  27. new bool:replaced = false;
  28.  
  29. while( !feof(vault) ) {
  30. fgets(vault, _data, charsmax(_data));
  31. parse(_data, _key, charsmax(_key), _other, charsmax(_other));
  32.  
  33. if( equal(_key, key) && !replaced ) {
  34. fprintf(file, "^"%s^" ^"%s^"^n", key, data);
  35.  
  36. replaced = true;
  37. }
  38. else {
  39. fputs(file, _data);
  40. }
  41. }
  42.  
  43. if( !replaced ) {
  44. fprintf(file, "^"%s^" ^"%s^"^n", key, data);
  45. }
  46.  
  47. fclose(file);
  48. fclose(vault);
  49.  
  50. delete_file(filename);
  51.  
  52. while( !rename_file(temp_vault_name, filename, 1) ) { }
  53.  
  54. //delete_file(temp_vault_name);
  55. }


Mentés:

SteamID-re. ( Ha ID_LAN, akkor IP-re. )
SMA Forráskód: [ Mindet kijelol ]
  1. public client_disconnect(id) {
  2. if(!is_user_bot(id) && !is_user_hltv(id)) {
  3. save(id);
  4. }
  5. }
  6.  
  7. public save(id) {
  8. new szData[128];
  9. new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
  10. if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
  11.  
  12. formatex(szData, charsmax(szData), "%i %i", valtozo[id], valtozo2[id]);
  13. set_data(steamid, szData)
  14. }


Névre: ( ehhez le kell tiltanod a névváltást egy pluginnal. )
SMA Forráskód: [ Mindet kijelol ]
  1. public client_disconnect(id) {
  2. if(!is_user_bot(id) && !is_user_hltv(id)) {
  3. save(id);
  4. valtozo[id] = 0; // nullázzuk a változókat a mentés után
  5. valtozo2[id] = 0;
  6. }
  7. }
  8.  
  9. public save(id) {
  10. new szData[128];
  11. new name[32]; get_user_name(id, name, charsmax(name));
  12.  
  13. formatex(szData, charsmax(szData), "%i %i", valtozo[id], valtozo2[id]);
  14. set_data(name, szData)
  15. }


A formatex rész számít, ahol számoknak integert adunk (%i), szövegnek (%s), és a vessző után a menteni való változókat beírjuk.
Figyelembe vesszük az szData tömb karakterértékét, tehát ha kevés, akkor feljebb emeljük. Nagyobb szövegek mentését nagyon nem ajánlatos egyébként fájlba menteni.

Betöltés:

SteamID-re. ( Ha ID_LAN, akkor IP-re. )
SMA Forráskód: [ Mindet kijelol ]
  1. public client_authorized(id) {
  2. if(!is_user_bot(id) && !is_user_hltv(id)) {
  3. load(id);
  4. }
  5. }
  6.  
  7. public load(id) {
  8. new szData[128];
  9. new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
  10. if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
  11.  
  12. if(get_data(steamid, szData, charsmax(szData))) {
  13. new valami[32], valami2[32];
  14. parse(szData, valami, charsmax(valami), valami2, charsmax(valami2);
  15. valtozo[id] = str_to_num(valami)
  16. valtozo2[id] = str_to_num(valami2)
  17. }
  18. }


Névre: ( ehhez le kell tiltanod a névváltást egy pluginnal. )
SMA Forráskód: [ Mindet kijelol ]
  1. public client_authorized(id) {
  2. if(!is_user_bot(id) && !is_user_hltv(id)) {
  3. load(id);
  4. }
  5. }
  6.  
  7. public load(id) {
  8. new szData[128];
  9. new name[32]; get_user_name(id, name, charsmax(name));;
  10.  
  11. if(get_data(name, szData, charsmax(szData))) {
  12. new valami[32], valami2[32];
  13. parse(szData, valami, charsmax(valami), valami2, charsmax(valami2);
  14. valtozo[id] = str_to_num(valami)
  15. valtozo2[id] = str_to_num(valami2)
  16. }
  17. }


Itt a parse rész után érdemes odafigyelni, hogy ha számokról van szó, akkor ezt használjuk:
SMA Forráskód: [ Mindet kijelol ]
  1. valtozo[id] = str_to_num(valami)

Ha szövegről, akkor meg:
SMA Forráskód: [ Mindet kijelol ]
  1. copy(valtozo[id], charsmax(valtozo[]), valami)


Itt is érvényes:
Figyelembe vesszük az szData tömb karakterértékét, tehát ha kevés, akkor feljebb emeljük. Nagyobb szövegek mentését nagyon nem ajánlatos egyébként fájlba menteni.
Az if(get_data rész meg annyit takar, hogy ha megtalálta a fájlban a klienst, akkor az történik. Ha nem, akkor semmi. Tehát egy else ágban is lehetőség van a változók nullázására például, ha úgy tetszik.

Még több változóhoz segítség a formatex (mentés) részen kívül a betöltéshez:
létrehozunk több tömböt tárolásra.
SMA Forráskód: [ Mindet kijelol ]
  1. new valami3[32], valami4[32]

Itt 32 a karakterszámot jelenti, ami persze levehető számoknál pl. a tiny integer alapértékére [8].
Én fentebb alapból 32-t írtam mindenhez, a biztonság kedvéért, mert nem tudhatom, hogy számok vagy szövegek mentésére van szükség.
Parse résznél a további változókhoz folytatjuk a sort.
SMA Forráskód: [ Mindet kijelol ]
  1. parse(szData, valami, charsmax(valami), valami2, charsmax(valami2), valtozo3, charsmax(valami3), valtozo4, charsmax(valami4))

Ugyanígy használjuk a
SMA Forráskód: [ Mindet kijelol ]
  1. valtozo3[id] = str_to_num(valami3)
  2. valtozo4[id] = str_to_num(valami4)

parancsokat számok betöltésénél.
Vagy
SMA Forráskód: [ Mindet kijelol ]
  1. copy(valtozo3[id], charsmax(valtozo3[]), valami3)
  2. copy(valtozo4[id], charsmax(valtozo4[]), valami4)

szövegek betöltésénél.

Ha van még kérdés, akkor itt legyetek szívesek feltenni, ne nyissatok 100 témát ilyen dolgoknak.

Szerző:  slre141 [ 2015.11.24. 17:28 ]
Hozzászólás témája:  Re: Fájl mentés

Szia mforce megnéznéd hogy ebbe mi a hiba mert sajnos pár cucott ment és betölt de a többi valami oknál fogva nem köszönöm a miharabbi választ :D

SMA Forráskód: [ Mindet kijelol ]
  1. public client_authorized(id) {
  2. if(!is_user_bot(id) && !is_user_hltv(id)) {
  3. load(id);
  4.  
  5. }
  6. }
  7.  
  8.  
  9. public client_disconnect(id) {
  10. if(!is_user_bot(id) && !is_user_hltv(id)) {
  11. save(id);
  12.  
  13. }
  14. }
  15. public save(id) {
  16. new szData[256];
  17. new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
  18. if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
  19.  
  20. formatex(szData, charsmax(szData), "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i",pont[id],kulcs[id],knifeskin[1][id],knifeskin[2][id],
  21. knifeskin[3][id],knifeskin[4][id],knifeskin[5][id],knifeskin[6][id],knifeskin[7][id],szinlada2[id],huntlada[id],esportlada[id],operlada[id],operblada[id],szinlada[id]);
  22. set_data(steamid, szData)
  23. }
  24.  
  25.  
  26. public load(id) {
  27. new szData[256];
  28. new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
  29. if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
  30.  
  31. if(get_data(steamid, szData, charsmax(szData))) {
  32. new fpont[32],fkulcs[32],fknife[32],fknife1[32],fknife2[32],fknife3[32],fknife4[32],fknife5[32],fknife6[32],fknife7[32],lada_mny1[32],lada_mny2[32],lada_mny3[32],lada_mny4[32],lada_mny5[32],lada_mny6[32]
  33. parse(szData,fpont,charsmax(fpont),fkulcs,charsmax(fkulcs),fknife,charsmax(fknife),fknife1,charsmax(fknife1),fknife2,charsmax(fknife2),fknife3,charsmax(fknife3),fknife4,charsmax(fknife4),fknife5,charsmax(fknife5),fknife6,charsmax(fknife6),
  34. fknife7,charsmax(fknife7),lada_mny1,charsmax(lada_mny1),lada_mny2,charsmax(lada_mny2),lada_mny3,charsmax(lada_mny3),lada_mny4,charsmax(lada_mny4),lada_mny5,charsmax(lada_mny5),lada_mny6,charsmax(lada_mny6))
  35. pont[id] = str_to_num(fpont)
  36. kulcs[id] = str_to_num(fkulcs)
  37. knifeskin[1][id] = str_to_num(fknife)
  38. knifeskin[2][id] = str_to_num(fknife1)
  39. knifeskin[3][id] = str_to_num(fknife2)
  40. knifeskin[4][id] = str_to_num(fknife3)
  41. knifeskin[5][id] = str_to_num(fknife4)
  42. knifeskin[6][id] = str_to_num(fknife5)
  43. knifeskin[7][id] = str_to_num(fknife6)
  44. szinlada2[id] = str_to_num(lada_mny1)
  45. huntlada[id] = str_to_num(lada_mny2)
  46. esportlada[id] = str_to_num(lada_mny3)
  47. operlada[id] = str_to_num(lada_mny4)
  48. operblada[id] = str_to_num(lada_mny5)
  49. szinlada[id] = str_to_num(lada_mny6)
  50.  
  51.  
  52. }
  53. }
  54.  

Szerző:  mforce [ 2015.11.24. 17:43 ]
Hozzászólás témája:  Re: Fájl mentés

Így nem látok benne hibát, de ennyi változóhoz amúgy se ajánlott fájl mentés, majd lesz SQL tutoriál is. Amúgy fájl mentés is ideális, de max memóriacelákkal (array), ha 1x olvasod be map váltáskor, azt kész.

amúgy számokról van szó, ahogy látom ott a new valami[32], inkább [8] vagy [11] legyen.

Szerző:  slre141 [ 2015.11.24. 17:57 ]
Hozzászólás témája:  Re: Fájl mentés

Ebbe is meglehetne oldani hogy ne buggoljon? Vagy hgyam es maj sql-be?

Szerző:  mforce [ 2015.12.02. 17:04 ]
Hozzászólás témája:  Re: Fájl mentés

Most látom maga az index és a tömb sem tiszta, hát 0-ról kezdünk, meg fordítva van + miért nem enumeráció akkor? Azt 0-ázni is 1sor lenne.

SMA Forráskód: [ Mindet kijelol ]
  1. enum _:knives
  2. {
  3. knife1,
  4. knife2
  5. }
  6.  
  7. new data[33][knives];
  8.  
  9. // és akkor így néz ki:
  10. data[id][knife1]
  11.  
  12. // összes nullázása:
  13. arrayset(data[id] , 0 , sizeof(data[]));

Szerző:  jokypapa [ 2015.12.04. 07:49 ]
Hozzászólás témája:  Re: Fájl mentés

mforce írta:
Most látom maga az index és a tömb sem tiszta, hát 0-ról kezdünk, meg fordítva van + miért nem enumeráció akkor? Azt 0-ázni is 1sor lenne.

SMA Forráskód: [ Mindet kijelol ]enum _:knives{ knife1, knife2} new data[33][knives]; // és akkor így néz ki:data[id][knife1] // összes nullázása:arrayset(data[id] , 0 , sizeof(data[]));



Köszi a leírást! Mforce tudnád módosítani a témanevet, mondjuk írd már hozzá légy szíves h [TuT] vagy tutorial vagy valami :) Mert már négyszer néztem meg a témát, mindig azt hiszem h valami hibának a javítása :)

Szerző:  mforce [ 2015.12.04. 09:17 ]
Hozzászólás témája:  Re: Fájl mentés

Nem igazán tervezek a szerkesztéshez nyúlni, mert összeugrik az egész :D

Szerző:  jokypapa [ 2015.12.04. 12:27 ]
Hozzászólás témája:  Re: Fájl mentés

mforce írta:
Nem igazán tervezek a szerkesztéshez nyúlni, mert összeugrik az egész :D


:) Igen tudom :) Csak reménykedtem h témanév módosításnál nem kell hozzányúlni :)

Szerző:  PistaCFG [ 2016.01.03. 18:01 ]
Hozzászólás témája:  Re: Fájl mentés

Miért nem menti le az öléseket?

  1. public client_authorized(id)
  2. {
  3.     if(!is_user_bot(id) && !is_user_hltv(id))
  4.     {
  5.         Betoltes(id)
  6.     }
  7. }
  8. public client_disconnect(id)
  9. {
  10.     if(!is_user_bot(id) && !is_user_hltv(id))
  11.     {
  12.         Mentes(id)
  13.     }
  14. }
  15. public Mentes(id)
  16. {
  17.     new szData[128], ip[32]
  18.     get_user_ip(id, ip, charsmax(id))
  19.    
  20.     formatex(szData, charsmax(szData), "%i", oles[id])
  21.     set_data(ip, szData)
  22. }
  23. public Betoltes(id)
  24. {
  25.     new szData[128], ip[32]
  26.     get_user_ip(id, ip, charsmax(ip))
  27.    
  28.     if(get_data(ip, szData, charsmax(szData)))
  29.     {
  30.         new oles1[32]
  31.         parse(szData, oles1, charsmax(oles1))
  32.         oles[id] = str_to_num(oles1)
  33.     }
  34. }

Szerző:  V!RUSHĐ [ 2016.01.03. 18:47 ]
Hozzászólás témája:  Re: Fájl mentés

get_user_ip(id, ip, charsmax(id))

---->

get_user_ip(id, ip, charsmax(ip))

Oldal: 1 / 2 Minden időpont UTC+02:00 időzóna szerinti
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/