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::IR_OnKeyboardRelease(int cmd) { if (m_blocked_actions.find((EGameActions)cmd) != m_blocked_actions.end() ) return; // Real Wolf. 14.10.2014 if (Remote()) return; // if (conditions().IsSleeping()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; if (g_Alive()) { if (cmd == kUSE) PickupModeOff(); if(m_holder) { m_holder->OnKeyboardRelease(cmd); if(m_holder->allowWeapon() && inventory().Action(cmd, CMD_STOP)) return; return; }else if(inventory().Action(cmd, CMD_STOP)) return; switch(cmd) { case kJUMP: mstate_wishful &=~mcJump; break; case kDROP: if(GAME_PHASE_INPROGRESS == Game().Phase()) g_PerformDrop(); break; case kCROUCH: g_bAutoClearCrouch = true; } } }
void CActor::PickupModeUpdate_COD () { if (Level().CurrentViewEntity() != this || !g_b_COD_PickUpMode) return; if (!g_Alive() || eacFirstEye != cam_active) { HUD().GetUI()->UIMainIngameWnd->SetPickUpItem(NULL); return; }; CFrustum frustum; frustum.CreateFromMatrix(Device.mFullTransform,FRUSTUM_P_LRTB|FRUSTUM_P_FAR); //--------------------------------------------------------------------------- ISpatialResult.clear_not_free (); g_SpatialSpace->q_frustum(ISpatialResult, 0, STYPE_COLLIDEABLE, frustum); //--------------------------------------------------------------------------- float maxlen = 1000.0f; CInventoryItem* pNearestItem = NULL; for (u32 o_it=0; o_it<ISpatialResult.size(); o_it++) { ISpatial* spatial = ISpatialResult[o_it]; CInventoryItem* pIItem = smart_cast<CInventoryItem*> (spatial->dcast_CObject ()); if (0 == pIItem) continue; if (pIItem->object().H_Parent() != NULL) continue; if (!pIItem->CanTake()) continue; if (pIItem->object().CLS_ID == CLSID_OBJECT_G_RPG7 || pIItem->object().CLS_ID == CLSID_OBJECT_G_FAKE) continue; CGrenade* pGrenade = smart_cast<CGrenade*> (spatial->dcast_CObject ()); if (pGrenade && !pGrenade->Useful()) continue; CMissile* pMissile = smart_cast<CMissile*> (spatial->dcast_CObject ()); if (pMissile && !pMissile->Useful()) continue; Fvector A, B, tmp; pIItem->object().Center (A); if (A.distance_to_sqr(Position())>4) continue; tmp.sub(A, cam_Active()->vPosition); B.mad(cam_Active()->vPosition, cam_Active()->vDirection, tmp.dotproduct(cam_Active()->vDirection)); float len = B.distance_to_sqr(A); if (len > 1) continue; if (maxlen>len && !pIItem->object().getDestroy()) { maxlen = len; pNearestItem = pIItem; }; } if(pNearestItem) { CFrustum frustum; frustum.CreateFromMatrix (Device.mFullTransform,FRUSTUM_P_LRTB|FRUSTUM_P_FAR); if (!CanPickItem(frustum,Device.vCameraPosition,&pNearestItem->object())) pNearestItem = NULL; } if (pNearestItem && pNearestItem->cast_game_object()) { if (Level().m_feel_deny.is_object_denied(pNearestItem->cast_game_object())) pNearestItem = NULL; } HUD().GetUI()->UIMainIngameWnd->SetPickUpItem(pNearestItem); if (pNearestItem && m_bPickupMode) { //подбирание объекта Game().SendPickUpEvent(ID(), pNearestItem->object().ID()); PickupModeOff(); } };