AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   voting at the beginning of the last round? (https://forums.alliedmods.net/showthread.php?t=183296)

TRUE RED 04-20-2012 09:23

voting at the beginning of the last round?
 
4 Attachment(s)
This plugin makes voting when timeleft is 20 sec but i want voting at the beginning of last round. Any ideas? Please help!
PHP Code:

#include <amxmodx>

new const PLUGIN[] = "Super Mapchooser"
new const VERSION[] = "2.0"
new const AUTHOR[] = "Prayer"

#define FLOAT_TIMELIMIT        "mp_timelimit"
#define STRING_NEXTMAP        "amx_nextmap"
#define NUM_MAXROUNDS        "mp_maxrounds"
#define NUM_WINLIMIT        "mp_winlimit"

#define NUM_SM_VOTEMAPS    "mapchooser_votemaps"
#define NUM_SM_LANG        "mapchooser_lang"
#define NUM_SM_TIME        "mapchooser_votetime"

#define NUM_SM_RED        "mapchooser_result_red"
#define NUM_SM_GREEN        "mapchooser_result_green"
#define NUM_SM_BLUE        "mapchooser_result_blue"

#define TASK_PLUGIN_ID        44747477 // +=:D
#define TASK_SCREEN_ID        979699 // +=:D:=+
#define TASK_RESULT_ID        12111 // :o

const HudLen 512

new Array:g_mapName
new g_mapNums
new g_saveids[10]

new 
g_voteCount[10]
new 
g_nextName[10]
new 
g_lastMap[32]
new 
g_currentMap[32]
new 
g_mapVoteNum

new g_votemaps
new g_maxspeed 320

new bool:hasBlocked false
new bool:forceBlock true
new bool:voteStarted true
new bool:hasExtend false
new timeleft

new bool:hasBlind[33] = { false, ... }
new 
g_msgScreenFade

new PlayersVoted 0
new PlayersNum 0

new
    
g_result_red,
    
g_result_green,
    
g_result_blue

new MenuName[96]

enum ChatColor
{
    
CHATCOLOR_NORMAL 1,     // Normal
    
CHATCOLOR_GREEN,     // Green Color
    
CHATCOLOR_TEAM_COLOR,     // Red, grey, blue
    
CHATCOLOR_GREY,     // grey
    
CHATCOLOR_RED,         // Red
    
CHATCOLOR_BLUE,     // Blue
}

new 
g_TeamName[][] = 
{
    
"",
    
"TERRORIST",
    
"CT",
    
"SPECTATOR"
}

new 
g_msgSayText
new g_msgTeamInfo

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_cvar("amx_extendmap_max",    "90.0")//Максимальное количество минут. Когда несколько раз продлевается карта - это значение будет максимальным в timelimit'е    
    
register_cvar("amx_extendmap_step",    "15.0")//На сколько минут продлевать карту, если проголосовали за ее продление.
    
    
register_cvar(NUM_SM_LANG,        "0")//0-Русский, 1-English
    
register_cvar(NUM_SM_TIME,        "15")//Сколько времени в секундах должно идти голосование
    
register_cvar(NUM_SM_VOTEMAPS,        "5")//Сколько карт выводить на голосование не считая карты, которую продливают в голосовании
    
    // Каким цветом показывать результаты голосования. Формат RGB
    
register_cvar(NUM_SM_RED,        "255")//Красный    
    
register_cvar(NUM_SM_GREEN,        "255")//Зеленый    
    
register_cvar(NUM_SM_BLUE,        "255")//Синий
    
    
register_event("ScreenFade",    "EVENT_ScreenFade",    "be")
    
register_event("TextMsg",    "EVENT_RestartRound",    "a",    "2&#Game_C","2&#Game_w")
    
    
g_msgSayText get_user_msgid("SayText")
    
g_msgTeamInfo get_user_msgid("TeamInfo"
    
g_msgScreenFade get_user_msgid("ScreenFade")
}

public 
plugin_cfg()
{
    
g_votemaps get_cvar_num(NUM_SM_VOTEMAPS)
    
    if(
g_votemaps 8)
        
set_cvar_num(NUM_SM_VOTEMAPS8)
    else if(
g_votemaps 1)
        
set_cvar_num(NUM_SM_VOTEMAPS1)
    
    
g_votemaps get_cvar_num(NUM_SM_VOTEMAPS)
    
    
register_menucmd(register_menuid("superMapChooserMenu"), (-1^(-1<<(g_votemaps 1))), "countVote")
    
    
g_mapName ArrayCreate(32)
    
    
get_localinfo("lastMap"g_lastMapsizeof g_lastMap -1)
    
set_localinfo("lastMap""")
    
    new 
maps_ini_file[64]
    
get_localinfo("amxx_configsdir"maps_ini_filesizeof maps_ini_file -1)
    
    
format(maps_ini_filesizeof maps_ini_file -1"%s/maps.ini"maps_ini_file)
    
    if(!
file_exists(maps_ini_file))
        
get_cvar_string("mapcyclefile"maps_ini_filesizeof maps_ini_file -1)
    
    if(
loadSettings(maps_ini_file))
        
cmdReloadTimer()
    
    
g_maxspeed get_cvar_num("sv_maxspeed")
    
    
// bugfix: need for timeleft (cs time == amxx time): !(!(remaining == left)) || !(remaining != left) :o
    
server_cmd("sv_restart 1")
    
    
get_mapname(g_currentMapsizeof g_currentMap -1)
}

public 
client_disconnect(id)
{
    
remove_task(id+TASK_SCREEN_ID)
    
remove_task(id+TASK_RESULT_ID)
    
    
hasBlind[id] = false
}

public 
EVENT_RestartRound()
    
cmdReloadTimer()

public 
cmdReloadTimer()
{
    if(
voteStarted)
    {
        
PlayersVoted 0
        PlayersNum 
0
        
        forceBlock 
true
        hasBlocked 
false
        voteStarted 
false
        
        
new players[32], numpid
        get_players
(playersnum)
        for(new 
i=0;i<num;i++)
        {
            
pid players[i]
            
            
hasBlind[pid] = false
            
            remove_task
(pid+TASK_SCREEN_ID)
            
remove_task(pid+TASK_RESULT_ID)
            
            
message_begin(MSG_ONEg_msgScreenFade_pid)
            
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()
        }
        
        if(!
hasExtend)
        {
            switch(
get_cvar_num(NUM_SM_LANG))
            {
                
//ĮГолосование прервано!
                
case 0colorChat(0CHATCOLOR_RED"Голосование прервано !")
                case 
1colorChat(0CHATCOLOR_RED"Voting is interrupted!")
            }
        }
        
        
set_cvar_num("sv_maxspeed"g_maxspeed)
        
        
remove_task(TASK_PLUGIN_ID)
        
        
set_task(8.0"taskListening"TASK_PLUGIN_ID""0"b")
        
taskListening()
    }
}

public 
taskListening()
{
    
timeleft get_timeleft()
    
    if(!
hasBlocked && (timeleft <= (get_cvar_num(NUM_SM_TIME) + 14)))
    {
        
change_task(TASK_PLUGIN_ID1.0)
        
        
hasBlocked true
    
}
    else if(
timeleft <= (get_cvar_num(NUM_SM_TIME)))//5 sekynd - skoka ostaetsia do smeni karti posle okon4ania golosovania
    
{
        
remove_task(TASK_PLUGIN_ID)
        
        
forceBlock false
        hasBlocked 
false
        hasExtend 
false
        
        g_result_red 
get_cvar_num(NUM_SM_RED)
        
g_result_green get_cvar_num(NUM_SM_GREEN)
        
g_result_blue get_cvar_num(NUM_SM_BLUE)
        
        
set_cvar_num("sv_maxspeed"0)
        
        switch(
get_cvar_num(NUM_SM_LANG))
        {
            
//Проголосуйте за следующую карту            
            
case 0:    format(MenuNamesizeof MenuName -1"Проголосуйте за следующую карту")
            case 
1format(MenuNamesizeof MenuName -1"Vote for the next map")
        }
        
        
cmdVoteNextmap()
    }
}

public 
cmdVoteNextmap()
{
    new
        
winlimit,
        
maxrounds
    
    winlimit 
get_cvar_num(NUM_WINLIMIT)
    
maxrounds get_cvar_num(NUM_MAXROUNDS)
    
    new
        
mkeys = ((1<<g_votemaps) + 1),
        
menu[HudLen],
        
a
    
    
new pos format(menuHudLen -1"     \r%s:^n^n"MenuName)
    new 
dmax = (g_mapNums g_votemaps) ? g_votemaps g_mapNums
    
    
new unki 0
    
    
for(g_mapVoteNum 0g_mapVoteNum dmaxg_mapVoteNum++)
    {
        
random_num(0g_mapNums -1)
        
        while(
isInMenu(a))
        {
            if(++
>= g_mapNums)
            {
                
0
            
}
        }
        
        
g_nextName[g_mapVoteNum] = a
        
        pos 
+= format(menu[pos], HudLen -1"     \y%d.\w %a^n"g_mapVoteNum 1ArrayGetStringHandle(g_mapNamea))
        
        
g_saveids[unki] = a
        unki
++
        
        
mkeys |= (1<<g_mapVoteNum)
        
        
g_voteCount[g_mapVoteNum] = 0
    
}
    
    
g_voteCount[g_votemaps] = 0
    g_voteCount
[g_votemaps 1] = 0
    
    
new language get_cvar_num(NUM_SM_LANG)
    
    if(((
winlimit maxrounds) == 0) && (get_cvar_float(FLOAT_TIMELIMIT) < get_cvar_float("amx_extendmap_max")))
    {
        switch(
language)
        {
            
//продлить            
            
case 0pos += format(menu[pos], HudLen -1"     \y%d.\w %s \y[продлить]"g_votemaps 1g_currentMap)
            case 
1pos += format(menu[pos], HudLen -1"     \y%d.\w %s \y[prolong]"g_votemaps 1g_currentMap)
        }
        
        
mkeys |= (1<<g_votemaps)
    }
    
    
set_task(get_cvar_float(NUM_SM_TIME), "checkVotes"TASK_PLUGIN_ID)
    
    new 
players[32], pid
    get_players
(playersPlayersNum)
    for(new 
i=0;i<PlayersNum;i++)
    {
        
pid players[i]
        
        
hasBlind[pid] = true
        
        show_menu
(pidmkeysmenuget_cvar_num(NUM_SM_TIME), "superMapChooserMenu")
        
        switch(
language)
        {
            
//Голосование начато!
            
case 0colorChat(pidCHATCOLOR_GREEN"Голосование начато !")
            case 
1colorChat(pidCHATCOLOR_GREEN"Voting started")
        }
        
        
client_cmd(pid"spk gman/gman_choose1")
        
        
message_begin(MSG_ONEg_msgScreenFade_pid)
        
write_short(1<<12)    // Duration
        
write_short(1<<9)    // Hold time
        
write_short(1<<0)    // Fade type
        
write_byte(0)        // Red
        
write_byte(0)        // Green
        
write_byte(0)        // Blue
        
write_byte(255)        // Alpha
        
message_end()
        
        
set_task(1.0"cmdFadeScreen"pid+TASK_SCREEN_ID""0"b")
    }
    
    
voteStarted true
    
    log_amx
("Super Vote: Voting for the nextmap started")
}

public 
checkVotes()
{
    new 
bolt 0
    
    
for(new 0g_mapVoteNuma++)
    {
        if(
g_voteCount[bolt] < g_voteCount[a])
        {
            
bolt a
        
}
    }
    
    
//clear removed channel #2 :/
    
set_hudmessage(_,_,_,_,_,_,_,_,_,_,2)
    
show_hudmessage(0" ")
    
    new 
players[32], numpid
    get_players
(playersnum)
    
    if((
g_voteCount[g_votemaps] > g_voteCount[bolt]) && (g_voteCount[g_votemaps] > g_voteCount[g_votemaps 1]))
    {    
        new 
Float:steptime get_cvar_float("amx_extendmap_step")
        
        
set_cvar_float(FLOAT_TIMELIMITget_cvar_float(FLOAT_TIMELIMIT) + steptime)
        
        
set_hudmessage(2551270, -1.00.2520.110.00.051.01)
        
        for(new 
i=0;i<num;i++)
        {
            
pid players[i]
            
            switch(
get_cvar_num(NUM_SM_LANG))
            {
                case 
0:
                {
                    
//Голосование завершено. Эта карта продлена на %.0f мин
                    
colorChat(pidCHATCOLOR_GREEN"Голосование завершено.^x01 Эта карта продлена на %.0f мин"steptime)
                    
                    
//Эта карта продлена на %.0f мин
                    
show_hudmessage(pid"Эта карта продлена на %.0f мин"steptime)
                }
                case 
1:
                {
                    
colorChat(pidCHATCOLOR_GREEN"Voting is finished. This map is prolonged on %.0f minutes"steptime)
                    
show_hudmessage(pid"This map is prolonged on %.0f minutes"steptime)
                }
            }
        }
        
        
log_amx("Super Vote: Voting for the nextmap finished. Map %s will be extended to next %.0f minutes"g_currentMapsteptime)
        
        
hasExtend true
        
        cmdReloadTimer
()
        
        return
    }
    
    new 
smap[32]
    
    if(
g_voteCount[bolt] && (g_voteCount[g_votemaps 1] <= g_voteCount[bolt]))
    {
        
ArrayGetString(g_mapNameg_nextName[bolt], smapsizeof smap -1)
        
set_cvar_string(STRING_NEXTMAPsmap)
    }
    
    
get_cvar_string(STRING_NEXTMAPsmapsizeof smap -1)
    
    
set_hudmessage(2551270, -1.00.4220.110.00.051.01)
    
    for(new 
i=0;i<num;i++)
    {
        
pid players[i]
        
        
remove_task(pid+TASK_RESULT_ID)
        
        switch(
get_cvar_num(NUM_SM_LANG))
        {
            case 
0:
            {
                
//Голосование завершено.^x01 Следующая карта:^x04 %s
                
colorChat(pidCHATCOLOR_GREEN"Голосование завершено.^x01 Следующая карта:^x04 %s"smap)
                
                
//Следующая карта %s
                
show_hudmessage(pid"Следующая карта %s"smap)
            }
            case 
1:
            {
                
colorChat(pidCHATCOLOR_GREEN"Voting is finished.^x01 Nextmap:^x04 %s"smap)
                
show_hudmessage(pid"Nextmap will be %s"smap)
            }
        }
    }
    
    
log_amx("Super Vote: Voting for the nextmap finished. The nextmap will be %s"smap)
}

public 
countVote(idkey)
{
    if(!
voteStarted && forceBlock)
        return 
PLUGIN_HANDLED
    
    
if(get_cvar_float("amx_vote_answers"))
    {
        new 
name[32]
        
get_user_name(idnamesizeof name -1)
        
        if(
key == g_votemaps)
        {
            switch(
get_cvar_num(NUM_SM_LANG))
            {
                
//Голосование завершено.^x01 Следующая карта:^x04 %s            
                
case 0colorChat(0CHATCOLOR_GREEN"%s^x01 проголосовал за^x04 продление карты"name)
                case 
1colorChat(0CHATCOLOR_GREEN"%s^x01 chose^x04 map extending"name
            }
        }
        else if(
key g_votemaps)
        {
            new 
map[32]
            
ArrayGetString(g_mapNameg_nextName[key], mapsizeof map -1)
            
            switch(
get_cvar_num(NUM_SM_LANG))
            {
                
//%s^x01 проголосовал за^x04 продление карты
                
case 0colorChat(0CHATCOLOR_GREEN"%s^x01 проголосовал за^x04 %s"namemap)
                case 
1colorChat(0CHATCOLOR_GREEN"%s^x01 chose^x04 %s"namemap)
            }
        }
        
        
cmdShowResults(id+TASK_RESULT_ID)
        
set_task(0.8"cmdShowResults"id+TASK_RESULT_ID""0"b")
    }
    
    
client_cmd(id"spk UI/buttonclickrelease")
    
    
g_voteCount[key]++
    
PlayersVoted++
    
    return 
PLUGIN_HANDLED
}

public 
cmdShowResults(pid)
{
    static 
id
    id 
pid-TASK_RESULT_ID
    
    
if(is_user_connected(id))
    {
        static 
ilenlanguagemessage[HudLen]
        
        
language get_cvar_num(NUM_SM_LANG)
        
        switch(
language)
        {
            
//Результаты голосования
            
case 0len format(messagesizeof message -1"Результаты голосования^n^n")
            case 
1len format(messagesizeof message -1"Results of voting^n^n")
        }
        
        for(
i=0;i<g_votemaps;i++)
        {
            
len += format(message[len], HudLen -1"[%d] | %a^n"g_voteCount[i], ArrayGetStringHandle(g_mapNameg_saveids[i]))
        }
        
        switch(
language)
        {
            case 
0:
            {
                
//продливаемая
                
len += format(message[len], HudLen -1"[%d] | %s [продливаемая]^n^n"g_voteCount[i], g_currentMap)
                
//Всего проголосовало: %d из %d
                
len += format(message[len], HudLen -1"Всего проголосовало: %d из %d"PlayersVotedPlayersNum)
            }
            case 
1:
            {
                
len += format(message[len], HudLen -1"[%d] | %s [prolonged]^n^n"g_voteCount[i], g_currentMap)
                
len += format(message[len], HudLen -1"In total has voted: %d from %d"PlayersVotedPlayersNum)
            }
        }
        
        
set_hudmessage(g_result_redg_result_greeng_result_blue0.360.301.04.00.10.22)
        
show_hudmessage(id"%s"message)
    }
}

public 
EVENT_ScreenFade(id)
{
    if(
hasBlind[id])
    {
        
set_task(0.6"cmdFadeScreen"id+TASK_SCREEN_ID)
    }
}

public 
cmdFadeScreen(pid)
{
    new 
id pid-TASK_SCREEN_ID
    
    
if(is_user_connected(id))
    {
        
message_begin(MSG_ONEg_msgScreenFade_id)
        
write_short(1<<0)    // Duration
        
write_short(1<<0)    // Hold time
        
write_short(1<<2)    // Fade type
        
write_byte(0)        // Red
        
write_byte(0)        // Green
        
write_byte(0)        // Blue
        
write_byte(255)        // Alpha
        
message_end()
    }
}

public 
plugin_end()
{
    new 
current_map[32]
    
    
set_cvar_num("sv_maxspeed"g_maxspeed)
    
    
get_mapname(current_mapsizeof current_map -1)
    
set_localinfo("lastMap"current_map)
}

stock bool:ValidMap(mapname[])
{
    if(
is_map_valid(mapname))
    {
        return 
true
    
}
    
    new 
len strlen(mapname) -4
    
    
if(len 0)
    {
        return 
false
    
}
    
    if(
equali(mapname[len], ".bsp"))
    {
        
mapname[len] = '^0'
        
        
if(is_map_valid(mapname))
        {
            return 
true
        
}
    }
    
    return 
false
}

loadSettings(filename[])
{
    if(!
file_exists(filename))
        return 
0

    
new
        
currentMap[32],
        
szText[32],
        
buff[256]
    
    
get_mapname(currentMapsizeof currentMap -1)

    new 
fp fopen(filename"r")
    
    while(!
feof(fp))
    {
        
buff[0] = '^0'
        
        
fgets(fpbuffsizeof buff -1)
        
        
parse(buffszTextsizeof szText -1)
        
        if((
szText[0] != ';') && ValidMap(szText) && !equali(szTextg_lastMap) && !equali(szTextcurrentMap))
        {
            
ArrayPushString(g_mapNameszText)
            
            
g_mapNums++
        }
    }
    
    
fclose(fp)

    return 
g_mapNums
}

bool:isInMenu(id)
{
    for(new 
0g_mapVoteNuma++)
    {
        if(
id == g_nextName[a])
        {
            return 
true
        
}
    }
    
    return 
false
}

colorChat(idChatColor:color, const msg[], {Float,Sql,Result,_}:...)
{
    new 
teamindexMSG_Type
    
new bool:teamChanged false
    
static message[192]
    
    switch(
color)
    {
        case 
CHATCOLOR_NORMAL// Normal
        
{
            
message[0] = 0x01;
        }
        case 
CHATCOLOR_GREEN// Green
        
{
            
message[0] = 0x04;
        }
        default: 
// Grey, Red, Blue
        
{
            
message[0] = 0x03;
        }
    }
    
    
vformat(message[1], 190msg4);
    
    if(
id == 0)
    {
        
index findAnyPlayer();
        
MSG_Type MSG_ALL;
    }
    else
    {
        
index id;
        
MSG_Type MSG_ONE;
    }
    if(
index != 0)
    {
        
team get_user_team(index);    
        if(
color == CHATCOLOR_RED && team != 1)
        {
            
messageTeamInfo(indexMSG_Typeg_TeamName[1])
            
teamChanged true
        
}
        else
        if(
color == CHATCOLOR_BLUE && team != 2)
        {
            
messageTeamInfo(indexMSG_Typeg_TeamName[2])
            
teamChanged true
        
}
        else
        if(
color == CHATCOLOR_GREY && team != 0)
        {
            
messageTeamInfo(indexMSG_Typeg_TeamName[0])
            
teamChanged true
        
}
        
messageSayText(indexMSG_Typemessage);
        if(
teamChanged)
        {
            
messageTeamInfo(indexMSG_Typeg_TeamName[team])
        }
    }
}

messageSayText(idtypemessage[])
{
    
message_begin(typeg_msgSayText_id)
    
write_byte(id)        
    
write_string(message)
    
message_end()
}
    
messageTeamInfo(idtypeteam[])
{
    
message_begin(typeg_msgTeamInfo_id)
    
write_byte(id)
    
write_string(team)
    
message_end()
}
    
findAnyPlayer()
{
    static 
players[32], inumpid
    
    get_players
(playersinum"ch")
    
    for (new 
0inuma++)
    {
        
pid players[a]
        if(
is_user_connected(pid))
            return 
pid
    
}
    
    return 
0
}

/*
    Плагин сделан на сайте http://www.darktower.su/ по заказу: Курица
    
    Плагины на заказ только у нас!
    http://www.darktower.su/fouroom/showthread.php?t=203
    
    А так же - помощь по серверам, различные статьи, видео уроки и много другого!
    
    Описание:
    Super MapChooser - альтернатива стандарнтому плагину mapchooser.amxx
    До окончания карты экран затухает, игроки останавливаются и предлагается выбрать карту.
    После выбора карты появляются результаты голосования - сколько игроков проголосовали, за какую карту и кол-во проголосовавших.
    По истечению времени голосования написано какая карта будет следующей.

    Переменные (уже прописаны в amxx.cfg):
    На сколько минут продлевать карту, если проголосовали за ее продление.
    amx_extendmap_step "15.0"

    Максимальное количество минут. Когда несколько раз продлевается карта - это значение будет максимальным в timelimit'е.
    amx_extendmap_max "90.0"

    Переменные (можно прописать в amxx.cfg):
    Язык отображения сообщений. (можно изменять в игре)
    mapchooser_lang "0"
    0 - Русский
    1 - English

    Сколько времени в секундах должно идти голосование. (можно изменять в игре до голосования)
    mapchooser_votetime "15"

    Сколько карт выводить на голосование не считая карты, которую продливают в голосовании. (можно изменять в игре - активируется в след. карте)
    mapchooser_votemaps "5"
    Минимальное значение 1, максимальное 8

    Каким цветом показывать результаты голосования. (можно изменять в игре до голосования)
    mapchooser_result_red "255"
    mapchooser_result_green "255"
    mapchooser_result_blue "255"

    Установка плагина:
    1) Плагин super_mapchooser.amxx кладем в папку с плагинами - addons/amxmodx/plugins
    2) Открываем файл addons/amxmodx/configs/plugins.ini
    3) Находим там строчку:
    mapchooser.amxx        ; allows to vote for next map
    4) Вместо нее вставляем строчку:
    super_mapchooser.amxx
    5) Сохраняем изменения
    6) Рестартим сервер...

    Бонусы:
    1) Цветные сообщения.
*/ 


isotonic 04-25-2012 17:31

Re: voting at the beginning of the last round?
 
Here it is.


All times are GMT -4. The time now is 07:43.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.