←  Pytania dotyczące pluginów

AMXX.pl: Support AMX Mod X i SourceMod

»

Zapis nvault problem

  • +
  • -
I am the one who knocks. - zdjęcie 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)) {
	}
}
Odpowiedz

  • +
  • -
Rivit - zdjęcie 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)

Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie I am the one who knocks. 02.01.2020

Czyli gdzie?
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 02.01.2020

Spoiler

 

Na

 

Spoiler
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 02.01.2020

Here

Załączone pliki

  • Załączony plik  hud.sma   11,87 KB   43 Ilość pobrań
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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ł

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 02.01.2020

bo nigdzie nie wywołujesz funkcji LoadHud...

 

wywołaj ją w client_authorized

Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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ą
Spoiler


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
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 02.01.2020

pokaz jak wyglada client_authorized

 

 

 

no hud nie znika bo nigdzie nie dodales przełączania hudu.

cmdRangiHud dodaj sobie przed returnem:

g_hudEnabled[id] = !g_hudEnabled[id]
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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.

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

  • +
  • -
I am the one who knocks. - zdjęcie I am the one who knocks. 03.01.2020

 

 

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

Spoiler

Użytkownik localhost edytował ten post 03.01.2020 00:08
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 03.01.2020

W client_disconnect musisz wywołać ZapiszHud
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 03.01.2020

pokaz jak wyglada kod caly teraz. Daj w spoilerze 

Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie I am the one who knocks. 03.01.2020



pokaz jak wyglada kod caly teraz. Daj w spoilerze 

 

Spoiler
 
Tak
Odpowiedz

  • +
  • -
Deus Vult - zdjęcie Deus Vult 03.01.2020

Zobacz to

Załączone pliki

  • Załączony plik  hud.sma   11,73 KB   24 Ilość pobrań
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie I am the one who knocks. 03.01.2020

Zobacz to

 

takie błędy sie pokazują 

Spoiler

 

przy kompilacji


Użytkownik localhost edytował ten post 03.01.2020 14:30
Odpowiedz

  • +
  • -
Deus Vult - zdjęcie Deus Vult 03.01.2020

linia 155

g_hudEnabled[id] = !ghudEnabled[id];

na 

g_hudEnabled[id] = !g_hudEnabled[id];
Odpowiedz

  • +
  • -
I am the one who knocks. - zdjęcie 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 

Spoiler

 

Linia 255

 

Próbowałem zmieniac na takie

Spoiler

 

I dalej błędy

Odpowiedz