AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Get weapon drop on death (https://forums.alliedmods.net/showthread.php?t=195270)

dFF 09-05-2012 13:50

Get weapon drop on death
 
I want to check when weapon is dropped on death event without FM_SetModel forward.
I tried with Ham_Item_Drop and doesn't seem to call this event when weapon is dropped on death event.

I need best method to check weapons dropped on death event, can be with Orpheu or Rage is not a problem.

Liverwiz 09-05-2012 14:07

Re: Get weapon drop on death
 
Its in the HLSDK.
dlls/player.cpp CBasePlayer:: PackDeadPlayerItems( void )

ConnorMcLeod 09-06-2012 00:47

Re: Get weapon drop on death
 
What do you want to do exactly ?

C4 is dropped during CBasePlayer :: Killed.
Defuser is dropped (in fact new defuser is given but player can't receive it so it's falling on ground) during CBasePlayer :: Killed.
Weapon(s) are packed during CBasePlayer :: PreThink that is on the frame after CBasePlayer :: Killed.

So depending on what you exactly want to do, you need to choose the proper method.

dFF 09-06-2012 03:29

Re: Get weapon drop on death
 
Quote:

Originally Posted by ConnorMcLeod (Post 1792490)
What do you want to do exactly ?

I want to remove instant specific weapon after player death.
FM_SetModel is call every time, need a better method to hook specific weapon after player death and remove then on the floor/earth.

matsi 09-06-2012 06:27

Re: Get weapon drop on death
 
Quote:

Originally Posted by dFF (Post 1792523)
I want to remove instant specific weapon after player death.
FM_SetModel is call every time, need a better method to hook specific weapon after player death and remove then on the floor/earth.

Search for 'remove weaponbox' and limit you search to 'Scripting help' section.

ConnorMcLeod 09-06-2012 12:35

Re: Get weapon drop on death
 
Something like this could work, not sure it is better than only hook SetModel though.
SetModel is not called so often.

PHP Code:

#include <amxmodx>

#include <fakemeta>
#include <hamsandwich>

#include "cstrike_pdatas"

#define PLUGIN ""
#define VERSION "0.0.1"

new g_iMaxPlayers
#define IsPlayer(%0)    ( 1 <= %0 <= g_iMaxPlayers )

#define MaskEnt(%0)    ( 1<<(%0 & 31) )
new g_bitPreThinkPlayers
#define EnablePlayerDeathDrop(%0)        g_bitPreThinkPlayers |= MaskEnt(%0)
#define DisablePlayerDeathDrop(%0)        g_bitPreThinkPlayers &= ~MaskEnt(%0)
#define IsPlayerDeathDropEnabled(%0)    g_bitPreThinkPlayers & MaskEnt(%0)

new HamHook:g_iCBasePlayerPreThinkPreHamHook:g_iCBasePlayerPreThinkPostHamHook:g_iCItemThighPackMyTouchPost

public plugin_init()
{
    
register_pluginPLUGINVERSION"ConnorMcLeod" )

    
g_iMaxPlayers get_maxplayers()

    
RegisterHam(Ham_Killed"player""OnCBasePlayer_Killed"false)
    
RegisterHam(Ham_Killed"player""OnCBasePlayer_Killed_Post"true)
    
DisableHamForwardg_iCBasePlayerPreThinkPre RegisterHam(Ham_Player_PreThink"player""OnCBasePlayer_PreThink"false) )
    
DisableHamForwardg_iCBasePlayerPreThinkPost RegisterHam(Ham_Player_PreThink"player""OnCBasePlayer_PreThink_Post"true) )
    
DisableHamForwardg_iCItemThighPackMyTouchPost RegisterHam(Ham_Touch"item_thighpack""CItemThighPack_MyTouch_Post"true) )
}

Set_SetModelbool:bOnOff )
{
    static 
_SetModel 0
    
if( bOnOff )
    {
        if( !
_SetModel )
        {
            
_SetModel register_forward(FM_SetModel"OnSetModel_Post"true)
        }
    }
    else if( 
_SetModel )
    {
        
unregister_forward(FM_SetModel_SetModeltrue)
    }
}

Set_PreThinkid bool:bOnOff )
{
    if( 
bOnOff )
    {
        if( !
g_bitPreThinkPlayers )
        {
            
EnableHamForwardg_iCBasePlayerPreThinkPre )
            
EnableHamForwardg_iCBasePlayerPreThinkPost )
        }

        
EnablePlayerDeathDrop(id)
    }
    else
    {
        
DisablePlayerDeathDrop(id)

        if( !
g_bitPreThinkPlayers )
        {
            
DisableHamForwardg_iCBasePlayerPreThinkPre )
            
DisableHamForwardg_iCBasePlayerPreThinkPost )
        }
    }
}

public 
OnCBasePlayer_Killedid iAttackeriGib)
{
    if( 
get_pdata_bool(idm_bHasC4) )
    {
        
Set_SetModeltrue )
    }
    else if( 
get_pdata_bool(idm_bHasDefuser) )
    {
        
EnableHamForwardg_iCItemThighPackMyTouchPost )
    }
}

public 
OnCBasePlayer_Killed_PostidiAttackeriGib )
{
    
Set_SetModelfalse )
    
DisableHamForwardg_iCItemThighPackMyTouchPost )
    
Set_PreThinkid true )
}

public 
OnCBasePlayer_PreThinkid )
{
    if( 
IsPlayerDeathDropEnabled(id) )
    {
        
Set_SetModeltrue )
    }
}

public 
OnCBasePlayer_PreThink_Postid )
{
    if( 
IsPlayerDeathDropEnabled(id) )
    {
        
Set_PreThinkid false )
        
Set_SetModelfalse )
    }
}

public 
OnSetModel_Post(entmodel[])
{
    if( !
equal(model"models/w_weaponbox.mdl") )
    {
        new 
id pev(entpev_owner)
        if( 
IsPlayer(id) )
        {
            
PlayerDeathDropped(ident)
        }
    }
}

public 
CItemThighPack_MyTouch_Post(entid)
{
    
PlayerDeathDropped(ident)
}

PlayerDeathDropped(ident)
{
    if( 
ExecuteHam(Ham_Weapon_GetWeaponPtrent) == ent )
    {
        new 
iId get_pdata_int(entm_iIdXO_CBasePlayerItem)
        
// iId is CSW_*** const
    
}
    else
    {
        
// defuser
    
}



dFF 09-07-2012 03:57

Re: Get weapon drop on death
 
Thank you for the code Connor!

Quote:

Originally Posted by ConnorMcLeod (Post 1792792)
SetModel is not called so often.

SetModel is call every time when player spawn, when weapon is dropped manually; so I think if is a better method for what i needed.

Arkshine 09-07-2012 06:12

Re: Get weapon drop on death
 
You think wrong, and you should stop to say that unless you know what you're taking about. SetModel is not called often at all (it's not like a prethink function eh!) and using only that would be more efficient than the plugin above which does way more extra operations even if it's well coded. People should stop to seek complicated way for a zero benefit which is most of time the reverse. Here the case, and it's completely bullshits for the wanted purpose.


All times are GMT -4. The time now is 08:19.

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