Заставить игрока выполнить команду "-duck"

Сообщения
27
Реакции
3
Проблема такова, пытаюсь запретить использование приседания во время определенного события. В Ham_Player_Duck вписал такую строку
set_pev(iPlayer, pev_oldbuttons, pev(iPlayer, pev_oldbuttons)|IN_DUCK)
Запрещает использовать приседание во время события, НО! Мне еще необходимо заставить игрока отжать кнопку приседания, когда выполнится "это событие"
Пытался использовать такие строки:
set_pev(iPlayer, pev_oldbuttons, pev(iPlayer, pev_oldbuttons)|IN_DUCK)
client_cmd(iPlayer, "-duck")
Всё безуспешно, даже никак не повлияло, выполнял их в своей функции (CmdStart, PlayerPreThink не использую дабы не выполнялось много раз).
Мне нужно выполнить команду "-duck" всего один раз в теле моей функции, подскажите как ее выполнить рабочими методами?
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Побитовое отрицание ("отжать"):
Код:
set_pev(iPlayer, pev_oldbuttons, pev(iPlayer, pev_oldbuttons) & ~IN_DUCK)
Ну и нажатая кнопка в текущем кадре не pev_oldbuttons, а pev_button.
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Se_IaQe, суть сводится к тому, что нужно при определённом условии запретить игроку использовать приседание?
 
Сообщения
775
Реакции
292
Помог
11 раз(а)
Se_IaQe, в разделе заказов его пишут полный, протестированный .
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Код:
#include <amxmodx>
#include <reapi>

new bool: g_bIsCanDuck[MAX_PLAYERS+1];

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_Duck, "@CBasePlayer_Duck_Pre");

    register_clcmd("say /duck", "@duck_or_not_duck");
}

@CBasePlayer_Duck_Pre(pPlayer)
{
    if(!g_bIsCanDuck[pPlayer])
        set_entvar(pPlayer, var_oldbuttons, get_entvar(pPlayer, var_oldbuttons) | IN_DUCK);
}

@duck_or_not_duck(pPlayer) g_bIsCanDuck[pPlayer] = !g_bIsCanDuck[pPlayer];
Выкл/вкл: say /duck
8 Июн 2022
Про client_cmd(index, "-duck"); вообще стоит забыть, на дворе не 2012 год.
 
Сообщения
326
Реакции
6
Помог
1 раз(а)
Код:
#include <amxmodx>
#include <reapi>

new bool: g_bIsCanDuck[MAX_PLAYERS+1];

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_Duck, "@CBasePlayer_Duck_Pre");

    register_clcmd("say /duck", "@duck_or_not_duck");
}

@CBasePlayer_Duck_Pre(pPlayer)
{
    if(!g_bIsCanDuck[pPlayer])
        set_entvar(pPlayer, var_oldbuttons, get_entvar(pPlayer, var_oldbuttons) | IN_DUCK);
}

@duck_or_not_duck(pPlayer) g_bIsCanDuck[pPlayer] = !g_bIsCanDuck[pPlayer];
Выкл/вкл: say /duck
8 Июн 2022
Про client_cmd(index, "-duck"); вообще стоит забыть, на дворе не 2012 год.
Can you only work with the ctrl key?
 
Сообщения
1,499
Реакции
1,499
Помог
2 раз(а)
bizon,
А этот булл g_bIsCanDuck не нужно ставить на false при дисконнекте игрока или смысла нет?
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Can you only work with the ctrl key?
The "RG_CBasePlayer_Duck" function is called when the player presses button "ctrl".

bizon,
А этот булл g_bIsCanDuck не нужно ставить на false при дисконнекте игрока или смысла нет?
Если цель, чтобы изначально приседание не блокировалось, то да.
Я вообще просто пример дал. Нужно что-то делать красиво и правильно - это дело для ТС.
 
Последнее редактирование:
Сообщения
326
Реакции
6
Помог
1 раз(а)
The "RG_CBasePlayer_Duck" function is called when the player presses button "ctrl".


Если цель, чтобы изначально приседание не блокировалось, то да.
Я вообще просто пример дал. Нужно что-то делать красиво и правильно - это дело для ТС.
re
The "RG_CBasePlayer_Duck" function is called when the player presses button "ctrl".


Если цель, чтобы изначально приседание не блокировалось, то да.
Я вообще просто пример дал. Нужно что-то делать красиво и правильно - это дело для ТС.
full scripts
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Читайте правила форума:
dev-cs.ru написал(а):
В данном разделе размещаются темы, в которых требуется помощь с доработкой или объяснением материала.
В теме должны быть опубликованы попытки (diff кода или последовательность действий) самостоятельного поиска решения.
Если у вас нет наработок и попыток самому вникнуть в проблему, тогда вам в раздел "Покупка"
 
Сообщения
27
Реакции
3
Код:
set_pev(iPlayer, pev_oldbuttons, pev(iPlayer, pev_oldbuttons) & ~IN_DUCK)
Пытался pev_button и oldbuttons менять, всеровно игрок приседает, необходимо чтобы он отжал и сработало событие что игрок как бы уже не сидит, а стоит. Мне очень мешает то что игрок сидит, ведь у меня проигрывается анимация игрока и модель игрока вбивается в пол, чего по сути я должен избегать. У меня было два варианта решения данной проблемы, отжать кнопку приседания каким-нибудь образом, чтобы игрок стал. Либо же как-нибудь сделать чтобы модель находилась над полом (Используя возможности кодинга). Или же еще как вариант изменить коллизию игрока, чтобы тот был обычным размером как когда он стоит на месте, а не сидит. И да, момент отжатия кнопки должен происходить до проигрывания анимации, чтобы модель находилась над полом

Есть помощь?
11 Июн 2022
Не совсем понимаю как работать с pm_bInDuck, pm_flDuckTime офсетами, могут ли они помочь мне как то в этой ситуации? Если их поменять то игрок встанет?
 
Последнее редактирование:
Сообщения
146
Реакции
29
im also interested in solution of sending button to player. unfortunately i can confirm this doesnt work to me neither:

Bitwise negation ("squeeze"):
Код:
set_pev(iPlayer, pev_oldbuttons, pev(iPlayer, pev_oldbuttons) & ~IN_DUCK)
Well, the pressed button in the current frame is not pev_oldbuttons, but pev_button.
 
Сообщения
678
Реакции
56
Помог
16 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
494
Реакции
340
Помог
11 раз(а)
Xpym4uk76, все команды -command происходят на стороне клиента и эмулировать их в большинстве случаев невозможно.
Заставить игрока в положении сидя встать у вас никак не получится, по крайней мере с помощью var_button, var_oldbuttons, var_flags (~FL_DUCKING). С оффсетами такая же фигня.
Единственный способ обмануть клиент - вариант, который я кинул выше с var_oldbuttons, ну либо если есть рвение, то изучить этот вопрос более глубже и, возможно, найти костыльный вариант.
 

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

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