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 ); }
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; }
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 }