I think you are wrong with PreThink() (Ham_Think) called from PlayerPreThink (Ham_Player_PreThink)
Reading HLSDK it seems to be :
PlayerPreThink (from client.cpp) I don't know if it's engine forward client_PreThink and fakemeta FM_PlayerPreThink but it sounds like it is correct.
Code:
/*
================
PlayerPreThink
Called every frame before physics are run
================
*/
void PlayerPreThink( edict_t *pEntity )
{
entvars_t *pev = &pEntity->v;
CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity);
if (pPlayer)
pPlayer->PreThink( );
}
Then CBasePlayer:
reThink from player.cpp (Ham_Player_PreThink)
Code:
void CBasePlayer::PreThink(void)
{
int buttonsChanged = (m_afButtonLast ^ pev->button); // These buttons have changed this frame
// Debounced button codes for pressed/released
// UNDONE: Do we need auto-repeat?
m_afButtonPressed = buttonsChanged & pev->button; // The changed ones still down are "pressed"
m_afButtonReleased = buttonsChanged & (~pev->button); // The ones not down are "released"
g_pGameRules->PlayerThink( this );
if ( g_fGameOver )
return; // intermission or finale
UTIL_MakeVectors(pev->v_angle); // is this still used?
ItemPreFrame( );
WaterMove();
if ( g_pGameRules && g_pGameRules->FAllowFlashlight() )
m_iHideHUD &= ~HIDEHUD_FLASHLIGHT;
else
m_iHideHUD |= HIDEHUD_FLASHLIGHT;
// JOHN: checks if new client data (for HUD and view control) needs to be sent to the client
UpdateClientData();
And from that one are called
* g_pGameRules->PlayerThink (CHalfLifeMultiplay :: PlayerThink in multiplayer that is hookable with orpheu module)
* ItemPreFrame
* UpdateClientData
Also, ItemPreFrame is not Ham_Item_PreFrame, it's CBasePlayer::ItemPreFrame (not hookable with hamsandwich) from where m_pActiveItem->ItemPreFrame( ); (Ham_Item_PreFrame) is called.
Code:
void CBasePlayer::ItemPreFrame()
{
#if defined( CLIENT_WEAPONS )
if ( m_flNextAttack > 0 )
#else
if ( gpGlobals->time < m_flNextAttack )
#endif
{
return;
}
if (!m_pActiveItem)
return;
m_pActiveItem->ItemPreFrame( );
}
__________________