bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { if( H.initiator() != Level().CurrentControlEntity()) return false; if(H.type() == ALife::eHitTypeExplosion) { edirection dr = dir( ea, H, angle ); m = motion( dr ); type_motion_diagnostic( "type_motion6: 7. √ранта", dr, ea, H, m ); return true; } CObject* O = Level().Objects.net_Find( H.weaponID ); if(!O) { m = MotionID(); return false; } if( smart_cast<CExplosive*>( O ) != 0 ) { edirection dr = dir( ea, H, angle ); m = motion( dr ); type_motion_diagnostic( "type_motion6: 7. √ранта - осколок", dr, ea, H, m ); return true; } return false; }
void CCharacterPhysicsSupport::in_Hit( SHit &H, bool is_killing ) { m_sv_hit = H; m_hit_valide_time = Device.dwTimeGlobal + hit_valide_time; if( m_EntityAlife.use_simplified_visual ( ) || esRemoved == m_eState ) return; if( m_flags.test( fl_block_hit ) ) { VERIFY2( !m_EntityAlife.g_Alive( ), make_string("entity [%s][%d] is dead", m_EntityAlife.Name(), m_EntityAlife.ID()).c_str()); if( Device.dwTimeGlobal - m_EntityAlife.GetLevelDeathTime( ) >= 2000 ) m_flags.set(fl_block_hit,FALSE); else return; } //is_killing = is_killing || ( m_eState==esAlive && !m_EntityAlife.g_Alive( ) ); if( m_EntityAlife.g_Alive( ) && is_killing && H.type( ) == ALife::eHitTypeExplosion && H.damage( ) > 70.f ) CPHDestroyable::Destroy( ); if( ( !m_EntityAlife.g_Alive() || is_killing ) ) m_character_shell_control.set_kill_hit( H ); if(!m_pPhysicsShell&&is_killing) KillHit( H ); if( m_flags.test(fl_use_hit_anims) && Type() != etBitting && !m_flags.test(fl_death_anim_on) ) //&& Type() == etStalker { m_hit_animations.PlayHitMotion( H.direction( ), H.bone_space_position(), H.bone( ), m_EntityAlife ); } if( !( m_pPhysicsShell && m_pPhysicsShell->isActive( ) ) ) { if( !is_killing && m_EntityAlife.g_Alive( ) ) m_PhysicMovementControl->ApplyHit( H.direction( ), H.phys_impulse( ), H.type( ) ); } else { #ifdef DEBUG if( is_killing && death_anim_debug && !is_imotion( m_interactive_motion ) ) { Msg( "death anim: applied fatal impulse dir: (%f,%f,%f), value: (%f) ", H.dir.x,H.dir.y,H.dir.z, H.impulse ); } #endif m_pPhysicsShell->applyHit( H.bone_space_position( ), H.direction( ), H.phys_impulse( ), H.bone(), H.type( ) ); } }
void CCar::PHHit(SHit &H) { if(!m_pPhysicsShell) return; if(m_bone_steer==H.bone()) return; if(CPHUpdateObject::IsActive()) { Fvector vimpulse;vimpulse.set(H.direction()); vimpulse.mul( H.phys_impulse( ) ); vimpulse.y *=GravityFactorImpulse(); float mag=vimpulse.magnitude(); if(!fis_zero(mag)) { vimpulse.mul(1.f/mag); m_pPhysicsShell->applyHit(H.bone_space_position(),vimpulse,mag,H.bone(),H.type()); } } else { m_pPhysicsShell->applyHit( H.bone_space_position(), H.direction(), H.phys_impulse(), H.bone(), H.type() ); } }
void CPhysicsShellHolder::PHHit( SHit &H ) { if(H.phys_impulse() >0) if(m_pPhysicsShell) m_pPhysicsShell->applyHit(H.bone_space_position(),H.direction(),H.phys_impulse(),H.bone(),H.type()); }