Silnik
/*
* _______ _ _ __ __
* | _____/ | | | | \ \ __ / /
* | | | | | | | | / \ | |
* | | | |____| | | |/ __ \| |
* | | ___ | ______ | | / \ |
* | | |_ | | | | | | / \ |
* | | | | | | | | | | | |
* | |____| | | | | | | | | |
* |_______/ |_| |_| \_/ \_/
*
*
*
* Last Edited: 08-25-08
*
* ============
* Changelog:
* ============
*
* v3.1b
* -Flag Holders no longer get spawn protection
*
* v3.1a
* -de_ map objective respawn bug hard-fix
* -cs_ map objective respawn bug fix
* -Minor fixes
*
* v3.1
* -Added Infinite Ammo
* -Added Random option to weapons menu
* -Optimized amx_ctf_on function
*
* v3.0
* -Rewrite #2
*
* v2.0
* -Rewrite
*
* v1.0
* -Initial Release
*
*/
#define VERSION "3.1b"
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>
#include <csx>
#include <fakemeta>
//Remove the '//' on the next line for AMXX 1.76d compadability.
//#define amxx176d
//Max Distance from player->flag for touch to occur
#define PICKUP_DISTANCE 100.0
#define MAX_OBJECTIVES 10
#define MAX_OBJ_TYPES 8
//CTF CS Weapon Constants
#define CTF_SCOUT 1 //a
#define CTF_XM1014 2 //b
#define CTF_MAC10 4 //c
#define CTF_AUG 8 //d
#define CTF_UMP45 16 //e
#define CTF_SG550 32 //f
#define CTF_GALIL 64 //g
#define CTF_FAMAS 128 //h
#define CTF_AWP 256 //i
#define CTF_MP5NAVY 512 //j
#define CTF_M249 1024 //k
#define CTF_M3 2048 //l
#define CTF_M4A1 4096 //m
#define CTF_TMP 8192 //n
#define CTF_G3SG1 16384 //o
#define CTF_SG552 32768 //p
#define CTF_AK47 65536 //q
#define CTF_P90 131072 //r
#define CTF_P228 262144 //s
#define CTF_ELITE 524288 //t
#define CTF_FIVESEVEN 1048576 //u
#define CTF_USP 2097152 //v
#define CTF_GLOCK18 4194304 //w
#define CTF_DEAGLE 8388608 //x
#define CTF_VEST 16777216//y
#define CTF_VESTHELM 33554432//z
static const weapon_names[26][16] =
{
"Scout",
"XM1014",
"Mac10",
"Aug",
"UMP",
"SG550",
"Galil",
"Famas",
"AWP",
"MP5Navy",
"M249",
"M3",
"M4A1",
"TMP",
"G3SG1",
"SG552",
"AK47",
"P90",
"P228",
"Elite",
"Fiveseven",
"USP",
"Glock18",
"Deagle",
"VEST",
"VESTHELM"
}
//Map Objective Removal
new num_objectives
new Float:objective[MAX_OBJECTIVES][3]
new objective_type[MAX_OBJECTIVES]
new objective_solidity[MAX_OBJECTIVES]
new Float:objectiveminsize[MAX_OBJECTIVES][3]
new Float:objectivemaxsize[MAX_OBJECTIVES][3]
new bool:give_c4
static const map_objectives[MAX_OBJ_TYPES][24] =
{
"func_bomb_target",
"func_escapezone",
"func_hostage_rescue",
"func_vip_safetyzone",
"hostage_entity",
"info_bomb_target",
"info_hostage_rescue",
"info_vip_start"
}
//Map Objective Removal - de_ bug fix
new weapon[33][31]
new CsArmorType:armortype[33]
new armoramount[33]
new bool:killing
new WeaponNames[31][] =
{
"", //Blank
"weapon_p228",
"", //Nothing
"weapon_scout",
"weapon_hegrenade",
"weapon_xm1014",
"", //C4
"weapon_mac10",
"weapon_aug",
"weapon_smokegrenade",
"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",
"weapon_flashbang",
"weapon_deagle",
"weapon_sg552",
"weapon_ak47",
"", //Knife
"weapon_p90"
}
//CVAR Pointers
new togglecvar, respawntime, maxcaps, spawnprotection
#if !defined amxx176d
new allowableweapons, nades
#endif
new bool:play_sounds
//Flag
new Float:maxs[2][3] = {{-4800.0,-4800.0,-4800.0},{-4800.0,-4800.0,-4800.0}}
new Float:mins[2][3] = {{4800.0,4800.0,4800.0},{4800.0,4800.0,4800.0}}
new I_max[2][3]
new I_min[2][3]
static const holo_model[] = "models/holo.mdl"
static const blue_flag_model[] = "models/blue_flag.mdl"
static const red_flag_model[] = "models/red_flag.mdl"
static const flag_captured[] = "PVPFlagCaptured.mp3"
static const flag_returned[] = "PVPFlagReturned.mp3"
static const flag_taken[] = "PVPFlagTaken.mp3"
new beamsprite
new flag_holder[2]
new flagstand_ents[2]
new bool:is_in_safezone[33]
new TScore, CTScore
new saytext_msgid
new maxplayers
//Weapon Menu
new bool:firsttime[33]
new bool:ask[33]
new weapon_picked[2][33]
new cur_offset[33]
new options_on_menu[8][33]
//Voting
new voterounddelay, votecvar, votelength, votedelay
new bool:roundend
new bool:voting
new bool:voted
new yes, no
public plugin_init()
{
register_plugin("GHW Capture The Flag",VERSION,"GHW_Chronic")
togglecvar = register_cvar("ctf_on","1")
#if defined amxx176d
register_cvar("ctf_weapons","abcdefghijklmnopqrstuvwxyz")
#else
allowableweapons = register_cvar("ctf_weapons","abcdefghijklmnopqrstuvwxyz")
#endif
#if defined amxx176d
register_cvar("ctf_nades","hhff")
#else
nades = register_cvar("ctf_nades","hhff")
#endif
respawntime = register_cvar("ctf_respawntime","3.0")
maxcaps = register_cvar("ctf_maxcaps","25")
votecvar = register_cvar("ctf_vote","1")
votelength = register_cvar("ctf_votelength","20.0")
votedelay = register_cvar("ctf_votedelay","180.0")
voterounddelay = register_cvar("ctf_voterounddelay","5.0")
spawnprotection = register_cvar("ctf_spawnprotection","1")
//register_clcmd("say /spawnme","respawn_player")
//register_clcmd("say_team /spawnme","respawn_player")
register_clcmd("say /guns","cmd_guns")
register_clcmd("say_team /guns","cmd_guns")
register_clcmd("say guns","cmd_guns")
register_clcmd("say_team guns","cmd_guns")
register_clcmd("say /ctfvote","say_vote_hook")
register_clcmd("say_team /ctfvote","say_vote_hook")
register_concmd("amx_ctf_addweap","cmd_addweap",ADMIN_BAN,"<Weapon> Un-Restricts a weapon from the weapons menu.")
register_concmd("amx_ctf_removeweap","cmd_delweap",ADMIN_BAN,"<Weapon> Restricts a weapon from the weapons menu.")
register_concmd("amx_ctf_set_tflag","cmd_set_tflag",ADMIN_BAN,"Sets your current location to the new T Flag Spawn Location.")
register_concmd("amx_ctf_set_ctflag","cmd_set_ctflag",ADMIN_BAN,"Sets your current location to the new CT Flag Spawn Location.")
register_concmd("amx_ctf_off","cmd_off",ADMIN_BAN,"Turn CTF Off")
register_concmd("amx_ctf_on","cmd_on",ADMIN_BAN,"Turn CTF On")
register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
register_menucmd(register_menuid("PrimaryWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9),"prim_weapons_pushed")
register_menucmd(register_menuid("SecWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7),"sec_weapons_pushed")
register_menucmd(register_menuid("ctfvote"),(1<<0)|(1<<1), "Key_Hook")
register_forward(FM_Think,"FM_Think_Hook")
register_forward(FM_PlayerPreThink,"FM_PlayerPreThink_Hook")
register_forward(FM_SetModel,"Hook_SetModel",1)
register_event("DeathMsg","DeathMsg","a")
register_event("SendAudio","endround","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")
register_logevent("newround",2,"1=Round_Start")
saytext_msgid = get_user_msgid("SayText")
maxplayers = get_maxplayers()
if(get_pcvar_num(togglecvar))
{
ctf_on()
}
}
/*
cmd_delweap cmd_addweap
*/
public cmd_delweap(id,level,cid)
{
if(!cmd_access(id,level,cid,2))
{
return PLUGIN_HANDLED
}
new arg[32]
read_argv(1,arg,31)
new cvar_value[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",cvar_value,31)
#else
get_pcvar_string(allowableweapons,cvar_value,31)
#endif
new flags = read_flags(cvar_value)
for(new i=0;i<26;i++)
{
if(equali(arg,weapon_names[i]))
{
new remove_flag = power(2,i)
if(flags & remove_flag)
{
console_print(id,"[AMXX] Removing weapon %s from the choice list.",weapon_names[i])
flags -= remove_flag
get_flags(flags,cvar_value,31)
set_cvar_string("ctf_weapons",cvar_value)
}
else
{
console_print(id,"[AMXX] Weapon %s is already off choice list.",weapon_names[i])
}
break;
}
}
return PLUGIN_HANDLED
}
public cmd_addweap(id,level,cid)
{
if(!cmd_access(id,level,cid,2))
{
return PLUGIN_HANDLED
}
new arg[32]
read_argv(1,arg,31)
new cvar_value[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",cvar_value,31)
#else
get_pcvar_string(allowableweapons,cvar_value,31)
#endif
for(new i=0;i<26;i++)
{
if(equali(arg,weapon_names[i]))
{
new flags = read_flags(cvar_value)
new add_flag = power(2,i)
if(!(flags & add_flag))
{
console_print(id,"[AMXX] Adding weapon %s to the choice list.",weapon_names[i])
flags += add_flag
get_flags(flags,cvar_value,31)
set_cvar_string("ctf_weapons",cvar_value)
}
else
{
console_print(id,"[AMXX] Weapon %s is already on choice list.",weapon_names[i])
}
break;
}
}
return PLUGIN_HANDLED
}
/*
Respawn on Team Select
*/
public client_putinserver(id)
{
set_task(1.0,"catch_jointeam",id,"",0,"b")
ask[id] = true
firsttime[id] = true
}
public catch_jointeam(id)
{
if(get_pcvar_num(togglecvar) && is_user_connected(id))
{
static CsTeams:team
team = cs_get_user_team(id)
if(team==CS_TEAM_T || team==CS_TEAM_T)
{
remove_task(id)
respawn_player(id)
}
}
else
{
remove_task(id)
}
}
/*
Base Respawn Code
*/
public respawn_player(id)
{
if(get_pcvar_num(togglecvar) && is_user_connected(id))
{
//Make the engine think he is spawning
set_pev(id,pev_deadflag,DEAD_RESPAWNABLE)
set_pev(id,pev_iuser1,0)
dllfunc(DLLFunc_Think,id)
//Move his body so if corpse is created it is not in map
engfunc(EngFunc_SetOrigin,id,Float:{-4800.0,-4800.0,-4800.0})
//Actual Spawn
set_task(0.5,"spawnagain",id)
}
}
public spawnagain(id)
{
//Make sure he didn't disconnect in the 0.5 seconds that have passed.
if(is_user_connected(id))
{
//Spawn player
spawn(id)
dllfunc(DLLFunc_Spawn,id)
set_task(1.0,"weapon_method_menu",id)
}
}
/*
CSDM Style weapons menu
*/
public weapon_method_menu(id)
{
if(is_user_bot(id))
{
weapon_picked[0][id] = 16
weapon_picked[1][id] = 23
give_weapons(id)
}
else if(firsttime[id])
{
firsttime[id] = false
prim_weapons_menu(id,0)
}
else
{
cur_offset[id] = 0
if(ask[id])
{
show_menu(id,(1<<0)|(1<<1)|(1<<2),"Weapon Selection Method^n^n1. Last Guns^n2. Last Guns + Save^n3. New Guns",-1,"WeaponMethodMenu")
}
else
{
give_weapons(id)
}
}
}
public weapon_method_pushed(id,key)
{
switch(key)
{
case 0:
{
ask[id] = true
give_weapons(id)
}
case 1:
{
new string[200]
format(string,199,"[red][CTF][/red] Type [green]guns[/green] to re-activate the gun menu.")
show_colored_message(id,string,199)
ask[id] = false
give_weapons(id)
}
case 2:
{
ask[id] = true
prim_weapons_menu(id,0)
}
}
return ;
}
public prim_weapons_menu(id,offset)
{
if(offset<0) offset = 0
new cvar_value[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",cvar_value,31)
#else
get_pcvar_string(allowableweapons,cvar_value,31)
#endif
new flags = read_flags(cvar_value)
new keys, curnum, menu[2048]
for(new i=offset;i<19;i++)
{
if(i==18)
{
options_on_menu[curnum][id] = 24
keys += (1<<curnum)
curnum++
format(menu,2047,"%s^n%d. Random",menu,curnum)
break;
}
else if(flags & power(2,i))
{
options_on_menu[curnum][id] = i
keys += (1<<curnum)
curnum++
format(menu,2047,"%s^n%d. %s",menu,curnum,weapon_names[i])
if(curnum==8)
break;
}
}
format(menu,2047,"\ySelect Primary Weapon:\w^n^n%s^n",menu)
if(curnum==8 && offset<12)
{
keys += (1<<8)
format(menu,2047,"%s^n9. Next",menu)
}
if(offset)
{
keys += (1<<9)
format(menu,2047,"%s^n0. Back",menu)
}
show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}
public prim_weapons_pushed(id,key)
{
if(key<8)
{
weapon_picked[0][id] = options_on_menu[key][id]
cur_offset[id] = 0
sec_weapons_menu(id,0)
}
else
{
if(key==8)
cur_offset[id] += 8
if(key==9)
cur_offset[id] -= 8
prim_weapons_menu(id,cur_offset[id])
}
return ;
}
public sec_weapons_menu(id,offset)
{
if(offset<0) offset = 0
new cvar_value[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",cvar_value,31)
#else
get_pcvar_string(allowableweapons,cvar_value,31)
#endif
new flags = read_flags(cvar_value)
new keys, curnum, menu[2048]
for(new i=18;i<24;i++)
{
if(flags & power(2,i))
{
options_on_menu[curnum][id] = i
keys += (1<<curnum)
curnum++
format(menu,2047,"%s^n%d. %s",menu,curnum,weapon_names[i])
}
}
options_on_menu[curnum][id] = 25
keys += (1<<curnum)
curnum++
format(menu,2047,"%s^n%d. Random",menu,curnum)
format(menu,2047,"\ySelect Secondary Weapon:\w^n^n%s",menu)
show_menu(id,keys,menu,-1,"SecWeaponSelect")
}
public sec_weapons_pushed(id,key)
{
if(key<8)
{
weapon_picked[1][id] = options_on_menu[key][id]
}
give_weapons(id)
return ;
}
public give_weapons(id)
{
strip_user_weapons(id)
give_item(id,"weapon_knife")
new weapon[32]
new csw = csw_contant(weapon_picked[0][id])
get_weaponname(csw,weapon,31)
give_item(id,weapon)
cs_set_user_bpammo(id,csw,999)
csw = csw_contant(weapon_picked[1][id])
get_weaponname(csw,weapon,31)
give_item(id,weapon)
cs_set_user_bpammo(id,csw,999)
#if defined amxx176d
get_cvar_string("ctf_nades",weapon,31)
#else
get_pcvar_string(nades,weapon,31)
#endif
new he, flash, smoke
for(new i=0;i<strlen(weapon);i++)
{
switch(weapon[i])
{
case 'h': he++
case 'f': flash++
case 's': smoke++
}
}
if(he) give_item(id,"weapon_hegrenade"), cs_set_user_bpammo(id,CSW_HEGRENADE,he)
if(flash) give_item(id,"weapon_flashbang"), cs_set_user_bpammo(id,CSW_FLASHBANG,flash)
if(smoke) give_item(id,"weapon_smokegrenade"), cs_set_user_bpammo(id,CSW_SMOKEGRENADE,smoke)
#if defined amxx176d
get_cvar_string("ctf_weapons",weapon,31)
#else
get_pcvar_string(allowableweapons,weapon,31)
#endif
new flags = read_flags(weapon)
if(flags & CTF_VESTHELM) cs_set_user_armor(id,100,CS_ARMOR_VESTHELM)
else if(flags & CTF_VEST) cs_set_user_armor(id,100,CS_ARMOR_KEVLAR)
}
public csw_contant(weapon)
{
new num = 29
switch(weapon)
{
case 0: num = 3
case 1: num = 5
case 2: num = 7
case 3: num = 8
case 4: num = 12
case 5: num = 13
case 6: num = 14
case 7: num = 15
case 8: num = 18
case 9: num = 19
case 10: num = 20
case 11: num = 21
case 12: num = 22
case 13: num = 23
case 14: num = 24
case 15: num = 27
case 16: num = 28
case 17: num = 30
case 18: num = 1
case 19: num = 10
case 20: num = 11
case 21: num = 16
case 22: num = 17
case 23: num = 26
case 24:
{
new s_weapon[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",s_weapon,31)
#else
get_pcvar_string(allowableweapons,s_weapon,31)
#endif
new flags = read_flags(s_weapon)
do
{
num = random_num(0,18)
if(!(num & flags))
{
num = -1
}
}
while(num==-1)
num = csw_contant(num)
}
case 25:
{
new s_weapon[32]
#if defined amxx176d
get_cvar_string("ctf_weapons",s_weapon,31)
#else
get_pcvar_string(allowableweapons,s_weapon,31)
#endif
new flags = read_flags(s_weapon)
do
{
num = random_num(18,23)
if(!(num & flags))
{
num = -1
}
}
while(num==-1)
num = csw_contant(num)
}
}
return num;
}
public cmd_guns(id)
{
ask[id] = true
weapon_method_menu(id)
}
/*
Weapon Despawn
*/
public Hook_SetModel(ent,model[])
{
if(get_pcvar_num(togglecvar) && pev_valid(ent) && ent>maxplayers)
{
if(containi(model,"models/w_")==0)
{
if(containi(model,"nade")!=-1 || containi(model,"flash")!=-1)
{
set_task(2.0,"remove_nade_ent",ent,model,31)
}
else
{
set_task(0.1,"remove_ent",ent,model,31)
}
}
}
}
public remove_ent(model[32],ent)
{
if(pev_valid(ent))
{
static model2[32]
pev(ent,pev_model,model2,31)
if(equal(model,model2)) engfunc(EngFunc_RemoveEntity,ent)
}
}
public remove_nade_ent(model[32],ent)
{
if(pev_valid(ent))
{
static model2[32]
pev(ent,pev_model,model2,31)
if(equal(model,model2))
{
static Float:velocity[3]
pev(ent,pev_velocity,velocity)
if(!velocity[0] && !velocity[1] && !velocity[2])
set_pev(ent,pev_flags,FL_KILLME)
}
}
}
/*
Base Setup - Spawn Protection & Flag Spawn
*/
public plugin_precache()
{
precache_model(holo_model)
precache_model(red_flag_model)
precache_model(blue_flag_model)
beamsprite = precache_model("sprites/dot.spr")
precache_model("models/scientist.mdl")
if(get_pcvar_num(register_cvar("ctf_sounds","1")))
{
play_sounds = true
precache_sound(flag_captured)
precache_sound(flag_returned)
precache_sound(flag_taken)
}
}
public cmd_set_tflag(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
setflagspawn(id,0)
console_print(id,"[CTF] T Flag Spawn Location Saved.")
return PLUGIN_HANDLED
}
public cmd_set_ctflag(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
setflagspawn(id,1)
console_print(id,"[CTF] CT Flag Spawn Location Saved.")
return PLUGIN_HANDLED
}
public setflagspawn(id,team)
{
new bool:readfromfile = false
new configfile[200]
get_configsdir(configfile,199)
format(configfile,199,"%s/CTF_FlagSpawns.ini",configfile)
new mapname[32]
get_mapname(mapname,31)
new string[200]
format(string,199,"%s | T | ",mapname)
new Float:origin[3], Float:origin2[3]
switch(team)
{
case 0:
{
pev(flag_holder[1],pev_origin,origin2)
pev(id,pev_origin,origin)
engfunc(EngFunc_SetOrigin,flag_holder[0],origin)
}
case 1:
{
pev(flag_holder[0],pev_origin,origin)
pev(id,pev_origin,origin2)
engfunc(EngFunc_SetOrigin,flag_holder[1],origin2)
}
}
if(file_exists(configfile))
{
new read[200], trash, Fsize = file_size(configfile,1)
for(new i=0;i<Fsize;i++)
{
read_file(configfile,i,read,199,trash)
if(containi(read,string)==0)
{
format(string,199,"%s | T | %f %f %f | CT | %f %f %f",mapname,origin[0],origin[1],origin[2],origin2[0],origin2[1],origin2[2])
write_file(configfile,string,i)
readfromfile = true
break;
}
}
}
if(!readfromfile)
{
format(string,199,"%s | T | %f %f %f | CT | %f %f %f",mapname,origin[0],origin[1],origin[2],origin2[0],origin2[1],origin2[2])
write_file(configfile,string,-1)
}
}
public find_minmaxs()
{
new Float:origin[3], i
new ent = engfunc(EngFunc_FindEntityByString,maxplayers,"classname","info_player_deathmatch")
while(ent)
{
if(pev_valid(ent))
{
pev(ent,pev_origin,origin)
for(i=0;i<3;i++)
{
if(origin[i] < mins[0][i])
mins[0][i] = origin[i]
if(origin[i] > maxs[0][i])
maxs[0][i] = origin[i]
}
}
ent = engfunc(EngFunc_FindEntityByString,ent,"classname","info_player_deathmatch")
}
ent = engfunc(EngFunc_FindEntityByString,maxplayers,"classname","info_player_start")
while(ent)
{
if(pev_valid(ent))
{
pev(ent,pev_origin,origin)
for(i=0;i<3;i++)
{
if(origin[i] < mins[1][i])
mins[1][i] = origin[i]
if(origin[i] > maxs[1][i])
maxs[1][i] = origin[i]
}
}
ent = engfunc(EngFunc_FindEntityByString,ent,"classname","info_player_start")
}
maxs[0][2] += 70.0
mins[1][2] -= 70.0
maxs[0][0] += 32.0
mins[1][0] -= 32.0
maxs[0][1] += 32.0
mins[1][1] -= 32.0
new Float:T_origin[3], Float:CT_origin[3]
get_flagstand_origins(CT_origin,T_origin)
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
set_pev(ent,pev_classname,"Flagstand_Model")
engfunc(EngFunc_SetModel,ent,holo_model)
set_pev(ent,pev_effects,EF_BRIGHTLIGHT)
set_pev(ent,pev_renderfx,kRenderFxGlowShell)
set_pev(ent,pev_rendercolor,Float:{255.0,0.0,0.0})
set_pev(ent,pev_rendermode,kRenderNormal)
set_pev(ent,pev_renderamt,255.0)
set_pev(ent,pev_gaitsequence,0)
set_pev(ent,pev_sequence,0)
set_pev(ent,pev_framerate,0.7)
engfunc(EngFunc_SetOrigin,ent,T_origin)
engfunc(EngFunc_DropToFloor,ent)
pev(ent,pev_origin,origin)
origin[2] += 36.0
engfunc(EngFunc_SetOrigin,ent,origin)
set_pev(ent,pev_nextthink,1.0)
flagstand_ents[0] = ent
flag_holder[0] = ent
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
set_pev(ent,pev_classname,"Flagstand_Model")
engfunc(EngFunc_SetModel,ent,holo_model)
set_pev(ent,pev_effects,EF_BRIGHTLIGHT)
set_pev(ent,pev_renderfx,kRenderFxGlowShell)
set_pev(ent,pev_rendercolor,Float:{0.0,0.0,255.0})
set_pev(ent,pev_rendermode,kRenderNormal)
set_pev(ent,pev_renderamt,255.0)
set_pev(ent,pev_gaitsequence,0)
set_pev(ent,pev_sequence,0)
set_pev(ent,pev_framerate,0.7)
engfunc(EngFunc_SetOrigin,ent,CT_origin)
engfunc(EngFunc_DropToFloor,ent)
pev(ent,pev_origin,origin)
origin[2] += 36.0
engfunc(EngFunc_SetOrigin,ent,origin)
set_pev(ent,pev_nextthink,1.0)
flagstand_ents[1] = ent
flag_holder[1] = ent
for(new i=0;i<2;i++)
{
for(new j=0;j<3;j++)
{
I_max[i][j] = floatround(maxs[i][j])
I_min[i][j] = floatround(mins[i][j])
}
}
set_task(5.0,"create_beamsprites")
set_task(10.0,"create_beamsprites",1500,"",0,"b")
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
set_pev(ent,pev_classname,"CTF_T_Flag")
engfunc(EngFunc_SetModel,ent,red_flag_model)
set_pev(ent,pev_movetype,MOVETYPE_FLY)
FM_Think_Hook(ent)
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
set_pev(ent,pev_classname,"CTF_CT_Flag")
engfunc(EngFunc_SetModel,ent,blue_flag_model)
set_pev(ent,pev_movetype,MOVETYPE_FLY)
FM_Think_Hook(ent)
}
public get_flagstand_origins(Float:CT_origin[3],Float:T_origin[3])
{
new i
new Float:midpoint[2][3]
for(i=0;i<2;i++)
{
for(new j=0;j<3;j++)
{
midpoint[i][j] = (maxs[i][j] + mins[i][j]) / 2.0
}
}
new configfile[200]
get_configsdir(configfile,199)
format(configfile,199,"%s/CTF_FlagSpawns.ini",configfile)
T_origin[0] = midpoint[0][0]
T_origin[1] = midpoint[0][1]
T_origin[2] = midpoint[0][2]
CT_origin[0] = midpoint[1][0]
CT_origin[1] = midpoint[1][1]
CT_origin[2] = midpoint[1][2]
new mapname[32]
get_mapname(mapname,31)
new string[200]
format(string,199,"%s | T | ",mapname)
if(file_exists(configfile))
{
new read[200], trash, Fsize = file_size(configfile,1)
for(new i=0;i<Fsize;i++)
{
read_file(configfile,i,read,199,trash)
if(containi(read,string)==0)
{
format(read,199,read[strlen(string)])
replace_all(read,199," | CT |","")
strbreak(read,string,199,read,199)
T_origin[0] = str_to_float(string)
strbreak(read,string,199,read,199)
T_origin[1] = str_to_float(string)
strbreak(read,string,199,read,199)
T_origin[2] = str_to_float(string)
strbreak(read,string,199,read,199)
CT_origin[0] = str_to_float(string)
strbreak(read,string,199,read,199)
CT_origin[1] = str_to_float(string)
strbreak(read,string,199,read,199)
CT_origin[2] = str_to_float(string)
break;
}
}
}
return ;
}
public FM_Think_Hook(ent)
{
if(pev_valid(ent))
{
static classname[32]
pev(ent,pev_classname,classname,31)
if(equal(classname,"Flagstand_Model"))
{
static Float:angles[3]
pev(ent,pev_angles,angles)
angles[1] += 0.3
while(angles[1]>180.0) angles[1] -= 360.0
set_pev(ent,pev_angles,angles)
set_pev(ent,pev_nextthink,1.0)
}
else if(equal(classname,"CTF_T_Flag"))
{
Flag_Think_Hook(ent,0)
set_pev(ent,pev_nextthink,1.0)
}
else if(equal(classname,"CTF_CT_Flag"))
{
Flag_Think_Hook(ent,1)
set_pev(ent,pev_nextthink,1.0)
}
}
}
public create_beamsprites()
{
if(get_pcvar_num(spawnprotection))
{
//T Base
create_beam_message(I_max[0][0],I_max[0][1],I_max[0][2],I_max[0][0],I_min[0][1],I_max[0][2],255,0)
//create_beam_message(I_max[0][0],I_max[0][1],I_min[0][2],I_max[0][0],I_min[0][1],I_min[0][2],255,0)
create_beam_message(I_max[0][0],I_max[0][1],(I_max[0][2] + I_min[0][2]) / 2,I_max[0][0],I_min[0][1],(I_max[0][2] + I_min[0][2]) / 2,255,0)
create_beam_message(I_max[0][0],I_max[0][1],I_max[0][2],I_min[0][0],I_max[0][1],I_max[0][2],255,0)
//create_beam_message(I_max[0][0],I_max[0][1],I_min[0][2],I_min[0][0],I_max[0][1],I_min[0][2],255,0)
create_beam_message(I_max[0][0],I_max[0][1],(I_max[0][2] + I_min[0][2]) / 2,I_min[0][0],I_max[0][1],(I_max[0][2] + I_min[0][2]) / 2,255,0)
create_beam_message(I_min[0][0],I_max[0][1],I_max[0][2],I_min[0][0],I_min[0][1],I_max[0][2],255,0)
//create_beam_message(I_min[0][0],I_max[0][1],I_min[0][2],I_min[0][0],I_min[0][1],I_min[0][2],255,0)
create_beam_message(I_min[0][0],I_max[0][1],(I_max[0][2] + I_min[0][2]) / 2,I_min[0][0],I_min[0][1],(I_max[0][2] + I_min[0][2]) / 2,255,0)
create_beam_message(I_min[0][0],I_min[0][1],I_max[0][2],I_max[0][0],I_min[0][1],I_max[0][2],255,0)
//create_beam_message(I_min[0][0],I_min[0][1],I_min[0][2],I_max[0][0],I_min[0][1],I_min[0][2],255,0)
create_beam_message(I_min[0][0],I_min[0][1],(I_max[0][2] + I_min[0][2]) / 2,I_max[0][0],I_min[0][1],(I_max[0][2] + I_min[0][2]) / 2,255,0)
//CT Base
create_beam_message(I_max[1][0],I_max[1][1],I_max[1][2],I_max[1][0],I_min[1][1],I_max[1][2],0,255)
//create_beam_message(I_max[1][0],I_max[1][1],I_min[1][2],I_max[1][0],I_min[1][1],I_min[1][2],255,0)
create_beam_message(I_max[1][0],I_max[1][1],(I_max[1][2] + I_min[1][2]) / 2,I_max[1][0],I_min[1][1],(I_max[1][2] + I_min[1][2]) / 2,0,255)
create_beam_message(I_max[1][0],I_max[1][1],I_max[1][2],I_min[1][0],I_max[1][1],I_max[1][2],0,255)
//create_beam_message(I_max[1][0],I_max[1][1],I_min[1][2],I_min[1][0],I_max[1][1],I_min[1][2],255,0)
create_beam_message(I_max[1][0],I_max[1][1],(I_max[1][2] + I_min[1][2]) / 2,I_min[1][0],I_max[1][1],(I_max[1][2] + I_min[1][2]) / 2,0,255)
create_beam_message(I_min[1][0],I_max[1][1],I_max[1][2],I_min[1][0],I_min[1][1],I_max[1][2],0,255)
//create_beam_message(I_min[1][0],I_max[1][1],I_min[1][2],I_min[1][0],I_min[1][1],I_min[1][2],255,0)
create_beam_message(I_min[1][0],I_max[1][1],(I_max[1][2] + I_min[1][2]) / 2,I_min[1][0],I_min[1][1],(I_max[1][2] + I_min[1][2]) / 2,0,255)
create_beam_message(I_min[1][0],I_min[1][1],I_max[1][2],I_max[1][0],I_min[1][1],I_max[1][2],0,255)
//create_beam_message(I_min[1][0],I_min[1][1],I_min[1][2],I_max[1][0],I_min[1][1],I_min[1][2],255,0)
create_beam_message(I_min[1][0],I_min[1][1],(I_max[1][2] + I_min[1][2]) / 2,I_max[1][0],I_min[1][1],(I_max[1][2] + I_min[1][2]) / 2,0,255)
}
}
public create_beam_message(origin1_0,origin1_1,origin1_2,origin2_0,origin2_1,origin2_2,r,b)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(0) //TE_BEAMPOINTS
write_coord(origin1_0)
write_coord(origin1_1)
write_coord(origin1_2)
write_coord(origin2_0)
write_coord(origin2_1)
write_coord(origin2_2)
write_short(beamsprite)
write_byte(1) // framestart
write_byte(1) // framerate
write_byte(110) // life in 0.1's
write_byte(5) // width
write_byte(0) // noise
write_byte(r)
write_byte(0)
write_byte(b)
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
public FM_PlayerPreThink_Hook(id)
{
if(is_user_alive(id) && !is_user_bot(id) && get_pcvar_num(spawnprotection) && get_pcvar_num(togglecvar) && id!=flag_holder[0] && id!=flag_holder[1])
{
static Float:origin[3]
pev(id,pev_origin,origin)
if(is_in_safezone[id])
{
new buttons = pev(id,pev_button)
if(buttons & IN_ATTACK) buttons -= IN_ATTACK
if(buttons & IN_ATTACK2) buttons -= IN_ATTACK2
set_pev(id,pev_button,buttons)
buttons = pev(id,pev_oldbuttons)
if(buttons & IN_ATTACK) buttons -= IN_ATTACK
if(buttons & IN_ATTACK2) buttons -= IN_ATTACK2
set_pev(id,pev_oldbuttons,buttons)
if(!((origin[0]<=maxs[0][0] && origin[0]>=mins[0][0] && origin[1]<=maxs[0][1] && origin[1]>=mins[0][1]) || (origin[0]<=maxs[1][0] && origin[0]>=mins[1][0] && origin[1]<=maxs[1][1] && origin[1]>=mins[1][1])))
{
unsafezone(id)
}
}
else if((origin[0]<=maxs[0][0] && origin[0]>=mins[0][0] && origin[1]<=maxs[0][1] && origin[1]>=mins[0][1]) || (origin[0]<=maxs[1][0] && origin[0]>=mins[1][0] && origin[1]<=maxs[1][1] && origin[1]>=mins[1][1]))
{
switch(cs_get_user_team(id))
{
case CS_TEAM_T: in_safezone(id,255,0,0)
case CS_TEAM_CT: in_safezone(id,0,0,255)
default: in_safezone(id,0,255,0)
}
}
}
}
public in_safezone(id,r,g,b)
{
set_user_godmode(id,1)
set_user_rendering(id,kRenderFxGlowShell,r,g,b,kRenderTransColor,50)
is_in_safezone[id] = true
message_begin(MSG_ONE,get_user_msgid("ScreenFade"),{0,0,0},id)
write_short(~0)
write_short(~0)
write_short(1<<12)
write_byte(r)
write_byte(g)
write_byte(b)
write_byte(100)
message_end()
new param[3]
param[0] = r
param[1] = g
param[2] = b
if(!task_exists(id + 20000)) set_task(8.0,"reflash",id + 20000,param,3,"b")
set_task(0.5,"reflash",id + 20000,param,3)
}
public reflash(param[3],id)
{
id -= 20000
if(!is_in_safezone[id] || !is_user_alive(id))
{
remove_task(id + 20000)
}
else
{
message_begin(MSG_ONE,get_user_msgid("ScreenFade"),{0,0,0},id)
write_short(~0)
write_short(~0)
write_short(1<<12)
write_byte(param[0])
write_byte(param[1])
write_byte(param[2])
write_byte(100)
message_end()
}
}
public unsafezone(id)
{
set_user_godmode(id)
set_user_rendering(id,kRenderFxNone,0,0,0,kRenderTransAlpha,255)
is_in_safezone[id] = false
message_begin(MSG_ONE,get_user_msgid("ScreenFade"),{0,0,0},id)
write_short(~0)
write_short(~0)
write_short(1<<12)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(1)
message_end()
remove_task(id + 20000)
}
/*
Flag Think
*/
public Flag_Think_Hook(ent,team)
{
if(pev_valid(flag_holder[team]))
{
static Float:origin[3], Float:origin2[3]
pev(flag_holder[team],pev_origin,origin)
origin[2] += 16.0
pev(ent,pev_origin,origin2)
if(get_distance_f(origin,origin2)>50.0)
engfunc(EngFunc_SetOrigin,ent,origin)
if(flag_holder[team]!=flagstand_ents[team] && flag_holder[(team + 1) % 2]==flagstand_ents[(team + 1) % 2])
{
pev(flagstand_ents[(team + 1) % 2],pev_origin,origin)
if(get_distance_f(origin2,origin)<PICKUP_DISTANCE)
{
new string[200]
new cvar_value = get_pcvar_num(maxcaps)
new ministring[4]
if(team)
{
ministring = "CT"
TScore++
if(cvar_value<=TScore)
{
format(string,199,"[red][CTF][/red] Game Over. [green]Ts[/green] won.")
show_colored_message(0,string,199)
endmap()
}
}
else
{
ministring = "T"
CTScore++
if(cvar_value<=CTScore)
{
format(string,199,"[red][CTF][/red] Game Over. [green]CTs[/green] won.")
show_colored_message(0,string,199)
endmap()
}
}
new name[32]
get_user_name(flag_holder[team],name,31)
format(string,199,"[red][CTF][/red] [green]%s[/green] captured the [green]%s[/green] flag.",name,ministring)
if(play_sounds) client_cmd(0,"mp3 play sound/%s",flag_captured)
show_colored_message(0,string,199)
flag_holder[team] = flagstand_ents[team]
write_hudmsg()
return ;
}
}
pev(flag_holder[team],pev_velocity,origin)
set_pev(ent,pev_velocity,origin)
}
if(flag_holder[team]==flagstand_ents[team] || !flag_holder[team])
{
static Float:origin[3]
static Float:flag_origin[3]
pev(ent,pev_origin,flag_origin)
static players[32], num
get_players(players,num,"ach")
for(new i=0;i<num;i++)
{
if(get_user_team(players[i])!=(team + 1))
{
pev(players[i],pev_origin,origin)
if(get_distance_f(origin,flag_origin)<PICKUP_DISTANCE)
{
new ministring[4]
if(team) ministring = "CT"
else ministring = "T"
flag_holder[team] = players[i]
new name[32]
new string[200]
get_user_name(players[i],name,31)
format(string,199,"[red][CTF][/red] [green]%s[/green] picked up the [green]%s[/green] flag.",name,ministring)
if(play_sounds) client_cmd(0,"mp3 play sound/%s",flag_taken)
show_colored_message(0,string,199)
flag_holder[team] = players[i]
write_hudmsg()
unsafezone(players[i])
break;
}
}
else if(!flag_holder[team])
{
pev(players[i],pev_origin,origin)
if(get_distance_f(origin,flag_origin)<PICKUP_DISTANCE)
{
new ministring[4]
if(team) ministring = "CT"
else ministring = "T"
flag_holder[team] = players[i]
new name[32]
new string[200]
get_user_name(players[i],name,31)
format(string,199,"[red][CTF][/red] [green]%s[/green] returned the [green]%s[/green] flag.",name,ministring)
if(play_sounds) client_cmd(0,"mp3 play sound/%s",flag_returned)
show_colored_message(0,string,199)
flag_holder[team] = flagstand_ents[team]
write_hudmsg()
break;
}
}
}
}
return ;
}
public client_disconnect(id)
{
if(read_data(2)==flag_holder[0])
{
flag_holder[0] = 0
new string[200]
format(string,199,"[red][CTF][/red] [green]UNKNOWN[/green] dropped the [green]T[/green] flag.")
if(play_sounds) client_cmd(0,"mp3 play sound/%s",flag_taken)
show_colored_message(0,string,199)
write_hudmsg()
}
else if(read_data(2)==flag_holder[1])
{
flag_holder[1] = 0
new string[200]
format(string,199,"[red][CTF][/red] [green]UNKNOWN[/green] dropped the [green]CT[/green] flag.")
if(play_sounds) client_cmd(0,"mp3 play sound/%s",flag_taken)
show_colored_message(0,string,199)
write_hudmsg()
}
}
public DeathMsg()
{
new victim = read_data(2)
if(is_user_connected(victim))
{
if(victim==flag_holder[0])
{
flag_holder[0] = 0
new name[32]
new string[200]
get_user_name(victim,name,31)
format(string,199,"[red][CTF][/red] [green]%s[/green] dropped the [green]T[/green] flag.",name)
show_colored_message(0,string,199)
write_hudmsg()
}
else if(victim==flag_holder[1])
{
flag_holder[1] = 0
new name[32]
new string[200]
get_user_name(victim,name,31)
format(string,199,"[red][CTF][/red] [green]%s[/green] dropped the [green]CT[/green] flag.",name)
show_colored_message(0,string,199)
write_hudmsg()
}
set_task(get_pcvar_float(respawntime),"respawn_player",victim)
}
}
public show_colored_message(id,string[],maxlen)
{
replace_all(string,maxlen,"[blue]","^x03")
replace_all(string,maxlen,"[/blue]","^x01")
replace_all(string,maxlen,"[red]","^x03")
replace_all(string,maxlen,"[/red]","^x01")
replace_all(string,maxlen,"[green]","^x04")
replace_all(string,maxlen,"[/green]","^x01")
format(string,maxlen,"^x04^x01%s",string)
static q
q++
if(!id)
{
static players[32], num
get_players(players,num,"ch")
for(new i=0;i<num;i++)
{
message_begin(MSG_ONE,saytext_msgid,{0,0,0},players[i])
write_byte(players[i])
write_string(string)
message_end()
}
}
else
{
message_begin(MSG_ONE,saytext_msgid,{0,0,0},id)
write_byte(id)
write_string(string)
message_end()
}
}
public write_hudmsg()
{
new flagloc[32]
if(!flag_holder[0])
{
format(flagloc,31,"On Ground")
}
else if(flag_holder[0]==flagstand_ents[0])
{
format(flagloc,31,"Base")
}
else if(is_user_alive(flag_holder[0]))
{
get_user_name(flag_holder[0],flagloc,31)
}
set_hudmessage(255, 0, 0, -1.0, 0.03, 0, 6.0, 12.0, 0.0, 0.0)
show_hudmessage(0,"[ %d ] T Flag: %s",TScore,flagloc)
if(!flag_holder[1])
{
format(flagloc,31,"On Ground")
}
else if(flag_holder[1]==flagstand_ents[0])
{
format(flagloc,31,"Base")
}
else if(is_user_alive(flag_holder[1]))
{
get_user_name(flag_holder[1],flagloc,31)
}
set_hudmessage(0, 0, 255, -1.0, 0.03, 0, 6.0, 12.0, 0.0, 0.0,3)
show_hudmessage(0,"_^n [ %d ] CT Flag: %s",CTScore,flagloc)
}
public endmap()
{
new trash
new map[32]
new configfile[200]
get_basedir(configfile,199)
format(configfile,199,"%s/maps.ini",configfile)
format(map,31,"de_dust")
if(file_exists(configfile)) read_file(configfile,random_num(0,file_size(configfile,1) - 1),map,31,trash)
if(!is_map_valid(map))
{
if(file_size(configfile,1)<3)
{
server_cmd("amx_map de_dust2;amx_map de_dust2_cz")
}
else
{
set_task(0.1,"endmap")
}
}
else server_cmd("amx_map %s",map)
}
/*
CTF Vote (From v2.0)
*/
public say_vote_hook(id)
{
if(!get_pcvar_num(votecvar))
{
client_print(id,print_chat,"[CTF] Voting disabled")
}
else if(roundend)
{
client_print(id,print_chat,"[CTF] Voting can't start. People are buying.")
}
else if(voting)
{
client_print(id,print_chat,"[CTF] Voting currently in progrss.")
}
else if(voted)
{
client_print(id,print_chat,"[CTF] Can't vote this soon after a vote.")
}
else if(get_pcvar_num(togglecvar))
{
voting=true
voted=true
show_menu(0,(1<<0)|(1<<1),"\bTurn CTF off?^n^n\w1. Yes^n\w2. No",-1,"ctfvote")
set_task(get_pcvar_float(votelength),"voting_over",0)
set_task(get_pcvar_float(votedelay),"voted_over")
}
else
{
voting=true
voted=true
show_menu(0,(1<<0)|(1<<1),"\bTurn CTF on?^n^n\w1. Yes^n\w2. No",-1,"ctfvote")
set_task(get_pcvar_float(votelength),"voting_over",1)
set_task(get_pcvar_float(votedelay),"voted_over")
}
}
public Key_Hook(id,key)
{
if(voting)
{
client_print(id,print_chat,"[CTF] Vote Accepted.")
if(!key) yes++
else no++
}
}
public voting_over(num)
{
if(num)
{
client_print(0,print_chat,"[CTF] Voting to turn CTF on results: Yes: %d | No: %d",yes,no)
if(yes>no)
{
ctf_on()
}
}
else
{
client_print(0,print_chat,"[CTF] Voting to turn CTF off results: Yes: %d | No: %d",yes,no)
if(yes>no)
{
ctf_off()
}
}
yes=0
no=0
voting=false
}
public voted_over()
{
voted=false
}
public endround()
{
roundend = true
set_task(7.0 + get_pcvar_float(voterounddelay),"roundstart")
}
public roundstart()
{
roundend = false
}
/*
Off / On Functions
*/
public ctf_off()
{
set_pcvar_num(togglecvar,0)
remove_task(1234)
remove_task(1500)
engfunc(EngFunc_SetOrigin,flagstand_ents[0],Float:{-4800.0,-4800.0,-4800.0})
engfunc(EngFunc_SetOrigin,flagstand_ents[1],Float:{-4800.0,-4800.0,-4800.0})
flag_holder[0] = flagstand_ents[0]
flag_holder[1] = flagstand_ents[1]
add_objectives()
for(new i=1;i<=32;i++)
{
if(is_user_alive(i) && is_in_safezone[i])
{
unsafezone(i)
}
}
}
public ctf_on()
{
set_pcvar_num(togglecvar,1)
set_task(10.0,"create_beamsprites",1500,"",0,"b")
if(!pev_valid(flagstand_ents[0]) || !pev_valid(flagstand_ents[1]))
{
set_task(0.5,"find_minmaxs")
}
else
{
new Float:T_origin[3], Float:CT_origin[3]
get_flagstand_origins(CT_origin,T_origin)
engfunc(EngFunc_SetOrigin,flagstand_ents[0],T_origin)
engfunc(EngFunc_SetOrigin,flagstand_ents[1],CT_origin)
engfunc(EngFunc_DropToFloor,flagstand_ents[0])
engfunc(EngFunc_DropToFloor,flagstand_ents[1])
pev(flagstand_ents[0],pev_origin,T_origin)
pev(flagstand_ents[1],pev_origin,CT_origin)
T_origin[2] += 36.0
CT_origin[2] += 36.0
engfunc(EngFunc_SetOrigin,flagstand_ents[0],T_origin)
engfunc(EngFunc_SetOrigin,flagstand_ents[1],CT_origin)
}
set_task(10.0,"write_hudmsg",1234,"",0,"b")
remove_objectives()
set_task(10.0,"ctf_restartround")
remove_task(5547)
remove_task(5548)
client_print(0,print_center,"[CTF] CTF Enabled. Round Restarting in 10 seconds.")
}
public ctf_restartround()
{
set_cvar_num("sv_restartround",1)
for(new i=1;i<=32;i++)
{
if(is_user_connected(i))
{
firsttime[i] = true
weapon_method_menu(i)
}
}
}
/*
Off / On Commands
*/
public cmd_off(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
if(get_pcvar_num(togglecvar))
{
console_print(id,"[CTF] CTF Turned Off.")
ctf_off()
new string[200]
format(string,199,"[red][CTF][/red] CTF Turned [green]Off[/green].")
show_colored_message(0,string,199)
}
else
{
console_print(id,"[CTF] CTF Is Already Turned Off.")
}
return PLUGIN_HANDLED
}
public cmd_on(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
if(!get_pcvar_num(togglecvar))
{
console_print(id,"[CTF] CTF Turned On.")
ctf_on()
new string[200]
format(string,199,"[red][CTF][/red] CTF Turned [green]On[/green].")
show_colored_message(0,string,199)
}
else
{
console_print(id,"[CTF] CTF Is Already Turned On.")
}
return PLUGIN_HANDLED
}
/*
Remove Map Objectives
*/
public remove_objectives()
{
new ent
for(new i=0;i<MAX_OBJ_TYPES;i++)
{
ent = engfunc(EngFunc_FindEntityByString,maxplayers,"classname",map_objectives[i])
while(ent)
{
if(pev_valid(ent))
{
objective_type[num_objectives] = i
pev(ent,pev_origin,objective[num_objectives])
pev(ent,pev_size,objectiveminsize[num_objectives],objectivemaxsize[num_objectives])
pev(ent,pev_solid,objective_solidity[num_objectives])
engfunc(EngFunc_RemoveEntity,ent)
num_objectives++
}
ent = engfunc(EngFunc_FindEntityByString,ent,"classname",map_objectives[i])
}
}
give_c4 = false
}
public add_objectives()
{
new ent
for(num_objectives--;num_objectives>=0;num_objectives--)
{
if(objective_type[num_objectives]==0 || objective_type[num_objectives]==5) give_c4 = true
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,map_objectives[objective_type[num_objectives]]))
set_pev(ent,pev_classname,map_objectives[objective_type[num_objectives]])
set_pev(ent,pev_origin,objective[num_objectives])
set_pev(ent,pev_solid,objective_solidity[num_objectives])
engfunc(EngFunc_SetSize,ent,objectiveminsize[num_objectives],objectivemaxsize[num_objectives])
set_pev(ent,pev_size,objectiveminsize[num_objectives],objectivemaxsize[num_objectives])
dllfunc(DLLFunc_Spawn,ent)
dllfunc(DLLFunc_Think,ent)
for(new i=0;i<3;i++)
{
objective[num_objectives][i] = 0.0
objectiveminsize[num_objectives][i] = 0.0
objectivemaxsize[num_objectives][i] = 0.0
}
}
num_objectives=0
}
//All this handles de_ maps - making them re-work if ctf is turned off during runtime.
public newround()
{
if(give_c4) set_task(0.5,"manually_give_c4",5547)
}
public manually_give_c4()
{
if(!get_pcvar_num(togglecvar))
{
new found = 0
static start
if(start<1 || start>maxplayers) start = 1
for(;start<=maxplayers;start++)
{
if(is_user_alive(start) && cs_get_user_team(start)==CS_TEAM_T)
{
found = start
break;
}
}
if(!found)
{
for(start = 0;start<=maxplayers;start++)
{
if(is_user_alive(start) && cs_get_user_team(start)==CS_TEAM_T)
{
found = start
break;
}
}
}
if(found) give_item(found,"weapon_c4")
}
set_task(get_cvar_float("mp_roundtime") * 60.0,"force_endround",5548)
}
public bomb_planted() remove_task(5548)
public force_endround()
{
getweapons()
set_task(0.5,"killum")
}
public getweapons()
{
static i, i2
for(i=1;i<=maxplayers;i++)
{
arrayset(weapon[i],0,31)
if(is_user_alive(i) && cs_get_user_team(i)==CS_TEAM_T)
{
armoramount[i] = cs_get_user_armor(i,armortype[i])
for(i2=1;i2<=30;i2++)
{
if(i2!=2 && i2!=6 && i2!=29)
{
if(user_has_weapon(i,i2))
{
weapon[i][i2] = cs_get_user_bpammo(i,i2)
if(!weapon[i][i2]) weapon[i][i2] = 1
}
}
}
}
}
}
public killum()
{
killing=true
new msgblock = get_msg_block(get_user_msgid("DeathMsg"))
set_msg_block(get_user_msgid("DeathMsg"),BLOCK_SET)
new i
for(i=1;i<=maxplayers;i++)
{
if(is_user_alive(i) && cs_get_user_team(i)==CS_TEAM_T)
{
user_kill(i)
client_print(i,print_chat,"[AMXX] You Failed to complete map objective. Respawning.")
set_task(4.0,"spawnum",i)
}
}
set_msg_block(get_user_msgid("DeathMsg"),msgblock)
killing=false
set_task(4.5,"giveweapons")
}
public plugin_log()
{
if(killing)
{
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public spawnum(id)
{
cs_set_user_deaths(id,cs_get_user_deaths(id) - 1)
set_user_frags(id,get_user_frags(id) + 1)
dllfunc(DLLFunc_Spawn,id)
}
public giveweapons()
{
new i, i2
for(i=1;i<=maxplayers;i++)
{
if(is_user_alive(i) && cs_get_user_team(i)==CS_TEAM_T)
{
cs_set_user_armor(i,armoramount[i],armortype[i])
strip_user_weapons(i)
for(i2=1;i2<=30;i2++)
{
if(i2!=2 && i2!=6 && i2!=29)
{
if(weapon[i][i2])
{
give_item(i,WeaponNames[i2])
cs_set_user_bpammo(i,i2,weapon[i][i2])
}
}
}
give_item(i,"weapon_knife")
}
}
}
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Wyłączyć podświetlenie Flag
#1
Napisano 27.01.2019 12:46
#3
Napisano 27.01.2019 13:54
Daje załącznik sma
GHW_CTF.sma 44,66 KB 35 Ilość pobrań
GHW_CTF.amxx
nie wiem gdzie edytować podświetlanie flag może ktoś będzie wiedział i pomorze ;/
#4
Napisano 27.01.2019 13:59
Wydaje mi się, że trzeba podmienić funkcję find_minmaxs() na tą:
Użytkownik TibacK edytował ten post 27.01.2019 14:00
#6
Napisano 27.01.2019 14:51
- usuń całą funkcję 'reflash()'
- Podmień in_safezone() i unsafezone() na:
public in_safezone(id,r,g,b)
{
set_user_godmode(id,1)
set_user_rendering(id,kRenderFxGlowShell,r,g,b,kRenderTransColor,50)
is_in_safezone[id] = true
}
public unsafezone(id)
{
set_user_godmode(id)
set_user_rendering(id,kRenderFxNone,0,0,0,kRenderTransAlpha,255)
is_in_safezone[id] = false
}
Użytkownik TibacK edytował ten post 27.01.2019 14:51
#7
Napisano 27.01.2019 15:01
- usuń całą funkcję 'reflash()'
- Podmień in_safezone() i unsafezone() na:
public in_safezone(id,r,g,b) { set_user_godmode(id,1) set_user_rendering(id,kRenderFxGlowShell,r,g,b,kRenderTransColor,50) is_in_safezone[id] = true }public unsafezone(id) { set_user_godmode(id) set_user_rendering(id,kRenderFxNone,0,0,0,kRenderTransAlpha,255) is_in_safezone[id] = false }
teraz nie ma niebieskiego ale czerwony jest ![]()
#8
Napisano 27.01.2019 15:05
na pewno wrzuciłeś zaktualizowaną wersję na serwer? W kodzie nie ma już żadnej wzmianki o kolorowaniu ekranu gracza na czerwono.
#9
Napisano 27.01.2019 15:09
na pewno wrzuciłeś zaktualizowaną wersję na serwer? W kodzie nie ma już żadnej wzmianki o kolorowaniu ekranu gracza na czerwono.
Tak ja pisałeś tak robiłem jak wchodze w ten model co trzyma flage i ten linie to pojawia sie czerwony ekran
GHW_CTF.sma 43,71 KB 26 Ilość pobrań
GHW_CTF.amxx
Użytkownik Blue-shout edytował ten post 27.01.2019 15:12
#10
Napisano 27.01.2019 15:17
public in_safezone(id,r,g,b)
{
set_user_godmode(id,1)
//set_user_rendering(id,kRenderFxGlowShell,r,g,b,kRenderTransColor,50)
is_in_safezone[id] = true
}
Spróbuj tego
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych


Dodatki SourceMod












