mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-03-12 05:22:55 +00:00
Prop unstuck feature (stop infinite touching between props)
This commit is contained in:
parent
635759e3b6
commit
e920c98659
@ -194,9 +194,13 @@ public:
|
|||||||
Explosions m_Explosion;
|
Explosions m_Explosion;
|
||||||
int m_iaCustomAnglesX[10];
|
int m_iaCustomAnglesX[10];
|
||||||
int m_iaCustomAnglesZ[10];
|
int m_iaCustomAnglesZ[10];
|
||||||
|
float m_flTouchTimer;
|
||||||
|
int m_iTouchCounter;
|
||||||
};
|
};
|
||||||
LINK_ENTITY_TO_CLASS(prop, CProp);
|
LINK_ENTITY_TO_CLASS(prop, CProp);
|
||||||
|
|
||||||
|
static int propTouchSelector;
|
||||||
|
|
||||||
const char *CProp::pSoundsWood[] =
|
const char *CProp::pSoundsWood[] =
|
||||||
{
|
{
|
||||||
"debris/wood1.wav",
|
"debris/wood1.wav",
|
||||||
@ -737,6 +741,41 @@ void CProp::Force(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTyp
|
|||||||
SetThink( &CProp::RespawnThink);
|
SetThink( &CProp::RespawnThink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int moveupcounter;
|
||||||
|
// Arrange entities that stucks prop
|
||||||
|
void UTIL_PropMoveUp( entvars_t *pev, float amount = 11 )
|
||||||
|
{
|
||||||
|
if( moveupcounter > 512 )
|
||||||
|
return;
|
||||||
|
if( pev->solid != SOLID_BBOX && pev->solid != SOLID_SLIDEBOX )
|
||||||
|
return;
|
||||||
|
if( pev->movetype != MOVETYPE_BOUNCE && pev->movetype != MOVETYPE_TOSS )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( amount <= 0 )
|
||||||
|
return;
|
||||||
|
if( pev->size.z > 100 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
moveupcounter++;
|
||||||
|
Vector mins = pev->absmin;
|
||||||
|
Vector maxs = pev->absmax;
|
||||||
|
|
||||||
|
mins.z = pev->absmax.z;
|
||||||
|
maxs.z += 10;
|
||||||
|
|
||||||
|
if( !CBaseEntity::Instance( pev )->IsPlayer() )
|
||||||
|
{
|
||||||
|
CBaseEntity *pList[32];
|
||||||
|
int count = UTIL_EntitiesInBox( pList, 32, mins, maxs, FL_ONGROUND );
|
||||||
|
for( int i = 0; i < count; i++ )
|
||||||
|
if( pList[i]->pev != pev && pList[i]->pev->absmin.z > pev->absmin.z )
|
||||||
|
UTIL_PropMoveUp( pList[i]->pev,pev->absmax.z - pList[i]->pev->absmin.z + 1 );
|
||||||
|
}
|
||||||
|
pev->origin.z += amount;
|
||||||
|
UTIL_SetOrigin( pev, pev->origin );
|
||||||
|
}
|
||||||
|
|
||||||
void CProp::CheckRotate()
|
void CProp::CheckRotate()
|
||||||
{
|
{
|
||||||
if( m_shape != SHAPE_CYL_H && m_shape != SHAPE_CYL_V )
|
if( m_shape != SHAPE_CYL_H && m_shape != SHAPE_CYL_V )
|
||||||
@ -763,25 +802,11 @@ void CProp::CheckRotate()
|
|||||||
}
|
}
|
||||||
else if (m_shape == SHAPE_CYL_V)
|
else if (m_shape == SHAPE_CYL_V)
|
||||||
{
|
{
|
||||||
Vector mins = pev->absmin;
|
|
||||||
Vector maxs = pev->absmax;
|
|
||||||
|
|
||||||
mins.z = pev->absmax.z;
|
|
||||||
maxs.z += 10;
|
|
||||||
ALERT(at_console, "setV: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z);
|
ALERT(at_console, "setV: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z);
|
||||||
|
|
||||||
// BUGBUG -- can only find 256 entities on a prop -- should be enough
|
moveupcounter = 0;
|
||||||
CBaseEntity *pList[256];
|
UTIL_PropMoveUp(pev);
|
||||||
int count = UTIL_EntitiesInBox( pList, 256, mins, maxs, FL_ONGROUND );
|
|
||||||
if ( count )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
pList[i]->pev->origin.z += 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pev->origin.z += 10;
|
|
||||||
//pev->angles.y -= 90;
|
|
||||||
UTIL_SetSize(pev, minsV, maxsV);
|
UTIL_SetSize(pev, minsV, maxsV);
|
||||||
}
|
}
|
||||||
//DROP_TO_FLOOR(edict());
|
//DROP_TO_FLOOR(edict());
|
||||||
@ -823,11 +848,30 @@ void CProp::BounceTouch(CBaseEntity *pOther)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pev->movetype = MOVETYPE_BOUNCE;
|
pev->movetype = MOVETYPE_BOUNCE;
|
||||||
|
if( gpGlobals->time - m_flTouchTimer < 1 && m_iTouchCounter > 100 )
|
||||||
|
{
|
||||||
|
if( pOther->pev->solid == SOLID_BBOX || pOther->pev->solid == SOLID_SLIDEBOX )
|
||||||
|
{
|
||||||
|
moveupcounter = 0;
|
||||||
|
UTIL_PropMoveUp( pOther->pev, 1.5 );
|
||||||
|
//if( Intersects( pOther ) )
|
||||||
|
//pOther->pev->origin.z += pOther->pev->size.z;
|
||||||
|
pev->velocity = pev->avelocity = g_vecZero;
|
||||||
|
UTIL_SetOrigin( pOther->pev, pOther->pev->origin );
|
||||||
|
|
||||||
|
m_iTouchCounter = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_iTouchCounter = 0;
|
||||||
|
}
|
||||||
|
m_flTouchTimer = gpGlobals->time;
|
||||||
|
if( !pOther->IsPlayer() )
|
||||||
|
m_iTouchCounter++;
|
||||||
//ALERT( at_console, "BounceTouch: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z );
|
//ALERT( at_console, "BounceTouch: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z );
|
||||||
// only do damage if we're moving fairly fast
|
// only do damage if we're moving fairly fast
|
||||||
DeployThink();
|
DeployThink();
|
||||||
|
|
||||||
if ( m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 300)
|
if ( m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 300 && pev->absmin.z - pOther->pev->absmin.z > 1 )
|
||||||
{
|
{
|
||||||
if( !m_attacker )
|
if( !m_attacker )
|
||||||
m_attacker = this;
|
m_attacker = this;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user