First Players Respawn

First Players Respawn 22.08.2025

Нет прав для скачивания
C++:
#include <amxmisc>
#include <reapi>

#define FNullString(%0)     (!%0[0] || %0[0] == '0' || strlen(%0) <= 0)
#define VALID_PLAYER(%0)    (1 <= %0 <= MaxClients)

// ConVars
new fpr_round;
new fpr_min_players;
new fpr_domination;
new fpr_respawn[TeamName];
new fpr_money;
new fpr_money_firstround;
new fpr_prevent_suicide;
new fpr_only_once;
new Float:fpr_time;
new Float:fpr_protection;
new fpr_flag[16];
new fpr_sound[64];
new fpr_chat_message;

new g_pAccessFlag;
new g_iRespawnCount[TeamName];

public plugin_precache()
{
    register_plugin("FirstPlayersRespawn", "22.08.2025", "@emmajule");
   
    parse_cfg();
   
    if (!FNullString(fpr_sound)) {
        precache_sound(fpr_sound);
    }
}

public plugin_init()
{
    register_dictionary("FirstPlayersRespawn.txt");
   
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", true);
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound", true);
}

public plugin_cfg()
{
    g_pAccessFlag = read_flags_ex(fpr_flag);
}

public CSGameRules_RestartRound()
{
    g_iRespawnCount[TEAM_CT] = 0;
    g_iRespawnCount[TEAM_TERRORIST] = 0;
}

public CBasePlayer_Killed(const id, const attacker, gib)
{
    if (rg_get_current_round() < fpr_round) {
        return;
    }
   
    if (g_pAccessFlag > 0 && !(get_user_flags(id) & g_pAccessFlag)) {
        return;
    }
   
    new Float:gameTime = get_gametime();
    if (gameTime - Float:get_member_game(m_fRoundStartTimeReal) > fpr_time) {
        return;
    }
   
    if (fpr_prevent_suicide && (id == attacker || !VALID_PLAYER(attacker))) {
        return;
    }
   
    if (fpr_only_once && get_member(id, m_iNumSpawns) != 1) {
        return;
    }
   
    if (get_member_game(m_iNumSpawnableTerrorist) + get_member_game(m_iNumSpawnableCT) < fpr_min_players) {
        return;
    }
   
    new TeamName:team = get_member(id, m_iTeam);
    if (fpr_domination > 0 && team == rg_get_team_wins_row(fpr_domination)) {
        return;
    }
   
    new spawnCount = g_iRespawnCount[team];
    if (spawnCount >= fpr_respawn[team]) {
        return;
    }
   
    // set_entvar(id, var_deadflag, DEAD_RESPAWNABLE);
    set_member(id, m_flRespawnPending, gameTime + 0.1);
    set_member(id, m_flSpawnProtectionEndTime, gameTime + fpr_protection);
    g_iRespawnCount[team] = spawnCount + 1;
   
    if (fpr_money_firstround && rg_get_current_round() == 1)
    {
        rg_add_account(id, get_cvar_num("mp_startmoney"), AS_SET, false);
    }
    else if (fpr_money > 0)
    {
        rg_add_account(id, fpr_money, .bTrackChange = false);
    }
   
    if (fpr_chat_message) {
        client_print_color(id, 0, "%l %l", "FPR_TAG", "FPR_MSG", fpr_respawn[team]);
    }
   
    if (!FNullString(fpr_sound)) {
        client_cmd(id, "spk ^"%s^"", fpr_sound);
    }
}

parse_cfg()
{
    bind_pcvar_num(create_cvar("fpr_round", "0", .description = "С какого раунда работает плагин"), fpr_round);
    bind_pcvar_num(create_cvar("fpr_min_players", "24", .description = "Минимальное количество игроков для работы плагина (не считая зрителей)"), fpr_min_players);
    bind_pcvar_num(create_cvar("fpr_domination", "0", .description = "Если одна команда доминирует над другой (побед подряд) то для этой команды плагин работать не будет"), fpr_domination);
    bind_pcvar_num(create_cvar("fpr_respawn_t", "2", .description = "Сколько максимально игроков из команды TERRORIST сможет возродить плагин"), fpr_respawn[TEAM_TERRORIST]);
    bind_pcvar_num(create_cvar("fpr_respawn_ct", "2", .description = "Сколько максимально игроков из команды CT сможет возродить плагин"), fpr_respawn[TEAM_CT]);
    bind_pcvar_num(create_cvar("fpr_money", "300", .description = "Денежная компенсация при спавне игрока этим плагином"), fpr_money);
    bind_pcvar_num(create_cvar("fpr_money_firstround", "1", .description = "Если это первый раунд то при спавне игрок получит 800$."), fpr_money_firstround);
    bind_pcvar_num(create_cvar("fpr_prevent_suicide", "1", .description = "Если игрок совершил суицид, плагин в любом случае его проигнорирует"), fpr_prevent_suicide);
    bind_pcvar_num(create_cvar("fpr_only_once", "1", .description = "Плагин не будет работать для тех кто уже был заспавнен как то еще в этом раунде."), fpr_only_once);
    bind_pcvar_float(create_cvar("fpr_time", "6", .description = "Плагин будет работать только первые Х сек. раунда"), fpr_time);
    bind_pcvar_float(create_cvar("fpr_protection", "0", .description = "Защита при спавне для возрожденного игрока"), fpr_protection);
    bind_pcvar_string(create_cvar("fpr_flag", "", .description = "Флаг доступа к действиям плагина^nИспользуйте 0 чтобы работало для всех без исключения, или пустые ковычки"), fpr_flag, charsmax(fpr_flag));
    bind_pcvar_string(create_cvar("fpr_sound", "", .description = "Проигрывание звук в момент спавна^nИспользуйте 0 чтобы отключить или пустые ковычки"), fpr_sound, charsmax(fpr_sound));
    bind_pcvar_num(create_cvar("fpr_chat_message", "1", .description = "Показывать чат сообщение в момент спавна"), fpr_chat_message);
   
    new path[PLATFORM_MAX_PATH];
    get_configsdir(path, charsmax(path));
    // strcat(path, "/plugins/FirstPlayersRespawn.cfg", charsmax(path));
    strcat(path, "/FirstPlayersRespawn.cfg", charsmax(path));
   
    server_cmd("exec %s", path);
    server_exec();
}

stock rg_get_current_round()
{
    return (get_member_game(m_iTotalRoundsPlayed) + 1);
}

stock TeamName:rg_get_team_wins_row(const wins)
{
    if (get_member_game(m_iNumConsecutiveCTLoses) >= wins)
        return TEAM_TERRORIST;
    else if (get_member_game(m_iNumConsecutiveTerroristLoses) >= wins)
        return TEAM_CT;
   
    // Noting to found
    return TEAM_UNASSIGNED;
}

stock read_flags_ex(const flags[])
{
    if (FNullString(flags)) {
        return ADMIN_ALL;
    }
   
    return read_flags(flags);
}
Назад
Верх