#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fun>
#include <cstrike>
#include <hamsandwich>
#include <nvault>
#include <dhudmessage>
 
#define VERSION	"0.7.0"
 
//Maxplayers
#define MAXPLAYERS 32 + 1
 
//Mission Types
#define MISSIONS 6
 
//Weapons
#define WEAPONS 30
 
//Sounds
#define SOUNDS 3
 
//Param count
#define MAXPARAMS 10
 
//Player tasks
#define TASK_TUTOR 1111
#define TASK_MISSION 2222
 
//Global Tasks
#define TASK_CHECKTIME 999990
 
//Map Types
#define MAP_DE (1<<1)
#define MAP_CS (1<<2)
 
//Difficulty
#define DIFFICULTY_VERYEASY 0.25
#define DIFFICULTY_EASY 0.5
#define DIFFICULTY_EASYNORMAL 0.75
#define DIFFICULTY_NORMAL 1.0
#define DIFFICULTY_HARDNORMAL 1.5
#define DIFFICULTY_HARD 2.0
 
//Cs Teams
enum
{
	TEAM_UNASS,
	TEAM_T,
	TEAM_CT,
	TEAM_SPEC
}
 
//Mission Types
enum
{
	KILL_NORMAL,
	KILL_WEAPON,
	PLANT,
	DEFUSE,
	WIN,
	HOSTAGE
}
 
//Params
enum
{
	PARAM_PLAYER,
	PARAM_CONST,
	PARAM_WEAPON,
	PARAM_HS,
	PARAM_ROUND,
	PARAM_SURVIVE,
	PARAM_TIME,
	PARAM_TIMEAMT,
	PARAM_ROUNDTIMES,
	PARAM_ROUNDTIME_COUNT
}
 
//Min & Max param
enum
{
	Float:PARAM_MIN,
	Float:PARAM_MAX
}
 
//Tutor color
enum
{
	RED = 1,
	BLUE,
	YELLOW,
	GREEN
}
 
//Mission status
enum
{
	STATUS_NORMAL,
	STATUS_FAILED
}
 
//Sounds
enum
{
	SOUND_LVLUP,
	SOUND_OBJ,
	SOUND_FAILED
}
 
//Mission description. Used to make missions TutorMsg/Chat Msg
new const g_MissionDesc[MISSIONS][] = { 
	"Ölj embereket",
	"Ölj embereket ezzel:",
	"Rakj le C4-et",
	"Hatástalaníts C4-et",
	"Nyerj köröket",
	"Ments túszokat"
}
 
//Mission param Multipliers
new const Float:g_MissionParams[MISSIONS][2] = {
	{DIFFICULTY_NORMAL  	,  DIFFICULTY_HARD			},			//Kill
	{DIFFICULTY_NORMAL  	,  DIFFICULTY_NORMAL		},			//Kill Weapon
	{DIFFICULTY_NORMAL  	,  DIFFICULTY_HARDNORMAL	},			//Plant
	{DIFFICULTY_NORMAL  	,  DIFFICULTY_HARDNORMAL	},			//Defuse
	{DIFFICULTY_VERYEASY  	,  DIFFICULTY_EASYNORMAL	},			//Win
	{DIFFICULTY_VERYEASY  	,  DIFFICULTY_EASYNORMAL	}			//Hostage
}
 
//Weapon names
new g_WeaponNames[WEAPONS][] = {
	"weapon_p228",
	0,       
	"weapon_scout",        
	"weapon_hegrenade",
	"weapon_xm1014",
	0,
	"weapon_mac10",
	"weapon_aug",
	0,
	"weapon_elite",
	"weapon_fiveseven",
	"weapon_ump45",
	"weapon_sg550",
	"weapon_galil",
	"weapon_famas",
	"weapon_usp",
	"weapon_glock18",
	"weapon_awp",
	"weapon_mp5navy",
	"weapon_m249",
	"weapon_m3",
	"weapon_m4a1",
	"weapon_tmp",
	"weapon_g3sg1",
	0,
	"weapon_deagle",
	"weapon_sg552",
	"weapon_ak47",
	"weapon_knife",
	"weapon_p90"
}
 
//Sounds
new const g_Sounds[SOUNDS][] = {
	"r3load-zon3_sounds/levelup.wav",
	"plats/elevbell1.wav",
	"buttons/bell1.wav"
}
 
//Resources needed to precache for Tutors.
new const g_TutorPrecache[][] = {
	"gfx/career/icon_!.tga",
	"gfx/career/icon_!-bigger.tga",
	"gfx/career/icon_i.tga",
	"gfx/career/icon_i-bigger.tga",
	"gfx/career/icon_skulls.tga",
	"gfx/career/round_corner_ne.tga",
	"gfx/career/round_corner_nw.tga",
	"gfx/career/round_corner_se.tga",
	"gfx/career/round_corner_sw.tga",
	"resource/TutorScheme.res",
	"resource/UI/TutorTextWindow.res"
}
 
//Map parameters(MAP_DE,MAP_CS).
new g_MapParams
 
//Holds Hostage_Entity count(max hostages).
new g_MapParamsCount
 
//Hostages alive in game.
new g_GameHostages
 
//Handler entity ID.
new g_HandlerEnt
 
//Has anyone got a time mission?
new bool:g_TimerOn
 
//Server maxplayers
new g_MaxPlayers
 
//Roundtime in seconds. Used in time missions.
new g_RoundTimerStart
 
//Roundtime left(in seconds). Used in time missions.
new g_RoundTimer
 
//RoundTime Amount Checked every round. Used for Time missions.
new g_MaxRoundTimeAmt
 
//There variables hold the message id's.
new g_MsgSay,g_MsgTutor,g_MsgTutorClose
new g_MsgStatusText,g_MsgStatusValue
 
//Vault ID & Other
new g_Vault
new hp[33] = 0
 
//Player level
new g_PlayerLevel[MAXPLAYERS]
 
//Player mission type(ex. Kill, plant bomb, defuse bomb e.c)
new g_PlayerMissionType[MAXPLAYERS]
 
//Mission Time status
new g_PlayerMissionTimeStatus[MAXPLAYERS]
 
//Can player complete his mission in the current round(for kills in round u.c?
new g_PlayerMissionStatus[MAXPLAYERS]
 
//Specific Mission params(like Hs/Survive round,Kill e.c).
new g_PlayerMissionParams[MAXPLAYERS][MAXPARAMS]
 
//Buttons player was holding last cmdstart frame.
new g_PlayerOldButtons[MAXPLAYERS]
 
//Player Holding IN_SCORE(TAB) button.
new g_PlayerInScore[MAXPLAYERS]
 
//Can show mission objectives through StatusText.
new bool:g_PlayerCanShow[MAXPLAYERS]
 
//Is an info message currently displayed to player?
new bool:g_PlayerInfoMsg[MAXPLAYERS]
 
//Tutur On for player | Player has tutor available.
new bool:g_PlayerHasTutor[MAXPLAYERS],bool:g_PlayerHasTutor2[MAXPLAYERS]
 
//Is true if player just connected and hasn't spawned.
new bool:g_PlayerJustConnected[MAXPLAYERS]
 
//Cvars
new /*c_save_type,*/c_use_tutor
 
new c_roundtime_step
 
new c_min_level[MISSIONS]
 
new c_min_hs_level,c_min_round_level,c_min_survive_level,c_min_time_level
 
new c_max_in_round
 
new c_autocorrect_missions
 
//Cvar Pointers
new cp_roundtime,cp_freezetime
 
public plugin_init() {
 
	register_plugin("Advanced Condition Zero Style Career Missions",VERSION,"shine")
 
	register_cvar("czscm",VERSION,FCVAR_SERVER|FCVAR_SPONLY)
 
	//Debug
	register_clcmd("say /resetstats","CmdReset")
	//Cvars
	//In future releases
	//c_save_type = register_cvar("amx_czsm_save_type","1") 		//1 - nVault, 2 - MySQL
	c_use_tutor = register_cvar("amx_czsm_use_tutor","1")
 
	c_roundtime_step = register_cvar("amx_czsm_roundtime_step","60") //Sec
 
	c_min_level[KILL_NORMAL] = register_cvar("amx_czsm_min_kill_level","1")
	c_min_level[KILL_WEAPON] = register_cvar("amx_czsm_min_killweapon_level","5")
	c_min_level[PLANT] = register_cvar("amx_czsm_min_plant_level","3")
	c_min_level[DEFUSE] = register_cvar("amx_czsm_min_defuse_level","3")
	c_min_level[WIN] = register_cvar("amx_czsm_min_win_level","7")
	c_min_level[HOSTAGE] = register_cvar("amx_czsm_min_hostage_level","10")
 
	c_min_hs_level = register_cvar("amx_czsm_min_hs_level","5")
	c_min_round_level = register_cvar("amx_czsm_min_round_level","10")
	c_min_survive_level = register_cvar("amx_czsm_min_survive_level","15")
	c_min_time_level = register_cvar("amx_czsm_min_time_level","20")
 
	c_max_in_round = register_cvar("amx_czsm_max_in_round","5") //0 - maxplayers / 2
 
	c_autocorrect_missions = register_cvar("amx_czsm_autocorrect_missions","1")
 
	//Cvar Pointers
	cp_roundtime = get_cvar_pointer("mp_roundtime")
	cp_freezetime = get_cvar_pointer("mp_freezetime")
 
	//Events
	register_event("DeathMsg","PlayerDeath","a")
	register_event("HLTV","RoundStart","a","1=0","2=0")
	register_event("TextMsg","HostageAliveCheck","b","1=4","2=#Killed_Hostage")
 
	register_logevent("RoundEnd",2,"1=Round_End")
	register_logevent("PlayerRescueHostage",3,"1=triggered","2=Rescued_A_Hostage")
 
	register_logevent("PlayerPlantedBomb",3,"2=Planted_The_Bomb")
	register_logevent("PlayerDefusedBomb",3,"2=Defused_The_Bomb")
 
	//Audio Events
	register_event("SendAudio","TerroristsWin","a","2=%!MRAD_terwin")
	register_event("SendAudio","CTWin","a","2=%!MRAD_ctwin")
 
	//Fakemeta Forwards
	register_forward(FM_CmdStart,"PlayerCmdStart")
 
	//Ham Forwards
	RegisterHam(Ham_Spawn,"player","PlayerSpawn",1)
	RegisterHam(Ham_Think,"info_target","HandlerThink")
 
	//Messages
	g_MsgSay = get_user_msgid("SayText")
	g_MsgTutor = get_user_msgid("TutorText")
	g_MsgTutorClose = get_user_msgid("TutorClose")
 
	g_MsgStatusText = get_user_msgid("StatusText")
	g_MsgStatusValue = get_user_msgid("StatusValue")
 
	//Hook Messages
	register_message(g_MsgStatusText,"BlockMessage")
	register_message(g_MsgStatusValue,"BlockMessage")
 
	//Open nVault
	g_Vault = nvault_open("czstyle_missions")
        register_clcmd("say /vhp", "VHP_Menu") 
 
	//Get maxplayers
	g_MaxPlayers = get_maxplayers()
 
	//Make the time mission handler
	MakeHandler()
 
	//Check Map Params
	CheckMap()
 
	//Start Configs
	StartCfg()
}
 
public client_PreThink(id)
{
	if(pev(id, pev_button) & IN_SCORE)
	{
		set_dhudmessage(0, 160, 0, -1.0, 0.80, 0, 0.2, 0.2, 0.1, 0.2)
                show_dhudmessage(id, "Virtualis HP-jaid: %d", hp[id])			
	}
}
 
public VHP_Menu(id)
{
        new menu = menu_create("\rExtra HP-k:", "menu_handler")
        menu_additem(menu, "\w10 HP \r[10 VHP]", "1", 0)
        menu_additem(menu, "\w20 HP \r[20 VHP]", "2", 0)
        menu_additem(menu, "\w30 HP \r[30 VHP]", "3", 0)
        menu_additem(menu, "\w40 HP \r[40 VHP]", "4", 0)
        menu_additem(menu, "\w50 HP \r[50 VHP]", "5", 0)
        menu_display(id, menu, 0)
}
public menu_handler(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }
 
    new data[6], szName[64]
    new access, callback
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
    new key = str_to_num(data)
 
    switch(key)
    {
        case 1: 
        {
            if(hp[id] < 10)
            {
            ClientPrintColor(id, "!g[R3load-Zon3] !nNincs eleg VHP-d") 
            }
            else
            {
            hp[id] = hp[id] - 10
            set_user_health(id, get_user_health(id) + 10)
            ClientPrintColor(id, "!g[R3load-Zon3] !nVettel !g10 VHP!n-ert !g10 HP!n-t") 
            }
        }
        case 2:
        {
            if(hp[id] < 20)
            {
            ClientPrintColor(id, "!g[R3load-Zon3] !nNincs eleg VHP-d") 
            }
            else
            {
            hp[id] = hp[id] - 20
            set_user_health(id, get_user_health(id) + 20)
            ClientPrintColor(id, "!g[R3load-Zon3] !nVettel !g20 VHP!n-ert !g20 HP!n-t") 
            }
        }
        case 3:
        {
            if(hp[id] < 30)
            {
            ClientPrintColor(id, "!g[R3load-Zon3] !nNincs eleg VHP-d") 
            }
            else
            {
            hp[id] = hp[id] - 30
            set_user_health(id, get_user_health(id) + 30)
            ClientPrintColor(id, "!g[R3load-Zon3] !nVettel !g30 VHP!n-ert !g30 HP!n-t") 
            }
        }
        case 4: 
        {
            if(hp[id] < 40)
            {
            ClientPrintColor(id, "!g[R3load-Zon3] !nNincs eleg VHP-d") 
            }
            else
            {
            hp[id] = hp[id] - 40
            set_user_health(id, get_user_health(id) + 40)
            ClientPrintColor(id, "!g[R3load-Zon3] !nVettel !g40 VHP!n-ert !g40 HP!n-t") 
            }
        }
        case 5: 
        {
            if(hp[id] < 50)
            {
            ClientPrintColor(id, "!g[R3load-Zon3] !nNincs eleg VHP-d") 
            }
            else
            {
            hp[id] = hp[id] - 50
            set_user_health(id, get_user_health(id) + 50)
            ClientPrintColor(id, "!g[R3load-Zon3] !nVettel !g50 VHP!n-ert !g50 HP!n-t") 
            }
        }
    }
 
    menu_destroy(menu)
    return PLUGIN_HANDLED
}
 
public MakeHandler() {
 
	g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))	
 
	set_pev(g_HandlerEnt,pev_classname,"CZSMHandler")
 
	set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + 1.0)
}
 
public CheckMap() {
 
	new tVar = -1
 
	if
	(
	engfunc(EngFunc_FindEntityByString,-1,"classname","info_bomb_target")
	||
	engfunc(EngFunc_FindEntityByString,-1,"classname","func_bomb_target")
	) {
		g_MapParams |= MAP_DE
	}
 
	while((tVar = engfunc(EngFunc_FindEntityByString,tVar,"classname","hostage_entity")) != 0) {
 
		if(!g_MapParamsCount) g_MapParams |= MAP_CS
 
		g_MapParamsCount++
	}
}
 
public StartCfg() {
 
	g_RoundTimerStart = floatround(get_pcvar_float(cp_roundtime) * 60.0)
	g_RoundTimer = g_RoundTimerStart
 
	g_GameHostages = g_MapParamsCount
 
	g_MaxRoundTimeAmt = floatround(get_pcvar_float(cp_roundtime) * 60) / get_pcvar_num(c_roundtime_step)
}
 
//Debug
public CmdReset(id) {
 
	new i
 
	g_PlayerLevel[id] = 0
 
	g_PlayerMissionType[id] = 0
 
	for(i = 0; i < 4; i++) g_PlayerMissionParams[id][i] = 0
 
	SaveMission(id)
}
 
public plugin_precache() {
 
	new i
 
	for(i = 0; i < sizeof g_TutorPrecache; i++) precache_generic(g_TutorPrecache[i])
 
	for(i = 0; i < sizeof g_Sounds; i++) precache_sound(g_Sounds[i])
}
 
public client_putinserver(id) {
 
	if(!is_user_bot(id)) {
 
		g_PlayerJustConnected[id] = true
 
		if(!get_pcvar_num(c_use_tutor)) g_PlayerHasTutor[id] = false
 
		set_task(0.3,"CheckPlayerInfo",id)
 
                LoadMission(id)
 
                loadvhp(id)
	}
}
 
public client_disconnect(id) {
 
	if(!is_user_bot(id)) {
 
		new i
 
		if(g_PlayerMissionParams[id][PARAM_ROUND]) {
 
			g_PlayerMissionParams[id][PARAM_PLAYER] = 0
		}
 
		SaveMission(id)
 
                savevhp(id)
 
		g_PlayerLevel[id] = 0
 
		g_PlayerMissionType[id] = 0
 
		g_PlayerMissionStatus[id] = STATUS_NORMAL
 
		g_PlayerMissionTimeStatus[id] = STATUS_NORMAL
 
		g_PlayerInfoMsg[id] = false
 
		g_PlayerInScore[id] = false
 
		g_PlayerCanShow[id] = true
 
		for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0
 
		remove_task(id + TASK_TUTOR)
		remove_task(id + TASK_MISSION)
	}
 
	CheckStatus()
}
 
public CheckPlayerInfo(id) {
 
	new Info[33]
	get_user_info(id,"cl_tutor",Info,32)
 
	if(Info[0] != '1') {
 
		client_cmd(id,"setinfo cl_tutor 1")
 
		g_PlayerHasTutor2[id] = false
	}
	else {
 
		g_PlayerHasTutor2[id] = true
	}
 
	if(get_pcvar_num(c_use_tutor) && g_PlayerHasTutor2[id]) {
 
		g_PlayerHasTutor[id] = true
	}
	else {
 
		g_PlayerHasTutor[id] = false
	}
}
 
public PlayerDeath() {
 
	new Killer = read_data(1)
	new Victim = read_data(2)
 
	RemoveTutor(Victim + TASK_TUTOR)
 
	if(g_PlayerMissionParams[Killer][PARAM_ROUND]) CheckPlayerMission(Killer,1)
 
	if(g_PlayerMissionTimeStatus[Killer] == STATUS_FAILED) return PLUGIN_CONTINUE
 
	if
	(
		Killer != Victim
		&&
		get_user_team(Killer) != get_user_team(Victim)
		&& 
		(
			g_PlayerMissionType[Killer] == KILL_NORMAL
			||
			g_PlayerMissionType[Killer] == KILL_WEAPON
		)
		&&
		!is_user_bot(Killer)
		&&
		is_user_alive(Killer)
	) {
 
		if(g_PlayerMissionType[Killer] == KILL_NORMAL) {
 
			new HeadShot = read_data(3)
 
			if(g_PlayerMissionParams[Killer][PARAM_HS] && HeadShot || !g_PlayerMissionParams[Killer][PARAM_HS]) {
 
				g_PlayerMissionParams[Killer][PARAM_PLAYER]++
 
				client_cmd(Killer,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
				if(!g_PlayerMissionParams[Killer][PARAM_SURVIVE]) {
 
					CheckPlayerMission(Killer,1)
				}
				else {
 
					CheckPlayerMission(Killer,0)
				}
			}
		}
 
		else if(g_PlayerMissionType[Killer] == KILL_WEAPON) {
 
			new Weapon[16],wWeapon[16],HeadShot
 
			read_data(4,Weapon,15)
 
			HeadShot = read_data(3)
 
			if(equal(Weapon,"grenade")) {
 
				formatex(wWeapon,15,"%s",g_WeaponNames[g_PlayerMissionParams[Killer][PARAM_WEAPON]][9])
			}
			else {
 
				formatex(wWeapon,15,"%s",g_WeaponNames[g_PlayerMissionParams[Killer][PARAM_WEAPON]][7])
			}
 
			if(equal(Weapon,wWeapon)) {
 
				if(g_PlayerMissionParams[Killer][PARAM_HS] && HeadShot || !g_PlayerMissionParams[Killer][PARAM_HS]) {
 
					g_PlayerMissionParams[Killer][PARAM_PLAYER]++
 
					client_cmd(Killer,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
					if(!g_PlayerMissionParams[Killer][PARAM_SURVIVE]) {
 
						CheckPlayerMission(Killer,1)
					}
					else {
 
						CheckPlayerMission(Killer,0)
					}
				}
			}
		}		
	}
 
	CheckStatus()
 
	return PLUGIN_CONTINUE
}
 
public RoundEnd() {
 
	new i,TutorOn = get_pcvar_num(c_use_tutor)
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_connected(i)) {
 
			if(TutorOn && g_PlayerHasTutor2[i]) g_PlayerHasTutor[i] = true
			else g_PlayerHasTutor[i] = false
 
			if(g_PlayerMissionParams[i][PARAM_SURVIVE] && is_user_alive(i)) CheckPlayerMission(i,1)
 
			if(g_PlayerMissionParams[i][PARAM_ROUND] || g_PlayerMissionParams[i][PARAM_SURVIVE]) {
 
				g_PlayerMissionParams[i][PARAM_PLAYER] = 0
			}
 
			g_PlayerMissionStatus[i] = STATUS_NORMAL
 
			g_PlayerMissionTimeStatus[i] = STATUS_NORMAL
		}
	}
}
 
public PlayerRescueHostage() {
 
	new LogArgs[128],Name[33],i
 
	read_logargv(0,LogArgs,127)
 
	parse_loguser(LogArgs,Name,32)
 
	new id = get_user_index(Name)
 
	if(g_PlayerMissionType[id] == HOSTAGE && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) {
 
		g_PlayerMissionParams[id][PARAM_PLAYER]++
 
		client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
		if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) {
 
			CheckPlayerMission(id,1)
		}
		else {
 
			CheckPlayerMission(id,0)
		}
	}
 
	g_GameHostages--
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(
		is_user_alive(i) &&
		!is_user_bot(i) &&
		g_PlayerMissionType[i] == HOSTAGE &&
		i != id &&
		g_GameHostages > g_PlayerMissionParams[i][PARAM_PLAYER] &&
		g_PlayerMissionParams[i][PARAM_ROUND]
		) {
 
			if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
			g_PlayerMissionStatus[i] = STATUS_FAILED
 
			CheckPlayerMission(i,0)
		}
	}
}
 
public RoundStart() {
 
	g_TimerOn = false
 
	remove_task(TASK_CHECKTIME)
 
	set_task(get_pcvar_float(cp_freezetime),"CheckTimer",TASK_CHECKTIME)
}
 
public HostageAliveCheck() {
 
	new i
 
	g_GameHostages--
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == HOSTAGE && g_GameHostages > g_PlayerMissionParams[i][PARAM_PLAYER] && g_PlayerMissionParams[i][PARAM_ROUND]) {
 
			if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
			g_PlayerMissionStatus[i] = STATUS_FAILED
 
			CheckPlayerMission(i,0)
		}
	}
}
 
public CheckTimer() {
 
	new bool:AnyoneHasTimer,i
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && g_PlayerMissionParams[i][PARAM_TIME]) {
 
			AnyoneHasTimer = true
 
			break
		}
	}
 
	if(AnyoneHasTimer) {
 
		g_RoundTimerStart = floatround(get_pcvar_float(cp_roundtime) * 60.0)
		g_RoundTimer = g_RoundTimerStart
 
		g_TimerOn = true
	}
	else {
 
		g_TimerOn = false
	}
}
 
 
public PlayerPlantedBomb() {
 
	new LogArgs[128],Name[33],i
 
	read_logargv(0,LogArgs,127)
 
	parse_loguser(LogArgs,Name,32)
 
	new id = get_user_index(Name)
 
	if(g_PlayerMissionType[id] == PLANT && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) {
 
		g_PlayerMissionParams[id][PARAM_PLAYER]++
 
		client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
		if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) {
 
			CheckPlayerMission(id,1)
		}
		else {
 
			CheckPlayerMission(id,0)
		}
	}
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == PLANT && i != id) {
 
			if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
			g_PlayerMissionStatus[i] = STATUS_FAILED
 
			CheckPlayerMission(i,0)
		}
	}
}
 
public PlayerDefusedBomb() {
 
	new LogArgs[128],Name[33],i
 
	read_logargv(0,LogArgs,127)
 
	parse_loguser(LogArgs,Name,32)
 
	new id = get_user_index(Name)
 
	if(g_PlayerMissionType[id] == DEFUSE && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) {
 
		g_PlayerMissionParams[id][PARAM_PLAYER]++
 
		client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
		if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) {
 
			CheckPlayerMission(id,1)
		}
		else {
 
			CheckPlayerMission(id,0)
		}
	}
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == DEFUSE && i != id) {
 
			if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
			g_PlayerMissionStatus[i] = STATUS_FAILED
 
			CheckPlayerMission(i,0)
		}
	}
}
 
public TerroristsWin() {
 
	new i
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && get_user_team(i) == TEAM_T && !is_user_bot(i) && g_PlayerMissionType[i] == WIN && g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) {
 
			g_PlayerMissionParams[i][PARAM_PLAYER]++
 
			client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
			CheckPlayerMission(i,1)
		}
	}
}
 
public CTWin() {
 
	new i
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i) && get_user_team(i) == TEAM_CT && !is_user_bot(i) && g_PlayerMissionType[i] == WIN && g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) {
 
			g_PlayerMissionParams[i][PARAM_PLAYER]++
 
			client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_OBJ])
 
			CheckPlayerMission(i,1)
		}
	}
}
 
public PlayerCmdStart(id,Uc_Handle,Seed) {
 
	static Buttons
 
	Buttons = get_uc(Uc_Handle,UC_Buttons)
 
	if(Buttons & IN_SCORE && !(g_PlayerOldButtons[id] & IN_SCORE)) {
 
		g_PlayerInScore[id] = true
 
		if(!g_PlayerInfoMsg[id]) {
 
			CheckPlayerMission(id,0)
		}
	}
	else if(!(Buttons & IN_SCORE) && g_PlayerOldButtons[id] & IN_SCORE) {
 
		g_PlayerInScore[id] = false
 
		if(!g_PlayerInfoMsg[id]) {
 
			if(g_PlayerHasTutor[id]) {
 
				RemoveTutor(id + TASK_TUTOR)
			}
			else {
 
				HideStatusText(id)
			}
		}
	}
 
	g_PlayerOldButtons[id] = Buttons
 
	return FMRES_IGNORED
}
 
public PlayerSpawn(id) {
 
	if(!is_user_alive(id) || is_user_bot(id)) return HAM_IGNORED
 
	CheckStatus()
 
	//RemoveTutor(id +TASK_TUTOR)
 
	if(g_PlayerJustConnected[id]) {
 
		g_PlayerJustConnected[id] = false
 
		new Text[192],Level[4]
 
		formatex(Level,3,"%d",g_PlayerLevel[id])
 
		if(g_PlayerHasTutor[id]) {
 
			formatex(Text,191,"Üdv a karrier módban!^n^n%s%s.",g_PlayerLevel[id] == 0 ?
			"Üdv újonc! Első alkalommal játszol itt?^nNe aggódj, ezek az üzenetek végigvezetnek a karriered során!" :
			"Üdv újra! Ezen a szinten vagy: ",
			g_PlayerLevel[id] == 0 ? "" : Level
 
			)
 
			g_PlayerInfoMsg[id] = true
 
			MakeTutor(id,Text,YELLOW,10.0)
		}
		else {
 
			formatex(Text,191,"^x04[AMXX]^x01 Welcome to CZ Style Missions Mod!")
 
			ColorPrint(id,Text)
 
			formatex(Text,191,"^x04[AMXX]^x01 %s%s.",g_PlayerLevel[id] == 0 ?
			"Hello there Newb. Is this the first time you play here?^nDon't worry! Just complete missions displayed in chat to level up" :
			"Welcome back! You're on level ",
			g_PlayerLevel[id] == 0 ? "" : Level
			)
 
			g_PlayerInfoMsg[id] = false
 
			ColorPrint(id,Text)
		}
 
		if(!g_PlayerLevel[id]) {
 
			g_PlayerLevel[id] = 1
 
			MakeMission(id,g_PlayerLevel[id],0)
		}
		else {
 
			if
			(
				(
					(
						(
							g_PlayerMissionType[id] == PLANT || g_PlayerMissionType[id] == DEFUSE
						)
						&&
						!(g_MapParams & MAP_DE)
					)
					||
					(
						g_PlayerMissionType[id] == HOSTAGE
						&&
						!(g_MapParams & MAP_CS)
					)
				)
				&&
				get_pcvar_num(c_autocorrect_missions)	
			) {
 
				MakeMission(id,g_PlayerLevel[id])
			}
 
			if(g_PlayerMissionType[id] == HOSTAGE && g_PlayerMissionParams[id][PARAM_ROUND] && g_PlayerMissionParams[id][PARAM_CONST] > g_MapParamsCount && get_pcvar_num(c_autocorrect_missions)) {
 
				g_PlayerMissionParams[id][PARAM_CONST] = g_MapParamsCount
			}
 
			if(g_PlayerMissionParams[id][PARAM_TIMEAMT] > g_MaxRoundTimeAmt) g_PlayerMissionParams[id][PARAM_TIMEAMT] = g_MaxRoundTimeAmt
		}
 
		set_task(10.1,"CheckPlayerMissionT",id + TASK_MISSION)
 
		return HAM_IGNORED
	}
 
	if(g_PlayerMissionParams[id][PARAM_TIMEAMT] > g_MaxRoundTimeAmt) g_PlayerMissionParams[id][PARAM_TIMEAMT] = g_MaxRoundTimeAmt
 
	g_PlayerInScore[id] = false
 
	//remove_task(id + TASK_TUTOR)
 
	if(!task_exists(id + TASK_MISSION)) CheckPlayerMission(id,0)
 
	return HAM_IGNORED
}
 
public HandlerThink(Ent) {
 
	if(Ent == g_HandlerEnt) {
 
		if(g_TimerOn && g_RoundTimer) {
 
			g_RoundTimer--
 
			static i,TimePassed,PlayerTimeLeft
 
			TimePassed = g_RoundTimerStart - g_RoundTimer
 
			for(i = 0; i < MAXPLAYERS; i++) {
 
				if
				(
					is_user_alive(i)
					&&
					!is_user_bot(i)
					&&
					g_PlayerMissionParams[i][PARAM_TIME]
					&&
					g_PlayerMissionTimeStatus[i] == STATUS_NORMAL
				) {
 
					PlayerTimeLeft = (g_PlayerMissionParams[i][PARAM_TIMEAMT] * 60) - TimePassed
 
					if(PlayerTimeLeft <= 0) {
 
						if(g_PlayerMissionParams[i][PARAM_PLAYER] < g_PlayerMissionParams[i][PARAM_CONST]) {
 
							g_PlayerMissionTimeStatus[i] = STATUS_FAILED
 
							CheckPlayerMission(i,0)
						}
					}
					else {
 
						set_hudmessage(255,255,255,-1.0,0.90,0,6.0,1.0)
						show_hudmessage(i, "Küldetés: %d mp van hátra, hogy teljesítsd!",PlayerTimeLeft)
					}
				}
			}
		}
 
		set_pev(Ent,pev_nextthink,get_gametime() + 1.0)
	}
 
	return HAM_IGNORED
}
 
public BlockMessage(MsgID,MsgDest,id) {
 
	if(!g_PlayerHasTutor[id] && g_PlayerInScore[id]) {
 
		new Args[3]
		get_msg_arg_string(2,Args,2)
 
		if(Args[0] != 'L' || Args[1] != 'v' || Args[2] != 'l') {
 
			return PLUGIN_HANDLED
		}
	}
 
	return PLUGIN_CONTINUE
}
 
MakeMission(id,Level,UpdateTutor = 1) {
 
	new i,Weapon = -1,Float:DifficultyMulti = DIFFICULTY_NORMAL
 
	g_PlayerMissionType[id] = RandomMission(Level)
 
	if(g_PlayerMissionType[id] < 0) return 1
 
	for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0
 
	if(g_PlayerMissionType[id] == KILL_WEAPON) {
 
		while(Weapon < 0) {
 
			Weapon = random_num(0,WEAPONS - 1)
 
			if(g_WeaponNames[Weapon][0] == 0) Weapon = -1
 
		}
 
		g_PlayerMissionParams[id][PARAM_WEAPON] = Weapon
 
		if(Weapon != CSW_HEGRENADE - 1) {
 
			if(get_pcvar_num(c_min_hs_level) <= Level) g_PlayerMissionParams[id][PARAM_HS] = random_num(0,1)
 
			if(get_pcvar_num(c_min_round_level) <= Level) {
 
				g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1)
			}
		}
	}
	else if(g_PlayerMissionType[id] == KILL_NORMAL) {
 
		if(Weapon != CSW_HEGRENADE - 1) {
 
			if(get_pcvar_num(c_min_hs_level) <= Level) g_PlayerMissionParams[id][PARAM_HS] = random_num(0,1)
 
			if(get_pcvar_num(c_min_round_level) <= Level) g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1)
		}
	}
 
	if(g_PlayerMissionType[id] == HOSTAGE ) {
 
		if(get_pcvar_num(c_min_round_level) <= Level) g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1)
	}
 
 
	if(g_PlayerMissionType[id] != DEFUSE && g_PlayerMissionType[id] != WIN && get_pcvar_num(c_min_survive_level) <= Level) {
 
		g_PlayerMissionParams[id][PARAM_SURVIVE] = random_num(0,1)
 
		if(g_PlayerMissionParams[id][PARAM_SURVIVE]) {
 
			DifficultyMulti *= DIFFICULTY_EASYNORMAL
		}
	}
 
	if(!g_PlayerMissionParams[id][PARAM_ROUND] && g_PlayerMissionType[id] != DEFUSE && get_pcvar_num(c_min_time_level) <= Level) {
 
		g_PlayerMissionParams[id][PARAM_TIME] = random_num(0,1)
 
		if(g_PlayerMissionParams[id][PARAM_TIME]) {
 
			i = random_num(1,g_MaxRoundTimeAmt)
 
			g_PlayerMissionParams[id][PARAM_TIMEAMT] = i
 
			DifficultyMulti *= DIFFICULTY_NORMAL / 4 * i
		}
	}
 
	//Yes, i'm making variables.
	static Float:Rand,Float:Lvl,MaxInRound
 
	Rand = random_float
	(
			g_MissionParams[g_PlayerMissionType[id]][PARAM_MIN],
			g_MissionParams[g_PlayerMissionType[id]][PARAM_MAX]
	)
 
	Lvl = float(Level)
 
	g_PlayerMissionParams[id][PARAM_CONST] = floatround(Rand * Lvl * DifficultyMulti)
 
	if(g_PlayerMissionParams[id][PARAM_CONST] < 1) g_PlayerMissionParams[id][PARAM_CONST] = 1
 
	if(g_PlayerMissionParams[id][PARAM_CONST] < 2 && g_PlayerMissionParams[id][PARAM_ROUND]) g_PlayerMissionParams[id][PARAM_CONST] = 2
 
	MaxInRound = get_pcvar_num(c_max_in_round) ? get_pcvar_num(c_max_in_round) : g_MaxPlayers / 2
 
	if(g_PlayerMissionParams[id][PARAM_ROUND] || g_PlayerMissionParams[id][PARAM_TIME]) {
 
		if(g_PlayerMissionParams[id][PARAM_CONST] > MaxInRound && (g_PlayerMissionType[id] == KILL_NORMAL || g_PlayerMissionType[id] == KILL_WEAPON)) {
 
			g_PlayerMissionParams[id][PARAM_ROUNDTIMES] = g_PlayerMissionParams[id][PARAM_CONST] / MaxInRound + ((g_PlayerMissionParams[id][PARAM_CONST] % MaxInRound > 0) ? 1 : 0)
			g_PlayerMissionParams[id][PARAM_CONST] = MaxInRound
		}
		else if(g_PlayerMissionParams[id][PARAM_CONST] > g_MapParamsCount && g_PlayerMissionType[id] == HOSTAGE) {
 
			g_PlayerMissionParams[id][PARAM_ROUNDTIMES] = g_PlayerMissionParams[id][PARAM_CONST] / g_MapParamsCount + ((g_PlayerMissionParams[id][PARAM_CONST] % g_MapParamsCount != 0) ? 1 : 0)
			g_PlayerMissionParams[id][PARAM_CONST] = g_MapParamsCount
		}
	}
 
	new Plrs[3]
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i)) {
 
			switch(get_user_team(i)) {
 
				case TEAM_T : Plrs[TEAM_T]++
 
				case TEAM_CT : Plrs[TEAM_CT]++
			}
		}
	}
 
	if((g_PlayerMissionType[id] == KILL_NORMAL || g_PlayerMissionType[id] == KILL_WEAPON) && g_PlayerMissionParams[id][PARAM_ROUND]) {
 
		if(
		g_PlayerMissionParams[id][PARAM_CONST] - g_PlayerMissionParams[id][PARAM_PLAYER] >
		Plrs[get_user_team(id) == TEAM_CT ? TEAM_T : TEAM_CT]
		) {
			if(g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
			g_PlayerMissionStatus[id] = STATUS_FAILED
		}
		else {
 
			g_PlayerMissionStatus[id] = STATUS_NORMAL
		}
	}
 
	if(UpdateTutor) CheckPlayerMission(id,0)
 
	return 1
}
 
public CheckPlayerMissionT(taskID) {
 
	new id = taskID - TASK_MISSION
 
	CheckPlayerMission(id,0)
}
 
public CheckPlayerMission(id,CheckWin) {
 
	static Text[192],sMission[33],TimeStr[16],RoundTimeStr[33]
 
	if(g_PlayerMissionParams[id][PARAM_PLAYER] > g_PlayerMissionParams[id][PARAM_CONST]) {
 
		g_PlayerMissionParams[id][PARAM_PLAYER] = g_PlayerMissionParams[id][PARAM_CONST]
	}
 
	if
	(
		g_PlayerMissionParams[id][PARAM_PLAYER] == g_PlayerMissionParams[id][PARAM_CONST]
		&&
		g_PlayerMissionParams[id][PARAM_CONST]
		&&
		CheckWin
	) {
 
		if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] > 0) {
 
			g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT]++
 
			g_PlayerMissionParams[id][PARAM_PLAYER] = 0
		}
 
		if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] == g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT]) {
 
			static i
 
			g_PlayerLevel[id]++
 
 
			if(g_PlayerHasTutor[id]) {
 
                        formatex(Text,191,"%sKüldetés teljesítve! Te ezen a szinten vagy: %s%d%s!",
			g_PlayerHasTutor[id] == false ? "^x04[Küldetés]^x01 " : "",
			g_PlayerHasTutor[id] == false ? "^x03" : "",
			g_PlayerLevel[id],
			g_PlayerHasTutor[id] == false ? "^x01" : "",
			g_PlayerHasTutor[id] == false ? "^x03" : ""
			)
 
				g_PlayerInfoMsg[id] = true
 
				MakeTutor(id,Text,GREEN,4.9)
 
			}
			else {
 
				ColorPrint(id,Text)
			}
 
			g_PlayerMissionType[id] = 0
 
			for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0
 
			MakeMission(id,g_PlayerLevel[id],0)
 
			set_task(5.0,"CheckPlayerMissionT",id + TASK_MISSION)
 
			client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_LVLUP])
 
                        switch(random_num(1,4))
                        {
 
                        case 1:
 
                        {
 
                        hp[id] = hp[id] + 3  
 
                        }
 
                        case 2:
 
                        {
 
                        cs_set_user_money(id, (cs_get_user_money(id) + 5000))
 
                        }
 
                        case 3:
 
                        {
 
                        give_item(id, "weapon_deagle")
 
                        cs_set_user_bpammo(id, CSW_DEAGLE, 35)
 
                        }
 
                        case 4:
 
                        {
 
                        give_item(id, "weapon_hegrenade")
 
                        give_item(id, "weapon_flashbang")
 
                        give_item(id, "weapon_flashbang")
 
                        give_item(id, "weapon_smokegrenade")
 
                        give_item(id, "item_assaultsuit")
 
                        give_item(id, "item_thingpack")
 
                        }
 
                        }                                                      
		}                 
 
		return PLUGIN_CONTINUE
	}
 
	if(!is_user_alive(id)) return PLUGIN_CONTINUE
 
	if(g_PlayerMissionType[id] == KILL_WEAPON) {
 
		formatex(sMission,32,"%s ",g_WeaponNames[g_PlayerMissionParams[id][PARAM_WEAPON]][7])
	}
 
	if(g_PlayerMissionParams[id][PARAM_TIME]) {
 
		formatex(TimeStr,15,"ennyi idő alatt: %d mp. ",g_PlayerMissionParams[id][PARAM_TIMEAMT] * 60)
	}
 
	if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] > 0) {
 
		formatex(RoundTimeStr,32," csináld meg ennyiszer: %d/%d ",g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT],g_PlayerMissionParams[id][PARAM_ROUNDTIMES])
	}
	else {
 
		RoundTimeStr[0] = 0
	}
 
	//					     Line			   In Time
	//													Weapon    Survive
	//								Level			  Desc   ROUND
	//			  Level Text	     	     D  W HS        P/C
	formatex(Text,191,"%s: %d%s[Küldetés] %s %s%s%s%s%s- %d/%d%s.",
	g_PlayerHasTutor[id] == true ? "Aktuális szinted" : "Lvl",
	g_PlayerLevel[id],
	g_PlayerHasTutor[id] == true ? "^n" : " -- ",
	g_MissionDesc[g_PlayerMissionType[id]],
	g_PlayerMissionType[id] == KILL_WEAPON ? sMission : "",
	g_PlayerMissionParams[id][PARAM_HS] == 1 ? "[fejlövéssel] " : "",
	g_PlayerMissionParams[id][PARAM_ROUND] == 1 ? "1 kör alatt " : "",
	g_PlayerMissionParams[id][PARAM_TIME] == 1 ? TimeStr : "",
	g_PlayerMissionParams[id][PARAM_SURVIVE] == 1 ? "és éld túl " : "",
	g_PlayerMissionParams[id][PARAM_PLAYER],
	g_PlayerMissionParams[id][PARAM_CONST],
	RoundTimeStr
	)
 
	if(g_PlayerHasTutor[id]) {
 
		static Color
 
		if(g_PlayerMissionStatus[id] == STATUS_FAILED || g_PlayerMissionTimeStatus[id] == STATUS_FAILED) Color = RED
		else if(g_PlayerMissionParams[id][PARAM_PLAYER] == 0) Color = BLUE
		else if(g_PlayerMissionParams[id][PARAM_PLAYER] == g_PlayerMissionParams[id][PARAM_CONST]) Color = GREEN
		else Color = YELLOW
 
		if(g_PlayerInScore[id]) {
 
			MakeTutor(id,Text,Color)
		}
	}
	else {
 
		if(g_PlayerInScore[id]) {
 
			MakeStatusText(id,Text)
		}
	}
 
	return PLUGIN_CONTINUE
}
 
public CheckStatus() {
 
	new Plrs[3],i
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if(is_user_alive(i)) {
 
			switch(get_user_team(i)) {
 
				case TEAM_T : Plrs[TEAM_T]++
 
				case TEAM_CT : Plrs[TEAM_CT]++
			}
		}
	}
 
	for(i = 0; i < MAXPLAYERS; i++) {
 
		if((g_PlayerMissionType[i] == KILL_NORMAL || g_PlayerMissionType[i] == KILL_WEAPON) && g_PlayerMissionParams[i][PARAM_ROUND] && is_user_alive(i)) {
 
			if(
			g_PlayerMissionParams[i][PARAM_CONST] - g_PlayerMissionParams[i][PARAM_PLAYER] >
			Plrs[get_user_team(i) == TEAM_CT ? TEAM_T : TEAM_CT]
			) {
				if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED])
 
				g_PlayerMissionStatus[i] = STATUS_FAILED
			}
			else {
 
				g_PlayerMissionStatus[i] = STATUS_NORMAL
			}
		}
	}
}
 
//Stocks
 
RandomMission(Level) {
 
	new Nums[MISSIONS] = {-1,...},i,x
 
	for(i = 0; i < MISSIONS; i++) {
 
		if
		(
			get_pcvar_num(c_min_level[i]) > Level
			||
			(
				(
					(
						i == PLANT || i == DEFUSE
					)
					&& !(g_MapParams & MAP_DE)
				)
				||
				(
					i == HOSTAGE && !(g_MapParams & MAP_CS)
				)
			)
		) {
 
			continue
		}
 
		Nums[x] = i
 
		x++
	}
 
	if(Nums[0] == -1) {
 
		return -1
	}
	else {
 
		return Nums[random_num(0,x - 1)]
	}
 
	return -1
}
 
 
MakeTutor(id,Text[],Color,Float:Time = 0.0) {
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgTutor,_,id)
	write_string(Text)
	write_byte(0)
	write_short(0)
	write_short(0)
	write_short(1<<Color)
	message_end()
 
	if(Time != 0.0) {
 
		set_task(Time,"RemoveTutor",id + TASK_TUTOR)
	}
}
 
MakeStatusText(id,Text[]) {
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusText,_,id)
	write_byte(0)
	write_string(Text)
	message_end()
}
 
HideStatusText(id) {
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusText,_,id)
	write_byte(0)
	write_string("1 %c1: %p2^n2  %h: %i3%%")
	message_end()
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusValue,_,id)
	write_byte(2)
	write_short(1)
	message_end()
}
 
public RemoveTutor(taskID) {
 
	new id = taskID - TASK_TUTOR
 
	g_PlayerInfoMsg[id] = false
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgTutorClose,_,id)
	message_end()
}
 
ColorPrint(id,Text[]) {
 
	message_begin(MSG_ONE_UNRELIABLE,g_MsgSay,_,id)
	write_byte(id)
	write_string(Text)
	message_end()
}
 
//Vaults
public SaveMission(Player) {
 
        new MISS_ID[33],Key[64],Data[256]
        get_user_authid(Player,MISS_ID,32)
 
        formatex(Key,63,"%s_mis",MISS_ID)
 
	formatex(Data,255,"%d %d %d %d %d %d %d %d %d %d %d %d",
	g_PlayerLevel[Player],
	g_PlayerMissionType[Player],
	g_PlayerMissionParams[Player][PARAM_PLAYER],
	g_PlayerMissionParams[Player][PARAM_CONST],
	g_PlayerMissionParams[Player][PARAM_WEAPON],
	g_PlayerMissionParams[Player][PARAM_HS],
	g_PlayerMissionParams[Player][PARAM_ROUND],
	g_PlayerMissionParams[Player][PARAM_SURVIVE],
	g_PlayerMissionParams[Player][PARAM_TIME],
	g_PlayerMissionParams[Player][PARAM_TIMEAMT],
	g_PlayerMissionParams[Player][PARAM_ROUNDTIMES],
	g_PlayerMissionParams[Player][PARAM_ROUNDTIME_COUNT]
	)
 
	nvault_set(g_Vault,Key,Data) 
}
 
public LoadMission(Player) {
 
	new MISS_ID[33],Key[64],Data[256],tStr[MAXPARAMS + 2][6]
        get_user_authid(Player,MISS_ID,32)
 
        formatex(Key,63,"%s_mis",MISS_ID)
 
	nvault_get(g_Vault,Key,Data,255)
 
	parse
	(
		Data,
		tStr[0],5,
		tStr[1],5,
		tStr[2],5,
		tStr[3],5,
		tStr[4],5,
		tStr[5],5,
		tStr[6],5,
		tStr[7],5,
		tStr[8],5,
		tStr[9],5,
		tStr[10],5,
		tStr[11],5
	)
 
	g_PlayerLevel[Player] = str_to_num(tStr[0])
	g_PlayerMissionType[Player] = str_to_num(tStr[1])
 
	g_PlayerMissionParams[Player][PARAM_PLAYER] = str_to_num(tStr[2])
	g_PlayerMissionParams[Player][PARAM_CONST] = str_to_num(tStr[3])
	g_PlayerMissionParams[Player][PARAM_WEAPON] = str_to_num(tStr[4])
 
	g_PlayerMissionParams[Player][PARAM_HS] = str_to_num(tStr[5])
	g_PlayerMissionParams[Player][PARAM_ROUND] = str_to_num(tStr[6])
	g_PlayerMissionParams[Player][PARAM_SURVIVE] = str_to_num(tStr[7])
	g_PlayerMissionParams[Player][PARAM_TIME] = str_to_num(tStr[8])
	g_PlayerMissionParams[Player][PARAM_TIMEAMT] = str_to_num(tStr[9])
	g_PlayerMissionParams[Player][PARAM_ROUNDTIMES] = str_to_num(tStr[10])
	g_PlayerMissionParams[Player][PARAM_ROUNDTIME_COUNT] = str_to_num(tStr[11])
}
 
public savevhp(id)
{	
	new VHP_ID[33],Key[64],Data[256]
	get_user_authid(id,VHP_ID,32)
 
        formatex(Key,63,"%s_vhp",VHP_ID)
 
        format(Data,255,"%i#", hp[id])
 
	nvault_set(g_Vault,Key,Data) 
}
 
public loadvhp(id)
{	
	new VHP_ID[33],Key[64],Data[256]
	get_user_authid(id,VHP_ID,32)
 
        formatex(Key,63,"%s_vhp",VHP_ID)
 
        format(Data,255,"%i#", hp[id])
 
	nvault_get(g_Vault,Key,Data,255)
 
        new hp_s[32]
        parse(Data, hp_s, 31) 
        hp[id] = str_to_num(hp_s)
}
 
//Color Chat
stock ClientPrintColor(id, String[], any:...)
{
	new SzMsg[192]
	vformat(SzMsg, charsmax(SzMsg), String, 3)
 
	replace_all(SzMsg, charsmax(SzMsg), "!n", "^1")
	replace_all(SzMsg, charsmax(SzMsg), "!t", "^3")
	replace_all(SzMsg, charsmax(SzMsg), "!g", "^4")
 
	static msgSayText = 0
	static fake_user
 
	if(!msgSayText)
	{
		msgSayText = get_user_msgid("SayText")
		fake_user = get_maxplayers() + 1
	}
 
	message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgSayText, _, id)
	write_byte(id ? id : fake_user)
	write_string(SzMsg)
	message_end()
}