Выдача оружия за лучший урон в новом раунде

Сообщения
143
Реакции
68
Помог
1 раз(а)
Всем привет.
Дорогие знатоки. Прошу Вашей помощи.
Хочу добавить в плагин https://dev-cs.ru/resources/273/ возможность выдачи рандомного оружия как бонус вместе с деньгами в новом раунде.
Из оригинала удалил только все что связанно с выводом в чат и HUD, мне это не нужно. Добавил выдачу рандомного оружия.
Теперь мне надо подсказку, как сделать чтобы деньги и оружие, или хоть оружие выдавалось в новом раунде.
Сей час работает, но выдает в конце раунда и при условии что игрок остался жив. Поэтому мне нужно чтобы это все работало с нового раунда.
Вот получилось так, если что не так поправте).

Код:
#include <amxmodx>
#include <reapi>

new const g_Cases[] = {2, 0, 1, 1, 1, 2};

new g_FriendlyFire = false;
new g_MoneyBonus;

enum _:PLAYER_DATA {
    PLAYER_KILLS,
    PLAYER_DMG,
    PLAYER_HS
}

new g_PlayerData[MAX_CLIENTS + 1][PLAYER_DATA];
new g_CvarFriendlyFire, g_CvarMoney;

public plugin_init() {
    register_plugin("Best player of the round", "0.4", "F@nt0M");

    register_dictionary("best_player_of_round.txt");

    RegisterHookChain(RG_RoundEnd, "RoundEnd", 1);
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", 1);
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", 1);

    g_CvarMoney = register_cvar("bpr_money", "1000");                        // 0 - отключить выдачу денег , значение выше нуля - сколько денег получит игрок
    bind_pcvar_num(g_CvarMoney, g_MoneyBonus);

    g_CvarFriendlyFire = get_cvar_pointer("mp_friendlyfire");
    bind_pcvar_num(g_CvarFriendlyFire, g_FriendlyFire);
}

public OnConfigsExecuted() {
    g_MoneyBonus = get_pcvar_num(g_CvarMoney);
    g_FriendlyFire = get_pcvar_num(g_CvarFriendlyFire);
}

public WeaponRandom(id)
{
    switch(random(4))
    {
        case 0:
        {
            rg_give_item(id, "weapon_m4a1");
            rg_set_user_bpammo(id, WEAPON_M4A1, 90);
        }
        case 1:
        {
            rg_give_item(id, "weapon_ak47");
            rg_set_user_bpammo(id, WEAPON_AK47, 90);
        }
        case 2:
        {
            rg_give_item(id, "weapon_mp5navy");
            rg_set_user_bpammo(id, WEAPON_MP5N, 120);
        }
        case 3:
        {
            rg_give_item(id, "weapon_sg550");
            rg_set_user_bpammo(id, WEAPON_SG550, 90);
        }
    }   
}

public client_disconnected(id) {
    arrayset(g_PlayerData[id], 0, PLAYER_DATA);
}

public RoundEnd(WinStatus:status, ScenarioEventEndRound:event) {
    #pragma unused status

    if (event == ROUND_GAME_COMMENCE || event == ROUND_GAME_RESTART || event == ROUND_GAME_OVER) {
        return HC_CONTINUE;
    }

    if (get_playersnum(0) <= 0) {
        return HC_CONTINUE;
    }

    set_task(1.0, "TaskRoundEnd");

    return HC_CONTINUE;
}

public CBasePlayer_TakeDamage(id, inflictor, attacker, Float:damage, damageType) {
    if (id == attacker || attacker < 1 || attacker > MaxClients) {
        return HC_CONTINUE;
    }

    if (g_FriendlyFire && get_member(id, m_iTeam) == get_member(attacker, m_iTeam)) {
        return HC_CONTINUE;
    }

    if (inflictor != attacker && ~damageType & DMG_GRENADE) {
        return HC_CONTINUE;
    }

    g_PlayerData[attacker][PLAYER_DMG] += floatround(damage);

    if( get_member(id, m_LastHitGroup) == HIT_HEAD) {
        g_PlayerData[attacker][PLAYER_HS]++;
    }

    return HC_CONTINUE;
}

public CBasePlayer_Killed(id, attacker) {
    if (id == attacker || attacker < 1 || attacker > MaxClients) {
        return HC_CONTINUE;
    }

    if (g_FriendlyFire && get_member(id, m_iTeam) == get_member(attacker, m_iTeam)) {
        return HC_CONTINUE;
    }

    g_PlayerData[attacker][PLAYER_KILLS]++;

    return HC_CONTINUE;
}

public TaskRoundEnd() {
    new players[MAX_CLIENTS], num, player, i;
    new maxId, maxKills, maxDmg;
    new name[MAX_NAME_LENGTH];

    get_players(players, num, "h");
    for (i = 0; i < num; i++) {
        player = players[i];
        if (g_PlayerData[player][PLAYER_KILLS] > maxKills || g_PlayerData[player][PLAYER_DMG] > maxDmg) {
            maxId = player;
            maxKills = g_PlayerData[player][PLAYER_KILLS];
            maxDmg = g_PlayerData[player][PLAYER_DMG];
        }
    }

    if (maxId == 0) {
        return;
    }
  
    if (g_MoneyBonus > 0) {
        rg_add_account(maxId, g_MoneyBonus, AS_ADD, true);
        WeaponRandom(player);
    }
    get_user_name(maxId, name, charsmax(name));
    for (i = 0; i < num; i++) {
        player = players[i];
        if (is_user_bot(player)) {
            continue;
        }
    }

    for(i = 0; i <= MAX_CLIENTS; i++) {
        arrayset(g_PlayerData[i], 0, PLAYER_DATA);
    }
}

stock makeNumber(number) {
    if (4 < (number % 100) < 20) {
        return 2;
    } else if ((number % 10) < 5) {
        return g_Cases[number % 10];
    } else {
        return 2;
    }
}
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Запоминать ид игрока, и при спавне выдавать
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, я так понимаю, надо тогда подключать:
Код:
RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true)
ну и потом уже
Код:
public fwdPlayerSpawnPost(id)

{

    if(is_user_alive(id) && g_PlayerData[player][PLAYER_DMG])

        WeaponRandom(id);

}
Как то так? Пока это то что на ум пришло :)
 
Последнее редактирование:
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, ну тогда надо убрать значит
Код:
WeaponRandom(id);
с

Код:
if (g_MoneyBonus > 0) {
        rg_add_account(maxId, g_MoneyBonus, AS_ADD, true);
        WeaponRandom(player);
Или нет? На счет "почти верно" дайте подсказку).
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
roten, maxId переменуую нужно сделать глобальной, чтобы в спавне было с чем сравнивать
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, Хммм.... нууу тогда значит так

Код:
public fwdPlayerSpawnPost(id)

{
    new maxID;
    if(is_user_alive(id) && maxID)

        WeaponRandom(id);

}
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
roten, вы начали в верном напрвлении двигатся с хуком. Но вот с переменной...
Мне с телефона сейчас не совсем удобно. Но maxId нужно вынести за пределы функций, чтобы она стала видна везде. Ну и в спавне должна быть проверка id == maxId
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, получилось так:
В начале самом:
Код:
new maxID;
Дальше:
Код:
public fwdPlayerSpawnPost(id)

{
    new maxID;
    if(is_user_alive(id) && maxID == id)

        WeaponRandom(id);

}
Если я все верно понял.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
roten, в хуке спавна убрать new maxId. И еще в конце раунда
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, Да я так и сделал. Это я понял. Вынес
Код:
maxId
и убрал с
Код:
public TaskRoundEnd
Код:
#include <amxmodx>
#include <reapi>

new const g_Cases[] = {2, 0, 1, 1, 1, 2};

new g_FriendlyFire = false;
new g_MoneyBonus, maxId;
Вопрос остается только убрать или оставить
Код:
WeaponRandom(id);
с
Код:
if (g_MoneyBonus > 0) {
        rg_add_account(maxId, g_MoneyBonus, AS_ADD, true);
        WeaponRandom(player);
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, все скомпилилось, но оружие не выдает. Деньги выдает. Может еще что то упустил я.
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom,
Код:
#include <amxmodx>
#include <reapi>

new const g_Cases[] = {2, 0, 1, 1, 1, 2};

new g_FriendlyFire = false;
new g_MoneyBonus, maxId;

enum _:PLAYER_DATA {
    PLAYER_KILLS,
    PLAYER_DMG,
    PLAYER_HS
}

new g_PlayerData[MAX_CLIENTS + 1][PLAYER_DATA];
new g_CvarFriendlyFire, g_CvarMoney;

public plugin_init() {
    register_plugin("Best player of the round", "0.4", "F@nt0M");

    register_dictionary("best_player_of_round.txt");

    RegisterHookChain(RG_RoundEnd, "RoundEnd", 1);
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", 1);
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", 1);
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true)

    g_CvarMoney = register_cvar("bpr_money", "1000");                        // 0 - отключить выдачу денег , значение выше нуля - сколько денег получит игрок
    bind_pcvar_num(g_CvarMoney, g_MoneyBonus);

    g_CvarFriendlyFire = get_cvar_pointer("mp_friendlyfire");
    bind_pcvar_num(g_CvarFriendlyFire, g_FriendlyFire);
}

public OnConfigsExecuted() {
    g_MoneyBonus = get_pcvar_num(g_CvarMoney);
    g_FriendlyFire = get_pcvar_num(g_CvarFriendlyFire);
}

public WeaponRandom(id)
{
    switch(random(4))
    {
        case 0:
        {
            rg_give_item(id, "weapon_m4a1");
            rg_set_user_bpammo(id, WEAPON_M4A1, 90);
        }
        case 1:
        {
            rg_give_item(id, "weapon_ak47");
            rg_set_user_bpammo(id, WEAPON_AK47, 90);
        }
        case 2:
        {
            rg_give_item(id, "weapon_mp5navy");
            rg_set_user_bpammo(id, WEAPON_MP5N, 120);
        }
        case 3:
        {
            rg_give_item(id, "weapon_sg550");
            rg_set_user_bpammo(id, WEAPON_SG550, 90);
        }
    }   
}

public client_disconnected(id) {
    arrayset(g_PlayerData[id], 0, PLAYER_DATA);
}

public RoundEnd(WinStatus:status, ScenarioEventEndRound:event) {
    #pragma unused status

    if (event == ROUND_GAME_COMMENCE || event == ROUND_GAME_RESTART || event == ROUND_GAME_OVER) {
        return HC_CONTINUE;
    }

    if (get_playersnum(0) <= 0) {
        return HC_CONTINUE;
    }

    set_task(1.0, "TaskRoundEnd");

    return HC_CONTINUE;
}

public CBasePlayer_TakeDamage(id, inflictor, attacker, Float:damage, damageType) {
    if (id == attacker || attacker < 1 || attacker > MaxClients) {
        return HC_CONTINUE;
    }

    if (g_FriendlyFire && get_member(id, m_iTeam) == get_member(attacker, m_iTeam)) {
        return HC_CONTINUE;
    }

    if (inflictor != attacker && ~damageType & DMG_GRENADE) {
        return HC_CONTINUE;
    }

    g_PlayerData[attacker][PLAYER_DMG] += floatround(damage);

    if( get_member(id, m_LastHitGroup) == HIT_HEAD) {
        g_PlayerData[attacker][PLAYER_HS]++;
    }

    return HC_CONTINUE;
}

public CBasePlayer_Killed(id, attacker) {
    if (id == attacker || attacker < 1 || attacker > MaxClients) {
        return HC_CONTINUE;
    }

    if (g_FriendlyFire && get_member(id, m_iTeam) == get_member(attacker, m_iTeam)) {
        return HC_CONTINUE;
    }

    g_PlayerData[attacker][PLAYER_KILLS]++;

    return HC_CONTINUE;
}

public TaskRoundEnd() {
    new players[MAX_CLIENTS], num, player, i;
    new maxKills, maxDmg;
    new name[MAX_NAME_LENGTH];

    get_players(players, num, "h");
    for (i = 0; i < num; i++) {
        player = players[i];
        if (g_PlayerData[player][PLAYER_KILLS] > maxKills || g_PlayerData[player][PLAYER_DMG] > maxDmg) {
            maxId = player;
            maxKills = g_PlayerData[player][PLAYER_KILLS];
            maxDmg = g_PlayerData[player][PLAYER_DMG];
        }
    }

    if (maxId == 0) {
        return;
    }
    
    if (g_MoneyBonus > 0) {
        rg_add_account(maxId, g_MoneyBonus, AS_ADD, true);
        //WeaponRandom(player);
    }
    get_user_name(maxId, name, charsmax(name));
    for (i = 0; i < num; i++) {
        player = players[i];
        if (is_user_bot(player)) {
            continue;
        }
    }

    for(i = 0; i <= MAX_CLIENTS; i++) {
        arrayset(g_PlayerData[i], 0, PLAYER_DATA);
    }
}

public fwdPlayerSpawnPost(player)

{
    new maxID;
    if(is_user_alive(player) && maxID == player)

        WeaponRandom(player);

}

stock makeNumber(number) {
    if (4 < (number % 100) < 20) {
        return 2;
    } else if ((number % 10) < 5) {
        return g_Cases[number % 10];
    } else {
        return 2;
    }
}
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fantom, Большое спасибо за помощь. Хотел еще спросить, правильно ли я сделал ограничение по раундах?
Код:
new g_pCvarRoundAccess, g_iRoundCounter;
Дальше:
Код:
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_event("TextMsg", "event_restart_game", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
Потом сам квар:
Код:
g_pCvarRoundAccess = register_cvar("round_access", "3");
Потом для начала и рестарта раунда:
Код:
public event_round_start()
{
    g_iRoundCounter++
}

public event_restart_game()
{
    g_iRoundCounter = 0
}
Ну и условие на спавне:
Код:
public fwdPlayerSpawnPost(player)
{
    if (g_iRoundCounter < get_pcvar_num(g_pCvarRoundAccess)) {  
        return HC_CONTINUE;
    }

    if(is_user_alive(player) && maxId == player) {
        WeaponRandom(player);
    }

    return HC_CONTINUE;
}
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
roten, используйте так же правильные хуки. Вам не хук спавна нужен, а момент выдачи оружия
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
wopox1337, тогда посоветуйте, какой хук будет правильно использовать.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу