Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 22/32
Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
France EMIRATES.KiNGS 亗 GAMEAREA ||͇̿P͇̿U͇̿B͇̿L͇̿I͇̿C͇̿| ✪ 32/32
Promuj serwer
csb-admin-extend-map / addons / amxmodx / scripting / csb_extend_map.sma
171 lines 4.6 KiB Pawn Raw Permalink History
/*
 * CSB Extend Map
 * Copyright (C) 2026 counter-strike-boost.com
 *
 * amx_extendmap adds N minutes to mp_timelimit and re-broadcasts the new time
 * left. Players can also start a vote (say /extend) to extend the current map
 * once, capped by a max-extensions cvar so a map can never run forever.
 *
 * Inspired by the map-extension commands from the AMX Mod X map management
 * plugin (AMX Mod X Development Team). Independent GPL re-implementation.
 *
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version. It is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See <https://www.gnu.org/licenses/> for details.
 */

#include <amxmodx>
#include <amxmisc>

new const PLUGIN[] = "CSB Extend Map"
new const VERSION[] = "1.0.0"
new const AUTHOR[]  = "counter-strike-boost.com"

new g_pTimeLimit
new g_pDefaultMin, g_pMaxExtends, g_pVoteMin

new g_iExtends = 0
new bool:g_bVoteRunning = false
new g_iYes, g_iNo

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    g_pTimeLimit  = get_cvar_pointer("mp_timelimit")

    g_pDefaultMin = register_cvar("csb_extend_minutes", "15")
    g_pMaxExtends = register_cvar("csb_extend_max", "3")
    g_pVoteMin    = register_cvar("csb_extend_votemin", "15")

    register_concmd("amx_extendmap", "cmdExtend", ADMIN_MAP, "[minutes] - add time to mp_timelimit")
    register_clcmd("say /extend", "cmdVote")
    register_clcmd("say_team /extend", "cmdVote")
}

public plugin_cfg()
{
    g_iExtends = 0
}

extendBy(minutes)
{
    new cur = g_pTimeLimit ? get_pcvar_num(g_pTimeLimit) : get_cvar_num("mp_timelimit")
    new next = cur + minutes

    if (g_pTimeLimit)
        set_pcvar_num(g_pTimeLimit, next)
    else
        set_cvar_num("mp_timelimit", next)

    g_iExtends++

    new left = get_timeleft() / 60
    client_print(0, print_chat, "[CSB] Map extended by %d minute(s). New limit: %d min, about %d min left.",
        minutes, next, left)
}

public cmdExtend(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return PLUGIN_HANDLED

    new minutes = get_pcvar_num(g_pDefaultMin)

    if (read_argc() > 1)
    {
        new arg[8]
        read_argv(1, arg, charsmax(arg))
        new n = str_to_num(arg)

        if (n > 0)
            minutes = n
    }

    extendBy(minutes)

    new aname[32]
    if (id)
        get_user_name(id, aname, charsmax(aname))
    else
        copy(aname, charsmax(aname), "CONSOLE")

    log_amx("[CSB Extend] %s extended the map by %d min", aname, minutes)
    return PLUGIN_HANDLED
}

public cmdVote(id)
{
    if (g_bVoteRunning)
    {
        client_print(id, print_chat, "[CSB] A vote is already running.")
        return PLUGIN_HANDLED
    }

    if (g_iExtends >= get_pcvar_num(g_pMaxExtends))
    {
        client_print(id, print_chat, "[CSB] This map has already been extended the maximum number of times.")
        return PLUGIN_HANDLED
    }

    g_bVoteRunning = true
    g_iYes = 0
    g_iNo = 0

    new menu = menu_create("\yExtend the map?^n\wIt will add time to the current map.", "voteHandler")
    menu_additem(menu, "\wYes, extend", "1", 0)
    menu_additem(menu, "\wNo", "2", 0)
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)

    new players[32], num, pid
    get_players(players, num, "ch")

    for (new i = 0; i < num; i++)
    {
        pid = players[i]
        menu_display(pid, menu, 0)
    }

    client_print(0, print_chat, "[CSB] Vote started: extend the current map?")
    set_task(15.0, "voteEnd")
    return PLUGIN_HANDLED
}

public voteHandler(id, menu, item)
{
    if (item == MENU_EXIT || item < 0)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }

    new info[4], name[32], access, callback
    menu_item_getinfo(menu, item, access, info, charsmax(info), name, charsmax(name), callback)
    menu_destroy(menu)

    if (str_to_num(info) == 1)
        g_iYes++
    else
        g_iNo++

    return PLUGIN_HANDLED
}

public voteEnd()
{
    g_bVoteRunning = false

    if (g_iYes > g_iNo)
    {
        client_print(0, print_chat, "[CSB] Vote passed (%d yes / %d no). Extending the map.", g_iYes, g_iNo)
        extendBy(get_pcvar_num(g_pVoteMin))
        log_amx("[CSB Extend] player vote passed (%d/%d), map extended", g_iYes, g_iNo)
    }
    else
    {
        client_print(0, print_chat, "[CSB] Vote failed (%d yes / %d no). The map will not be extended.", g_iYes, g_iNo)
    }
}