AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Code Snippets/Tutorials (https://forums.alliedmods.net/forumdisplay.php?f=83)
-   -   How to block PlayerUse ? (https://forums.alliedmods.net/showthread.php?t=154186)

MPNumB 04-03-2011 09:32

How to block PlayerUse ?
 
Edit (ConnorMcLeod) : Posts moved from http://forums.alliedmods.net/showthr...74#post1444174

If you want to block PlayerUse, than I would suggest to change pev_button at FM_PlayerPreThink pre to:
PHP Code:

new iButtons pev(idpev_button);
if( 
iButtons&IN_USE )
{
iButtons &= ~IN_USE;
set_pev(idpev_buttoniButtons);
set_pdata_cbase(idm_afButtonPressediButtons5); // offsetid 246


This should fix the problems related with USE if they exist.

ConnorMcLeod 04-03-2011 12:57

Re: Ghost after death
 
Hook FM_Use could be better since you just want to supercede all kind of use.

MPNumB 04-03-2011 13:44

Re: Ghost after death
 
Quote:

Originally Posted by ConnorMcLeod (Post 1443845)
Hook FM_Use could be better since you just want to supercede all kind of use.

FM_Use doesn't work for player using objects last time I checked. =P Ham_Use does, but that's a bad solution (looping all possible entity classnames and stuff). Better just to set keys, or hook and block FM_FindEntityInSphere I assume.

ConnorMcLeod 04-03-2011 13:48

Re: Ghost after death
 
You mean objects such as buttons ?

MPNumB 04-03-2011 22:41

Re: Ghost after death
 
Yes. If player uses a button, than two use functions should be called:
1. Player using the button.
2. Button using a door or a camera or whatever.

FM_Use will not hook the first one. In other words FM_Use isn't called when player uses something with +use button, that's why I think it's best to block the key or the search of entities near by. Also for example func_pushable object isn't called neither by FM_Use, neither by Ham_Use (though here I may be wrong, but all I'm sure that returning HAM_SUPERCEDE inside Ham_Use for pushable objects doesn't block player from grabbing and later moving the object).

ConnorMcLeod 04-04-2011 01:14

Re: Ghost after death
 
Then yes, can be disabled from client_PostThink forward.

So following code should block any kind of use :
PHP Code:

public client_PostThink(id)
{
    if( 
is_user_alive(id) )
    {
        new 
iButton
        
if( (iButton pev(idpev_button)) & IN_USE )
        {
            
set_pev(idpev_buttoniButton & ~IN_USE)
        }
        if( (
iButton get_pdata_int(idm_afButtonPressedXO_PLAYER)) & IN_USE )
        {
            
set_pdata_int(idm_afButtonPressediButton & ~IN_USEXO_PLAYER)
        }
        if( (
iButton get_pdata_int(idm_afButtonReleasedXO_PLAYER)) & IN_USE )
        {
            
set_pdata_int(idm_afButtonReleasediButton & ~IN_USEXO_PLAYER)
        }
    }



About plugin, fakemeta_util is not used, don't include it.

MPNumB 04-04-2011 01:17

Re: Ghost after death
 
Well, I personally would still suggest prethink, cause than you won't have to worry about possible problems with m_afButtonReleased (engine may think that it was never released, what may cause problems).

ConnorMcLeod 04-04-2011 01:31

Re: Ghost after death
 
But Use is checked at PostThink and in PreThink you would have to set those 3 ones to.

Also, if you don't care about vehicles, you can just do the same code at EmitSound :

PHP Code:

public EmitSound(idiChannelszSample[], Float:flVolumeFloat:flAttenuationiFlagsiPitch)
{
    if( 
is_user_alive(id) && equal(szSample"common/wpn_select.wav") ) 


WAIT, gonna do a nice thing for this thread :P
Edit : done, posts moved, his release thread was turning into code discussion :)

MPNumB 04-04-2011 03:24

Re: How to hook PlayerUse ?
 
Nice... Moved posts. Though I do think that "How to block PlayerUse ?" would fit a bit more than "How to hook PlayerUse ?" for thread name. =P

And the reason why I am suggesting to use PlayerPreThink rather than PlayerPostThink is because if using Post, than you will have IN_USE set in pev_oldbuttons, at functions where it shouldn't be there. In other words if you are holding IN_USE and block it at every PlayerPostThink, than during the time when you are holding your use key, pev_oldbuttons will have IN_USE in them. That won't necessary lead to some engine glitches (though it might - here I'm just guessing), but it can cause problems with other plugins what detect when you release USE key (this once I can say for sure - don't know if such a plugin exists, but it wont he hard to create one).

ConnorMcLeod 04-04-2011 06:30

Re: How to block PlayerUse ?
 
I don't think pev->oldbuttons are used anywhere.
About plugins you are right but pdatas should be checked then instead of oldbuttons, better to make plugins act as the game does.

So, you recommand to do stuff at PreThink (POST) right ?
I recommand PostThink (PRE).

Also, if you don't care about vehicles but only buttons and objects, i recommande EmitSound method that is more efficient and uses less cpu.

Last, m_afButtonPressed can be checked only if button doesn't contain IN_USE and m_afButtonReleased can be check only in the other case, gonna update code later.


All times are GMT -4. The time now is 18:25.

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