Server Messege Plugin

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Richma
Извън линия
Потребител
Потребител
Мнения: 63
Регистриран на: 27 Окт 2016, 22:55

Server Messege Plugin

Мнение от Richma » 06 Ное 2016, 15:01

Преди няколко дена бях пуснал тема, че търся такъв плъгин, дадоха ми го, но проблема е такъв, че е настроен като за мисии и ако бутна нещо в .sma ще го разваля.
Заявката ми е да се редактира плъгина, че да мога през data/lang/server_messages.txt да си променям съобщенията, като всеки ефект на съобщението да бъде номерирано.
Един вид в server_messeges.txt на първи ред да ми пише
1.Жълт ефект
2.Син ефект.
3.Червен ефект.
4.Зелен ефект.
А за да избирам аз ефекта искам да се направи:
SERVER_MESSEGE_1: Като едно бъде жълтия ефект.
Съобщенията искам да се показват само когато дадения играч натисне TAB бутона, за да си види stat.

Код за потвърждение: Избери целия код

/*
Current Version: 0.7.0

- Description -

This plugin tries to simulate Counter-Strike: CZ singleplayer Career missions.
Imagine, now you can complete them in both Counter-Strike 1.6 and Condition Zero multiplayer!
You start at level 1. Every level missions get harder and harder.
As you gain levels you unlock new types of missions. Your level and current mission is automatically
saved and loaded on connect and disconnect. There is no max level where you have to stop and restart over.
To simulate CZ for CS 1.6 i made tutor support, it looks awesome. This plugin supports players without
tutor in CS 1.6 after the first connect. It'll show mission info in status text and chat messages.

- Missions -

There are five mission types for now:

* Kill players
* Plant bombs
* Defuse bombs
* Rescue Hostages
* Win rounds

There are several conditions for missions:

* Headshot - You must complete your mission killing players only in head. Only for Kill missions.
* Weapon - You must kill your enemies with a specific weapon. Only for Kill missions.
* In one round - You must do your mission in one round. Only for Kill and Hostage missions.
Sometimes you'll need to do one round missions several times to complete the actual mission.
* Survive - You must complete the mission and survive the round to fully complete the mission.
For every mission except win and defuse.
* Time - You must complete your mission in time. For all missions.

Conditions can be combined to make a different mission every time.

- Cvars -

amx_czsm_save_by < 1 / 2 > < 1 - IP | 2 - Steam ID. > < Def: 1 >
amx_czsm_use_tutor < 1 / 0 > < Use CZ Tutor. Note that players connecting first time without
Tutor in CS 1.6 wont see it until he restarts cs and connects to your server again. > < Def: 1 >

amx_czsm_min_kill_level < ## > < Min level for killing missions to become available to players.
I strongly suggest you to leave this to one, or if you change it
then change another missions type minimal level to 1. > < Def: 1 >
amx_czsm_min_killweapon_level < ## > < Min level for killing with weapons to become available to players. > < Def: 5 >
amx_czsm_min_plant_level < ## > < Min level for planting missions to become available to players. > < Def: 3 >
amx_czsm_min_defuse_level < ## > < Min level for defusing missions to become available to players. > < Def: 3 >
amx_czsm_min_win_level < ## > < Min level for winning missions to become available to players. > < Def: 7 >
amx_czsm_min_hostage_level < ## > < Min level for hostage rescuing missions to become available to players. > < Def: 10 >

amx_czsm_min_hs_level < ## > < Min level for headshot missions to become available to players. > < Def: 5 >
amx_czsm_min_round_level < ## > < Min level for round missions to become available to players. > < Def: 10 >
amx_czsm_min_survive_level < ## > < Min level for survive missions to become available to players. > < Def: 15 >
amx_czsm_min_time_level < ## > < Min level for time missions to become available to players. > < Def: 20 >

amx_czsm_roundtime_step < ## > < Time step for time missions. If timestep is 60 you can only get
time missions with times like - 60, 120, 180, 240.. etc. > < Def: 60 >

amx_czsm_max_in_round < 0 / ## > < Max players you have to shoot in one round.
Leave 0 to automatically set it to half of server maxplayer limit. \
If you have 16 slots and it's set to 0, you can have max 8 kills in one round for missions,
but if there less than 8 players on your opposing team, you cannot complete your mission. > < Def: 5 >

amx_czsm_autocorrect_missions < 0 / 1 > < If you join a cs_ map and your last mission was to defuse a bomb you'll
be given a new mission if this is set to 1. > < Def: 0 >

- Super Health, Gravity and Speed upgrades for levels -

I'm afraid - none.

- Future Upgrades -

MySQL and VIP escape and ES_ mission types. Maybe some more conditions for missions. NO ML.

- ScreenShots -

http://img145.imageshack.us/img145/1460/czscr1.jpg
http://img141.imageshack.us/img141/4311/czscr2.jpg
http://img230.imageshack.us/img230/6761/czscr3.jpg
http://img228.imageshack.us/img228/1327/czscr4.jpg
http://img27.imageshack.us/img27/4048/czscr5.jpg

- Change Log -

0.7.0
* Initial Release

*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>

#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][] = { 
	"Kill enemies",
	"Kill enemies with",
	"Plant bombs",
	"Defuse bombs",
	"Win rounds",
	"Rescue hostages"
}

//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][] = {
	"czsm/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
new g_Vault

//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_save_by,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_save_by = register_cvar("amx_czsm_save_by","1") 		//1 - Ip, 2 - SteamID
	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","0")
	
	//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")
	
	//Get maxplayers
	g_MaxPlayers = get_maxplayers()
	
	//Make the time mission handler
	MakeHandler()
	
	//Check Map Params
	CheckMap()
	
	//Start Configs
	StartCfg()
}

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

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)
		
		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,"Welcome to CZ Style Missions Mod!^n^n%s%s.",g_PlayerLevel[id] == 0 ?
			"Hello there Newb. Is this the first time you play here?^nDon't worry! Just complete missions displayed here to level up" :
			"Welcome back! You're on level ",
			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, "Mission Time: %d seconds.",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]++
			
			formatex(Text,191,"%sMission Complete! You're now on level %s%d%s!",
			g_PlayerHasTutor[id] == false ? "^x04[Mission]^x01 " : "",
			g_PlayerHasTutor[id] == false ? "^x03" : "",
			g_PlayerLevel[id],
			g_PlayerHasTutor[id] == false ? "^x01" : "",
			g_PlayerHasTutor[id] == false ? "^x03" : ""
			)
			
			if(g_PlayerHasTutor[id]) {
				
				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])
		}
			
		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,"in %d seconds ",g_PlayerMissionParams[id][PARAM_TIMEAMT] * 60)
	}
	
	if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] > 0) {
		
		formatex(RoundTimeStr,32," and do it %d/%d times",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[Mission] %s %s%s%s%s%s- %d/%d%s.",
	g_PlayerHasTutor[id] == true ? "Current Level" : "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 ? "with headshot " : "",
	g_PlayerMissionParams[id][PARAM_ROUND] == 1 ? "in one round " : "",
	g_PlayerMissionParams[id][PARAM_TIME] == 1 ? TimeStr : "",
	g_PlayerMissionParams[id][PARAM_SURVIVE] == 1 ? "and survive " : "",
	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()
}

//Vault
public SaveMission(Player) {
	
	new SteamID_IP[33],Key[64],Data[256]
	
	get_pcvar_num(c_save_by) == 1 ? get_user_ip(Player,SteamID_IP,32,1) : get_user_authid(Player,SteamID_IP,32)
	
	formatex(Key,63,"%s_msn",SteamID_IP)
	
	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 SteamID_IP[33],Key[64],Data[256],tStr[MAXPARAMS + 2][6]
	
	get_pcvar_num(c_save_by) == 1 ? get_user_ip(Player,SteamID_IP,32,1) : get_user_authid(Player,SteamID_IP,32)
	
	formatex(Key,63,"%s_msn",SteamID_IP)  
	
	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])
}

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Re: Server Messege Plugin

Мнение от TheRedShoko » 07 Ное 2016, 17:47

Плъгинът, който са ти дали няма същата функция, каквато ти трябва. Реших да споделя плъгинът, който аз използвам и откъдето си видял идеята.

viewtopic.php?f=32&t=642

Richma
Извън линия
Потребител
Потребител
Мнения: 63
Регистриран на: 27 Окт 2016, 22:55

Re: Server Messege Plugin

Мнение от Richma » 07 Ное 2016, 22:00

А възможно ли е да промениш малко плъгина, само при натиска на TAB [stat board] да излиза тоя худ[не знам как да го нарека]?

Аватар
JustInCase
Извън линия
Потребител
Потребител
Мнения: 582
Регистриран на: 14 Окт 2016, 23:31
Се отблагодари: 4 пъти
Получена благодарност: 15 пъти

Re: Server Messege Plugin

Мнение от JustInCase » 07 Ное 2016, 22:26

Няма смисъл от тази промяна тъй като играчите ако натиснат за малко време таб бутона съобщението ще изчезне. Пък и не им пречи да си го пуска, както си е .. ;д
MANSION - HNS : 45.144.155.99:27026
ONLINE

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Re: Server Messege Plugin

Мнение от OciXCrom » 07 Ное 2016, 23:15

Няма да изчезне, тъй като няма начин да се премахне автоматично при затварянето на scoreboard-а. HUD съобщенията доста често товарят сървъра и въобще не е добра идея даден играч да има възможност да пусне 100 такива наведнъж.

Richma
Извън линия
Потребител
Потребител
Мнения: 63
Регистриран на: 27 Окт 2016, 22:55

Re: Server Messege Plugin

Мнение от Richma » 07 Ное 2016, 23:27

Защото четох някъде когато този худ се появи, бъгва мястото където излизат кой кого е убил.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Заявки за плъгини”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 9 госта