←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

[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
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 - zdjęcie 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;
}

Odpowiedz

GT Team - zdjęcie 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;

}

sebul (21.04.2013 17:33):
Nawet danych nie wczytujesz, więc na pewno nie będzie działać.
Odpowiedz

  • +
  • -
Najlepsza odpowiedź sebul - zdjęcie sebul 21.04.2013

Powiadasz, że każda wartość jest jednocyfrowa? Skoro tak, to najlepiej to zrobić w ten sposób
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ę.
sebul (21.04.2013 17:51):
7. Powinieneś zainteresować się funkcją "nvault_prune".
Odpowiedz

GT Team - zdjęcie GT Team 21.04.2013

Sebul, poprostu skopiowałem, i edytowałem ;P Lecz gdybym dodał to nvault_get to na pewno by działało
Odpowiedz

  • +
  • -
Raen - zdjęcie 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 :)

Odpowiedz

  • +
  • -
Raen - zdjęcie Raen 23.04.2013

Wszystko działa jak należy dziękuję sebul ;)

Odpowiedz