←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Zapis oraz odczyt nvault


Najlepsza odpowiedź GwynBleidD 21.11.2014 13:37

Ma zostać puste, a dostajesz argument type mismatch, bo parametr name w ZapiszDaneNick powinien być tablicą. Ostatecznie powinno wyglądać to tak:

public Zapisz_Dane(id)
{
    new name[64];
    get_user_name(id, name, 63)
    ZapiszDaneNick(id, name)
}

public ZapiszDaneNick(id, name[]){
    new vaultkey[40], vaultdata[25]
    formatex(vaultkey, 39 ,"%s-ggg", name);
    formatex(vaultdata, 24, " ^"%d^" ^"%d^" ^"%d^" ^"%d^" ^"%s^"", zabil[id], padlofiara[id], poziomct[id], poziomtt[id], name)
    nvault_set(zapis_sprawdz, vaultkey, vaultdata);
}
Z Wczytaj_Dane chyba sobie już poradzisz ;) Przejdź do postu
Zablokowany

  • +
  • -
Petpat - zdjęcie Petpat 19.11.2014

Witam mam pewno pytanie, da się jakoś zrobić gdy gracz zmienia nick, to żeby statystyki się zerowały gdy gracz o takim nicku nie był zapisany, lub zmiana nicku = wczytanie statystyk gracza który jest już zapisany, wiem ,że można zablokować zmianę nicku, ale ja tego nie chce zrobić ;)

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 20.11.2014

public client_infochanged(id){
	new newname[32], oldname[32];
	get_user_info(id, "name", newname, 31);
	get_user_name(id, oldname, 31);
	if(!equal(oldname, newname)){
		//tu dajesz kod zapisujący staty dla nicku "oldname" oraz wczytujący dla nicku "name" + możesz dodać zerowanie statów w tabeli podczas danej mapy (żeby przy nastepnej zmianie nicku nie wczytac tulu fragow/smierci ile aktualnie posiada, albo zapisywac do zmiennej globalnej podczas zmiany nicku i odejmowac je przy nastepnej i tak w kółko.
	}
}

Użytkownik grankee edytował ten post 20.11.2014 04:10
Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 20.11.2014

public client_infochanged(id){
    new newname[32], oldname[32];
    get_user_info(id, "name", newname, 31);
    get_user_name(id, oldname, 31);
    if(!equal(oldname, newname)){
        Zapisz_Dane(id)
        padlofiara[id] = 0;
        zabil[id] = 0;
        Wczytaj_Dane(id)
    }
}

 

Zrobiłem coś takiego, ale to nie działa, jest dalej tak ,że jak zmieniam nick, to statystyki są takie same które miałem na starym nicku, jakieś inne propozycję ? :)

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 20.11.2014

Jeśli chcesz to w tabeli zresetować to musisz użyć 

set_user_frags
cs_set_user_deaths
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 20.11.2014

public client_infochanged(id){
    new newname[32], oldname[32];
    get_user_info(id, "name", newname, 31);
    get_user_name(id, oldname, 31);
    if(!equal(oldname, newname)){
        Zapisz_Dane(id)
        padlofiara[id] = 0;
        zabil[id] = 0;
        Wczytaj_Dane(id)
    }
}

Zrobiłem coś takiego, ale to nie działa, jest dalej tak ,że jak zmieniam nick, to statystyki są takie same które miałem na starym nicku, jakieś inne propozycję ? :)

 

1. Do Zapisz_Dane(id) i Wczytaj_Dane(id) podajesz tylko ID, przez co te funkcje spróbują na podstawie ID same pobrać nick gracza. Stwórz ich alternatywne wersje, do których podasz nick, a nie id. I wtedy odpowiednio podaj do nich oldname i newname

 

2. Obie te funkcje wywołane z client_infochanged wywołają się dla STAREGO nicku, client_infochanged jest wywoływany przed właściwą zmianą nicku na serwerze (aby można było taką zmianę zablokować), więc nie dziwota, że statystyki się nie zmienią skoro wczytujesz nadal te dla starego nicku :)

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 20.11.2014

Można prosić o jakiś przykład ? :)

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 20.11.2014

załóżmy, że kod funkcji zapisz wygląda tak:

 

ZapiszDane(id) {
    new name[64];
    get_user_name(id, name, 63);
 
    // ... dalej zapis danych na nick w SQL lub nvault
}

 

Stwórz więc funkcję ZapiszDaneNick(id, name) do której przeniesiesz wszystko z Zapisz_Dane, prócz pobierania nicku gracza. Następnie w Zapisz_Dane po pobraniu nicku wywołasz ZapiszDaneNick. Tą samą funkcję również wykonasz w client_infochanged, podając jako nick oldname. Dla Wczytaj_Dane postąp analogicznie, podając tym razem newname w client_infochanged.

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 21.11.2014

Gwyn

get_user_info(id, "name", newname, 31);

wczyta nowy nick (ten po zmianie)

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 21.11.2014

Owszem, to jest oczywiste i wynika z kodu, który podałeś wcześniej. Można też do wczytywania danych dać w/w get_user_info zamiast get_user_name, a w zapisywaniu zostawić get_user_name, co rozwiąże problem, ale rozwiązanie z dodaniem parametru do określenia nicku da nam możliwość późniejszej rozbudowy pluginu np o logowanie się przez admina do statystyk dowolnej osoby (z różnychtam przyczyn, np twierdzi, że mu się level zbugował i mimo nabicia X expa nie wbił nowego levelu). Podejście już takie mam, że staram się zostawiać wszędzie jak najwięcej możliwości rozbudowy ;)
Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 21.11.2014

Hmmmmm, najwyraźniej ja źle zrozumiałem  ... ;) Wyświetla mi się błąd : ""error 035: argument type mismatch (argument 2)"
Właśnie Zapisz_Dane(id) ma zostać puste w sensie ,że zostaje tylko pobieranie nicku + zapis danych na nick ? Czy tak jak teraz jest ? :)

 

public Zapisz_Dane(id)
{
    new name[64];
    get_user_name(id, name, 63)
    ZapiszDaneNick(id, name)
    new vaultkey[40], vaultdata[25]
    formatex(vaultkey, 39 ,"%s-ggg", name);
    formatex(vaultdata, 24, " ^"%d^" ^"%d^" ^"%d^" ^"%d^" ^"%s^"", zabil[id], padlofiara[id], poziomct[id], poziomtt[id], name)
    nvault_set(zapis_sprawdz, vaultkey, vaultdata);
}

public ZapiszDaneNick(id, name){
    new vaultkey[40], vaultdata[25]
    formatex(vaultkey, 39 ,"%s-ggg", name);
    formatex(vaultdata, 24, " ^"%d^" ^"%d^" ^"%d^" ^"%d^" ^"%s^"", zabil[id], padlofiara[id], poziomct[id], poziomtt[id], name)
    nvault_set(zapis_sprawdz, vaultkey, vaultdata);
}
Odpowiedz

  • +
  • -
Najlepsza odpowiedź GwynBleidD - zdjęcie GwynBleidD 21.11.2014

Ma zostać puste, a dostajesz argument type mismatch, bo parametr name w ZapiszDaneNick powinien być tablicą. Ostatecznie powinno wyglądać to tak:

public Zapisz_Dane(id)
{
    new name[64];
    get_user_name(id, name, 63)
    ZapiszDaneNick(id, name)
}

public ZapiszDaneNick(id, name[]){
    new vaultkey[40], vaultdata[25]
    formatex(vaultkey, 39 ,"%s-ggg", name);
    formatex(vaultdata, 24, " ^"%d^" ^"%d^" ^"%d^" ^"%d^" ^"%s^"", zabil[id], padlofiara[id], poziomct[id], poziomtt[id], name)
    nvault_set(zapis_sprawdz, vaultkey, vaultdata);
}
Z Wczytaj_Dane chyba sobie już poradzisz ;)
Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 21.11.2014

Dzięki za zainteresowanie, wszystko działa teraz jak należy ;)

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 22.11.2014

Jednak nie działa jak należy :) Są dwa problemy jeden załatany

public Zapisz_Dane(id)
{
    new name[64];
    get_user_name(id, name, 63)
    ZapiszDaneNick(id, name)
}

public ZapiszDaneNick(id, name[]){
    new vaultkey[40], vaultdata[25]
    formatex(vaultkey, 39 ,"%s-ggg", name);
    formatex(vaultdata, 24, " ^"%d^" ^"%d^" ^"%d^" ^"%d^" ^"%s^"", zabil[id], padlofiara[id], poziomct[id], poziomtt[id], name)
    nvault_set(zapis_sprawdz, vaultkey, vaultdata);
}

 

Gdy jest tak ustawione, to nie zapisuje statystyk ..

 

    new name[64];
    get_user_name(id, name, 63)
dodałem również do ZapiszDaneNick

I zapis teraz działa, teraz problem jest z odczytem ;) Bo wczytuje dalej stary nick ... ;)

Wczytaj_Dane(id, name[]) Jest zrobione tak + w client_infochanged(id) Wczytaj_Dane(id, oldname);

 

@POST UP NIE MOGŁEM EDYTOWAĆ :)

 

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 22.11.2014

Pokaż funkcje Zapisz_Dane, ZapiszDaneNick, Wczytaj_Dane, WczytajDaneNick i client_infochanged w całości.

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 22.11.2014

^"%d^"
A po co tak? Inty można dawać bez tego "".
Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 22.11.2014

Dzięki za zaangażowanie oraz za zainteresowanie, sebul, bo tak chciałem że tak powiem dla estetyki, mi to odpowiada ;) Wdarła mi się literówka i dzięki temu nie czytało danych, udało mi się to naprawić dzięki raz jeszcze :)


sebul (23.11.2014 14:59):
Problem może już rozwiązałeś, ale zwiększ tablicę "vaultdata", bo masz tam zbyt mało miejsca.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 23.11.2014

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Temat zamknięty na prośbę użytkownika.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz
Zablokowany