It continues to draw a vote and change without anyone pressing anything.
Code:
#include <amxmodx>
#include <amxmisc>
// #include <polymorph>
native polyn_votemod()
new bool:g_rockedVote[33], g_rockedVoteCnt
new bool:g_hasbeenrocked = false
// Cvars
new cvar_rtv_enabled
new cvar_rtv_ratio
new cvar_rtv_wait
new cvar_rtv_show
//Sound path
new const SOUND[] = "ambience/start.wav"
public plugin_init()
{
register_plugin("Polymorph: RockTheVote", "1.0", "Fysiks")
register_clcmd("amx_rtv","cmdAdminRTV", ADMIN_MAP, " Manually RockTheVote")
register_clcmd("say /mod", "cmdSayRTV")
// Cvars
cvar_rtv_enabled = register_cvar("rtv_enable", "1") // <0|1>
cvar_rtv_ratio = register_cvar("rtv_ratio", "0.51") // Use amx_votemap_ratio?
cvar_rtv_wait = register_cvar("rtv_wait", "1") // Minutes after mapstart you can rtv
cvar_rtv_show = register_cvar("rtv_show", "1") // Display how many more votes needed to rtv
}
public plugin_precache()
{
precache_sound(SOUND);
}
public cmdAdminRTV(id, level, cid)
{
if(!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED
if(g_hasbeenrocked)
{
client_print(id,print_console,"[MG] Vote has already been rocked")
}
else
{
g_hasbeenrocked = true
new admin_name[32]
get_user_name(id, admin_name, 31)
show_activity(id, admin_name, "has RockedTheVote")
client_print(id,print_console, "[MG] You have a Mod change")
set_task(6.2,"announce_vote")
set_task(5.0,"startRockVote")
}
// Add functionality to cancel rocked vote.
return PLUGIN_HANDLED
}
public client_connect(id)
{
g_rockedVote[id] = false
}
public client_disconnected(id)
{
if(g_rockedVote[id])
{
g_rockedVote[id] = false
g_rockedVoteCnt--
}
check_rock_the_vote();
}
public cmdSayRTV(id)
{
if(!get_pcvar_num(cvar_rtv_enabled))
return PLUGIN_CONTINUE // PLUGIN_HANDLED
if(g_hasbeenrocked)
{
client_print(id, print_chat, "[MG] Vote has already been started.")
return PLUGIN_HANDLED
}
if(g_rockedVote[id])
{
client_print(id, print_chat, "[MG] You already voted.")
rtv_remind()
return PLUGIN_CONTINUE // PLUGIN_HANDLED for blind?
}
new Float:vote_wait = get_pcvar_float(cvar_rtv_wait)
new Float:time_elapsed = get_cvar_float("mp_timelimit") - (float( get_timeleft() ) / 60.0) // Use get_gametime
if( time_elapsed < vote_wait )
{
// Can replace all this content with "You cannot change Mod yet."
// which would require no if statement or calculations.
new Float:time_til_votebegin = vote_wait - time_elapsed
if(time_til_votebegin > 1.0)
{
new min_to_vote = clamp(floatround(time_til_votebegin),1,floatround(vote_wait))
client_print(id, print_chat, "[MG] You cannot change Mod for %d more minute%s.", min_to_vote, min_to_vote > 1 ? "s" : "" )
}
else // time_til_votebegin <= 1 minute
{
client_print(id, print_chat, "[MG] You cannot change Mod for %d more seconds.", floatround(time_til_votebegin * 60) )
}
return PLUGIN_HANDLED
}
if(get_timeleft() < 120 ) // don't allow rtv 2 minutes before map ends
{
client_print(id, print_chat, "[MG] Too Late to change Mod.")
return PLUGIN_HANDLED
}
// You (id) just voted to rock.
g_rockedVote[id] = true
g_rockedVoteCnt++
client_print(id,print_chat, "[MG] You chose to change Mod")
check_rock_the_vote();
return PLUGIN_CONTINUE
}
public startRockVote()
{
polyn_votemod()
}
get_RocksNeeded()
{
return floatround(get_pcvar_float(cvar_rtv_ratio) * float(get_realplayersnum()), floatround_ceil);
}
stock get_realplayersnum()
{
new players[32], playerCnt;
get_players(players, playerCnt, "ch");
return playerCnt;
}
rtv_remind()
{
if(get_pcvar_num(cvar_rtv_show))
{ // Not tested yet.
client_print(0,print_chat, "[MG] Need %d more players to change Mod.", get_RocksNeeded() - g_rockedVoteCnt)
}
}
public announce_vote()
{
emit_sound(0, CHAN_AUTO, SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
check_rock_the_vote()
{
if( g_rockedVoteCnt >= get_RocksNeeded() && !(get_timeleft() < 120) && get_pcvar_num(cvar_rtv_enabled) && !g_hasbeenrocked ) // Decide if we rock the vote
{
g_hasbeenrocked = true
client_print(0,print_chat, "[MG] The Vote has been started!")
set_task(6.2,"announce_vote")
set_task(5.0,"startRockVote")
}
else
{
rtv_remind()
}
}