Как привязать команду к клавише

C

CaJI9pA

Приветствую! Подскажите как привязать команду(Например: !rs, !vip, !shop ну и т.п.) к клавише на сервере, чтобы народ не писать их. Они ведь будут работать только на этом сервере.
Оффтоп
На форуме люди добрые, надеюсь поможете:blush2:

Решение найдено!
1. Вариант
PHP:
public Action:OnPlayerRunCmd(client, &buttons)
{
 static bool:g_InUse[MAXPLAYERS+1];
 if(!g_InUse[client] && (buttons & IN_USE))
 {
  ClientCommand(client, "sm_rs");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_USE) && g_InUse[client])
 {
  g_InUse[client] = false;
 }
 return Plugin_Continue;
}
2. Вариант
PHP:
public OnPluginStart() AddCommandListener(Button_F4, "rebuy");

public Action:Button_F4(client, String:command[], args)
{
   FakeClientCommand(client, "gm");
   return Plugin_Continue;
}
 
Последнее редактирование модератором:

Rostu

Добрая душа
Сообщения
986
Реакции
623
доступные кнопки, кнопки не только ксс, так что некоторые могут не работать
PHP:
#define IN_ATTACK      (1 << 0)
#define IN_JUMP   (1 << 1)
#define IN_DUCK   (1 << 2)
#define IN_FORWARD    (1 << 3)
#define IN_BACK   (1 << 4)
#define IN_USE      (1 << 5)
#define IN_CANCEL      (1 << 6)
#define IN_LEFT   (1 << 7)
#define IN_RIGHT        (1 << 8)
#define IN_MOVELEFT  (1 << 9)
#define IN_MOVERIGHT        (1 << 10)
#define IN_ATTACK2    (1 << 11)
#define IN_RUN      (1 << 12)
#define IN_RELOAD      (1 << 13)
#define IN_ALT1   (1 << 14)
#define IN_ALT2   (1 << 15)
#define IN_SCORE        (1 << 16)       // Used by client.dll for when scoreboard is held down
#define IN_SPEED        (1 << 17)   // Player is holding the speed key
#define IN_WALK   (1 << 18)    // Player holding walk key
#define IN_ZOOM   (1 << 19)    // Zoom key for HUD zoom
#define IN_WEAPON1    (1 << 20) // weapon defines these bits
#define IN_WEAPON2    (1 << 21) // weapon defines these bits
#define IN_BULLRUSH  (1 << 22)
#define IN_GRENADE1  (1 << 23)    // grenade 1
#define IN_GRENADE2  (1 << 24)    // grenade 2
Пример команды rs на кнопку E ( у русская )
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1

public Action:OnPlayerRunCmd(client, &buttons)
{
 static bool:g_InUse[MAXPLAYERS+1];
 if(!g_InUse[client] && (buttons & IN_USE))
 {
  ClientCommand(client, "sm_rs");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_USE) && g_InUse[client])
 {
  g_InUse[client] = false;
 }
 return Plugin_Continue;
}
 
C

CaJI9pA

@Rostu, Спасибо сейчас попробую. Вопрос такой!
C-подобный:
#define IN_USE      (1 << 5)
отвечает как раз таки за клавишу "E", а что означает "(1 << 5)" что то не совсем понимаю...

И как в один плагин укомплектовать несколько команд? Примерно понимаю, но думаю ошибусь
--- Добавлено позже ---
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1

public Action:OnPlayerRunCmd(client, &buttons)
{
 static bool:g_InUse[MAXPLAYERS+1];
 if(!g_InUse[client] && (buttons & IN_USE))
 {
  ClientCommand(client, "sm_rs");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_USE) && g_InUse[client])
 {
  g_InUse[client] = false;
 }
{
 static bool:g_IN_WEAPON1[MAXPLAYERS+1];
 if(!g_IN_WEAPON1[client] && (buttons & IN_WEAPON1))
 {
  ClientCommand(client, "sm_vip");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_WEAPON1) && g_IN_WEAPON1[client])
 {
  g_IN_WEAPON1[client] = false;
 }
 return Plugin_Continue;
}
Как то так? По любому не правильно...
 
Последнее редактирование модератором:

Grey83

не пишу плагины с весны 2022
Сообщения
8,560
Реакции
5,061
что означает "(1 << 5)" что то не совсем понимаю
смещение на 5 позиций влево: 00100000 в бинарном виде (или 32 в десятичном)
но тебе нужно только IN_USE
--- Добавлено позже ---
1) у тебя лишняя фигурная скобка
2) у тебя при попытке стрелять будет випка всплывать
 

Rostu

Добрая душа
Сообщения
986
Реакции
623
@CaJI9pA, Не знаю какие точно клавиши можно использовать ( знаю что только wasd + space ) Измени IN_JUMP на что нибудь. Проверил. Работает по идеи.
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1




public Action:OnPlayerRunCmd(client, &buttons)
{
 static bool:g_InUse[MAXPLAYERS+1];
 if(!g_InUse[client] && (buttons & IN_USE))
 {
  ClientCommand(client, "sm_rs");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_USE) && g_InUse[client])
 {
  g_InUse[client] = false;
 }
 static bool:g_IN_WEAPON1[MAXPLAYERS+1];
 if(!g_IN_WEAPON1[client] && (buttons & IN_JUMP))
 {
  ClientCommand(client, "sm_vip");
  g_IN_WEAPON1[client] = true;
 }
  else if (!(buttons & IN_JUMP) && g_IN_WEAPON1[client])
 {
  g_IN_WEAPON1[client] = false;
 }
 return Plugin_Continue;
}
 
C

CaJI9pA

@Grey83, @Rostu, Хорошо спасибо! А вот тут указаны только основные команды к клавишам, а как например привязать к клавишам, такие как ? Ну там "]" "[" "F4, F5, и т.д"
 

Rostu

Добрая душа
Сообщения
986
Реакции
623
@CaJI9pA, По идеи никак. И то что выше кидал это все кнопки ( Могу ошибаться )
 
C

CaJI9pA

@Rostu, честно говоря что то не работает... Сброс счета на кнопку Е
 

Rostu

Добрая душа
Сообщения
986
Реакции
623
@CaJI9pA, Ну пусть он в чат пишет !rs
PHP:
public Action:OnPlayerRunCmd(client, &buttons)
{
 static bool:g_InUse[MAXPLAYERS+1];
 if(!g_InUse[client] && (buttons & IN_USE))
 {
  ClientCommand(client, "say !rs");
  g_InUse[client] = true;
 }
  else if (!(buttons & IN_USE) && g_InUse[client])
 {
  g_InUse[client] = false;
 }
 return Plugin_Continue;
}
Главное чтобы кнопка "использовать" была нажата а она может на любой кнопке быть.
 

Steammer

Участник
Сообщения
443
Реакции
187
Можно сделать как у меня, через Menu Creator и серверный бинд.
C-подобный:
public OnPluginStart() AddCommandListener(Button_F4, "rebuy");

public Action:Button_F4(client, String:command[], args)
{
   FakeClientCommand(client, "gm");
   return Plugin_Continue;
}
И меню в Menu Creator:
C-подобный:
create          |gamemenu                               |menu
regcmd          |gm                                     |
title           |[ Игровое меню ]{nl}{ }
item            |!rs - сбросить счет                    |{q1}sm_mc_fc {cl} "say !rs" {q1}sm_mc_fc {cl} gm
item            |!rtv - голосование за смену карты      |{q1}sm_mc_fc {cl} "say !rtv" {q1}sm_mc_fc {cl} gm
item            |!shop - игровой магазин                |{q1}sm_mc_fc {cl} "say !shop"
item            |!stopmusic - выключить музыку на карте |{q1}sm_mc_fc {cl} "say !stopmusic" {q1}sm_mc_fc {cl} gm
item            |!onmusic - включить музыку на карте    |{q1}sm_mc_fc {cl} "say !onmusic" {q1}sm_mc_fc {cl} gm
item            |!knife - сменить модель ножа           |{q1}sm_mc_fc {cl} "say !knife"
item            |!ws - сменить раскраску оружия{ }[VIP] |{q1}sm_mc_fc {cl} sm_ws
item            |!gl - сменить перчатки{ } { } { }[VIP] |{q1}sm_mc_fc {cl} sm_gl

В итоге, по нажатию F4, будет появляться меню с командами выше.
 
C

CaJI9pA

@Steammerr, Твой вариант работает! Но вот только не пойму почему у тебя на F4 стоит rebuy, у меня эта клавиша в конфиге по дефолту на F2 прописана
И еще раз твой вариант работает, как мне на клавишу "i" ее прописать. В конфиге на эту кнопку прописана команда "show_loadout_toggle"
 

Steammer

Участник
Сообщения
443
Реакции
187
@CaJI9pA
C-подобный:
bind "ESCAPE" "cancelselect"
bind "`" "toggleconsole"

bind "TAB" "+showscores"
bind "SPACE" "+jump"
bind "," "buyammo1"
bind "." "buyammo2"
bind "0" "slot10"
bind "1" "slot1"
bind "2" "slot2"
bind "3" "slot3"
bind "4" "slot4"
bind "5" "slot5"
bind "6" "slot6"
bind "7" "slot7"
bind "8" "slot8"
bind "9" "slot9"
bind "a" "+moveleft"
bind "b" "buymenu"
bind "c" "radio3"
bind "d" "+moveright"
bind "e" "+use"
bind "f" "+lookatweapon"
bind "g" "drop"
bind "i" "show_loadout_toggle"
bind "k" "+voicerecord"
bind "m" "teammenu"
bind "q" "lastinv"
bind "r" "+reload"
bind "s" "+back"
bind "u" "messagemode2"
bind "w" "+forward"
bind "x" "radio2"
bind "y" "messagemode"
bind "z" "radio1"
bind "CTRL" "+duck"
bind "SHIFT" "+speed"
bind "F3" "autobuy"
bind "F4" "rebuy"
bind "F5" "jpeg"
bind "F6" "save quick"
bind "F7" "load quick"
bind "F10" "quit prompt"
bind "MWHEELDOWN" "invnext"
bind "MWHEELUP" "invprev"
bind "MOUSE1" "+attack"
bind "MOUSE2" "+attack2"
bind "PAUSE" "pause"
bind "DEL" "mute"
bind "t" "+spray_menu"

Бинды точно работают на: autobuy, rebuy, buyammo1, buyammo2.
Сейчас попробую на show_loadout_toggle и отпишу.
 
  • Мне нравится
Реакции: Lnk

Steammer

Участник
Сообщения
443
Реакции
187
@CaJI9pA, нет, нельзя. Данным биндом нельзя использовать команды типа +use, radio1(которые открывают своё меню).
Команда "show_loadout_toggle" скрывает со временем/делает статической экипировку игрока. И почему то на ней нельзя использовать бинд.
 
C

CaJI9pA

@CaJI9pA, нет, нельзя. Данным биндом нельзя использовать команды типа +use, radio1(которые открывают своё меню).
Команда "show_loadout_toggle" скрывает со временем/делает статической экипировку игрока. И почему то на ней нельзя использовать бинд.
Ясно, я тоже по разному попробовал, тоже не хочет.
Ладно и на этом спасибо, твой вариант работает отлично.
Вопрос еще, в этот код можно еще один бинд добавить? Можешь пример прикинуть, я пока не силен в скриптинге(
--- Добавлено позже ---
@Rostu, в твоем варианте он пишет FCVAR_SERVER_CAN_EXECUTE prevented server running command: say !rs
 
Последнее редактирование модератором:
C

CaJI9pA

@Rostu, У тебя немного код не верный Вместо ClientCommand нужно написать FakeClientCommand и все заработало)
@Steammerr, Нее, у тебя по нажатию F4 отрывается меню, а можно еще в этом же коде добавить команду на клавишу например "F3" sm_vip
 

Steammer

Участник
Сообщения
443
Реакции
187
@Steammerr, Нее, у тебя по нажатию F4 отрывается меню, а можно еще в этом же коде добавить команду на клавишу например "F3" sm_vip
C-подобный:
public OnPluginStart() AddCommandListener(Button_F3, "autobuy");

public Action:Button_F3(client, String:command[], args)
{
   FakeClientCommand(client, "sm_vip");
   return Plugin_Continue;
}
 

Вложения

  • bind_vip_F3.smx
    3.5 КБ · Просмотры: 15
Сверху Снизу