Esempio n. 1
0
void CFuncLight :: TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
{
	if( pev->takedamage == DAMAGE_NO )
		return;

	if( m_iState == STATE_DEAD )
		return;

	const char *pTextureName = NULL;
	Vector start = pevAttacker->origin + pevAttacker->view_ofs;
	Vector end = start + vecDir * 1024;
	edict_t *pHit = ptr->pHit;

	if( pHit )
		pTextureName = TRACE_TEXTURE( pHit, start, end );

	if( pTextureName != NULL && ( !Q_strncmp( pTextureName, "+0~", 3 ) || *pTextureName == '~' ))
	{
		// take damage only at light texture
		UTIL_Sparks( ptr->vecEndPos );
		m_vecLastDmgPoint = ptr->vecEndPos;
	}

	CBreakable::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType );
}
Esempio n. 2
0
char UTIL_TextureHit(TraceResult *ptr, Vector vecSrc, Vector vecEnd)
{
	char chTextureType;
	float rgfl1[3], rgfl2[3];
	const char *pTextureName;
	char szbuffer[64];
	CBaseEntity *pEntity;

	if( ptr->pHit == NULL )
		return CHAR_TEX_FLESH;

	pEntity = CBaseEntity::Instance(ptr->pHit);

	if (pEntity && pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE)
		return CHAR_TEX_FLESH;

	vecSrc.CopyToArray(rgfl1);
	vecEnd.CopyToArray(rgfl2);

	if (pEntity)
		pTextureName = TRACE_TEXTURE(ENT(pEntity->pev), rgfl1, rgfl2);
	else
		pTextureName = TRACE_TEXTURE(ENT(0), rgfl1, rgfl2);

	if (pTextureName)
	{
		if (*pTextureName == '-' || *pTextureName == '+')
			pTextureName += 2;

		if (*pTextureName == '{' || *pTextureName == '!' || *pTextureName == '~' || *pTextureName == ' ')
			pTextureName++;

		strncpy(szbuffer, pTextureName, sizeof(szbuffer));
		szbuffer[CBTEXTURENAMEMAX - 1] = 0;
		chTextureType = PM_FindTextureType(szbuffer);
	}
	else
		chTextureType = 0;

	return chTextureType;
}
Esempio n. 3
0
void CGrappleHook :: Hit( CBaseEntity* Target ) 
{
	EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/bgrapple_impact.wav", 1, ATTN_NORM);

	TraceResult TResult; 
	Vector StartPosition;
	Vector delta = Vector( 8, 8, 0 );
	Vector mins = pev->origin - delta;
	Vector maxs = pev->origin + delta;
	maxs.z = pev->origin.z;

#ifndef CLIENT_DLL

	CBaseEntity *pList[1];
	int count = UTIL_EntitiesInBox( pList, 1, mins, maxs, (FL_MONSTER) );

	// Fograin92: We did hit a monster
	if ( count )
	{
		m_iHitMonster = 1;	// Fograin92: Let's assume we hit bigger monster.

		// Fograin92: Loop through everything we did hit.
		for (int i = 0; i < count; i++ )
		{
			ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> Hit ^3%s\n", STRING(pList[i]->pev->classname) );
			myHitMonster = pList[i]; // Fograin92: Hook pointer to our monster.

			// Fograin92: Check what did we hit
			if ((FClassnameIs (pList[i]->pev, "monster_babycrab" ))
				||	(FClassnameIs (pList[i]->pev, "monster_headcrab" ))
				||	(FClassnameIs (pList[i]->pev, "monster_cockroach" ))
				||	(FClassnameIs (pList[i]->pev, "monster_rat" ))
				)
			{
				m_iHitMonster = 2;	// Fograin92: This is tiny monster.
				SetTouch(NULL);		// Fograin92: Let's reset this, we don't want multiple HIT execs when target is moving.
				break;
			}
			else if (FClassnameIs (pList[i]->pev, "monster_barnacle" ))
			{
				// Fograin92: We did hit another barnacle
				bPullBack = true;	// Let's pull back the tongue, we don't want any barnacle <-> barnacle love here...
			}
		}

		// Fograin92: If it's still "1" then we did hit bigger monster
		if (m_iHitMonster == 1)
		{
			pev->velocity = pev->velocity.Normalize( );
			myowner->m_afPhysicsFlags |= PFLAG_ON_GRAPPLE; // Set physics flag to "on grapple"
			myowner->pev->movetype = MOVETYPE_BOUNCE; // Remove gravity effect on player
			SetTouch(NULL);	// Fograin92: Let's reset this, we don't want multiple HIT execs when target is moving.
		}
	}
	else
	{
		ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> Tongue hit a brush entity.\n");
		TraceResult tr;
		float rgfl1[3];
		float rgfl2[3];
		const char *pTextureName;
		Vector vecSrc = pev->origin;
		Vector vecEnd = vecSrc + gpGlobals->v_forward * 8;

		UTIL_MakeVectors( pev->v_angle );
		UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( pev ), &tr );

		CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
		vecSrc.CopyToArray(rgfl1);
		vecEnd.CopyToArray(rgfl2);
		if (pEntity)
		{
			// Fograin92: Did we hit a gib?
			if (pEntity->Classify() == CLASS_GIBS)
			{
				// Fograin92: Let's pull this gib
				myHitMonster = pEntity;
				m_iHitMonster = 2;
				SetTouch(NULL);
				return;
			}

			// Fograin92: If we are still here, try to trace texture
			pTextureName = TRACE_TEXTURE( ENT(pEntity->pev), rgfl1, rgfl2 );
		}
		else
			pTextureName = TRACE_TEXTURE( ENT(0), rgfl1, rgfl2 );

		if (pTextureName && myowner && (strnicmp (pTextureName, "xeno_", 5) == 0))
		{
			pev->velocity = pev->velocity.Normalize( );
			myowner->m_afPhysicsFlags |= PFLAG_ON_GRAPPLE; // Set physics flag to "on grapple"
			myowner->pev->movetype = MOVETYPE_BOUNCE; // Remove gravity effect on player
		}
		else
		{
			// Fograin92: We did hit a non organic wall, let's pull-back the tongue
			bPullBack = true;
		}
	}
#endif
}