Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Problem z zapisem zmiennej do nvault


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


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
5 odpowiedzi w tym temacie

#1 Raen

    Wszechwiedzący

  • Power User

Reputacja: 158
Profesjonalista

  • Postów:536
  • GG:
  • Imię:Paweł
  • Lokalizacja:......
Offline

Napisano 21.04.2013 14:47

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;
}


  • +
  • -
  • 0

angel-little.png


#2 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 21.04.2013 16:43

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ć.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#3 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 21.04.2013 17:39   Najlepsza odpowiedź

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".

  • +
  • -
  • 1
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#4 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 21.04.2013 19:24

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

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#5 Raen

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 158
Profesjonalista

  • Postów:536
  • GG:
  • Imię:Paweł
  • Lokalizacja:......
Offline

Napisano 22.04.2013 15:59

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 :)


  • +
  • -
  • 0

angel-little.png


#6 Raen

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 158
Profesjonalista

  • Postów:536
  • GG:
  • Imię:Paweł
  • Lokalizacja:......
Offline

Napisano 23.04.2013 21:37

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


  • +
  • -
  • 0

angel-little.png





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych