#include <amxmodx>
#include <cstrike>
#include <engine>
#include <hamsandwich>
#include <colorchat>
#include <nvault_util>
 
 
 
#define TAG "Szint mod"
 
 
#define ADMIN_LEVEL ADMIN_KICK
 
 
#define MaxLevels 100
 
 
#define TopNumber 15
 
 
#define MAX_PLAYERS 32
 
 
new g_pCvar_Kill, g_pCvar_Headshot, g_pCvar_Win
new g_pCvar_Suicide, g_pCvar_Dying, g_pCvar_Logadmin
 
new g_iHeadshot, g_iKill, g_iDying
new g_iWin, g_iSuicide, g_iLogadmin
 
new g_iLevel[MAX_PLAYERS +1], g_iPoints[MAX_PLAYERS +1], g_iName[MAX_PLAYERS +1]
new g_szLevels[MaxLevels], g_szLevelNames[MaxLevels][MAX_PLAYERS +1]
new g_szKnife[MaxLevels][2][64], bool:g_bGiveRemove
 
new const SPECIAL_CHAR[2] = "-"
new g_iVault
new g_szTopMotd[1024]
 
//function by fysiks
public plugin_precache( )
{
	new cfgdir[64]
	get_localinfo("amxx_configsdir", cfgdir, charsmax(cfgdir))
	format(cfgdir, charsmax(cfgdir), "%s/levelmod.ini", cfgdir)
 
	new file = fopen(cfgdir, "rt");
 
	if( file )
	{
		new i = 0;
		new szLevel[5], sfLineData[128];
 
		while( !feof(file) && i < MaxLevels )
		{
			fgets(file, sfLineData, charsmax(sfLineData));
 
			if( !sfLineData[0] || sfLineData[0] == ';' || sfLineData[0] == '/' && sfLineData[1] == '/' ) continue;
 
			parse(sfLineData, szLevel, charsmax(szLevel), g_szLevelNames[i], charsmax(g_szLevelNames[]), g_szKnife[i][0], charsmax(g_szKnife[][]), g_szKnife[i][1], charsmax(g_szKnife[][]));
			g_szLevels[i] = str_to_num(szLevel);
 
			precache_model(g_szKnife[i][0]);
			precache_model(g_szKnife[i][1]);
			i++;
		}
 
		fclose(file);
	}
	else
	{
		set_fail_state("amxmodx/configs/levelmod.ini doesnt exist. Stops plugin.");
	}
}
 
public plugin_cfg( )
{
	g_iHeadshot = get_pcvar_num(g_pCvar_Headshot)
	g_iKill = get_pcvar_num(g_pCvar_Kill)
	g_iSuicide = get_pcvar_num(g_pCvar_Suicide)
	g_iWin = get_pcvar_num(g_pCvar_Win)
	g_iDying = get_pcvar_num(g_pCvar_Dying)
	g_iLogadmin = get_pcvar_num(g_pCvar_Logadmin)
}
 
public plugin_init()
{
	register_plugin("Szint plugin", "1.0", "SnusMumrikeN")
 
	register_clcmd("say", "Cmd_Say")
	register_clcmd("say_team", "Cmd_Say")
 
	register_clcmd( "PointsAmount", "PointsAction" )
 
	g_pCvar_Kill = register_cvar("cvar_kill", "2") // alap +2
	g_pCvar_Headshot = register_cvar("cvar_headshot", "4") // alap +4
	g_pCvar_Win = register_cvar("cvar_win", "3") // alap +3
	g_pCvar_Dying = register_cvar("cvar_dying", "1") // alap -2
	g_pCvar_Suicide = register_cvar("cvar_suicide", "3") // alap -3
	g_pCvar_Logadmin = register_cvar("cvar_logadmin", "1") // alap 0
 
	register_event( "DeathMsg", "Event_DeathMsg", "a" );
 
	register_message(get_user_msgid("TextMsg") ,"Message_Win")
 
	RegisterHam( Ham_Item_Deploy, "weapon_knife", "Ham_KnifeDeploy", 1 );
 
	g_iVault = nvault_open("levelmod")
	FormatTop(TopNumber)
 
	set_task( 300.0, "Task_Advertise", .flags="b" );
}
 
public plugin_end() 
	nvault_close(g_iVault)
 
public Cmd_Say(id)
{
	new args[101], arg1[10], arg2[64]
	read_args(args, charsmax(args))
	remove_quotes(args)
	parse(args, arg1, charsmax(args), arg2, charsmax(arg2))
 
	if(equali(arg1, "/szint" ) || equali(arg1, "/lvl" ))
	{
		new iPlayer = cmd_target(id, arg2, 0)
		if(!arg2[0] || !iPlayer)
		{
			if( g_szLevels[g_iLevel[id]+1] != 0)
			{
				ColorChat(id, GREY, "^4[%s]^1 Következő szint:^3 %i ^1[^3%s^1] | Ennyi pont kell a következő szinthez:^3 %i", TAG, g_iLevel[id]+1, g_szLevelNames[g_iLevel[id]+1], g_szLevels[g_iLevel[id]+1] - g_szLevels[g_iLevel[id]]);
				ColorChat(id, GREY, "^4[%s]^1 Jelenlegi ponjaid: ^3 %i^1 | Jelenlegi szinted:^3 %i ^1[^3%s^1]", TAG, g_iPoints[ id ], g_iLevel[id], g_szLevelNames[g_iLevel[id]]);
			}
			else
			{
				ColorChat(id, GREY, "^4[%s]^1 Jelenlegi pontjaid: ^3 %i^1 | Jelenlegi szinted:^3 %i ^1[^3%s^1] (^4TELJES SZINT^1)", TAG, g_iPoints[ id ], g_iLevel[id], g_szLevelNames[g_iLevel[id]]);
			}
		}
		else
		{
			new iName[32]
			get_user_name(iPlayer, iName, 31)
 
			if( g_szLevels[g_iLevel[iPlayer]+1] != 0)
			{
				ColorChat(id, GREY, "^4[%s]^1 Következő szint:^3 %i ^1[^3%s^1] | Ennyi pont kell a következő szinthez:^3 %i", TAG, g_iLevel[iPlayer]+1, g_szLevelNames[g_iLevel[iPlayer]+1], g_szLevels[g_iLevel[iPlayer]+1] - g_szLevels[g_iLevel[iPlayer]]);
				ColorChat(id, GREY, "^4[%s]^3 %s^1 Kapott^3 %i^1 pontot | Szint:^3 %i ^1[^3%s^1]", TAG, iName, g_iPoints[ iPlayer ], g_iLevel[iPlayer], g_szLevelNames[g_iLevel[iPlayer]]);
			}
			else
			{
				ColorChat(id, GREY, "^4[%s]^3 %s^1 kapott^3 %i^1 pontot | Jelenlegi szintje:^3 %i ^1[^3%s^1] (^4TELJES SZINT^1)", TAG, iName, g_iPoints[ iPlayer ], g_iLevel[iPlayer], g_szLevelNames[g_iLevel[iPlayer]]);
			}
		}
	}
	else if(equali(arg1, "/top")) 
	{
		show_motd( id, g_szTopMotd, "Top Pont lista" )
	}
	else if(equali(arg1, "/pontadas")) 
	{
		Playerlist( id ) 
	}
}
 
Playerlist( id ) 
{
	if(get_user_flags( id ) & ADMIN_LEVEL_A )
	{
		new Playermenu, Temp[64]
 
		formatex(Temp, charsmax(Temp), "\w[\r%s\w]\y \rAddolás menü^n\wVálaszdi ki a játékost", TAG)
		Playermenu = menu_create(Temp, "PlayerlistHandler");
 
		new players[32], pnum, tempid;
		new szName[32], szTempid[10];
 
		formatex(Temp, charsmax(Temp), "\y[\r%s\y]^n", g_bGiveRemove ? "ELVÉTEL" : "ADĂS");  
		menu_additem(Playermenu, Temp, "0")
 
		get_players(players, pnum, "ch");
		for( new i; i<pnum; i++ )
		{
			tempid = players[i];
 
			get_user_name(tempid, szName, charsmax(szName));
			num_to_str(tempid, szTempid, charsmax(szTempid));
			menu_additem(Playermenu, szName, szTempid, 0);
		}
 
		menu_display(id, Playermenu);
	}
	return PLUGIN_HANDLED
}
 
public PlayerlistHandler(id, menu, item) {
	if( item == MENU_EXIT )
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
 
	new data[6], szName[32];
	new access, callback;
	menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
 
	new key = str_to_num(data);
	if( key == 0 )
	{
		if((g_bGiveRemove = !g_bGiveRemove)) 
		{
			g_bGiveRemove = true
 
			menu_destroy(menu);
			Playerlist( id ) 
			return PLUGIN_HANDLED
		}
		else 
		{
			g_bGiveRemove = false
 
			menu_destroy(menu);
			Playerlist( id ) 
			return PLUGIN_HANDLED
		}	
	}
 
	g_iName[id] = key
 
	client_cmd(id, "messagemode PointsAmount");
	client_cmd(id, "spk fvox/blip");
 
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}
 
public PointsAction(id)
{
	if(!is_user_connected(id))
		return PLUGIN_HANDLED
 
	new iAmount[50]
	read_argv(1,iAmount,49)
 
	new szName[2][32]
	get_user_name(id, szName[0], 31)
	get_user_name(g_iName[id], szName[1], 31)
 
	if( str_to_num(iAmount) >= 9999999 )
	{
		ColorChat(id, GREY, "^4[%s]^1  ^3 %s^1 pontot", TAG, g_bGiveRemove ? "elvettek tőled" : "kaptál");
		return PLUGIN_HANDLED;
	}
	if(!is_user_connected(g_iName[id]))
	{
		ColorChat(id, GREY, "^4[%s]^1 Felhasználó^3 %s^1 nem online", TAG, szName[1]);
		return PLUGIN_HANDLED
	}
 
	if( g_iLogadmin == 1 )
	{
		new message[200], Time[64];
		get_time("%c", Time, charsmax(Time)); 
		format ( message, charsmax(message), "[%s] %s %s %s %i points", Time, szName[0], g_bGiveRemove ? "elvett" : "adott", szName[1], str_to_num(iAmount));
		write_file ( "addons/amxmodx/logs/levelmod.txt", message )
	}
 
	ColorChat(0, GREY, "^4[%s]^3 %s^1 %s^3 %s^4 %i^1 pontot", TAG, szName[0], g_bGiveRemove ? "elvett" : "adott", szName[1], str_to_num(iAmount));
 
	set_hudmessage(255, 0, 0, -1.0, 0.1, 0, 1.0, 7.0, 0.1, 1.0)
	show_hudmessage( 0, "[%s] %s %s %s %i pontot", TAG, szName[0], g_bGiveRemove ? "elvett" : "adott", szName[1], str_to_num(iAmount));
 
	client_cmd(0, "spk buttons/bell1");
 
	if( g_bGiveRemove )
		g_iPoints[g_iName[id]] -= str_to_num(iAmount)
	else
		g_iPoints[g_iName[id]] += str_to_num(iAmount)
 
	CheckLevel(g_iName[id])
 
	return PLUGIN_HANDLED
}
 
CheckLevel(id)
{
	if( g_iPoints[id] >= g_szLevels[g_iLevel[id]+1] && g_szLevels[g_iLevel[id]+1] != 0)
	{
		g_iLevel[id]++;
 
		if( g_iPoints[id] >= g_szLevels[g_iLevel[id]+1] && g_szLevels[g_iLevel[id]+1] != 0)
		{
			CheckLevel(id)
			return PLUGIN_HANDLED
		}
 
		new g_iName[ 32 ]
		get_user_name( id, g_iName, charsmax(g_iName) );
 
		ColorChat ( 0, GREY, "^4[%s]^1 Gratulálunk ^3 %s^1 elérte a ^3 %i^1 szintet! [^3%s^1]", TAG, g_iName, g_iLevel[id], g_szLevelNames[g_iLevel[id]])
 
		client_cmd(0, "spk events/task_complete.wav");
 
		if( is_user_alive( id ) && get_user_weapon( id ) == CSW_KNIFE )
		{	
			entity_set_string( id, EV_SZ_viewmodel, g_szKnife[g_iLevel[id]][0] );
			entity_set_string( id, EV_SZ_weaponmodel, g_szKnife[g_iLevel[id]][1] );
		}
	}
	else if( g_iLevel[id] != 0 && g_iPoints[id] <= g_szLevels[g_iLevel[id]-1])
	{
		g_iLevel[id]--;
 
		if( g_iLevel[id] != 0 && g_iPoints[id] <= g_szLevels[g_iLevel[id]-1] )
		{
			CheckLevel(id)
			return PLUGIN_HANDLED
		}	
		if( is_user_alive( id ) && get_user_weapon( id ) == CSW_KNIFE )
		{
			entity_set_string( id, EV_SZ_viewmodel, g_szKnife[g_iLevel[id]][0] );
			entity_set_string( id, EV_SZ_weaponmodel, g_szKnife[g_iLevel[id]][1] );
		}
		ColorChat ( id, GREY, "^4[%s]^1 Szinted csökkent. Jelenlegi szinted^3 %i^1 [^3%s^1]", TAG, g_iLevel[id], g_szLevelNames[g_iLevel[id]])
	}
 
	return PLUGIN_HANDLED
}
 
public Event_DeathMsg()
{
	new g_iKiller = read_data(1);
	new g_iVictim = read_data(2);
 
	if( 1 <= g_iKiller <= get_maxplayers() && cs_get_user_team( g_iVictim ) != cs_get_user_team( g_iKiller )
	&& is_user_connected( g_iKiller ))
	{
		new g_iNames[2][32]
		get_user_name(g_iKiller, g_iNames[0], 31)
		get_user_name(g_iVictim, g_iNames[1], 31)
 
		if( read_data( 3 ) && g_iHeadshot != 0 )
		{
			g_iPoints[ g_iKiller ] += g_iHeadshot
			ColorChat ( g_iKiller, GREY, "^4[%s]^1 Kaptál ^3 %i^1 pontot mert megölted ^3 %s^1 [^3FEJLÖVÉS^1]", TAG, g_iHeadshot, g_iNames[1])
		}
		else if( g_iKill != 0 )
		{
			g_iPoints[ g_iKiller ] += g_iKill
			ColorChat ( g_iKiller, GREY, "^4[%s]^1 Kaptál ^3 %i^1 pontot mert megölted ^3 %s", TAG, g_iKill, g_iNames[1])
		}
		else if( g_iDying != 0 )
		{
			g_iPoints[ g_iVictim ] -= g_iDying
			ColorChat ( g_iVictim, GREY, "^4[%s]^1 Elvesztettél ^3 %i^1 pontot mert megölt téged^3 %s", TAG, g_iDying, g_iNames[0])
		}
 
	}	
	else if( g_iSuicide != 0 && g_iVictim == g_iKiller)
	{
		g_iPoints[ g_iKiller ] -= g_iSuicide
		ColorChat ( g_iKiller, GREY, "^4[%s]^1 Elvesztettél ^3 %i^1 pontot mert meghaltál!", TAG, g_iSuicide)
	}
	CheckLevel(g_iKiller)
	CheckLevel(g_iVictim)
}
 
public Ham_KnifeDeploy(iWeapon)
{
	new id = get_pdata_cbase(iWeapon, 41, 4)
 
	if(is_user_alive(id))
	{
		entity_set_string( id, EV_SZ_viewmodel, g_szKnife[g_iLevel[id]][0] );
		entity_set_string( id, EV_SZ_weaponmodel, g_szKnife[g_iLevel[id]][1] );
	}
}
 
public Message_Win(const MsgId, const MsgDest, const MsgEntity)
{
	if( g_iWin == 0 )
		return PLUGIN_HANDLED	
 
	new Flags[32], iPlayers[32], iNum, id
 
	new Message[ 16 ];
	get_msg_arg_string( 2, Message, charsmax( Message ) );
 
	switch(Message[1]) 
	{ 
		case 'T': 
		{ 
			copy(Flags, charsmax(Flags), "TERRORIST") 
		} 
		case 'C': 
		{ 
			copy(Flags, charsmax(Flags), "CT") 
		}
	}
 
	get_players( iPlayers, iNum, "ae", Flags);  
 
	for( new i; i < iNum; i++ )
	{
		id = iPlayers[i];
 
		g_iPoints[ id ] += g_iWin
		ColorChat ( id, GREY, "^4[%s]^1 Kaptál^3 %i^1 pontot mert megnyertétek a kört", TAG, g_iWin)
		CheckLevel(id)
	}
	return PLUGIN_HANDLED
}
 
public Task_Advertise()
{
	ColorChat(0, GREY, "^4[%s]^1 A szerveren szint rendszer fut!^3 ^1 magyarosĂtotta: ^3loleee", TAG);
}
 
stock FormatTop(iNum)
{	
	if(g_iVault == INVALID_HANDLE)
		set_fail_state("nVault returned invalid handle")
 
	enum _:VaultData
	{
		VD_Key[33],
		VD_Value,
		VD_szName[33]
	};
 
	new Vault2 = nvault_util_open("levelmod")
	new iSize = nvault_util_count(Vault2)
 
	new Array:entries = ArrayCreate(VaultData);
	new sizeEntries
 
	new data[VaultData], value[256], data2[VaultData]
 
	for(new i = 0, pos, timestamp; i < iSize; i++)
	{
		pos = nvault_util_read(Vault2, pos, data[VD_Key], charsmax(data[VD_Key]), value, charsmax(value), timestamp);
 
		if(contain(data[VD_Key], SPECIAL_CHAR) != -1)
			continue;
 
		else
		{
			formatex(data[VD_szName], charsmax(data[VD_szName]), "%s%s", data[VD_Key], SPECIAL_CHAR)
			nvault_get(g_iVault, data[VD_szName], data[VD_szName], charsmax(data[VD_szName]))
		}
 
		data[VD_Value] = str_to_num(value);
 
		if(sizeEntries == 0)
		{
			ArrayPushArray(entries, data);
			sizeEntries++;
			continue;
		}
 
		else
		{
			for(timestamp = 0; timestamp <= sizeEntries; timestamp++)
			{
				if(timestamp == sizeEntries)
				{
					if(sizeEntries < iNum)
					{
						ArrayPushArray(entries, data);
						sizeEntries++;
					}
 
					break;
				}
 
				ArrayGetArray(entries, timestamp, data2);
 
				if(data[VD_Value] >= data2[VD_Value])
				{
					ArrayInsertArrayBefore(entries, timestamp, data);
 
					if(sizeEntries < iNum)
					{
						sizeEntries++;
					} 
					else 
					{
						ArrayDeleteItem(entries, sizeEntries);
					}
 
					break;
				}
			}
		}
	}
 
	new iLen
 
	new len = charsmax(g_szTopMotd)
 
	iLen = formatex(g_szTopMotd, len, "<STYLE>body{background:#212121;color:#d1d1d1;font-family:Arial}table{width:100%%;font-size:28px}</STYLE><table cellpadding=1 cellspacing=1 border=0>")
	iLen += formatex(g_szTopMotd[iLen], len - iLen, "<tr bgcolor=#333333><th width=1%%><align=left font color=white> %s <th width=5%%> %-22.22s <th width=5%%> %s", "#", "Név", "Pontok")
 
	new i
	for(i = 0; i < sizeEntries; i++)
	{
		ArrayGetArray(entries, i, data);
 
		data[VD_Key][32] = 0;
		data[VD_szName][32] = 0
 
		replace_all(data[VD_szName], charsmax(data[VD_szName]), "<", "<")
		replace_all(data[VD_szName], charsmax(data[VD_szName]), ">", ">")
 
		iLen += formatex(g_szTopMotd[iLen], len - iLen, "<tr align=left%s><td align=left><font color=white> %d. <td> %-22.22s <td> %d", " bgcolor=#2b5b95", (i+1), data[VD_szName], data[VD_Value])
	}
 
	ArrayDestroy(entries);
 
	iLen += formatex(g_szTopMotd[iLen], len - iLen, "</table></body>")
}
public client_putinserver(id)
{
	if( is_user_hltv(id)  || is_user_bot(id) )
		return;
 
	Load(id)
}
 
public client_disconnect(id)
{
	if( is_user_hltv(id)  || is_user_bot(id) )
		return;
 
	Save(id)
}
 
stock Save(id)
{
	if(g_iVault == INVALID_HANDLE)
		set_fail_state("nVault returned invalid handle")
 
	new szAuthId[35]; 
	get_user_authid(id, szAuthId, charsmax(szAuthId))
 
	new szName[32]; 
	get_user_name(id, szName, 31)
 
	new szData[256];
	formatex(szData, charsmax(szData), "%i %i", g_iPoints[id], g_iLevel[id]);
 
	nvault_remove(g_iVault, szAuthId)
	nvault_set(g_iVault, szAuthId, szData)
 
	format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
	nvault_remove(g_iVault, szAuthId)
	nvault_set(g_iVault, szAuthId, szName)
}
 
stock Load(id)
{
	if(g_iVault == INVALID_HANDLE)
		set_fail_state("nVault returned invalid handle")
 
	new szSavedName[32]
	new szName[32]; get_user_name(id, szName, charsmax(szName))
	new szAuthId[33]; get_user_authid(id, szAuthId, charsmax(szAuthId))
 
	new szData[256], iTimeStamp
	if( !nvault_lookup(g_iVault, szAuthId, szData, charsmax(szData), iTimeStamp) )
	{
		nvault_set(g_iVault, szAuthId, "0")
 
		format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
		nvault_set(g_iVault, szAuthId, szName)
 
		return 0
	}
 
	ParseLoadData(id, szData);
 
	format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
	nvault_get(g_iVault, szAuthId, szSavedName)
 
	if(!equal(szName, szSavedName))
	{
		nvault_remove(g_iVault, szAuthId)
		nvault_set(g_iVault, szAuthId, szName)
	}
	return 0
}
 
ParseLoadData(id, szData[256])
{
	static szNum[11];
	strbreak(szData, szNum, charsmax(szNum), szData, charsmax(szData));
	g_iPoints[id] = str_to_num(szNum);
 
	strbreak(szData, szNum, charsmax(szNum), szData, charsmax(szData));
	g_iLevel[id] = str_to_num(szNum);
}