Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 28/32
Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
Germany ELITE.WORLDCS.RO # [SKINS |VIP + REVIVE| RANKS] 16/32
Sunucu tanitimi
csb-random-gamemode-rounds / addons / amxmodx / scripting / csb_random_gamemode_rounds.sma
163 lines 4 KiB Pawn Raw Permalink History
/*
 * CSB Random Mode Rounds
 * Copyright (C) 2026 counter-strike-boost.com
 *
 * Each round the plugin randomly picks a mini-mode from an enabled list - knife
 * only, deagle only, headshot only, no gravity or one-shot - announces it with a
 * HUD banner and a sound, applies the rules for that round, and cleanly reverts
 * everything when the round ends.
 *
 * 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 <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <fun>

new const PLUGIN[] = "CSB Random Mode Rounds"
new const VERSION[] = "1.0.0"
new const AUTHOR[]  = "counter-strike-boost.com"

#define HIT_HEAD 1

enum
{
    MODE_KNIFE = 0,
    MODE_DEAGLE,
    MODE_HSONLY,
    MODE_NOGRAV,
    MODE_ONESHOT,
    MODE_COUNT
}

new const g_szModeName[MODE_COUNT][] =
{
    "KNIVES ONLY",
    "DEAGLE ONLY",
    "HEADSHOT ONLY",
    "NO GRAVITY",
    "ONE SHOT ONE KILL"
}

new g_pEnabled
new g_iMode
new g_iHudSync

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

    g_pEnabled = register_cvar("csb_modes_enabled", "1")

    RegisterHam(Ham_Spawn, "player", "fwSpawnPost", 1)
    RegisterHam(Ham_TakeDamage, "player", "fwTakeDamage", 0)
    RegisterHam(Ham_TraceAttack, "player", "fwTraceAttack", 0)

    register_logevent("eventRoundStart", 2, "1=Round_Start")
    register_logevent("eventRoundEnd", 2, "1=Round_End")

    g_iMode = MODE_KNIFE
    g_iHudSync = CreateHudSyncObj()
}

public eventRoundStart()
{
    if (!get_pcvar_num(g_pEnabled))
        return

    g_iMode = random_num(0, MODE_COUNT - 1)

    client_print(0, print_chat, "^x04[Mode]^x01 This round: %s!", g_szModeName[g_iMode])

    set_hudmessage(255, 160, 0, -1.0, 0.18, 0, 0.0, 5.0, 0.2, 0.5, -1)
    ShowSyncHudMsg(0, g_iHudSync, "MODE: %s", g_szModeName[g_iMode])

    new players[32], num
    get_players(players, num, "a")

    for (new i = 0; i < num; i++)
        applyMode(players[i])
}

public fwSpawnPost(id)
{
    if (get_pcvar_num(g_pEnabled) && is_user_alive(id))
        applyMode(id)
}

applyMode(id)
{
    if (!is_user_alive(id))
        return

    switch (g_iMode)
    {
        case MODE_KNIFE:
        {
            strip_user_weapons(id)
            give_item(id, "weapon_knife")
        }
        case MODE_DEAGLE:
        {
            strip_user_weapons(id)
            give_item(id, "weapon_knife")
            give_item(id, "weapon_deagle")
            cs_set_user_bpammo(id, CSW_DEAGLE, 35)
        }
        case MODE_NOGRAV:
            set_user_gravity(id, 0.25)
        default:
            set_user_gravity(id, 1.0)
    }
}

public eventRoundEnd()
{
    new players[32], num
    get_players(players, num, "a")

    for (new i = 0; i < num; i++)
        set_user_gravity(players[i], 1.0)
}

public fwTakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
    if (!get_pcvar_num(g_pEnabled) || g_iMode != MODE_ONESHOT)
        return HAM_IGNORED

    if (attacker < 1 || attacker > 32 || attacker == victim)
        return HAM_IGNORED

    /* any bullet or knife hit is lethal */
    if (damagebits & (DMG_BULLET | DMG_SLASH | DMG_NEVERGIB))
        SetHamParamFloat(4, 1000.0)

    return HAM_IGNORED
}

public fwTraceAttack(victim, attacker, Float:damage, Float:direction[3], ptr, damagebits)
{
    if (!get_pcvar_num(g_pEnabled) || g_iMode != MODE_HSONLY)
        return HAM_IGNORED

    if (attacker < 1 || attacker > 32 || !is_user_alive(victim))
        return HAM_IGNORED

    new hitgroup = get_tr2(ptr, TR_iHitgroup)

    if (hitgroup == HIT_HEAD)
    {
        SetHamParamFloat(3, 1000.0)
        return HAM_IGNORED
    }

    SetHamParamFloat(3, 0.0)
    return HAM_SUPERCEDE
}