#include <amxmodx>
#include <fun>
#include <fakemeta_util>
#include <hamsandwich>
#define PLUGIN "HSMode vote"
#define VERSION "2.0"
#define AUTHOR "[gm-project.net] #Staff / Lt.RAT"
new g_VoteMenu
new g_Votes[2]
new g_Voting
new g_VoteVote[33]
new gHeadShot
new CvarRatio
new HamHook: fwd_TraceAttack, CvarKnife
new g_iMsgTeamInfo, g_iMsgSayText
new g_msgScreenFade
new g_MaxPlayers
enum Color {
NORMAL = 1,
GREEN,
RED,
BLUE
};
new TeamName[][] = {
"",
"TERRORIST",
"CT",
"SPECTATOR"
};
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_dictionary("hsv.txt")
register_cvar("hsv_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY);
CvarKnife = register_cvar ( "hsv_knife", "0")
CvarRatio = register_cvar ( "hsv_cratio", "0.6" )
g_MaxPlayers = global_get(glb_maxClients)
g_iMsgSayText = get_user_msgid( "SayText" );
g_iMsgTeamInfo = get_user_msgid( "TeamInfo" );
g_msgScreenFade = get_user_msgid("ScreenFade")
set_task(30.0,"StartVote")
}
public client_connect(id) {
if(gHeadShot) {
set_task(15.0,"DispInfo", id)
}
}
public cmd_startvote(id) {
g_VoteVote[id]=1
new name [32]
get_user_name(id, name, 31)
new VoteYes, VoteNo
for( new i = 1; i <= g_MaxPlayers; i++ )
{
if( is_user_connected(i) )
{
if (g_VoteVote[i]) {
VoteYes++
} else {
VoteNo++
}
}
}
ColorChat(0, RED, "[HsV]^1 %L", id, "HSV_PLVOTED", name)
if (VoteYes > get_pcvar_float(CvarRatio)*(VoteYes+VoteNo)) {
ColorChat(0, RED, "[HsV]^1 %L", id, "HSV_STNEWVOTE")
set_task(5.0,"StartVote")
}
}
public client_disconnect(id) {
g_VoteVote[id]=0
}
public DispInfo(id) {
ColorChat(0, RED, "[HsV] ^1 %L", id, "HSV_CONMSG")
}
public StartVote() {
static s_MenuHeader[64]
static s_MenuItem1[64]
static s_MenuItem2[64]
formatex(s_MenuHeader, charsmax(s_MenuHeader), "%L", LANG_PLAYER, "HSV_MHEADER")
formatex(s_MenuItem1, charsmax(s_MenuItem1), "%L", LANG_PLAYER, "HSV_MCLASSIC")
formatex(s_MenuItem2, charsmax(s_MenuItem2), "%L", LANG_PLAYER, "HSV_MHSONLY")
for( new plr = 1; plr <= g_MaxPlayers; plr++ ) {
if (is_user_alive(plr) && is_user_connected(plr)) {
set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_FROZEN)
}
}
set_task ( 0.1, "ScreenFade", 0)
client_cmd (0,"spk cccp_sounds/vote/startvote")
g_VoteMenu = menu_create(s_MenuHeader, "menu_handler")
menu_additem(g_VoteMenu, s_MenuItem1, "0", 0)
menu_additem(g_VoteMenu, s_MenuItem2, "1", 0)
new s_Players[32], i_Num, i_Player
get_players(s_Players, i_Num)
for (new i; i < i_Num; i++)
{
i_Player = s_Players[i]
menu_display(i_Player, g_VoteMenu, 0)
g_Voting++
}
set_task(10.0, "EndVote")
g_Votes[0] = g_Votes[1] = 0
return PLUGIN_HANDLED
}
public menu_handler(id, menu, item) {
if (item == MENU_EXIT)
return PLUGIN_HANDLED
new s_Data[6], s_Name[64], i_Access, i_Callback
new name[32]
get_user_name(id, name, 31)
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Vote = str_to_num(s_Data)
ColorChat(0, RED, "[HsV]^1 %L", id, "HSV_VOTED", name, (item ? "HS mode" : "Classic game"))
g_Votes[i_Vote]++
return PLUGIN_HANDLED
}
public EndVote() {
if ( fwd_TraceAttack == HamHook:0 ) {
register_clcmd ( "say /hsv", "cmd_startvote", 0, "- start vote for HSMode" )
register_clcmd ( "say_team /hsv", "cmd_startvote", 0, "- start vote for HSMode" )
}
if (g_Votes[0] > g_Votes[1]) {
gHeadShot = false
ColorChat(0, RED, "[HsV]^1 %L", LANG_PLAYER, "HSV_PLAYCL")
if ( fwd_TraceAttack != HamHook:0 )
{
DisableHamForward(fwd_TraceAttack)
}
server_cmd("sv_restart 1")
server_exec ()
}
else if (g_Votes[1] > g_Votes[0]) {
gHeadShot = true
ColorChat(0, RED, "[HsV]^1 %L", LANG_PLAYER, "HSV_PLAYHS")
if ( fwd_TraceAttack == HamHook:0 ) {
fwd_TraceAttack = RegisterHam(Ham_TraceAttack, "player", "Forward_TraceAttack")
}
else {
EnableHamForward(fwd_TraceAttack)
}
server_cmd("sv_restart 1")
server_exec ()
}
else if (g_Votes[1] >= g_Votes[0]) {
ColorChat(0, RED, "[HsV]^1 %L", LANG_PLAYER, "HSV_PLAYNT")
}
menu_destroy(g_VoteMenu)
for( new plr = 1; plr <= g_MaxPlayers; plr++ ) {
if (is_user_alive(plr) && is_user_connected(plr)) {
set_pev(plr, pev_flags, pev(plr, pev_flags) & ~FL_FROZEN)
}
}
set_task(0.1, "DelScreenFade", 0)
client_cmd (0,"spk cccp_sounds/vote/endvote")
g_Voting = 0
return PLUGIN_CONTINUE
}
public Forward_TraceAttack(id, attacker, Float:dmg, Float:dir[3], tr, dmgbit) {
if(id != attacker && get_tr2(tr, TR_iHitgroup) != HIT_HEAD) {
if(1 <= attacker <= g_MaxPlayers) {
if(!get_pcvar_num(CvarKnife) && get_user_weapon(attacker) == CSW_KNIFE) {
return HAM_IGNORED
}
return HAM_SUPERCEDE
}
}
return HAM_IGNORED;
}
public ScreenFade() {
message_begin(MSG_ALL, g_msgScreenFade, _, 0)
write_short(1<<0)
write_short(1<<0)
write_short(1<<2)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(255)
message_end()
}
public DelScreenFade() {
message_begin(MSG_ALL, g_msgScreenFade, _, 0)
write_short(1<<0)
write_short(1<<0)
write_short(1<<0)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(0)
message_end()
}
public plugin_precache()
{
precache_sound("cccp_sounds/vote/startvote.wav")
precache_sound("cccp_sounds/vote/endvote.wav")
}
// COLORCHAT, hello xPaw ^^,
ColorChat( id, Color:type, const szMessage[], {Float,Sql,Result,_}:... ) {
if( !get_playersnum() ) return;
new message[256];
switch( type ) {
case NORMAL: message[0] = 0x01;
case GREEN: message[0] = 0x04;
default: message[0] = 0x03;
}
vformat(message[1], 251, szMessage, 4);
message[192] = '^0';
replace_all( message, 191, "\YEL", "^1" );
replace_all( message, 191, "\GRN", "^4" );
replace_all( message, 191, "\TEM", "^3" );
new iTeam, ColorChange, index, MSG_Type;
if( id ) {
MSG_Type = MSG_ONE_UNRELIABLE;
index = id;
} else {
index = CC_FindPlayer();
MSG_Type = MSG_BROADCAST;
}
iTeam = get_user_team( index );
ColorChange = CC_ColorSelection(index, MSG_Type, type);
CC_ShowColorMessage(index, MSG_Type, message);
if( ColorChange )
CC_Team_Info(index, MSG_Type, TeamName[iTeam]);
}
CC_ShowColorMessage( id, type, message[] ) {
message_begin( type, g_iMsgSayText, _, id );
write_byte( id );
write_string( message );
message_end();
}
CC_Team_Info( id, type, team[] ) {
message_begin( type, g_iMsgTeamInfo, _, id );
write_byte( id );
write_string( team );
message_end( );
return 1;
}
CC_ColorSelection( index, type, Color:Type ) {
switch( Type ) {
case RED: return CC_Team_Info(index, type, TeamName[1]);
case BLUE: return CC_Team_Info(index, type, TeamName[2]);
}
return 0;
}
CC_FindPlayer() {
for( new i = 1; i <= g_MaxPlayers; i++ )
if( is_user_connected(i) )
return i;
return -1;
}