Zapis nvault problem
I am the one who knocks.
02.01.2020
Witam otóż borykałem się z następującym problemem chciałem do pluginu wprowadzić zapis nvault, oczekiwałem na taki efekt że jeśli ktoś użyje /hud w celu wyłączenia hudu to żeby nie działało to na runde czy też mape ale żeby zapisało decyzje gracza i nie ważne czy crash serwera czy gracz wyjdzie dopóki nie wpisze znowu /hud w celu pokozania mu się znowu coś tam zajrzałem w dokumentacje bo zapisem nvault nie miałem jeszcze doczynienia drugim rozwiązaniem by był zapis na sql ale dla takiego pluginu to raczej zbędne i bezsensu więc nvault będzie odpowiedni tylko mam problem bo nie wiem czy dobrze to wyszło. Podejrzewam że coś spierdzieliłem lub też składnia kodu jest nie dobra
#include <amxmodx> #include <amxmisc> #include <fakemeta> #include <hamsandwich> #include <csx> #include <colorchat> #include <nvault> #define PLUGIN "Rangi" #define VERSION "1.0" #define AUTHOR "R3X" // User stats parms id #define STATS_KILLS 0 #define STATS_DEATHS 1 #define STATS_HS 2 #define STATS_TKS 3 #define STATS_SHOTS 4 #define STATS_HITS 5 #define STATS_DAMAGE 6 //Max count of levels #define LEVELS 20 //Max len of ClassName #define CLASS_LEN 25 #define MAX_NAME_LENGTH 31 #define MAX_BUFFER_LENGTH 2047 #define TASK_SHOWCLASS 2222 #define TASK_SHOWADV 768 #define adtime 90.0 //Default of 1,5 minuites //Buffers new t_sName[MAX_NAME_LENGTH + 1] = "" new g_sBuffer[MAX_BUFFER_LENGTH + 1] = "" new bool:g_hudEnabled[33]; new nazwa_gracza[33][64]; new giXP[LEVELS+1]; new gszClass[LEVELS+1][CLASS_LEN]; new giPointer=1; new gcvarMaxName; new gcvarType, gcvarTop, gcvarList; new gmsgSayText; new SyncHudObj; new g_vault; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_dictionary("statsx.txt"); register_clcmd("say /top10", "cmdTop10", 0, "- wyswietla range i statystyki najlepszych 10 graczy"); register_clcmd("say /hud", "cmdRangiHud", 0, "- włącza/wyłacza pokazywanie rang hud"); register_clcmd("say /rank", "cmdRank", 0, "- wyswietla range i statystyki"); register_clcmd("say /rangi", "cmdHelp", 0, "- wyswietla liste rang"); register_clcmd("say_team /top10", "cmdTop10", 0, "- wyswietla range i statystyki najlepszych 10 graczy"); register_clcmd("say_team /hud", "cmdRangiHud", 0, "- włącza/wyłacza pokazywanie rang hud"); register_clcmd("say_team /rank", "cmdRank", 0, "- wyswietla range i statystyki"); register_clcmd("say_team /rangi", "cmdHelp", 0, "- wyswietla liste rang"); SyncHudObj = CreateHudSyncObj(); RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1); gcvarMaxName = register_cvar("rangi_maxname", "Reszta jest milczeniem"); gcvarType = register_cvar("rangi_hud","0"); gcvarTop = register_cvar("rangi_top10","1"); gcvarList = register_cvar("rangi_list","1"); gmsgSayText = get_user_msgid("SayText"); // set_task(60.0, "ShowAdv",.flags = "b"); g_vault == nvault_open("HUD"); } //public ShowAdv(){ // ColorChat(0, NORMAL, "[RANGI]^x04 Wpisz w say /hud aby wl/wyl pokazywanie statystyk rangi na ekranie./rank - wyswietla twoja range,/rangi - wyswietla spis rang,/top10 - wyswietla rangi i statystyki najlepszych 10 graczy"); //} //CONFIG public plugin_cfg(){ new szFile[128]; get_configsdir(szFile, 127); add(szFile, 127, "/rangi.ini"); if(!file_exists(szFile)) return set_fail_state("Nie znalaziono pliku ranga.ini w folderze configs/"); new szLine[96], iLen=0, szClass[CLASS_LEN], szXP[16]; for(new i=0;read_file(szFile, i, szLine, 95, iLen);i++,szClass[0]=szXP[0]='^0'){ if( giPointer > LEVELS) break; if(iLen==0) continue; trim(szLine); if(szLine[0]=='^0' || szLine[0]==';') continue; parse(szLine, szClass, CLASS_LEN-1, szXP, 15); if(szClass[0] && szXP[0]){ giXP[giPointer]=str_to_num(szXP); copy(gszClass[giPointer], CLASS_LEN-1, szClass) giPointer++; } } return PLUGIN_CONTINUE; } public Odrodzenie(id) { if(!task_exists(TASK_SHOWCLASS+id)) { set_task(0.1, "taskDisplayRank", TASK_SHOWCLASS+id, _, _, "b"); } return PLUGIN_CONTINUE; } public UsunZadania(id) { if(task_exists(TASK_SHOWCLASS+id)) { remove_task(TASK_SHOWCLASS+id); } if(task_exists(TASK_SHOWADV+id)) { remove_task(TASK_SHOWADV+id); } } //COMMANDS public cmdTop10(id){ if(get_pcvar_num(gcvarTop) <= 0){ print_colored(id, "* ^x04Top10^x01 jest wylaczone"); return PLUGIN_HANDLED; } format_top10(g_sBuffer) show_motd(id, g_sBuffer, "Top 10") return PLUGIN_CONTINUE; } public cmdRangiHud(id){ if(g_hudEnabled[id] && task_exists(TASK_SHOWCLASS+id)) { remove_task(TASK_SHOWCLASS+id) } else { set_task(0.1,"taskDisplayRank",TASK_SHOWCLASS+id,_,_,"b"); } return PLUGIN_HANDLED; } public cmdRank(id) { static stats[8], body[8], rankpos, rankmax; get_user_stats(id, stats, body); rankpos = get_user_stats(id, stats, body); rankmax = get_statsnum(); print_colored(id, "* Twoja ranga to^x04 %s^x01, zajmujesz^x03 %d^x01 pozycje z^x03 %d", get_rankname(stats[0]), rankpos, rankmax); print_colored(id, "* Posiadasz^x03 %d^x01 zabojstw,^x03 %d^x01 smierci oraz^x03 %d^x01 headshot'ow, zadajac^x03 %d^x01 obrazen.", stats[STATS_KILLS], stats[STATS_DEATHS], stats[STATS_HS], stats[STATS_DAMAGE]); return PLUGIN_HANDLED; } public cmdHelp(id){ if(get_pcvar_num(gcvarList) <= 0){ print_colored(id, "* ^x04Lista rang^x01 jest niedostepna"); return PLUGIN_HANDLED; } static sBuffer[MAX_BUFFER_LENGTH+1]; new iLen; iLen = formatex(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>") iLen += formatex(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "#id Nazwa Prog^n"); if(giPointer > 1) iLen += formatex(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%02d %-22.22s < %d^n", 1, gszClass[1], giXP[1]); for(new i=2;i<giPointer;i++){ iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%02d %-22.22s %d-%d^n", i, gszClass[i], giXP[i-1]+1,giXP[i]); } new szMaxName[CLASS_LEN]; get_pcvar_string(gcvarMaxName, szMaxName, CLASS_LEN-1); iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "* %s > %d", szMaxName, giXP[giPointer-1]); show_motd(id, sBuffer, "Rangi"); return PLUGIN_HANDLED; } //FORWARDS public client_authorized(id) { g_hudEnabled[id] = get_pcvar_num(gcvarType)!=0; get_user_name(id, nazwa_gracza[id], 63); if(is_user_bot(id) || !g_hudEnabled[id]) return; UsunZadania(id); //set_task(0.1,"taskDisplayRank",TASK_SHOWCLASS+id,_,_,"b"); if(!task_exists(TASK_SHOWADV+id)) { set_task(10.0, "PokazReklame", TASK_SHOWADV+id); } } public PokazReklame(id) { id-=TASK_SHOWADV; //client_print(id, print_chat, "W celu uzyskania informacji o komendach napisz /pomoc."); ColorChat(id, NORMAL, "[RANGI]^x04 Wpisz /hud aby wl/wyl pokazywanie statystyk rangi na ekranie./rank - wyswietla twoja range,/rangi - wyswietla spis rang,/top10 - wyswietla rangi i statystyki najlepszych 10 graczy"); } public client_disconnect(id) { UsunZadania(id); } //TASKS public taskDisplayRank(id){ id-=TASK_SHOWCLASS; if(!is_user_connected(id)) { if(task_exists(TASK_SHOWCLASS+id)) { remove_task(TASK_SHOWCLASS+id); return PLUGIN_CONTINUE; } } static stats[8], bodyhits[8], rankpos, rankmax; rankmax = get_statsnum(); if(!is_user_alive(id)) { new target = pev(id, pev_iuser2); if(!target) { return PLUGIN_CONTINUE; } static statsTarget[8], bodyhitsTarget[8], rankposTarget; //get_user_stats(target, statsTarget, bodyhitsTarget); rankposTarget = get_user_stats(target, statsTarget, bodyhitsTarget); set_hudmessage(255, 255, 255, 0.6, -1.0, 0, 0.0, 0.3, 0.0, 0.0, 2); ShowSyncHudMsg(id, SyncHudObj, "[%s]^nRanga: %s^nPozycja: %d / %d^nZabojstw: %d^nSmierci: %i^nZabojstw przez HS: %i^nCelnych strzalow: %4.2f%%^nWspolczynnik k/d %4.2f",nazwa_gracza[target], get_rankname(statsTarget[STATS_KILLS]),rankposTarget, rankmax, statsTarget[STATS_KILLS], statsTarget[STATS_DEATHS], statsTarget[STATS_HS], accuracy(statsTarget), kdratio(statsTarget)); //^nSrednie obrazenia: %4.2f, -->damagePerShot(stats, bodyhits) return PLUGIN_CONTINUE; } //get_user_stats(id, stats, bodyhits); rankpos = get_user_stats(id, stats, bodyhits); set_hudmessage(0, 255, 0, 0.02, 0.15 ,0, 0.0, 0.3, 0.0, 0.0); ShowSyncHudMsg(id, SyncHudObj, "Ranga: %s^nPozycja: %d / %d^nZabojstw: %d^nSmierci: %i^nZabojstw przez HS: %i^nCelnych strzalow: %4.2f%%^nWspolczynnik k/d %4.2f",get_rankname(stats[STATS_KILLS]),rankpos, rankmax, stats[STATS_KILLS], stats[STATS_DEATHS], stats[STATS_HS], accuracy(stats), kdratio(stats)); //^nSrednie obrazenia: %4.2f, -->damagePerShot(stats, bodyhits) return PLUGIN_CONTINUE; } //CLASS get_lvl_by_exp(iXP){ new i; for(i=1;i<=giPointer;i++){ if(giXP[i]>=iXP) break; } if(i > giPointer) return -1; return i; } get_rankname(frags){ static szClass[CLASS_LEN]; new iLvl=get_lvl_by_exp(frags); if(iLvl>=0) copy(szClass,CLASS_LEN-1, gszClass[iLvl]); else get_pcvar_string(gcvarMaxName, szClass, CLASS_LEN-1); return szClass; } //RANK // Stats formulas Float:effec(izStats[8]) { if (!izStats[STATS_KILLS]) return (0.0) return (100.0 * float(izStats[STATS_KILLS]) / float(izStats[STATS_KILLS] + izStats[STATS_DEATHS])) } // get k/d ratio Float:kdratio(izStats[8]) { if (!izStats[STATS_DEATHS]) return (0.0) return (float(izStats[STATS_KILLS]) / float(izStats[STATS_DEATHS])) } //Float:damagePerShot(izStats[8], bodyStats[8]) //{ // if (!bodyStats[0]) // return (0.0) // // return (float(izStats[STATS_DAMAGE]) / float(bodyStats[0])) //} Float:accuracy(izStats[8]) { if (!izStats[STATS_SHOTS]) return (0.0) return (100.0 * float(izStats[STATS_HITS]) / float(izStats[STATS_SHOTS])) } // Get and format top 10 format_top10(sBuffer[MAX_BUFFER_LENGTH + 1]) { new iMax = get_statsnum() new izStats[8], izBody[8] new iLen = 0 if (iMax > 10) iMax = 10; new lKills[16], lDeaths[16], lHits[16], lShots[16], lEff[16], lAcc[16] format(lKills, 15, "%L", LANG_SERVER, "KILLS") format(lDeaths, 15, "%L", LANG_SERVER, "DEATHS") format(lHits, 15, "%L", LANG_SERVER, "HITS") format(lShots, 15, "%L", LANG_SERVER, "SHOTS") format(lEff, 15, "%L", LANG_SERVER, "EFF") format(lAcc, 15, "%L", LANG_SERVER, "ACC") ucfirst(lEff) ucfirst(lAcc) iLen = format(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>") iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%2s %-22.22s %6s %6s %6s %6s %4s %4s %4s^n", "#", "Nick", "Level", lKills, lDeaths, lHits, lShots, "HS", lEff, lAcc) for (new i = 0; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++) { get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH) replace_all(t_sName, MAX_NAME_LENGTH, "<", "[") replace_all(t_sName, MAX_NAME_LENGTH, ">", "]") iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%2d %-22.22s %-22.22s %6d %6d %6d %6d %4d %3.0f%% %3.0f%%^n", i + 1, t_sName,get_rankname(izStats[STATS_KILLS]), izStats[STATS_KILLS], izStats[STATS_DEATHS], izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_HS], effec(izStats), accuracy(izStats)) } } //STOCKS stock print_colored(id, const text[], any:...) { static szMessage[192]; szMessage[0]='^x01'; vformat(szMessage[1], 190, text, 3); if(id==0) { new plist[32], playernum; get_players(plist, playernum); for(new i = 0; i < playernum; i++) { id = plist[i]; message_begin(MSG_ONE, gmsgSayText, {0,0,0}, id); write_byte(id); write_string(szMessage); message_end(); } } else { message_begin(MSG_ONE, gmsgSayText, {0,0,0}, id); write_byte(id); write_string(szMessage); message_end(); } } public SaveHud(id) { if(g_vault == INVALID_HANDLE) return; new AuthID[32]; get_user_authid(id, AuthID, 31); new vaultkey[64], vaultdata[128]; format(vaultkey, 63, "%s-HUD", AuthID); format(vaultdata, 127, "%i", g_hudEnabled[id]); nvault_set(g_vault, vaultkey, vaultdata); } public LoadHud(id) { if(g_vault == INVALID_HANDLE) return; new AuthID[32]; get_user_authid(id, AuthID, 31); new vaultkey[64], vaultdata[128]; format(vaultkey, 63, "%s-HUD", AuthID); if(nvault_get(g_vault, vaultkey, vaultdata, 127)) { } }
Rivit
02.01.2020
w LoadHud dane odczytujesz ale kompletnie nic nie robisz z tym. tam trzeba ustawic zmienna bool:g_hudEnabled na true/false, w zaleznosci od odczytanej wartosci.
Wartosc uzyskasz konwertując bufor vaultdata na num (str_to_num)
I am the one who knocks.
02.01.2020
Spoiler
Na
Spoiler
Plugin sie kompiluje przez amx 1.9.0 próbowałem na niższe lecz nie dało się, myśle że kwestia ogarnięcia, tylko że pokazuje mi takie komunikaty
Warning: Symbol "client_disconnect" is marked as deprecated: Use client_disconnected() instead. on line 218 Warning: Redefinition of constant/macro (symbol "MAX_NAME_LENGTH") on line 26 Warning: Tag mismatch on line 409 Warning: Symbol is assigned a value that is never used: "vaultdata" on line 407
I am the one who knocks.
02.01.2020
Here
Tylko że nadal jest tak że jak wpisze /hud to przy zmianie mapy oraz wyjściu i wejściu ten hud sie pojawia a właśnie chodziło by się nie pojawiał
Rivit
02.01.2020
bo nigdzie nie wywołujesz funkcji LoadHud...
wywołaj ją w client_authorized
I am the one who knocks.
02.01.2020
bo nigdzie nie wywołujesz funkcji LoadHud...
wywołaj ją w client_authorized
Wywołałem ją
Jednakże nic się nie dzieje po wpisaniu /hud nie znika itp chyba ze trzeba dodac jeszcze jakis argument do tego
Użytkownik localhost edytował ten post 02.01.2020 23:16
Rivit
02.01.2020
pokaz jak wyglada client_authorized
no hud nie znika bo nigdzie nie dodales przełączania hudu.
w cmdRangiHud dodaj sobie przed returnem:
g_hudEnabled[id] = !g_hudEnabled[id]
I am the one who knocks.
02.01.2020
pokaz jak wyglada client_authorized
no hud nie znika bo nigdzie nie dodales przełączania hudu.
w cmdRangiHud dodaj sobie przed returnem:
g_hudEnabled[id] = !g_hudEnabled[id]
Obecnie tak
public client_authorized(id) { g_hudEnabled[id] = get_pcvar_num(gcvarType)!=0; get_user_name(id, nazwa_gracza[id], 63); if(is_user_bot(id) || !g_hudEnabled[id]) return; UsunZadania(id); LoadHud(id); //set_task(0.1,"taskDisplayRank",TASK_SHOWCLASS+id,_,_,"b"); if(!task_exists(TASK_SHOWADV+id)) { set_task(10.0, "PokazReklame", TASK_SHOWADV+id); } }
I am the one who knocks.
03.01.2020
w cmdRangiHud dodaj sobie przed returnem:
Dodałem przed returnem wyłącza się
Lecz gdy wyjde lub zmienie mape dalej się pojawia czyli musi być coś nie tak z wczytaniem tej funkcji
Użytkownik localhost edytował ten post 03.01.2020 00:08
I am the one who knocks.
03.01.2020
W client_disconnect musisz wywołać ZapiszHud
Wywołałem lecz nic z tego nadal jest jak było czyli przy wyjściu, zmiany mapy i zmianie rundy nie zapisuje decyzji gracza i zauważyłem też nwm czy jest to błąd czy u mnie tylko ale żeby wyłączyć hud trzeba 2 razy napisac /hud
Użytkownik localhost edytował ten post 03.01.2020 09:53
I am the one who knocks.
03.01.2020
pokaz jak wyglada kod caly teraz. Daj w spoilerze
I am the one who knocks.
03.01.2020
Zobacz to
takie błędy sie pokazują
przy kompilacji
Użytkownik localhost edytował ten post 03.01.2020 14:30
Deus Vult
03.01.2020
linia 155
g_hudEnabled[id] = !ghudEnabled[id];
na
g_hudEnabled[id] = !g_hudEnabled[id];
I am the one who knocks.
03.01.2020
linia 155
g_hudEnabled[id] = !ghudEnabled[id];na
g_hudEnabled[id] = !g_hudEnabled[id];
Problem teraz leży tu
Linia 255
Próbowałem zmieniac na takie
I dalej błędy