Raised This Month: $7 Target: $400
 1% 

[SNIPPET] Detecting button presses (and releases)


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
psychonic

BAFFLED
Join Date: May 2008
Old 02-22-2011 , 11:53   [SNIPPET] Detecting button presses (and releases)
Reply With Quote #1

It seems some people still struggle with this so here is a copy/paste way of detecting click button presses/releases in your plugins.

Make sure to include sdktools at the top of your plugin if it's not there already
Code:
#include <sdktools>

These also need to go somewhere near the top of the file
Code:
#define MAX_BUTTONS 25 new g_LastButtons[MAXPLAYERS+1];

If you don't already have these forwards, add them, else just add the contents
Code:
public OnClientDisconnect_Post(client) {     g_LastButtons[client] = 0; } public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon) {     for (new i = 0; i < MAX_BUTTONS; i++)     {         new button = (1 << i);                 if ((buttons & button))         {             if (!(g_LastButtons[client] & button))             {                 OnButtonPress(client, button);             }         }         else if ((g_LastButtons[client] & button))         {             OnButtonRelease(client, button);         }     }         g_LastButtons[client] = buttons;         return Plugin_Continue; }

Now you can use these function to detect the buttons
Code:
OnButtonPress(client, button) {     // do stuff } OnButtonRelease(client, button) {     // do stuff }

List of detectable buttons at time of writing (full list here):
Code:
#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

Last edited by psychonic; 03-03-2012 at 11:51. Reason: typofix
psychonic is offline
mysticssjgoku4
Veteran Member
Join Date: Jan 2005
Location: Chicago Heights, IL
Old 06-10-2011 , 23:51   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #2

This does not work fully with the most recent version of CSS.

If I press the use key, it does not detect it until I hold a movement key as well.

I do have sort of a newbish question what does:
Code:
        if ((buttons & button) && (g_LastButtons[id] & ~button))
        {
            OnButtonPress(id, button);
        }
do?

I understand that the if statement is looking for both sets to return true, but what does "(buttons & button)" mean? I understand it looks for "button" as apart of "buttons" but is that all?
__________________


Last edited by mysticssjgoku4; 06-11-2011 at 00:43.
mysticssjgoku4 is offline
Send a message via AIM to mysticssjgoku4 Send a message via MSN to mysticssjgoku4
DJ Tsunami
DJ Post Spammer
Join Date: Feb 2008
Location: The Netherlands
Old 06-11-2011 , 03:30   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #3

It checks if button is in buttons using bitwise operation.
__________________
Advertisements | REST in Pawn - HTTP client for JSON REST APIs
Please do not PM me with questions. Post in the plugin thread.
DJ Tsunami is offline
Cookies.net
Senior Member
Join Date: Jan 2011
Old 06-12-2011 , 13:58   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #4

I just noticed this thread and tried this method and it doesn't work properly (tried it myself instead of the way i currently do it), here's my explanation (it might not be the best, but i guess its fine)

e.g. if "button" in this case = "IN_JUMP" then it would check the current buttons if they contains "IN_JUMP" ("buttons & IN_JUMP") then it will proceed to "g_LastButtons[client] & ~IN_JUMP", here it will check if the last buttons contains anything else than IN_JUMP, so it will trigger if you held any other buttons than "IN_JUMP" the last frame. So psychonics snippet wont trigger when you jump, but it will trigger several times if you're e.g. walking forward and pressing your jump button.

what i did before and after i tried this would be something like this
PHP Code:
    if ((buttons button) && !(g_LastButtons[client] & button))
    {
        
OnButtonPress(clientbutton);
    }
        
    if ((
g_LastButtons[client] & button) && !(buttons button))
    {
        
OnButtonRelease(clientbutton);
    } 
which works just perfect
Cookies.net is offline
bl4nk
SourceMod Developer
Join Date: Jul 2007
Old 06-13-2011 , 02:12   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #5

Wouldn't that be better written like this?
PHP Code:
if ((buttons button)) {
    if (!(
g_LastButtons[client] & button)) {
        
OnButtonPress(clientbutton);
    }
} else if ((
g_LastButtons[client] & button)) {
    
OnButtonRelease(clientbutton);

bl4nk is offline
Despirator
Senior Member
Join Date: Jun 2011
Location: Kazakhstan ->Shymkent
Old 06-18-2011 , 13:57   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #6

Quote:
Originally Posted by bl4nk View Post
Wouldn't that be better written like this?
PHP Code:
if ((buttons button)) {
    if (!(
g_LastButtons[client] & button)) {
        
OnButtonPress(clientbutton);
    }
} else if ((
g_LastButtons[client] & button)) {
    
OnButtonRelease(clientbutton);

ye it's better
Despirator is offline
_pHabb
Senior Member
Join Date: Jul 2013
Location: GetCountry(pHabb);
Old 01-31-2016 , 15:09   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #7

How to create pressing IN_USE ~several seconds for activate something?
_pHabb is offline
KissLick
Veteran Member
Join Date: Nov 2012
Location: void
Old 01-31-2016 , 15:14   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #8

What about?

Pressed IN_USE - start 3s timer
Released IN_USE - destroy that timer
OnTimer - do something
__________________
Plugins: TeamGames
Includes: Menu stocks, ColorVariables, DownloadTableConfig

> No help through PM, make a topic.
KissLick is offline
_pHabb
Senior Member
Join Date: Jul 2013
Location: GetCountry(pHabb);
Old 01-31-2016 , 15:34   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #9

KissLick, thanks, i will try
_pHabb is offline
mottzi
Veteran Member
Join Date: May 2010
Location: Switzerland
Old 04-05-2016 , 06:01   Re: [SNIPPET] Detecting button presses (and releases)
Reply With Quote #10

@psychonic why are you creating the variable inside the loop?
__________________
Quote:
#define true ((rand() % 2)? true: false) //Happy debugging suckers
mottzi is offline
Send a message via MSN to mottzi
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:22.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode