View Single Post
ConnorMcLeod
Veteran Member
Join Date: Jul 2006
Location: France (95)
Old 12-06-2009 , 06:34   Re: [INFO] Think workflow
Reply With Quote #3

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( );
}
__________________
- tired and retired -

- my plugins -

Last edited by ConnorMcLeod; 12-06-2009 at 06:37.
ConnorMcLeod is offline