Yes here you have.
PHP Code:
/*
* _______ _ _ __ __
* | _____/ | | | | \ \ __ / /
* | | | | | | | | / \ | |
* | | | |____| | | |/ __ \| |
* | | ___ | ______ | | / \ |
* | | |_ | | | | | | / \ |
* | | | | | | | | | | | |
* | |____| | | | | | | | | |
* |_______/ |_| |_| \_/ \_/
*
*
*
* Last Edited: 07-12-09
*
* ============
* Changelog:
* ============
*
* v2.3
* -Bug Fixes
*
* v2.2
* -Added ML
*
* v2.1
* -Added rules
*
* v2.0
* -Rewrite
*
* v1.1
* -Made less laggy and more compadible (by taking out client_PreThink)
*
* v1.0
* -Initial Release
*
*/
#define VERSION "2.3b"
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <fakemeta>
#define TAG_BASE_DISTANCE 150
#define TASK_SELECT_IT 1335
#define TASK_CREATE_BASE 1336
#define TASK_REDRAW_BASE 1337
enum MODE
{
OFF,
REGULAR,
FREEZE,
BASE,
TEAM
}
new MODE:game_mode
new it_player
new old_it
new immune_player
new maxplayers
new individual_msg_pcvar
new restart_pcvar
new activity_pcvar
new bool:frozen[33]
new bool:defrostable[33]
new bool:respawning[33]
new bool:tagged[33]
new bool:gottobase[33]
new Float:base_origin[3]
new base_origin_I[3]
new beamsprite
public plugin_init()
{
register_plugin("Tag Mod",VERSION,"GHW_Chronic")
register_clcmd("chooseteam", "ClCmd_ChooseTeam")
register_concmd("amx_tag","cmd_start",ADMIN_SLAY," Starts a game of tag [Normal, Freeze, Base, Team]")
register_concmd("amx_tag_off","cmd_stop",ADMIN_SLAY," Stops a currently running game of tag")
register_forward(FM_Touch,"FM_Touch_Hook")
register_forward(FM_PlayerPreThink,"FM_Think_Hook")
register_event("ResetHUD","ResetHUD_Hook","b")
register_cvar("tag_mode","0")
individual_msg_pcvar = register_cvar("tag_individual_msg","0")
restart_pcvar = get_cvar_pointer("sv_restart")
activity_pcvar = get_cvar_pointer("amx_show_activity")
maxplayers = get_maxplayers()
if(get_cvar_num("tag_mode"))
{
switch(get_cvar_num("tag_mode"))
{
case 1:
{
game_mode = REGULAR
}
case 2:
{
game_mode = FREEZE
}
case 3:
{
game_mode = BASE
}
case 4:
{
game_mode = TEAM
}
}
reset_game()
new players[32], num
get_players(players,num,"h")
for(new i=0;i<num;i++)
{
set_pev(players[i],pev_takedamage,0.0)
frozen[players[i]] = false
}
select_it()
}
register_dictionary("GHW_TagMod.txt")
}
public plugin_precache()
{
beamsprite = precache_model("sprites/dot.spr")
}
public client_connect(id)
{
frozen[id] = false
respawning[id] = false
tagged[id] = false
gottobase[id] = false
}
public client_disconnect(id)
{
if(id==it_player)
{
select_it()
}
}
public cmd_start(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
game_mode = REGULAR
if(read_argc()>1)
{
new arg[32]
read_argv(1,arg,31)
if(equali(arg,"Freeze"))
{
game_mode = FREEZE
}
else if(equali(arg,"Base"))
{
game_mode = BASE
}
else if(equali(arg,"Team"))
{
game_mode = TEAM
}
}
new name[32]
if(get_pcvar_num(activity_pcvar)>1)
{
format(name,31,"Admin")
}
else
{
get_user_name(id,name,31)
}
new type[32]
new rules[128]
switch(game_mode)
{
case REGULAR:
{
format(type,31,"%L",0,"TAG_TYPE_REGULAR")
format(rules,127,"[AMXX] %L",0,"TAG_RULES_REGULAR")
}
case FREEZE:
{
format(type,31,"%L",0,"TAG_TYPE_FREEZE")
format(rules,127,"[AMXX] %L",0,"TAG_RULES_FREEZE")
}
case BASE:
{
format(type,31,"%L",0,"TAG_TYPE_BASE")
format(rules,127,"[AMXX] %L",0,"TAG_RULES_BASE")
}
case TEAM:
{
format(type,31,"%L",0,"TAG_TYPE_TEAM")
format(rules,127,"[AMXX] %L",0,"TAG_RULES_TEAM")
}
}
reset_game()
set_pcvar_num(restart_pcvar,1)
new players[32], num
get_players(players,num,"h")
for(new i=0;i<num;i++)
{
set_pev(players[i],pev_takedamage,0.0)
frozen[players[i]] = false
}
console_print(id,"[AMXX] %L",id,"TAG_GAME_STARTED_CON",type)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_GAME_STARTED_CHAT",name,type)
client_print(0,print_chat,"%s",rules)
select_it()
return PLUGIN_HANDLED
}
public clcmd_chooseteam(id)
{
if (id == it_player) return PLUGIN_HANDLED;
}
public Create_Base()
{
if(game_mode==BASE)
{
if(it_player && is_user_alive(it_player))
{
pev(it_player,pev_origin,base_origin)
FVecIVec(base_origin,base_origin_I)
set_task(2.0,"Redraw_Base")
set_task(30.0,"Redraw_Base",TASK_REDRAW_BASE,"",0,"b")
remove_task(TASK_CREATE_BASE)
}
}
else
{
remove_task(TASK_CREATE_BASE)
}
}
public Redraw_Base()
{
if(game_mode!=BASE)
{
remove_task(TASK_REDRAW_BASE)
}
draw_sprite(100,100,100,-100)
draw_sprite(100,100,-100,100)
draw_sprite(100,-100,-100,-100)
draw_sprite(-100,100,-100,-100)
}
public draw_sprite(addx1,addy1,addx2,addy2)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(0) //TE_BEAMPOINTS
write_coord(base_origin_I[0] + addx1)
write_coord(base_origin_I[1] + addy1)
write_coord(base_origin_I[2])
write_coord(base_origin_I[0] + addx2)
write_coord(base_origin_I[1] + addy2)
write_coord(base_origin_I[2])
write_short(beamsprite)
write_byte(1) // framestart
write_byte(1) // framerate
write_byte(1200) // life in 0.1's
write_byte(5) // width
write_byte(0) // noise
write_byte(random_num(0,255))
write_byte(random_num(0,255))
write_byte(random_num(0,255))
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
public reset_game()
{
for(new i=1;i<=maxplayers;i++)
{
if(is_user_connected(i))
{
set_user_noclip(i)
_set_rendering(i)
}
frozen[i] = false
tagged[i] = false
}
}
public reset_game2()
{
for(new i=1;i<=maxplayers;i++)
{
gottobase[i] = false
}
}
public select_it()
{
if(task_exists(TASK_SELECT_IT) && it_player && is_user_connected(it_player))
{
remove_task(TASK_SELECT_IT)
}
else if(!task_exists(TASK_SELECT_IT))
{
old_it = is_user_connected(it_player) ? it_player : 0
it_player = 0
set_task(5.0,"select_it",TASK_SELECT_IT,"",0,"b")
}
else
{
select_it2()
}
}
public select_it2()
{
if(it_player && is_user_connected(it_player))
_set_rendering(it_player)
it_player = 0
new num, players[32]
get_players(players,num,"h")
if(num)
{
new tries = 100
new tempplayer
while(!it_player && tries--)
{
tempplayer = random_num(0,num - 1)
if(tempplayer!=old_it && (game_mode!=BASE || !gottobase[players[tempplayer]]))
{
it_player = tempplayer
}
}
if(!it_player)
it_player = players[random_num(0,num - 1)]
if(is_user_connected(it_player))
{
_set_rendering(it_player,kRenderFxDistort,255,0,0,kRenderTransAdd,127)
new name[32]
get_user_name(it_player,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_IT_SELECTED",name)
if(it_player && game_mode==BASE)
{
reset_game2()
if(!task_exists(TASK_CREATE_BASE))
{
set_task(10.0,"Create_Base",TASK_CREATE_BASE,"",0,"b")
}
}
}
else
{
select_it2() /////////
it_player = 0
}
}
}
public ResetHUD_Hook(id)
{
if(game_mode && pev_valid(id) && pev(id,pev_takedamage))
set_pev(id,pev_takedamage,0.0)
}
public cmd_stop(id,level,cid)
{
if(!cmd_access(id,level,cid,1))
{
return PLUGIN_HANDLED
}
if(game_mode)
{
game_mode = OFF
new players[32], num
get_players(players,num,"h")
for(new i=0;i<num;i++)
{
_set_rendering(players[i])
set_pev(players[i],pev_takedamage,1.0)
set_user_noclip(players[i])
}
new name[32]
if(get_pcvar_num(activity_pcvar)>1)
{
format(name,31,"Admin")
}
else
{
get_user_name(id,name,31)
}
console_print(id,"[AMXX] %L",id,"TAG_GAME_STOPPED_CON")
client_print(0,print_chat,"[AMXX] %L",0,"TAG_GAME_STOPPED_CHAT",name)
}
else
{
console_print(id,"[AMXX] %L",id,"TAG_GAME_NOTRUNNING")
}
return PLUGIN_HANDLED
}
public respawn_player(id)
{
if(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(0.2,"spawned",id)
}
}
public spawned(id)
{
if(is_user_connected(id))
{
if(id==it_player)
{
_set_rendering(id,kRenderFxDistort,255,0,0,kRenderTransAdd,127)
}
else if(game_mode==BASE)
{
if(tagged[id])
{
_set_rendering(id,kRenderFxGlowShell,0,255,0,kRenderTransAlpha,70)
set_user_noclip(id,1)
}
else if(gottobase[id])
{
_set_rendering(id,kRenderFxGlowShell,0,0,0,kRenderTransAdd,0)
engfunc(EngFunc_SetView,id,it_player)
}
}
else if(game_mode==FREEZE && frozen[id])
{
_set_rendering(id,kRenderFxGlowShell,0,0,255,kRenderTransAlpha,70)
}
set_pev(id,pev_takedamage,0.0)
respawning[id] = false
if(!it_player)
{
select_it()
}
}
}
public FM_Think_Hook(ent)
{
if(!game_mode || ent > maxplayers)
return PLUGIN_CONTINUE
if(!respawning[ent] && !is_user_alive(ent) && get_user_team(ent))
{
respawning[ent] = true
respawn_player(ent)
}
if(frozen[ent])
{
set_pev(ent,pev_velocity,Float:{0.0,0.0,-100.0})
}
if(ent!=it_player && !tagged[ent] && !gottobase[ent] && is_user_alive(ent) && game_mode==BASE)
{
static Float:origin[3]
pev(ent,pev_origin,origin)
if(get_distance_f(origin,base_origin)<TAG_BASE_DISTANCE)
{
gottobase[ent] = true
frozen[ent] = true
set_user_noclip(ent,1)
_set_rendering(ent,kRenderFxGlowShell,0,0,0,kRenderTransAlpha,0)
if(get_pcvar_num(individual_msg_pcvar))
{
static name[32]
get_user_name(ent,name,31)
client_print(ent,print_chat,"[AMXX] %L",ent,"TAG_GOTTOBASE_CLIENT")
if(get_pcvar_num(individual_msg_pcvar))
{
client_print(0,print_chat,"[AMXX] %L",0,"TAG_GOTTOBASE_ALL",name)
}
if(allout())
{
client_print(0,print_chat,"[AMXX] %L",0,"TAG_NEXTROUND")
reset_game()
select_it()
reset_game2()
}
}
}
}
return PLUGIN_CONTINUE
}
public FM_Touch_Hook(ent1,ent2)
{
static name[32]
if(ent1 <= maxplayers && is_user_alive(ent1) && ent2 <= maxplayers && is_user_alive(ent1) && is_user_alive(ent2))
{
switch(game_mode)
{
case REGULAR:
{
if(ent1==it_player && ent2!=immune_player)
{
if(frozen[it_player])
frozen[it_player] = false
immune_player = it_player
set_task(5.0,"unimmune")
frozen[ent2] = true
set_task(5.0,"unfreeze",ent2)
it_player = ent2
get_user_name(ent2,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_TAGGED",name)
_set_rendering(ent1)
_set_rendering(ent2,kRenderFxDistort,0,0,0,kRenderTransAdd,127)
}
}
case FREEZE:
{
if(defrostable[ent1] && frozen[ent1] && ent2!=it_player && !frozen[ent2])
{
unfreeze(ent1)
_set_rendering(ent1)
if(get_pcvar_num(individual_msg_pcvar))
{
get_user_name(ent1,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_UNFROZEN",name)
}
}
else if(ent1==it_player && !frozen[ent2])
{
freeze(ent2)
_set_rendering(ent2,kRenderFxGlowShell,0,0,255,kRenderTransAlpha,70)
if(get_pcvar_num(individual_msg_pcvar))
{
get_user_name(ent2,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_FROZEN",name)
}
defrostable[ent2] = false
set_task(1.0,"unfreezeable",ent2)
if(allfrozen())
{
set_pcvar_num(restart_pcvar,1)
get_user_name(it_player,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_FROZEN_FINISHED",name)
reset_game()
select_it()
}
}
}
case BASE:
{
if(ent1==it_player && !tagged[ent2] && !gottobase[ent2])
{
tagged[ent2] = true;
_set_rendering(ent2,kRenderFxGlowShell,0,255,0,kRenderTransAlpha,70)
set_user_noclip(ent2,1)
if(get_pcvar_num(individual_msg_pcvar))
{
get_user_name(ent2,name,31)
client_print(0,print_chat,"[AMXX] %L",0,"TAG_BASE_TAGGED",name)
}
if(allout())
{
client_print(0,print_chat,"[AMXX] %L",0,"TAG_NEXTROUND")
reset_game()
select_it()
}
}
}
case TEAM:
{
if((ent1==it_player || tagged[ent1]) && (!tagged[ent2] && ent2!=it_player))
{
client_print(ent2,print_chat,"[AMXX] %L",ent2,"TAG_TEAM_TAGGED")
tagged[ent2] = true
_set_rendering(ent2,kRenderFxDistort,0,0,0,kRenderTransAdd,127)
if(alltagged())
{
client_print(0,print_chat,"[AMXX] %L",0,"TAG_NEXTROUND")
reset_game()
select_it()
}
}
}
}
}
}
public allfrozen()
{
new num, players[32]
get_players(players,num,"ah")
for(new i=0;i<num;i++)
{
if(players[i]!=it_player && !frozen[players[i]])
return 0;
}
return 1;
}
public allout()
{
new num, players[32]
get_players(players,num,"ah")
for(new i=0;i<num;i++)
{
if(players[i]!=it_player && !tagged[players[i]] && !gottobase[players[i]])
return 0;
}
return 1;
}
public alltagged()
{
new num, players[32]
get_players(players,num,"ah")
for(new i=0;i<num;i++)
{
if(players[i]!=it_player && !tagged[players[i]])
return 0;
}
return 1;
}
public unfreezeable(id)
{
defrostable[id] = true
}
public freeze(id)
{
frozen[id] = true
}
public unfreeze(id)
{
frozen[id] = false
}
public unimmune()
{
immune_player = 0
}
// Taken from csdm_protection.sma by BAILOPAN.
stock _set_rendering(index, fx=kRenderFxNone, r=255, g=255, b=255, render=kRenderNormal, amount=16)
{
set_pev(index, pev_renderfx, fx);
new Float:RenderColor[3];
RenderColor[0] = float(r);
RenderColor[1] = float(g);
RenderColor[2] = float(b);
set_pev(index, pev_rendercolor, RenderColor);
set_pev(index, pev_rendermode, render);
set_pev(index, pev_renderamt, float(amount));
return 1;
}