←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

XP MOD

Zablokowany

  • +
  • -
kyku - zdjęcie kyku 11.06.2010

Witam, dawno nie zwracałem się z prośbą do Was ale tym razem po prostu sobie nie poradzę, wymiękam :P

Mam tutaj taki kod (oczywiście jest to tylko kawałek ale reszta nie ma za bardzo na działanie wpływu)
Spoiler


Więc tak, kod działa aczkolwiek gracze skarżą się, że czasem im się "cofa" (czy też zmienia).
Dziwne jest to, ponieważ (że tak brzydko powiem) z d*py gracze, z 150 poziomu mają 44.. (taki przykład).

Jakieś pomysły?

Dodam, że mam na serwerze inny plugin który działa na podobnej zasadzie (nvault) i nie ma żadnych problemów.
Użytkownik kyku edytował ten post 11.06.2010 14:18
Odpowiedz

  • +
  • -
Kubaczek <3 - zdjęcie Kubaczek <3 11.06.2010

Miałem to samo przy vault, przeszedłem na sql i hula.
Odpowiedz

  • +
  • -
kyku - zdjęcie kyku 11.06.2010

ja z sql na nvault bo serwer padal ; d
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 11.06.2010

strzelam
save
replace_all(nick, 34, " ", "'");

i to samo w load ;)
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 11.06.2010

1.Zapisuj na sid, a jesli ktos jest z nonsteam (ma steam_id_lan) to dopiero na nick.
2.Po co Ci -xpmod na końcu key'a? Usuń to, bo to niepotrzebne, niech sam nick/sid będzie kluczem (key'em).
3.Jeśli xp nie dostaje się co chwila to od razu to zapisuj vaultem, wtedy po każdej operacji będzie zapis na bieżąco, a zmienne wywal, no chyba, że co chwila dostaje się za coś expa to wtedy do zmiennych i co runda najrzadziej zapisuj.
4.

public SaveData(id)
{
if(!zaladowalo[id]) return PLUGIN_HANDLED;// zmienna informujaca czy dany gracz byl zaladowany, ale jesli go nie zaladowalo to czemu go nie zapiszesz? Tworzenie konto robisz ręcznie? Jesli ma być automatycznie zapisywane dla nowych graczy to wywal tę linijkę
if(is_user_bot(id)) return PLUGIN_HANDLED;
if(player_xp[id]<=player_xp_old[id] || player_xp[id]==99999999999) return PLUGIN_HANDLED;//nie do konca rozumiem co to, jakby byl caly kod..
new nick[35]//32 wystarczy

new vaultkey[64],vaultdata[256]// po co Ci taka wielka tablica vaultdata? vaultkey w zasadzie powinien byc samym nickiem, po co ten dopisek -xpmod?
format(vaultkey,63,"%s-xpmod",nick)//czyli jak to wyzej poprawisz to ta linijka do usuniecia
format(vaultdata,255,"%i#%i#%i#", player_lvl[id], player_xp[id], player_dead[id])/* Po co wstawiasz #? Zrób to tak:
format(vaultdata,255,"%i %i %i", player_lvl[id], player_xp[id], player_dead[id])
skoro to liczby to nie zawierają spacji, więc później bez problemu podzielisz to parse'm*/
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}


5.
public LoadData(id)
{


if(is_user_bot(id) || !is_user_connected(id)) return PLUGIN_HANDLED;

new nick[35] //wystarczy 32
get_user_name(id, nick, 34);//analogicznie 31
replace_all(nick, 34, "#", "");//po co to ?

new vaultkey[64],vaultdata[256]//po co Ci takie duze tablice? przeczytaj co pisalem wyzej
format(vaultkey,63,"%s-xpmod",nick)// jak wyżej pisałem, wywal "-xpmod", bo to zbędne
format(vaultdata,255,"%i#%i#%i#",player_lvl[id], player_xp[id], player_dead[id])//po co formatujesz string do którego za chwile i tak zapiszesz co innego?(zapiszesz tu wartosc z vaulta)
nvault_get(g_vault,vaultkey,vaultdata,255)//uzyj nvault_lookup, który od razu zwróci Ci, czy taki klucz został odnaleziony w bazie vault, po czym mozesz to zawarunkować i w razie niepowodzenia dasz return, żeby dalej nie wykonywać funkcji
replace_all(vaultdata, 255, "#", " ")//wywal to
new tmp[3][32];
parse(vaultdata, tmp[0], 31, tmp[1], 31, tmp[2], 31)//chyba takich długich wartości expa nie będzie, 31 znaków to grubo ponad bilion :D
player_lvl[id] = str_to_num(tmp[0]);
player_xp[id] = str_to_num(tmp[1]);
player_dead[id] = str_to_num(tmp[2]);
zaladowalo[id] = 1;//jesli to co wyzej ma byc automatycznie to ta zmienna jest zbedna

return PLUGIN_CONTINUE
}



Popraw to i dalej będziemy działać :)
Odpowiedz

  • +
  • -
kyku - zdjęcie kyku 11.06.2010

Widzę, że znów dość często udzielasz się na forum :) dzięki za pomoc i życzę Ci ponownie moderatora
Odpowiedz
Zablokowany