Fixing trigger gravity: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
Currently the [[Trigger_gravity|trigger_gravity]] brush entity doesn't actually function properly.
Currently the [[Trigger_gravity|trigger_gravity]] brush entity doesn't actually function properly.


To fix gravity triggers, navigate to triggers.cpp, around line 2679 you should find this:
To fix gravity triggers, navigate to triggers.cpp, around line 2651 you should find this:


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
class CTriggerGravity : public CBaseTrigger
{
public:
DECLARE_CLASS( CTriggerGravity, CBaseTrigger );
DECLARE_DATADESC();
void Spawn( void );
void GravityTouch( CBaseEntity *pOther );
};
LINK_ENTITY_TO_CLASS( trigger_gravity, CTriggerGravity );
BEGIN_DATADESC( CTriggerGravity )
// Function Pointers
DEFINE_FUNCTION(GravityTouch),
END_DATADESC()
void CTriggerGravity::Spawn( void )
{
BaseClass::Spawn();
InitTrigger();
SetTouch( &CTriggerGravity::GravityTouch );
}
void CTriggerGravity::GravityTouch( CBaseEntity *pOther )
void CTriggerGravity::GravityTouch( CBaseEntity *pOther )
{
{
Line 14: Line 39:
</syntaxhighlight>
</syntaxhighlight>


Either comment out or remove the if-return.
replace the whole class, functions and all with this:
 
<syntaxhighlight lang="cpp">
class CTriggerGravity : public CTriggerMultiple
{
public:
DECLARE_CLASS(CTriggerGravity, CTriggerMultiple);
DECLARE_DATADESC();
 
void Spawn( void );
 
void StartTouch(CBaseEntity *pOther);
void EndTouch(CBaseEntity *pOther);
};
LINK_ENTITY_TO_CLASS( trigger_gravity, CTriggerGravity );
 
BEGIN_DATADESC( CTriggerGravity )
 
// Function Pointers
DEFINE_FUNCTION(StartTouch),
DEFINE_FUNCTION(EndTouch),
 
END_DATADESC()
 
void CTriggerGravity::Spawn( void )
{
BaseClass::Spawn();
InitTrigger();
//SetTouch( &CTriggerGravity::GravityTouch );
}
 
void CTriggerGravity::StartTouch( CBaseEntity *pOther )
{
// Only save on clients
//if ( !pOther->IsPlayer() )
// return;
 
pOther->SetGravity( GetGravity() );
}
 
void CTriggerGravity::EndTouch(CBaseEntity *pOther)
{
// Only save on clients
//if ( !pOther->IsPlayer() )
// return;
 
pOther->SetGravity(1);
}
</syntaxhighlight>


[[Trigger_gravity|trigger_gravity]] should work fine now on players, but still won't change a physics object's gravity.
[[Trigger_gravity|trigger_gravity]] should work fine now on players, but still won't change a physics object's gravity.

Revision as of 17:35, 5 January 2018

Currently the trigger_gravity brush entity doesn't actually function properly.

To fix gravity triggers, navigate to triggers.cpp, around line 2651 you should find this:

class CTriggerGravity : public CBaseTrigger
{
public:
	DECLARE_CLASS( CTriggerGravity, CBaseTrigger );
	DECLARE_DATADESC();

	void Spawn( void );
	void GravityTouch( CBaseEntity *pOther );
};
LINK_ENTITY_TO_CLASS( trigger_gravity, CTriggerGravity );

BEGIN_DATADESC( CTriggerGravity )

	// Function Pointers
	DEFINE_FUNCTION(GravityTouch),

END_DATADESC()

void CTriggerGravity::Spawn( void )
{
	BaseClass::Spawn();
	InitTrigger();
	SetTouch( &CTriggerGravity::GravityTouch );
}

void CTriggerGravity::GravityTouch( CBaseEntity *pOther )
{
	// Only save on clients
	if ( !pOther->IsPlayer() )
		return;

	pOther->SetGravity( GetGravity() );
}

replace the whole class, functions and all with this:

class CTriggerGravity : public CTriggerMultiple
{
public:
	DECLARE_CLASS(CTriggerGravity, CTriggerMultiple);
	DECLARE_DATADESC();

	void Spawn( void );

	void StartTouch(CBaseEntity *pOther);
	void EndTouch(CBaseEntity *pOther);
};
LINK_ENTITY_TO_CLASS( trigger_gravity, CTriggerGravity );

BEGIN_DATADESC( CTriggerGravity )

	// Function Pointers
	DEFINE_FUNCTION(StartTouch),
	DEFINE_FUNCTION(EndTouch),

END_DATADESC()

void CTriggerGravity::Spawn( void )
{
	BaseClass::Spawn();
	InitTrigger();
	//SetTouch( &CTriggerGravity::GravityTouch );
}

void CTriggerGravity::StartTouch( CBaseEntity *pOther )
{
	// Only save on clients
	//if ( !pOther->IsPlayer() )
	//	return;

	pOther->SetGravity( GetGravity() );
}

void CTriggerGravity::EndTouch(CBaseEntity *pOther)
{
	// Only save on clients
	//if ( !pOther->IsPlayer() )
	//	return;

	pOther->SetGravity(1);
}

trigger_gravity should work fine now on players, but still won't change a physics object's gravity.