void CActor::detach_Vehicle() { if(!m_holder) return; CCar* car=smart_cast<CCar*>(m_holder); if(!car)return; CPHShellSplitterHolder*sh= car->PPhysicsShell()->SplitterHolder(); if(sh)sh->Deactivate(); if(!character_physics_support()->movement()->ActivateBoxDynamic(0)) { if(sh)sh->Activate(); return; } if(sh)sh->Activate(); m_holder->detach_Actor();// character_physics_support()->movement()->SetPosition(m_holder->ExitPosition()); character_physics_support()->movement()->SetVelocity(m_holder->ExitVelocity()); r_model_yaw=-m_holder->Camera()->yaw; r_torso.yaw=r_model_yaw; r_model_yaw_dest=r_model_yaw; m_holder=NULL; SetCallbacks (); CKinematicsAnimated* V= smart_cast<CKinematicsAnimated*>(Visual()); R_ASSERT(V); V->PlayCycle (m_anims->m_normal.legs_idle); V->PlayCycle (m_anims->m_normal.m_torso_idle); m_holderID=u16(-1); //. SetWeaponHideState(whs_CAR, FALSE); SetWeaponHideState(INV_STATE_CAR, false); }
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); }
void CActor::g_cl_ValidateMState(float dt, u32 mstate_wf) { // Lookout if (mstate_wf&mcLookout) mstate_real |= mstate_wf&mcLookout; else mstate_real &= ~mcLookout; if (mstate_real&(mcJump|mcFall|mcLanding|mcLanding2)) mstate_real &= ~mcLookout; // закончить приземление if (mstate_real&(mcLanding|mcLanding2)){ m_fLandingTime -= dt; if (m_fLandingTime<=0.f){ mstate_real &=~ (mcLanding|mcLanding2); mstate_real &=~ (mcFall|mcJump); } } // закончить падение if (character_physics_support()->movement()->gcontact_Was){ if (mstate_real&mcFall){ if (character_physics_support()->movement()->GetContactSpeed()>4.f){ if (fis_zero(character_physics_support()->movement()->gcontact_HealthLost)){ m_fLandingTime = s_fLandingTime1; mstate_real |= mcLanding; }else{ m_fLandingTime = s_fLandingTime2; mstate_real |= mcLanding2; } } } m_bJumpKeyPressed = TRUE; m_fJumpTime = s_fJumpTime; mstate_real &=~ (mcFall|mcJump); } if ((mstate_wf&mcJump)==0) m_bJumpKeyPressed = FALSE; // Зажало-ли меня/уперся - не двигаюсь if (((character_physics_support()->movement()->GetVelocityActual()<0.2f)&&(!(mstate_real&(mcFall|mcJump)))) || character_physics_support()->movement()->bSleep) { mstate_real &=~ mcAnyMove; } if (character_physics_support()->movement()->Environment()==CPHMovementControl::peOnGround || character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall) { // если на земле гарантированно снимать флажок Jump if (((s_fJumpTime-m_fJumpTime)>s_fJumpGroundTime)&&(mstate_real&mcJump)) { mstate_real &=~ mcJump; m_fJumpTime = s_fJumpTime; } } if(character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall) { if(!(mstate_real & mcClimb)) { mstate_real |=mcClimb; mstate_real &=~mcSprint; cam_SetLadder(); } } else { if (mstate_real & mcClimb) { cam_UnsetLadder(); } mstate_real &=~mcClimb; }; if (mstate_wf != mstate_real){ if ((mstate_real&mcCrouch)&&((0==(mstate_wf&mcCrouch)) || mstate_real&mcClimb)){ if (character_physics_support()->movement()->ActivateBoxDynamic(0)){ mstate_real &= ~mcCrouch; } } } if(!CanAccelerate()&&isActorAccelerated(mstate_real, IsZoomAimingMode())) { mstate_real ^=mcAccel; }; if (this == Level().CurrentControlEntity()) { bool bOnClimbNow = !!(mstate_real&mcClimb); bool bOnClimbOld = !!(mstate_old&mcClimb); if (bOnClimbNow != bOnClimbOld ) { SetWeaponHideState (INV_STATE_LADDER, bOnClimbNow ); }; /* if ((mstate_real&mcSprint) != (mstate_old&mcSprint)) { CHudItem* pHudItem = smart_cast<CHudItem*>(inventory().ActiveItem()); if (pHudItem) pHudItem->onMovementChanged(mcSprint); }; */ }; };