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)) { } }