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