void CSpectator::UpdateCL() { inherited::UpdateCL(); if (GameID() != GAME_SINGLE) { if (Game().local_player && Game().local_player->GameID == ID()) { if (cam_active != eacFreeFly) { if (m_pActorToLookAt && !m_pActorToLookAt->g_Alive()) cam_Set(eacFreeLook); if (!m_pActorToLookAt) { SelectNextPlayerToLook(); if (!m_pActorToLookAt) cam_Set(eacFreeFly); }; } if (Level().CurrentViewEntity() == this) cam_Update(m_pActorToLookAt); return; } }; if (g_pGameLevel->CurrentViewEntity()==this){ if (eacFreeFly!=cam_active){ //------------------------------------- //------------------------------------- int idx = 0; game_PlayerState* P = Game().local_player; if (P&&(P->team>=0)&&(P->team<(int)Level().seniority_holder().teams().size())){ const CTeamHierarchyHolder& T = Level().seniority_holder().team(P->team); for (u32 i=0; i<T.squads().size(); ++i){ const CSquadHierarchyHolder& S = T.squad(i); for (u32 j=0; j<S.groups().size(); ++j){ const CGroupHierarchyHolder& G = S.group(j); for (u32 k=0; k<G.members().size(); ++k){ CActor* A = smart_cast<CActor*>(G.members()[k]); if (A/*&&A->g_Alive()*/){ if(idx==look_idx){ cam_Update (A); return; } ++idx; } } } } } // не найден объект с таким индексом - сбросим на первый объект look_idx = 0; // никого нет за кем смотреть - переключимся на if (0==idx) cam_Set(eacFreeFly); } // по умолчанию eacFreeFly cam_Update (0); } }
void CSpectator::net_Relcase (CObject *O) { if (O != m_pActorToLookAt) return; m_pActorToLookAt = NULL; if (cam_active != eacFreeFly) SelectNextPlayerToLook(); if (!m_pActorToLookAt) cam_Set(eacFreeFly); };
void CSpectator::net_Relcase (CObject *O) { if (O != m_pActorToLookAt) return; if (m_pActorToLookAt != Level().CurrentEntity()) //new spectator was spawned { m_pActorToLookAt = NULL; return; } m_pActorToLookAt = NULL; if (cam_active != eacFreeFly) { SelectNextPlayerToLook(false); if (m_pActorToLookAt == O) //selected to look at player that will be destroyed { m_pActorToLookAt = NULL; } } if (!m_pActorToLookAt) cam_Set(eacFreeFly); };
void CActor::Die (CObject* who) { inherited::Die(who); //------------------------------------- if (OnServer()) { TISlotArr::iterator I = inventory().m_slots.begin(), B = I; TISlotArr::iterator E = inventory().m_slots.end(); for ( ; I != E; ++I) { if ((I - B) == (int)inventory().GetActiveSlot()) { if((*I).m_pIItem) { if (OnServer()) { if (GameID() == GAME_SINGLE) (*I).m_pIItem->Drop(); else { NET_Packet P; (*I).m_pIItem->object().u_EventGen(P, GE_OWNERSHIP_REJECT, (*I).m_pIItem->object().H_Parent()->ID()); P.w_u16(u16((*I).m_pIItem->object().ID())); (*I).m_pIItem->object().u_EventSend(P); } } }; } else { CCustomOutfit *pOutfit = smart_cast<CCustomOutfit *> ((*I).m_pIItem); if (pOutfit) continue; if((*I).m_pIItem) inventory().Ruck((*I).m_pIItem); }; }; ///!!! чистка пояса TIItemContainer &l_blist = inventory().m_belt; while (!l_blist.empty()) inventory().Ruck(l_blist.front()); if (OnServer() && GameID() != GAME_SINGLE) { // bool MedKitDropped = false; //if we are on server and actor has PDA - destroy PDA TIItemContainer &l_rlist = inventory().m_ruck; for(TIItemContainer::iterator l_it = l_rlist.begin(); l_rlist.end() != l_it; ++l_it) { if (GameID() == GAME_ARTEFACTHUNT) { CArtefact* pArtefact = smart_cast<CArtefact*> (*l_it); if (pArtefact) { (*l_it)->Drop(); continue; }; }; if ((*l_it)->object().CLS_ID == CLSID_OBJECT_PLAYERS_BAG) { (*l_it)->Drop(); continue; }; /* if ((*l_it)->object().CLS_ID == CLSID_IITEM_MEDKIT && !MedKitDropped) { MedKitDropped = true; (*l_it)->Drop(); continue; }; if ((*l_it)->object().CLS_ID == CLSID_DEVICE_PDA) { (*l_it)->Drop(); continue; }; CCustomOutfit *pOutfit = smart_cast<CCustomOutfit *> (*l_it); if (pOutfit) continue; //пока у нас нельзя обыскивать трупы, удаляем все объекты из инвентаря (*l_it)->object().DestroyObject(); */ }; }; }; cam_Set (eacFreeLook); mstate_wishful &= ~mcAnyMove; mstate_real &= ~mcAnyMove; if(!g_pGamePersistent->bDedicatedServer) { ::Sound->play_at_pos (sndDie[Random.randI(SND_DIE_COUNT)],this,Position()); m_HeavyBreathSnd.stop (); m_BloodSnd.stop (); } if(IsGameTypeSingle()) { start_tutorial ("game_over"); } //. HUD().GetUI()->UIGame()->AddCustomStatic("game_over", true); xr_delete (m_sndShockEffector); }
void CActor::Load (LPCSTR section ) { // Msg ("Loading actor: %s",section); inherited::Load (section); material().Load (section); CInventoryOwner::Load (section); memory().Load (section); m_location_manager->Load (section); if (GameID() == GAME_SINGLE) OnDifficultyChanged (); ////////////////////////////////////////////////////////////////////////// ISpatial* self = smart_cast<ISpatial*> (this); if (self) { self->spatial.type |= STYPE_VISIBLEFORAI; self->spatial.type &= ~STYPE_REACTTOSOUND; } ////////////////////////////////////////////////////////////////////////// // m_PhysicMovementControl: General //m_PhysicMovementControl->SetParent (this); Fbox bb;Fvector vBOX_center,vBOX_size; // m_PhysicMovementControl: BOX vBOX_center= pSettings->r_fvector3 (section,"ph_box2_center" ); vBOX_size = pSettings->r_fvector3 (section,"ph_box2_size" ); bb.set (vBOX_center,vBOX_center); bb.grow(vBOX_size); character_physics_support()->movement()->SetBox (2,bb); // m_PhysicMovementControl: BOX vBOX_center= pSettings->r_fvector3 (section,"ph_box1_center" ); vBOX_size = pSettings->r_fvector3 (section,"ph_box1_size" ); bb.set (vBOX_center,vBOX_center); bb.grow(vBOX_size); character_physics_support()->movement()->SetBox (1,bb); // m_PhysicMovementControl: BOX vBOX_center= pSettings->r_fvector3 (section,"ph_box0_center" ); vBOX_size = pSettings->r_fvector3 (section,"ph_box0_size" ); bb.set (vBOX_center,vBOX_center); bb.grow(vBOX_size); character_physics_support()->movement()->SetBox (0,bb); //// m_PhysicMovementControl: Foots //Fvector vFOOT_center= pSettings->r_fvector3 (section,"ph_foot_center" ); //Fvector vFOOT_size = pSettings->r_fvector3 (section,"ph_foot_size" ); //bb.set (vFOOT_center,vFOOT_center); bb.grow(vFOOT_size); ////m_PhysicMovementControl->SetFoots (vFOOT_center,vFOOT_size); // m_PhysicMovementControl: Crash speed and mass float cs_min = pSettings->r_float (section,"ph_crash_speed_min" ); float cs_max = pSettings->r_float (section,"ph_crash_speed_max" ); float mass = pSettings->r_float (section,"ph_mass" ); character_physics_support()->movement()->SetCrashSpeeds (cs_min,cs_max); character_physics_support()->movement()->SetMass (mass); if(pSettings->line_exist(section,"stalker_restrictor_radius")) character_physics_support()->movement()->SetActorRestrictorRadius(CPHCharacter::rtStalker,pSettings->r_float(section,"stalker_restrictor_radius")); if(pSettings->line_exist(section,"stalker_small_restrictor_radius")) character_physics_support()->movement()->SetActorRestrictorRadius(CPHCharacter::rtStalkerSmall,pSettings->r_float(section,"stalker_small_restrictor_radius")); if(pSettings->line_exist(section,"medium_monster_restrictor_radius")) character_physics_support()->movement()->SetActorRestrictorRadius(CPHCharacter::rtMonsterMedium,pSettings->r_float(section,"medium_monster_restrictor_radius")); character_physics_support()->movement()->Load(section); m_fWalkAccel = pSettings->r_float(section,"walk_accel"); m_fJumpSpeed = pSettings->r_float(section,"jump_speed"); m_fRunFactor = pSettings->r_float(section,"run_coef"); m_fRunBackFactor = pSettings->r_float(section,"run_back_coef"); m_fWalkBackFactor = pSettings->r_float(section,"walk_back_coef"); m_fCrouchFactor = pSettings->r_float(section,"crouch_coef"); m_fClimbFactor = pSettings->r_float(section,"climb_coef"); m_fSprintFactor = pSettings->r_float(section,"sprint_koef"); m_fWalk_StrafeFactor = READ_IF_EXISTS(pSettings, r_float, section, "walk_strafe_coef", 1.0f); m_fRun_StrafeFactor = READ_IF_EXISTS(pSettings, r_float, section, "run_strafe_coef", 1.0f); m_fCamHeightFactor = pSettings->r_float(section,"camera_height_factor"); character_physics_support()->movement() ->SetJumpUpVelocity(m_fJumpSpeed); float AirControlParam = pSettings->r_float (section,"air_control_param" ); character_physics_support()->movement() ->SetAirControlParam(AirControlParam); m_fPickupInfoRadius = pSettings->r_float(section,"pickup_info_radius"); m_fSleepTimeFactor = pSettings->r_float(section,"sleep_time_factor"); character_physics_support()->in_Load (section); //загрузить параметры эффектора // LoadShootingEffector ("shooting_effector"); LoadSleepEffector ("sleep_effector"); //загрузить параметры смещения firepoint m_vMissileOffset = pSettings->r_fvector3(section,"missile_throw_offset"); //Weapons = xr_new<CWeaponList> (this); if(!g_pGamePersistent->bDedicatedServer) { LPCSTR hit_snd_sect = pSettings->r_string(section,"hit_sounds"); for(int hit_type=0; hit_type<(int)ALife::eHitTypeMax; ++hit_type) { LPCSTR hit_name = ALife::g_cafHitType2String((ALife::EHitType)hit_type); LPCSTR hit_snds = pSettings->r_string(hit_snd_sect, hit_name); int cnt = _GetItemCount(hit_snds); string128 tmp; VERIFY (cnt!=0); for(int i=0; i<cnt;++i) { sndHit[hit_type].push_back (ref_sound()); sndHit[hit_type].back().create (_GetItem(hit_snds,i,tmp),st_Effect,sg_SourceType); } char buf[256]; ::Sound->create (sndDie[0], strconcat(buf,*cName(),"\\die0"), st_Effect,SOUND_TYPE_MONSTER_DYING); ::Sound->create (sndDie[1], strconcat(buf,*cName(),"\\die1"), st_Effect,SOUND_TYPE_MONSTER_DYING); ::Sound->create (sndDie[2], strconcat(buf,*cName(),"\\die2"), st_Effect,SOUND_TYPE_MONSTER_DYING); ::Sound->create (sndDie[3], strconcat(buf,*cName(),"\\die3"), st_Effect,SOUND_TYPE_MONSTER_DYING); m_HeavyBreathSnd.create (pSettings->r_string(section,"heavy_breath_snd"), st_Effect,SOUND_TYPE_MONSTER_INJURING); m_BloodSnd.create (pSettings->r_string(section,"heavy_blood_snd"), st_Effect,SOUND_TYPE_MONSTER_INJURING); } } if( psActorFlags.test(AF_PSP) ) cam_Set (eacLookAt); else cam_Set (eacFirstEye); // sheduler shedule.t_min = shedule.t_max = 1; // настройки дисперсии стрельбы m_fDispBase = pSettings->r_float (section,"disp_base" ); m_fDispBase = deg2rad(m_fDispBase); m_fDispAim = pSettings->r_float (section,"disp_aim" ); m_fDispAim = deg2rad(m_fDispAim); m_fDispVelFactor = pSettings->r_float (section,"disp_vel_factor" ); m_fDispAccelFactor = pSettings->r_float (section,"disp_accel_factor" ); m_fDispCrouchFactor = pSettings->r_float (section,"disp_crouch_factor"); m_fDispCrouchNoAccelFactor = pSettings->r_float (section,"disp_crouch_no_acc_factor"); LPCSTR default_outfit = READ_IF_EXISTS(pSettings,r_string,section,"default_outfit",0); SetDefaultVisualOutfit (default_outfit); invincibility_fire_shield_1st = READ_IF_EXISTS(pSettings,r_string,section,"Invincibility_Shield_1st",0); invincibility_fire_shield_3rd = READ_IF_EXISTS(pSettings,r_string,section,"Invincibility_Shield_3rd",0); //----------------------------------------- m_AutoPickUp_AABB = READ_IF_EXISTS(pSettings,r_fvector3,section,"AutoPickUp_AABB",Fvector().set(0.02f, 0.02f, 0.02f)); m_AutoPickUp_AABB_Offset = READ_IF_EXISTS(pSettings,r_fvector3,section,"AutoPickUp_AABB_offs",Fvector().set(0, 0, 0)); CStringTable string_table; m_sCharacterUseAction = "character_use"; m_sDeadCharacterUseAction = "dead_character_use"; m_sDeadCharacterUseOrDragAction = "dead_character_use_or_drag"; m_sCarCharacterUseAction = "car_character_use"; m_sInventoryItemUseAction = "inventory_item_use"; m_sInventoryBoxUseAction = "inventory_box_use"; //--------------------------------------------------------------------- m_sHeadShotParticle = READ_IF_EXISTS(pSettings,r_string,section,"HeadShotParticle",0); }
void CActor::NoClipFly(int cmd) { Fvector cur_pos;// = Position(); cur_pos.set(0,0,0); float scale = 1.0f; if(pInput->iGetAsyncKeyState(DIK_LSHIFT)) scale = 0.25f; else if(pInput->iGetAsyncKeyState(DIK_LMENU)) scale = 4.0f; switch(cmd) { case kJUMP: cur_pos.y += 0.1f; break; case kCROUCH: cur_pos.y -= 0.1f; break; case kFWD: cur_pos.z += 0.1f; break; case kBACK: cur_pos.z -= 0.1f; break; case kL_STRAFE: cur_pos.x -= 0.1f; break; case kR_STRAFE: cur_pos.x += 0.1f; break; case kCAM_1: cam_Set(eacFirstEye); break; case kCAM_2: cam_Set(eacLookAt); break; case kCAM_3: cam_Set(eacFreeLook); break; case kNIGHT_VISION: SwitchNightVision(); break; case kTORCH: SwitchTorch(); break; case kDETECTOR: { PIItem det_active = inventory().ItemFromSlot(DETECTOR_SLOT); if(det_active) { CCustomDetector* det = smart_cast<CCustomDetector*>(det_active); det->ToggleDetector(g_player_hud->attached_item(0)!=NULL); return; } } break; case kUSE: ActorUse(); break; } cur_pos.mul(scale); Fmatrix mOrient; mOrient.rotateY(-(cam_Active()->GetWorldYaw())); mOrient.transform_dir(cur_pos); Position().add(cur_pos); character_physics_support()->movement()->SetPosition(Position()); }
void CActor::IR_OnKeyboardPress(int cmd) { if(hud_adj_mode && pInput->iGetAsyncKeyState(DIK_LSHIFT)) return; if (Remote()) return; if (IsTalking()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; switch (cmd) { case kWPN_FIRE: { /* XEM #95 */ //if( (mstate_wishful & mcLookout) && !IsGameTypeSingle() ) return; u16 slot = inventory().GetActiveSlot(); if(inventory().ActiveItem() && (slot==INV_SLOT_3 || slot==INV_SLOT_2) ) mstate_wishful &=~mcSprint; //----------------------------- if (OnServer()) { NET_Packet P; P.w_begin(M_PLAYER_FIRE); P.w_u16(ID()); u_EventSend(P); } }break; default: { }break; } if (!g_Alive()) return; if(m_holder && kUSE != cmd) { m_holder->OnKeyboardPress (cmd); if(m_holder->allowWeapon() && inventory().Action((u16)cmd, CMD_START)) return; return; }else if(inventory().Action((u16)cmd, CMD_START)) return; #ifdef DEBUG if(psActorFlags.test(AF_NO_CLIP)) { NoClipFly(cmd); return; } #endif //DEBUG switch(cmd) { case kJUMP: { mstate_wishful |= mcJump; }break; case kSPRINT_TOGGLE: { mstate_wishful ^= mcSprint; }break; case kCROUCH: { if( psActorFlags.test(AF_CROUCH_TOGGLE) ) mstate_wishful ^= mcCrouch; }break; case kCAM_1: cam_Set (eacFirstEye); break; case kCAM_2: cam_Set (eacLookAt); break; case kCAM_3: cam_Set (eacFreeLook); break; case kNIGHT_VISION: { SwitchNightVision(); break; } case kTORCH: { SwitchTorch(); break; } case kDETECTOR: { PIItem det_active = inventory().ItemFromSlot(DETECTOR_SLOT); if(det_active) { CCustomDetector* det = smart_cast<CCustomDetector*>(det_active); det->ToggleDetector (g_player_hud->attached_item(0)!=NULL); return; } }break; /* case kFLARE:{ PIItem fl_active = inventory().ItemFromSlot(FLARE_SLOT); if(fl_active) { CFlare* fl = smart_cast<CFlare*>(fl_active); fl->DropFlare (); return ; } PIItem fli = inventory().Get(CLSID_DEVICE_FLARE, true); if(!fli) return; CFlare* fl = smart_cast<CFlare*>(fli); if(inventory().Slot(fl)) fl->ActivateFlare (); }break; */ case kUSE: ActorUse(); break; case kDROP: b_DropActivated = TRUE; f_DropPower = 0; break; case kNEXT_SLOT: { OnNextWeaponSlot(); }break; case kPREV_SLOT: { OnPrevWeaponSlot(); }break; case kQUICK_USE_1: case kQUICK_USE_2: case kQUICK_USE_3: case kQUICK_USE_4: { const shared_str& item_name = g_quick_use_slots[cmd-kQUICK_USE_1]; if(item_name.size()) { PIItem itm = inventory().GetAny(item_name.c_str()); if(itm) { if (IsGameTypeSingle()) { inventory().Eat (itm); } else { inventory().ClientEat (itm); } StaticDrawableWrapper* _s = CurrentGameUI()->AddCustomStatic("item_used", true); string1024 str; strconcat (sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->NameItem()); _s->wnd()->TextItemControl()->SetText(str); CurrentGameUI()->GetActorMenu().m_pQuickSlot->ReloadReferences(this); } } }break; } }
void CSpectator::IR_OnKeyboardPress(int cmd) { if (Remote()) return; switch(cmd) { case kACCEL: { Accel_mul = START_ACCEL*2; }break; case kCAM_1: { SelectNextPlayerToLook(); if (m_pActorToLookAt) cam_Set (eacFirstEye); else cam_Set (eacFreeFly); }break; case kCAM_2: if (cam_active == eacFreeFly && SelectNextPlayerToLook()) cam_Set (eacLookAt); break; case kCAM_3: if (cam_active == eacFreeFly && SelectNextPlayerToLook()) cam_Set (eacFreeLook); break; case kCAM_4: cam_Set (eacFreeFly); m_pActorToLookAt = NULL; break; case kWPN_FIRE: { if (cam_active != eacFreeFly) { ++look_idx; SelectNextPlayerToLook(); if (cam_active == eacFirstEye && m_pActorToLookAt) FirstEye_ToPlayer(m_pActorToLookAt); } }break; case kWPN_ZOOM: { game_cl_mp* pMPGame = smart_cast<game_cl_mp*> (&Game()); if (!pMPGame) break; game_PlayerState* PS = Game().local_player; if (!PS || PS->GameID != ID()) break; EActorCameras new_camera = EActorCameras((cam_active+1)%eacMaxCam); if (!PS->testFlag(GAME_PLAYER_FLAG_SPECTATOR)) { while (!pMPGame->Is_Spectator_Camera_Allowed(new_camera) && new_camera != eacFreeFly) { new_camera = EActorCameras((new_camera+1)%eacMaxCam); } }; if (new_camera == eacFreeFly) { cam_Set (eacFreeFly); m_pActorToLookAt = NULL; } else { if (!m_pActorToLookAt) SelectNextPlayerToLook(); if (!m_pActorToLookAt) cam_Set (eacFreeFly); else cam_Set (new_camera); } }break; } }
void CActor::IR_OnKeyboardPress(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 (IsTalking()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; switch (cmd) { case kWPN_FIRE: { mstate_wishful &=~mcSprint; //----------------------------- if (OnServer()) { NET_Packet P; P.w_begin(M_PLAYER_FIRE); P.w_u16(ID()); u_EventSend(P); } }break; default: { }break; } if (!g_Alive()) return; if(m_holder && kUSE != cmd) { m_holder->OnKeyboardPress (cmd); if(m_holder->allowWeapon() && inventory().Action(cmd, CMD_START)) return; return; }else if(inventory().Action(cmd, CMD_START)) return; switch(cmd){ case kJUMP: { mstate_wishful |= mcJump; { // NET_Packet P; // u_EventGen(P, GE_ACTOR_JUMPING, ID()); // u_EventSend(P); } }break; case kCROUCH_TOGGLE: { g_bAutoClearCrouch = !g_bAutoClearCrouch; if (!g_bAutoClearCrouch) mstate_wishful |= mcCrouch; }break; case kSPRINT_TOGGLE: { if (mstate_wishful & mcSprint) mstate_wishful &=~mcSprint; else mstate_wishful |= mcSprint; }break; case kCAM_1: cam_Set (eacFirstEye); break; case kCAM_2: cam_Set (eacLookAt); break; case kCAM_3: cam_Set (eacFreeLook); break; case kNIGHT_VISION: { const xr_vector<CAttachableItem*>& all = CAttachmentOwner::attached_objects(); xr_vector<CAttachableItem*>::const_iterator it = all.begin(); xr_vector<CAttachableItem*>::const_iterator it_e = all.end(); for(;it!=it_e;++it){ CTorch* torch = smart_cast<CTorch*>(*it); if (torch){ torch->SwitchNightVision(); break; } } }break; case kTORCH:{ const xr_vector<CAttachableItem*>& all = CAttachmentOwner::attached_objects(); xr_vector<CAttachableItem*>::const_iterator it = all.begin(); xr_vector<CAttachableItem*>::const_iterator it_e = all.end(); for(;it!=it_e;++it){ CTorch* torch = smart_cast<CTorch*>(*it); if (torch){ torch->Switch(); break; } } }break; case kWPN_1: case kWPN_2: case kWPN_3: case kWPN_4: case kWPN_5: case kWPN_6: case kWPN_RELOAD: //Weapons->ActivateWeaponID (cmd-kWPN_1); break; case kUSE: ActorUse(); break; case kDROP: b_DropActivated = TRUE; f_DropPower = 0; break; case kNEXT_SLOT: { OnNextWeaponSlot(); }break; case kPREV_SLOT: { OnPrevWeaponSlot(); }break; case kUSE_BANDAGE: case kUSE_MEDKIT: { if(IsGameTypeSingle()) { PIItem itm = inventory().item((cmd==kUSE_BANDAGE)? CLSID_IITEM_BANDAGE:CLSID_IITEM_MEDKIT ); if(itm) { inventory().Eat (itm); SDrawStaticStruct* _s = HUD().GetUI()->UIGame()->AddCustomStatic("item_used", true); _s->m_endTime = Device.fTimeGlobal+3.0f;// 3sec string1024 str; strconcat (sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->Name()); _s->wnd()->SetText (str); } } }break; #ifdef INV_NEW_SLOTS_SYSTEM case kUSE_SLOT_QUICK_ACCESS_0: case kUSE_SLOT_QUICK_ACCESS_1: case kUSE_SLOT_QUICK_ACCESS_2: case kUSE_SLOT_QUICK_ACCESS_3: { if(IsGameTypeSingle()) { PIItem itm = 0; switch (cmd){ case kUSE_SLOT_QUICK_ACCESS_0: itm = inventory().m_slots[SLOT_QUICK_ACCESS_0].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_1: itm = inventory().m_slots[SLOT_QUICK_ACCESS_1].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_2: itm = inventory().m_slots[SLOT_QUICK_ACCESS_2].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_3: itm = inventory().m_slots[SLOT_QUICK_ACCESS_3].m_pIItem; break; } if (itm){ CMedkit* pMedkit = smart_cast<CMedkit*> (itm); CAntirad* pAntirad = smart_cast<CAntirad*> (itm); CEatableItem* pEatableItem = smart_cast<CEatableItem*> (itm); CBottleItem* pBottleItem = smart_cast<CBottleItem*> (itm); string1024 str; if(pMedkit || pAntirad || pEatableItem || pBottleItem){ PIItem iitm = inventory().Same(itm,true); if(iitm){ inventory().Eat(iitm); strconcat(sizeof(str),str,*CStringTable().translate("st_item_used"),": ", iitm->Name()); }else{ inventory().Eat(itm); strconcat(sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->Name()); } SDrawStaticStruct* _s = HUD().GetUI()->UIGame()->AddCustomStatic("item_used", true); _s->m_endTime = Device.fTimeGlobal+3.0f;// 3sec _s->wnd()->SetText (str); } } } }break; #endif } }
void CSpectator::UpdateCL() { inherited::UpdateCL(); float fPreviousFrameTime = m_timer.GetElapsed_sec(); m_timer.Start(); m_fTimeDelta = 0.3f * m_fTimeDelta + 0.7f * fPreviousFrameTime; if (m_fTimeDelta > 0.1f) m_fTimeDelta = 0.1f; //maximum 10 fps if (m_fTimeDelta < 0.0f) m_fTimeDelta = EPS_S; if (Device.Paused()) { #ifdef DEBUG dbg_update_cl = 0; #endif if (m_pActorToLookAt) { #ifdef DEBUG m_pActorToLookAt->dbg_update_cl = 0; m_pActorToLookAt->dbg_update_shedule = 0; Game().dbg_update_shedule = 0; #endif Device.dwTimeDelta = 0; m_pActorToLookAt->UpdateCL(); m_pActorToLookAt->shedule_Update (0); Game().shedule_Update (0); #ifdef DEBUG m_pActorToLookAt->dbg_update_cl = 0; m_pActorToLookAt->dbg_update_shedule = 0; Game().dbg_update_shedule = 0; #endif } } if (GameID() != eGameIDSingle) { if (Game().local_player && ( (Game().local_player->GameID == ID()) || Level().IsDemoPlay() ) ) { if (cam_active != eacFreeFly) { if (m_pActorToLookAt && !m_pActorToLookAt->g_Alive()) cam_Set(eacFreeLook); if (!m_pActorToLookAt) { SelectNextPlayerToLook(false); if (m_pActorToLookAt) cam_Set(m_last_camera); }; } if (Level().CurrentViewEntity() == this) { cam_Update(m_pActorToLookAt); } return; } }; if (g_pGameLevel->CurrentViewEntity()==this){ if (eacFreeFly!=cam_active){ //------------------------------------- //------------------------------------- int idx = 0; game_PlayerState* P = Game().local_player; if (P&&(P->team>=0)&&(P->team<(int)Level().seniority_holder().teams().size())){ const CTeamHierarchyHolder& T = Level().seniority_holder().team(P->team); for (u32 i=0; i<T.squads().size(); ++i){ const CSquadHierarchyHolder& S = T.squad(i); for (u32 j=0; j<S.groups().size(); ++j){ const CGroupHierarchyHolder& G = S.group(j); for (u32 k=0; k<G.members().size(); ++k){ CActor* A = smart_cast<CActor*>(G.members()[k]); if (A/*&&A->g_Alive()*/){ if(idx==look_idx){ cam_Update (A); return; } ++idx; } } } } } // не найден объект с таким индексом - сбросим на первый объект look_idx = 0; // никого нет за кем смотреть - переключимся на if (0==idx) cam_Set(eacFreeFly); } // по умолчанию eacFreeFly cam_Update (0); } }