ReAPI 5.24 + m_signals = 0

Сообщения
526
Реакции
461
Предупреждения
16
Помог
9 раз(а)
Refresh,
C++:
//    Copyright © 2024 Vaqtincha

#include <amxmodx>
#include <reapi>


public plugin_init()
{
    register_plugin("buyZone", "0.1", "Vaqtincha")
    
    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip", .post = true)

    register_clcmd("radio3", "CheckBuyZone")
}

public CheckBuyZone(pPlayer)
{
    client_print(pPlayer, print_chat, "buyzone_custom ? %s", rg_user_in_buyzone_custom(pPlayer) ? "YES" : "NO")
    client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
    
    return PLUGIN_HANDLED
}

public CBasePlayer_OnSpawnEquip(const pPlayer, bool:addDefault, bool:equipGame)
{
    client_print(pPlayer, print_chat, "buyzone_custom ? %s", rg_user_in_buyzone_custom(pPlayer) ? "YES" : "NO")
    client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
}

// обычный штатный
stock bool:rg_user_in_buyzone_signal(const pPlayer)
{
    new iSignals[UnifiedSignals]
    get_member(pPlayer, m_signals, iSignals)
    
    return bool:(SignalState:iSignals[US_State] & SIGNAL_BUY)
}


// свой новый
stock bool:rg_user_in_buyzone_custom(const pPlayer)
{
    // нет необходимости OLD_CheckBuyZone. проблема возникает только на картах где есть триггер func_buyzone
    // return bool:(get_member_game(m_bMapHasBuyZone) ? IsPlayerInBuyZOne(pPlayer) : OLD_CheckBuyZone(pPlayer))

    //.....
    
    // если есть триггер func_buyzone то свою вызываем а если нету то обычный штатный
    return bool:(get_member_game(m_bMapHasBuyZone) ? IsPlayerInBuyZOne(pPlayer) : rg_user_in_buyzone_signal(pPlayer))
}

// он немного строгий. игрок должен находиться внутри байзоны полностью (по высоте не имеет значение)
// entity_intersects нам не подойдет
bool:IsPlayerInBuyZOne(const pPlayer)
{
    new Float:player_absmax[3], Float:player_absmin[3]
    new Float:buyzone_absmax[3], Float:buyzone_absmin[3]
    
    get_entvar(pPlayer, var_absmin, player_absmin)   
    get_entvar(pPlayer, var_absmax, player_absmax)   
    
    new pBuyZone = NULLENT, buyzone_team, player_team = get_member(pPlayer, m_iTeam)
    
    while ((pBuyZone = rg_find_ent_by_class(pBuyZone, "func_buyzone")))
    {
        buyzone_team = get_entvar(pBuyZone, var_team)
        
        if (buyzone_team == any:TEAM_UNASSIGNED || buyzone_team == player_team)
        {
            get_entvar(pBuyZone, var_absmin, buyzone_absmin)   
            get_entvar(pBuyZone, var_absmax, buyzone_absmax)

            if (buyzone_absmin[0] > player_absmin[0] || buyzone_absmin[1] > player_absmin[1])
                return false
            
            if (buyzone_absmax[0] < player_absmax[0] || buyzone_absmax[1] < player_absmax[1])
                return false
        }
    }

    return true
}


// в этом стоке нет необходимости . проблема возникает только на картах где есть триггер func_buyzone
stock bool:OLD_CheckBuyZone(const pPlayer)
{
    new any:iTeam = get_member(pPlayer, m_iTeam)
    
    if (!CanPlayerBuy(iTeam))
        return false
    
    new pszSpawnClass[32]
    
    if (iTeam == TEAM_TERRORIST)
        pszSpawnClass = "info_player_deathmatch"
    else if (iTeam == TEAM_CT)
        pszSpawnClass = "info_player_start"
    
    if (pszSpawnClass[0])
    {
        new pSpot = NULLENT
        new Float:player_origin[3], Float:spot_origin[3]
    
        get_entvar(pPlayer, var_origin, player_origin)
    
        while ((pSpot = rg_find_ent_by_class(pSpot, pszSpawnClass)))
        {
            get_entvar(pSpot, var_origin, spot_origin)
            
            if (get_distance_f(spot_origin, player_origin) < 200.0)
            {
                return true   
            }
        }
    }
    
    return false
}

// restrict by maprules
stock bool:CanPlayerBuy(any:iTeam)
{
    if ((iTeam == TEAM_CT && get_member_game(m_bCTCantBuy)) || (iTeam == TEAM_TERRORIST && get_member_game(m_bTCantBuy)))
    {
        return false
    }
    
    return true
}


C++:
//    Copyright © 2024 Vaqtincha

#include <amxmodx>
#include <reapi>
#include <hamsandwich>

public plugin_init()
{
    register_plugin("buyZone", "0.1", "Vaqtincha")
    
    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip", .post = true)

    register_clcmd("radio3", "CheckBuyZone")
}

public CheckBuyZone(pPlayer)
{
    client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
    
    return PLUGIN_HANDLED
}

public CBasePlayer_OnSpawnEquip(const pPlayer, bool:addDefault, bool:equipGame)
{
    // Тач происходит после спавна игрока. форсим тач
    
    // нет необходимости проверки команды
    new pBuyZone = NULLENT//, buyzone_team, player_team = get_member(pPlayer, m_iTeam)
    while ((pBuyZone = rg_find_ent_by_class(pBuyZone, "func_buyzone")))
    {
        // buyzone_team = get_entvar(pBuyZone, var_team)
        
        // if (buyzone_team == any:TEAM_UNASSIGNED || buyzone_team == player_team)
            ExecuteHamB(Ham_Touch, pBuyZone, pPlayer)
    }
    
    client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
}

stock bool:rg_user_in_buyzone_signal(const pPlayer)
{
    new iSignals[UnifiedSignals]
    get_member(pPlayer, m_signals, iSignals)
    
    // проблема только с триггером func_buyzone так что тут Signal проверяем после нашего насильного тача
    return bool:(SignalState:iSignals[get_member_game(m_bMapHasBuyZone) ? US_Signal : US_State] & SIGNAL_BUY)
}
10 Апр 2024
Зато сколько опыта и эмоций
и еще говнокода :rofl:
 
Сообщения
253
Реакции
83
Vaqtincha, Спасибо, за примеры. По отдельности предложенные вами решения 1,2 не работают... можно проверять на dust2, inferno, nuke, train, valpo2. Весь этот неговнокод нужно "объединять" :pardon:С тачем там тоже проблемка была... Так что самый универсальный и производительный метод определения байзоны - координатный.
 
Сообщения
526
Реакции
461
Предупреждения
16
Помог
9 раз(а)
Refresh, ну у меня везде работают. Без проверки я не скинул бы код.
 
Сообщения
253
Реакции
83
Vaqtincha, Решение №1, сверху работа говнокода, потом две строчки ваши :dntknw:
1712755423589.png
 
Сообщения
526
Реакции
461
Предупреждения
16
Помог
9 раз(а)
Refresh, это листен сервер?
 
Сообщения
253
Реакции
83
Vaqtincha, 93.85.88.50:27017.

У меня тоже "не сработало" на de_agrena.... из-за #define ACS_MAX_BUYZONES 20, оказалось мапер создал 21х21 точек спавна... и моего массива не хватило... Скорее всего, для @avice и большинства постояльцев это само собой разумеющийся факт... но для меня стало очередным сюрпризом :pardon:

Фикс #define ACS_MAX_BUYZONES 33, на случай если маперы создадут карту 32х32...:scratch_one-s_head:
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
Refresh, слотов то и больше может быть, тогда чего делать?)
 
Сообщения
253
Реакции
83
d3m37r4, а зачем их больше, если игроков 32? просто искать определенный класс в цикле по всем объектам, каждый раз - это фу.
 

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
Refresh, а если будет больше?:D
 
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)
Vaqtincha, я к его решению написал, что его фикс не решает проблему множества байзон.
 
Сообщения
253
Реакции
83
Noob_with_cheats, не может такого быть... что это за карты, например? я не понимаю какой в этом смысл, если игроков 32.
 
Сообщения
3,381
Реакции
1,480
Помог
124 раз(а)
Refresh, кто-то запрещает мапперам сделать сколько угодно спавнов?
 
Сообщения
253
Реакции
83
Nordic Warrior, обычно, это здравый смысл. Есть же какие-то ограничения по количеству объектов на карте и абсолютно ненужные и лишние спавны создавать просто глупо.
 

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

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