Как переключить наблюдение за следующим игроком

Сообщения
20
Реакции
-1
Делаю плагин, чтобы за админом не могли наблюдать
В момент наблюдения за игроком с определенным флагом хочу выполнить команду client_cmd(id, "+attack; wait; -attack;"); для того игрока, который наблюдает, но на многих сборках она блокируется, а через engclient не работает, как можно это сделать через reapi/fakemeta? как то такого плана? pev(id, pev_iuser2, id_next), надо каким то образом тогда получать id следующего игрока в id_next
 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
Сообщения
20
Реакции
-1
Vaqtincha, строчки 98-101
31 Июл 2024
Через engclient_cmd и amxclient_cmd я так понимаю точно не получится, т.к. команда полностью выполняется на стороне клиента, остается только менять каким-то образом с помощью pev_iuser2
 

Вложения

Сообщения
20
Реакции
-1
пробовал set_pev(dead, pev_iuser2, alive++); но в итоге просто меняется индекс для alive на одного и того же следующего игрока (мертвого/живого)
 
Сообщения
20
Реакции
10
Помог
1 раз(а)
Код:
new is_player_can_switch_observer_modes = get_member(player_id, m_canSwitchObserverModes);
set_member(player_id, m_canSwitchObserverModes, true);
set_member(player_id, m_flNextFollowTime, 0.0);

engclient_cmd(player_id, "follownext", "1" или "0");

set_member(player_id, m_canSwitchObserverModes, is_player_can_switch_observer_modes);
 
Последнее редактирование:
Сообщения
20
Реакции
-1
Admrfsh, о, спасибо! красава, достаточно будет лишь строчки engclient_cmd(player_id, "follownext", "1");
Про follownext я не знал вообще
 
Сообщения
20
Реакции
10
Помог
1 раз(а)
@lowamxx,если использовать только engclient_cmd, тогда не при всех обстоятельствах будет работать (судя по коду из rehlds)
 
Сообщения
1,577
Реакции
659
Помог
5 раз(а)
@lowamxx,если использовать только engclient_cmd, тогда не при всех обстоятельствах будет работать (судя по коду из rehlds)
Там проверка "Если игрок в режиме наблюдения и может переключить в режиме наблюдателя".
31 Июл 2024
lowamxx, engclient_cmd выполняет команду от клиента на стороне сервера судя по описанию. (не отправляя ее клиенту)
 
Сообщения
20
Реакции
-1
karaulov, Admrfsh, а проверки на режим наблюдения игрока вообще нужны, если в коде уже есть if(pev(dead, pev_iuser2) == alive) ? это же означает, что dead игрок гарантированно смотрит за alive игроком, т.е. он уже в режиме наблюдения? Я переключение это добавляю в стандартный плагин speclist
 
Сообщения
20
Реакции
10
Помог
1 раз(а)
lowamxx, твой код делает так, что бы при определённых обстоятельствах за игроками с флагом А следить было нельзя, верно?
 
Сообщения
20
Реакции
-1
Admrfsh, да, когда игрок наблюдает за другим игроком идет проверка по флагу и срабатывает engclient_cmd(player_id, "follownext", "1");
 
Сообщения
1,577
Реакции
659
Помог
5 раз(а)
RG_CBasePlayer_Observer_IsValidTarget

По идее можно в этом хуке 0 вернуть и на игрока нельзя будет наблюдать, я сейчас как раз такую же хрень в God Seeker собираюсь делать что бы за невидимым не могли наблюдать :)
 
Сообщения
20
Реакции
10
Помог
1 раз(а)
lowamxx, тогда предлагаю упростить:
Код:
public plugin_init() {
    RegisterHookChain(RG_CBasePlayer_Observer_IsValidTarget, "player_observer_is_valid_target_pre", false);
}

public player_observer_is_valid_target_pre(player_id, target_id) {
    if (get_pcvar_num(gCvarOn) && get_user_flags(target_id) & ADMIN_LEVEL_A) {
        SetHookChainArg(2, ATYPE_INTEGER, 0);
    }
}
Таким образом нам не придется заморачиваться с дополнительными проверками
 
Сообщения
1,577
Реакции
659
Помог
5 раз(а)
Admrfsh, так кажись просто запрещает игроку переключаться на кого-либо?
надо по идее в Return значении 0 вернуть что бы пошел поиск следующего игрока

Код:
SetHookChainReturn(ATYPE_INTEGER, 0)
А если подумать разницы особой нет, только вариант с SetHookChainArg заставит всю функцию выполнится и выдать nullptr в качестве ошибки, а SetHookChainReturn сразу завершит выполнение
 
Сообщения
20
Реакции
10
Помог
1 раз(а)
karaulov, по идее не вся функция выполнится, а до первого условия.

Вариант с SetHookChainReturn(ATYPE_INTEGER, 0) мне тоже больше нравится. Уже как пол года не писал плагинов, взял этот код из своих исходников, а почему там именно так - не помню. Мб затупил хд
 
Сообщения
1,577
Реакции
659
Помог
5 раз(а)
karaulov, по идее не вся функция выполнится, а до первого условия.

Вариант с SetHookChainReturn(ATYPE_INTEGER, 0) мне тоже больше нравится. Уже как пол года не писал плагинов, взял этот код из своих исходников, а почему там именно так - не помню. Мб затупил хд
Проверил и работает только вариант с SetHookChainArg(2, ATYPE_INTEGER, 0);, возможно потому что фунцкия возвращает nullptr а не 0.

Вариант с SetHookChainReturn вызывает какой-то косяк и игрока просто скидывает в центр карты.
 
Сообщения
335
Реакции
93
Помог
2 раз(а)
Вот такое есть из запасов
Код:
@CBasePlayer_Observer_SetMode_Pre(const iPlayer)
{
    new iObserved = get_entvar(iPlayer, var_iuser2);

    if (checkObserver(iPlayer, iObserved))
    {
        return HC_SUPERCEDE;
    }

    return HC_CONTINUE;
}

// сменим игрока на следующего
@CBasePlayerObserverFindNextPlayer_Post(const iPlayer)
{
    new iObserved = get_entvar(iPlayer, var_iuser2);

    if (checkObserver(iPlayer, iObserved))
    {
        return HC_SUPERCEDE;
    }

    return HC_CONTINUE;
}


stock bool: checkObserver(const iPlayer, const iObserved)
{
// iObserved - за кем наблюдают.
    if (is_user_admin(iObserved) &! is_user_admin(iPlayer))
    {
        new iObservedNew, iter = iObserved;

        while (iter != iObserved)
        {
            if (++iter > MaxClients)
            {
                iter = 1;
            }
       
            if (is_user_alive(iter))
            {
                iObservedNew = iter;
                break;
            }
        }

        if (!iObservedNew)
        {
            set_entvar(iPlayer, var_iuser2, 0);
            set_entvar(iPlayer, var_iuser1, OBS_MAP_FREE);
            return true;
        }

        set_entvar(iPlayer, var_iuser2, iObservedNew);
        return true;
    }

    return false;
}
 
Последнее редактирование:
Сообщения
1,577
Реакции
659
Помог
5 раз(а)
Noob_with_cheats, ну тут смысл был не в том что бы заблокировать наблюдателя, тс'у надо было заблокировать наблюдаемого :)
 

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

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