Beispiel #1
0
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;
	}
Beispiel #9
0
MotionID	rnd_motion::	motion		( )	const
{
	if( motions.empty( ) )
			return MotionID();
	return motions[ ::Random.randI(0, motions.size()) ];
}