[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.
new filename[128];
public plugin_init() {
// blabla
get_localinfo("amxx_configsdir", filename, charsmax(filename))
format(filename, charsmax(filename), "%s/mforce_fajlmentes.ini", filename)
}
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.stock get_data(const key[], data[], len) {
new vault = fopen(filename, "rt");
new _data[512], _key[64];
while( !feof(vault) ) {
fgets(vault, _data, charsmax(_data));
parse(_data, _key, charsmax(_key), data, len);
if( equal(_key, key) ) {
fclose(vault);
return 1;
}
}
fclose(vault);
copy(data, len, "");
return 0;
}
stock set_data(const key[], const data[]) {
static const temp_vault_name[] = "set_data.txt";
new file = fopen(temp_vault_name, "wt");
new vault = fopen(filename, "rt");
new _data[512], _key[64], _other[32];
new bool:replaced = false;
while( !feof(vault) ) {
fgets(vault, _data, charsmax(_data));
parse(_data, _key, charsmax(_key), _other, charsmax(_other));
if( equal(_key, key) && !replaced ) {
fprintf(file, "^"%s^" ^"%s^"^n", key, data);
replaced = true;
}
else {
fputs(file, _data);
}
}
if( !replaced ) {
fprintf(file, "^"%s^" ^"%s^"^n", key, data);
}
fclose(file);
fclose(vault);
delete_file(filename);
while( !rename_file(temp_vault_name, filename, 1) ) { }
//delete_file(temp_vault_name);
}
Mentés:SteamID-re. ( Ha ID_LAN, akkor IP-re. )public client_disconnect(id) {
if(!is_user_bot(id) && !is_user_hltv(id)) {
save(id);
}
}
public save(id) {
new szData[128];
new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
formatex(szData, charsmax(szData), "%i %i", valtozo[id], valtozo2[id]);
set_data(steamid, szData)
}
Névre: ( ehhez le kell tiltanod a névváltást egy pluginnal. )public client_disconnect(id) {
if(!is_user_bot(id) && !is_user_hltv(id)) {
save(id);
valtozo[id] = 0; // nullázzuk a változókat a mentés után
valtozo2[id] = 0;
}
}
public save(id) {
new szData[128];
new name[32]; get_user_name(id, name, charsmax(name));
formatex(szData, charsmax(szData), "%i %i", valtozo[id], valtozo2[id]);
set_data(name, szData)
}
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. )public client_authorized(id) {
if(!is_user_bot(id) && !is_user_hltv(id)) {
load(id);
}
}
public load(id) {
new szData[128];
new steamid[32]; get_user_authid(id, steamid, charsmax(steamid));
if(contain(steamid, "_ID_LAN") != -1) get_user_ip(id, steamid, charsmax(steamid), 1);
if(get_data(steamid, szData, charsmax(szData))) {
new valami[32], valami2[32];
parse(szData, valami, charsmax(valami), valami2, charsmax(valami2);
valtozo[id] = str_to_num(valami)
valtozo2[id] = str_to_num(valami2)
}
}
Névre: ( ehhez le kell tiltanod a névváltást egy pluginnal. )public client_authorized(id) {
if(!is_user_bot(id) && !is_user_hltv(id)) {
load(id);
}
}
public load(id) {
new szData[128];
new name[32]; get_user_name(id, name, charsmax(name));;
if(get_data(name, szData, charsmax(szData))) {
new valami[32], valami2[32];
parse(szData, valami, charsmax(valami), valami2, charsmax(valami2);
valtozo[id] = str_to_num(valami)
valtozo2[id] = str_to_num(valami2)
}
}
Itt a parse rész után érdemes odafigyelni, hogy ha számokról van szó, akkor ezt használjuk:
valtozo[id] = str_to_num(valami)
Ha szövegről, akkor meg:
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.
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.
parse(szData, valami, charsmax(valami), valami2, charsmax(valami2), valtozo3, charsmax(valami3), valtozo4, charsmax(valami4))
Ugyanígy használjuk a
valtozo3[id] = str_to_num(valami3)
valtozo4[id] = str_to_num(valami4)
parancsokat számok betöltésénél.
Vagy
copy(valtozo3[id], charsmax(valtozo3[]), valami3)
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.