[ROZWIĄZANE] Problem z zapisem zmiennej do...
Najlepsza odpowiedź sebul 21.04.2013 17:39
Powiadasz, że każda wartość jest jednocyfrowa? Skoro tak, to najlepiej to zrobić w ten sposób
1. Zmienne bool można zapisywać tak jakby to była zwykła zmienna liczbowa, gdy będzie true, to zapisze się 1, a gry false - 0
2. Nie trzeba dodawać #, chyba że chcesz mieć jakieś statystyki www, które w tym przypadku i tak mogą czytać poprawnie wartości nawet i bez #, skoro wartości są jednocyfrowe.
3. Główny błąd w Twoim kodzie był taki, że po prostu nie wczytywałeś wartości.
4. Pobieranie nicku przed zapisem/odczytem nie jest dobrym rozwiązaniem, no chyba że masz na serwerze blokadę zmiany nicku, ale i tak dobrze by było, jakbyś pomyślał o przeniesieniu tego do jakichś zmiennych globalnych, do których będziesz zapisywał nick/ip/sid przy wchodzeniu gracza, a przy wychodzeniu usuwał.
5. Zmienne globalne, które zapisujesz do pliku vault, musisz zerować przed wczytaniem danych, lub po ich zapisie.
6. Zamiast
powinno być
bo co jeśli zapis będzie na ip czy steam? Pierwsza wartość może kolidować z kluczem, a przynajmniej tak mi się wydaję. Przejdź do postu
public SaveData(id) {
new vaultkey[64], vaultdata[8], uid[48];
switch(get_pcvar_num(CVAR_TYP_ZAPISU)) {
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
formatex(vaultdata, charsmax(vaultdata), "%i%i%i%i", knife_model[id], green[id], red[id], blue[id]);
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
nvault_set(plik_nvault, vaultkey, vaultdata);
return PLUGIN_HANDLED;
}
public LoadData(id) {
new vaultkey[64], vaultdata[8], uid[48];
switch(get_pcvar_num(CVAR_TYP_ZAPISU)) {
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
if(nvault_get(plik_nvault, vaultkey, vaultdata, charsmax(vaultdata))) {
new value[2];
value[0] = vaultdata[0]; knife_model[id] = str_to_num(value);
value[0] = vaultdata[1]; green[id] = bool:str_to_num(value);
value[0] = vaultdata[2]; red[id] = bool:str_to_num(value);
value[0] = vaultdata[3]; blue[id] = bool:str_to_num(value);
nvault_touch(plik_nvault, vaultkey);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
1. Zmienne bool można zapisywać tak jakby to była zwykła zmienna liczbowa, gdy będzie true, to zapisze się 1, a gry false - 0
2. Nie trzeba dodawać #, chyba że chcesz mieć jakieś statystyki www, które w tym przypadku i tak mogą czytać poprawnie wartości nawet i bez #, skoro wartości są jednocyfrowe.
3. Główny błąd w Twoim kodzie był taki, że po prostu nie wczytywałeś wartości.
4. Pobieranie nicku przed zapisem/odczytem nie jest dobrym rozwiązaniem, no chyba że masz na serwerze blokadę zmiany nicku, ale i tak dobrze by było, jakbyś pomyślał o przeniesieniu tego do jakichś zmiennych globalnych, do których będziesz zapisywał nick/ip/sid przy wchodzeniu gracza, a przy wychodzeniu usuwał.
5. Zmienne globalne, które zapisujesz do pliku vault, musisz zerować przed wczytaniem danych, lub po ich zapisie.
6. Zamiast
format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid);
powinno być
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
bo co jeśli zapis będzie na ip czy steam? Pierwsza wartość może kolidować z kluczem, a przynajmniej tak mi się wydaję. Przejdź do postu
Raen
21.04.2013
Witam.
Mam problem z zapisaniem 3 zmiennych typu bool do nvault. W sumie do zapisania mam 4 wartości, numer noża od 0 do 7 i 3 wartości true lub false. Oto sma jak zapisuję dane, proszę o poprawę tego lub napisanie mi co jest źle zrobione.
Z góry dzięki
public SaveData(id)
{
new vaultkey[128],vaultdata[64], uid[64];
switch(get_pcvar_num(CVAR_TYP_ZAPISU))
{
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
format(vaultdata, charsmax(vaultdata),"#%d#%i#%i#%i", knife_model[id], _:green[id], _:red[id], _:blue[id]);
format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid);
nvault_set(plik_nvault, vaultkey, vaultdata);
return PLUGIN_CONTINUE;
}
public LoadData(id)
{
new vaultkey[128],vaultdata[64], uid[64];
switch(get_pcvar_num(CVAR_TYP_ZAPISU))
{
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid);
replace_all(vaultdata, 63, "#", " ");
new uknife[33], ugreen[33], ured[33], ublue[33];
parse(vaultdata, uknife, 32, ugreen, 32, ured, 32, ublue, 32);
knife_model[id] = str_to_num(uknife);
green[id] = bool:str_to_num(ugreen);
red[id] = bool:str_to_num(ured);
blue[id] = bool:str_to_num(ublue);
return PLUGIN_CONTINUE;
}
GT Team 21.04.2013
public SaveData(id) { new vaultkey[128],vaultdata[64], uid[64]; switch(get_pcvar_num(CVAR_TYP_ZAPISU)) { case 1: get_user_name(id, uid, charsmax(uid)); case 2: get_user_authid(id, uid, charsmax(uid)); case 3: get_user_ip(id, uid, charsmax(uid)); } format(vaultdata, charsmax(vaultdata),"#%d#%i#%i#%i", knife_model[id], green[id]?1:0, red[id]?1:0, blue[id]?1:0); format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid); nvault_set(plik_nvault, vaultkey, vaultdata); return PLUGIN_CONTINUE; } public LoadData(id) { new vaultkey[128],vaultdata[64], uid[64]; switch(get_pcvar_num(CVAR_TYP_ZAPISU)) { case 1: get_user_name(id, uid, charsmax(uid)); case 2: get_user_authid(id, uid, charsmax(uid)); case 3: get_user_ip(id, uid, charsmax(uid)); } format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid); replace_all(vaultdata, 63, "#", " "); new uknife[33], ugreen[33], ured[33], ublue[33]; parse(vaultdata, uknife, 32, ugreen, 32, ured, 32, ublue, 32); knife_model[id] = str_to_num(uknife); if(str_to_num(ugreen)) green[id] = true else green[id] = false if(str_to_num(ured)) red[id] = true else red[id] = false if(str_to_num(ublue)) blue[id] = true else blue[id] = false return PLUGIN_CONTINUE; }
Najlepsza odpowiedź
sebul
21.04.2013
Powiadasz, że każda wartość jest jednocyfrowa? Skoro tak, to najlepiej to zrobić w ten sposób
1. Zmienne bool można zapisywać tak jakby to była zwykła zmienna liczbowa, gdy będzie true, to zapisze się 1, a gry false - 0
2. Nie trzeba dodawać #, chyba że chcesz mieć jakieś statystyki www, które w tym przypadku i tak mogą czytać poprawnie wartości nawet i bez #, skoro wartości są jednocyfrowe.
3. Główny błąd w Twoim kodzie był taki, że po prostu nie wczytywałeś wartości.
4. Pobieranie nicku przed zapisem/odczytem nie jest dobrym rozwiązaniem, no chyba że masz na serwerze blokadę zmiany nicku, ale i tak dobrze by było, jakbyś pomyślał o przeniesieniu tego do jakichś zmiennych globalnych, do których będziesz zapisywał nick/ip/sid przy wchodzeniu gracza, a przy wychodzeniu usuwał.
5. Zmienne globalne, które zapisujesz do pliku vault, musisz zerować przed wczytaniem danych, lub po ich zapisie.
6. Zamiast
powinno być
bo co jeśli zapis będzie na ip czy steam? Pierwsza wartość może kolidować z kluczem, a przynajmniej tak mi się wydaję.
public SaveData(id) {
new vaultkey[64], vaultdata[8], uid[48];
switch(get_pcvar_num(CVAR_TYP_ZAPISU)) {
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
formatex(vaultdata, charsmax(vaultdata), "%i%i%i%i", knife_model[id], green[id], red[id], blue[id]);
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
nvault_set(plik_nvault, vaultkey, vaultdata);
return PLUGIN_HANDLED;
}
public LoadData(id) {
new vaultkey[64], vaultdata[8], uid[48];
switch(get_pcvar_num(CVAR_TYP_ZAPISU)) {
case 1: get_user_name(id, uid, charsmax(uid));
case 2: get_user_authid(id, uid, charsmax(uid));
case 3: get_user_ip(id, uid, charsmax(uid));
}
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
if(nvault_get(plik_nvault, vaultkey, vaultdata, charsmax(vaultdata))) {
new value[2];
value[0] = vaultdata[0]; knife_model[id] = str_to_num(value);
value[0] = vaultdata[1]; green[id] = bool:str_to_num(value);
value[0] = vaultdata[2]; red[id] = bool:str_to_num(value);
value[0] = vaultdata[3]; blue[id] = bool:str_to_num(value);
nvault_touch(plik_nvault, vaultkey);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
1. Zmienne bool można zapisywać tak jakby to była zwykła zmienna liczbowa, gdy będzie true, to zapisze się 1, a gry false - 0
2. Nie trzeba dodawać #, chyba że chcesz mieć jakieś statystyki www, które w tym przypadku i tak mogą czytać poprawnie wartości nawet i bez #, skoro wartości są jednocyfrowe.
3. Główny błąd w Twoim kodzie był taki, że po prostu nie wczytywałeś wartości.
4. Pobieranie nicku przed zapisem/odczytem nie jest dobrym rozwiązaniem, no chyba że masz na serwerze blokadę zmiany nicku, ale i tak dobrze by było, jakbyś pomyślał o przeniesieniu tego do jakichś zmiennych globalnych, do których będziesz zapisywał nick/ip/sid przy wchodzeniu gracza, a przy wychodzeniu usuwał.
5. Zmienne globalne, które zapisujesz do pliku vault, musisz zerować przed wczytaniem danych, lub po ich zapisie.
6. Zamiast
format(vaultkey, charsmax(vaultkey), "KnifeMod_%s", uid);
powinno być
formatex(vaultkey, charsmax(vaultkey), "%s_KnifeMod", uid);
bo co jeśli zapis będzie na ip czy steam? Pierwsza wartość może kolidować z kluczem, a przynajmniej tak mi się wydaję.
GT Team 21.04.2013
Sebul, poprostu skopiowałem, i edytowałem Lecz gdybym dodał to nvault_get to na pewno by działało
Raen
22.04.2013
Dziękuję za pomoc, panowie po plusie
Jak tylko znajdę czas i serwer to przetestuję i dam znać co i jak więc proszę o nie zamykanie tematu