Проблемы с GetClientButtons

Alex's Works

Участник
Сообщения
8
Реакции
0
Доброго времени суток. Недавно решил переписать плагин Self Revive для Left 4 Dead 2, чтобы изменить принцип самоспасения с удерживания кнопки на простое нажатие клавиши "Использовать". Получилось примерно так:
C-подобный:
    new buttons = GetClientButtons(victim);
    if (buttons & IN_USE || IsFakeClient(victim)){Revive(victim, attacker);}}
На деле, как бы я не жал "Использовать", ничего не происходит. Однако, у ботов проблем нет (из-за IsFakeClient). Так в чём же дело? (Компилировал соурсмодом 1.6)
 

Вложения

  • decisive strike.sp
    2.7 КБ · Просмотры: 16
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
IsFakeClient(victim) в этой проверке, тока для ботов
Там "или" стоит - должно работать у людей, с условием нажатой клавиши.
Получилось примерно так
А что идёт до? Какое событие проверяет, что кнопки вообще нажимаются? По идее, должно проверяться через:
C-подобный:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon, &subtype, &cmdnum, &tickcount, &seed, mouse[2])
Чтобы сработка шла в любой момент времени (в реальном времени).
 

Alex's Works

Участник
Сообщения
8
Реакции
0
Я понял в чём дело. Проверка идёт только 1 раз. Но если использовать OnPlayerRunCmd, я могу сообщить кого спасать, но не от кого. Выглядеть будет примерно так
C-подобный:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon, &subtype, &cmdnum, &tickcount, &seed, mouse[2]){
if(buttons & IN_USE && IsGrab[client] == 1)
{Press[client]=1; action(client, ??? );}
}

C-подобный:
action(victim, attacker){
    if (!victim) return;
    if (!attacker) return;
    if (Srikes[victim] < 2){
    if (Press[victim] == 1 || IsFakeClient(victim)){Revive(victim, attacker);}}
    }

C-подобный:
public Event_TongueGrab (Handle:event, const String:name[], bool:dontBroadcast)
{
    new victim = GetClientOfUserId(GetEventInt(event, "victim"));
    new attacker = GetClientOfUserId(GetEventInt(event, "userid"));
    IsGrab[victim] = 1;
    PrintHintText(victim, "Жми [Использовать], чтобы задействовать решающий удар!");
    action(victim, attacker);
}


Спасибо за идею AlmazON
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Да кто его знает, как там игровой процесс происходит. Например, если событие:
Event_TongueGrab (Handle:event, const String:name[], bool:dontBroadcast)
Происходит каждый раз перед возможностью нажать клавишу (имеет необходимые данные), то предполагаю:
PHP:
public Event_TongueGrab(Handle:event, const String:name[], bool:dontBroadcast){
    new victim = GetClientOfUserId(GetEventInt(event, "victim"));
    if ((IsGrab[victim] = GetClientOfUserId(GetEventInt(event, "userid"))))
    {
        if (IsFakeClient(victim)) action(victim, IsGrab[victim]);
        else PrintHintText(victim, "Жми [Использовать], чтобы задействовать решающий удар!");
    }
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon){
    if (buttons & IN_USE && IsGrab[client])
    {
        action(client, IsGrab[client]);
        IsGrab[client] = 0;
    }
    return Plugin_Continue;
}

action(victim, attacker){
    if (Srikes[victim] < 2){
        Revive(victim, attacker);
    }
}
 

Alex's Works

Участник
Сообщения
8
Реакции
0
тогда и вместо
нужно > 0
и вместо
IsGrab[client]
Отличная идея. Но чтобы особо не переписывать, я просто объявлю массив ATTACKER[MAXPLAYERS+1] и буду передавать туда атакера к виктиму каждый эвент.
Оффтоп
Думаю, на этом можно закрыть тему.
 
Сверху Снизу