void CActor::attach_Vehicle(CHolderCustom* vehicle) { if(!vehicle) return; if(m_holder) return; PickupModeOff (); m_holder=vehicle; CKinematicsAnimated* V = smart_cast<CKinematicsAnimated*>(Visual()); R_ASSERT(V); if(!m_holder->attach_Actor(this)){ m_holder=NULL; return; } // temp play animation CCar* car = smart_cast<CCar*>(m_holder); u16 anim_type = car->DriverAnimationType(); SVehicleAnimCollection& anims = m_vehicle_anims->m_vehicles_type_collections[anim_type]; V->PlayCycle (anims.idles[0],FALSE); ResetCallbacks (); u16 head_bone = V->LL_BoneID("bip01_head"); V->LL_GetBoneInstance (u16(head_bone)).set_callback (bctPhysics, VehicleHeadCallback,this); character_physics_support ()->movement()->DestroyCharacter(); mstate_wishful = 0; m_holderID=car->ID (); SetWeaponHideState (INV_STATE_CAR, true); CStepManager::on_animation_start(MotionID(), 0); }
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; }
bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { m = MotionID(); //#ifdef DEBUG // if( death_anim_debug ) // Msg( " type_motion1: 2. »зрешетить пул¤ми " ); //#endif return false; }
void CCharacterPhysicsSupport::KillHit( SHit &H ) { #ifdef DEBUG if( death_anim_debug ) Msg( "death anim: kill hit " ); #endif VERIFY( m_EntityAlife.Visual( ) ); VERIFY( m_EntityAlife.Visual( )->dcast_PKinematics( ) ); m_character_shell_control.TestForWounded( m_EntityAlife.XFORM( ), m_EntityAlife.Visual( )->dcast_PKinematics( ) ); Fmatrix prev_pose; prev_pose.set( mXFORM ); Fvector start;start.set( m_EntityAlife.Position( ) ); Fvector velocity; Fvector death_position; CreateShell( H.who, death_position, velocity ); //ActivateShell( H.who ); // if(Type() == etStalker && xr_strcmp(dbg_stalker_death_anim, "none") != 0) float hit_angle = 0; MotionID m = m_death_anims.motion( m_EntityAlife, H, hit_angle ); CAI_Stalker* const holder = m_EntityAlife.cast_stalker(); if (holder && (holder->wounded() || holder->movement().current_params().cover()) ) m = MotionID(); if( m.valid( ) )//&& cmp( prev_pose, mXFORM ) { destroy( m_interactive_motion ); if( false && b_death_anim_velocity ) m_interactive_motion = new imotion_velocity( ); else m_interactive_motion = new imotion_position( ); m_interactive_motion->setup( m ,m_pPhysicsShell, hit_angle ); } else DestroyIKController( ); if( is_imotion(m_interactive_motion ) ) m_interactive_motion->play( ); m_character_shell_control.set_fatal_impulse( H ); if( !is_imotion( m_interactive_motion ) ) { #ifdef DEBUG if( death_anim_debug ) { Msg( "death anim: kill hit use free ragdoll " ); Msg( "death anim: fatal impulse: %f, ", H.impulse ); } #endif EndActivateFreeShell( H.who, start ,death_position, velocity ); m_flags.set( fl_block_hit, TRUE ); } }
bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { m = MotionID(); if( H.initiator() != Level().CurrentControlEntity()) return false; VERIFY( ea.Visual( ) ); IKinematics *K = ea.Visual()->dcast_PKinematics(); VERIFY( K ); if( is_bone_head( *K, H.bone() ) ) { edirection dr = dir( ea, H, angle ); m = motion( dr ); type_motion_diagnostic( " type_motion3: 4. ’едшот (по веро¤тности), кроме 5 (4)", dr, ea, H, m ); return true; } return false; }
bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { if( H.initiator() != Level().CurrentControlEntity()) return false; m = MotionID(); VERIFY( ea.Visual( ) ); IKinematics *K = ea.Visual()->dcast_PKinematics(); VERIFY( K ); if(is_snipper( H.weaponID ) && !is_bone_head( *K, H.bone() )) { edirection dr = dir( ea, H, angle ); m = motion( dr ); type_motion_diagnostic( "type_motion5: 6. —найперка в тело", dr, ea, H, m ); return true; } return false; }
bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { m = MotionID(); if( H.initiator() != Level().CurrentControlEntity()) return false; VERIFY( ea.Visual( ) ); IKinematics *K = ea.Visual()->dcast_PKinematics(); VERIFY( K ); if( !is_bone_head( *K, H.bone() )) return false; //CAI_Stalker* s = ea.cast_stalker (); CCharacterPhysicsSupport* chs = ea.character_physics_support(); if( !chs || chs->Type( ) == CCharacterPhysicsSupport::etBitting ) return false; VERIFY( chs->movement() ); const Fvector stalker_velocity = chs->movement()->GetVelocity(); const float stalker_speed = stalker_velocity.magnitude(); const float min_stalker_speed = 3.65f; if(stalker_speed < min_stalker_speed ) return false; const Fvector stalker_velocity_dir = Fvector().mul( stalker_velocity, 1.f/stalker_speed ); const Fvector dir_to_actor = Fvector().sub( H.initiator()->Position(), ea.Position() ).normalize_safe(); const float front_angle_cos = _cos( deg2rad ( 20.f ) ); if( stalker_velocity_dir.dotproduct(dir_to_actor) < front_angle_cos ) return false; if( type_motion::front != type_motion::dir( ea, H, angle ) ) return false; Fvector p; if( Fvector().sub( H.initiator()->Position(), global_hit_position( p, ea, H ) ).magnitude() > 30.f ) return false; m = motion( front ); type_motion_diagnostic( " type_motion0: 1. = »нерционное движение вперед от попадани¤ в голову ", front, ea, H, m ); return true; }
bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { m = MotionID(); if( H.initiator() != Level().CurrentControlEntity()) return false; CObject* O = Level().Objects.net_Find( H.weaponID ); if(!O) return false; //static_cast<CGameObject*>(O)->cast_weapon() CWeaponShotgun* s = smart_cast< CWeaponShotgun* >( static_cast<CGameObject*>(O) ); if(!s) return false; Fvector p; const float max_distance = 20.f; if(Fvector().sub(H.initiator()->Position(),global_hit_position( p, ea, H )).magnitude() > max_distance) return false; edirection dr = dir( ea, H, angle ); m = motion( dr ); type_motion_diagnostic( " type_motion2: 3. Ўотган ", dr, ea, H, m ); return true; }
MotionID rnd_motion:: motion ( ) const { if( motions.empty( ) ) return MotionID(); return motions[ ::Random.randI(0, motions.size()) ]; }