void CWeapon::OnZoomIn() { m_zoom_params.m_bIsZoomModeNow = true; if(m_zoom_params.m_bUseDynamicZoom) SetZoomFactor(m_fRTZoomFactor); else m_zoom_params.m_fCurrentZoomFactor = CurrentZoomFactor(); EnableHudInertion (FALSE); //if(m_zoom_params.m_bZoomDofEnabled && !IsScopeAttached()) // GamePersistent().SetEffectorDOF (m_zoom_params.m_ZoomDof); if(GetHUDmode()) GamePersistent().SetPickableEffectorDOF(true); if(m_zoom_params.m_sUseBinocularVision.size() && IsScopeAttached() && NULL==m_zoom_params.m_pVision) m_zoom_params.m_pVision = xr_new<CBinocularsVision>(m_zoom_params.m_sUseBinocularVision/*"wpn_binoc"*/); if(m_zoom_params.m_sUseZoomPostprocess.size() && IsScopeAttached()) { CActor *pA = smart_cast<CActor *>(H_Parent()); if(pA) { if(NULL==m_zoom_params.m_pNight_vision) { m_zoom_params.m_pNight_vision = xr_new<CNightVisionEffector>(m_zoom_params.m_sUseZoomPostprocess/*"device_torch"*/); } } } }
void CBurer::Hit (SHit* pHDS) { if ( m_shield_active && pHDS->hit_type == ALife::eHitTypeFireWound && Device.dwFrame != last_hit_frame ) { // вычислить позицию и направленность партикла Fmatrix pos; //CParticlesPlayer::MakeXFORM(this,element,Fvector().set(0.f,0.f,1.f),p_in_object_space,pos); CParticlesPlayer::MakeXFORM (this,pHDS->bone(),pHDS->dir,pHDS->p_in_bone_space,pos); // установить particles CParticlesObject* ps = CParticlesObject::Create(particle_fire_shield,TRUE); ps->UpdateParent (pos,Fvector().set(0.f,0.f,0.f)); GamePersistent().ps_needtoplay.push_back (ps); } else if ( !m_shield_active ) { inherited::Hit (pHDS); } last_hit_frame = Device.dwFrame; }
void CCustomZone::enter_Zone(SZoneObjectInfo& io) { if(m_zone_flags.test(eAffectPickDOF) && Level().CurrentEntity()) { if(io.object->ID()==Level().CurrentEntity()->ID()) GamePersistent().SetPickableEffectorDOF(true); } }
void CBulletManager::PlayExplodePS (const Fmatrix& xf) { if (!m_ExplodeParticles.empty()){ const shared_str& ps_name = m_ExplodeParticles[Random.randI(0, m_ExplodeParticles.size())]; CParticlesObject* ps = CParticlesObject::Create(*ps_name,TRUE); ps->UpdateParent(xf,zero_vel); GamePersistent().ps_needtoplay.push_back(ps); } }
void CCustomZone::exit_Zone (SZoneObjectInfo& io) { StopObjectIdleParticles(io.object); if(m_zone_flags.test(eAffectPickDOF) && Level().CurrentEntity()) { if(io.object->ID()==Level().CurrentEntity()->ID()) GamePersistent().SetPickableEffectorDOF(false); } }
virtual void run () { CParticlesObject* ps = CParticlesObject::Create(ps_name,TRUE); Fmatrix pos; Fvector zero_vel = {0.f,0.f,0.f}; pos.k.set(*((Fvector*)c.normal)); Fvector::generate_orthonormal_basis(pos.k, pos.j, pos.i); pos.c.set(*((Fvector*)c.pos)); ps->UpdateParent(pos,zero_vel); GamePersistent().ps_needtoplay.push_back(ps); };
void game_cl_Deathmatch::PlayParticleEffect(LPCSTR EffName, Fvector& pos) { if (!EffName) return; // вычислить позицию и направленность партикла Fmatrix M; M.translate(pos); // CParticlesPlayer::MakeXFORM(pObj,0,Fvector().set(0.f,1.f,0.f),Fvector().set(0.f,0.f,0.f),pos); // установить particles CParticlesObject* ps = NULL; ps = CParticlesObject::Create(EffName,TRUE); ps->UpdateParent(M,Fvector().set(0.f,0.f,0.f)); GamePersistent().ps_needtoplay.push_back(ps); }
BOOL CLevel::Load_GameSpecific_Before() { // AI space g_pGamePersistent->LoadTitle ("st_loading_ai_objects"); string_path fn_game; if (GamePersistent().GameType() == GAME_SINGLE && !ai().get_alife() && FS.exist(fn_game,"$level$","level.ai")) ai().load (net_SessionName()); if (!g_dedicated_server && !ai().get_alife() && ai().get_game_graph() && FS.exist(fn_game, "$level$", "level.game")) { IReader *stream = FS.r_open (fn_game); ai().patrol_path_storage_raw (*stream); FS.r_close (stream); } return (TRUE); }
void CWeapon::OnZoomOut() { m_zoom_params.m_bIsZoomModeNow = false; m_fRTZoomFactor = GetZoomFactor();//store current m_zoom_params.m_fCurrentZoomFactor = g_fov; EnableHudInertion (TRUE); // GamePersistent().RestoreEffectorDOF (); if(GetHUDmode()) GamePersistent().SetPickableEffectorDOF(false); ResetSubStateTime (); xr_delete (m_zoom_params.m_pVision); if(m_zoom_params.m_pNight_vision) { m_zoom_params.m_pNight_vision->Stop(100000.0f, false); xr_delete(m_zoom_params.m_pNight_vision); } }
void game_cl_GameState::net_import_GameTime (NET_Packet& P) { //time u64 GameTime; P.r_u64 (GameTime); float TimeFactor; P.r_float (TimeFactor); Level().SetGameTimeFactor (GameTime,TimeFactor); u64 GameEnvironmentTime; P.r_u64 (GameEnvironmentTime); float EnvironmentTimeFactor; P.r_float (EnvironmentTimeFactor); u64 OldTime = Level().GetEnvironmentGameTime(); Level().SetEnvironmentGameTimeFactor (GameEnvironmentTime,EnvironmentTimeFactor); if (OldTime > GameEnvironmentTime) GamePersistent().Environment().Invalidate(); }
void CActor::Hit (SHit* pHDS) { pHDS->aim_bullet = false; SHit HDS = *pHDS; if( HDS.hit_type<ALife::eHitTypeBurn || HDS.hit_type >= ALife::eHitTypeMax ) { string256 err; sprintf (err, "Unknown/unregistered hit type [%d]", HDS.hit_type); R_ASSERT2 (0, err ); } #ifdef DEBUG if(ph_dbg_draw_mask.test(phDbgCharacterControl)) { DBG_OpenCashedDraw(); Fvector to;to.add(Position(),Fvector().mul(HDS.dir,HDS.phys_impulse())); DBG_DrawLine(Position(),to,D3DCOLOR_XRGB(124,124,0)); DBG_ClosedCashedDraw(500); } #endif bool bPlaySound = true; if (!g_Alive()) bPlaySound = false; if (!IsGameTypeSingle() && !g_pGamePersistent->bDedicatedServer) { game_PlayerState* ps = Game().GetPlayerByGameID(ID()); if (ps && ps->testFlag(GAME_PLAYER_FLAG_INVINCIBLE)) { bPlaySound = false; if (Device.dwFrame != last_hit_frame && HDS.bone() != BI_NONE) { // вычислить позицию и направленность партикла Fmatrix pos; CParticlesPlayer::MakeXFORM(this,HDS.bone(),HDS.dir,HDS.p_in_bone_space,pos); // установить particles CParticlesObject* ps = NULL; if (eacFirstEye == cam_active && this == Level().CurrentEntity()) ps = CParticlesObject::Create(invincibility_fire_shield_1st,TRUE); else ps = CParticlesObject::Create(invincibility_fire_shield_3rd,TRUE); ps->UpdateParent(pos,Fvector().set(0.f,0.f,0.f)); GamePersistent().ps_needtoplay.push_back(ps); }; }; last_hit_frame = Device.dwFrame; }; if( !g_pGamePersistent->bDedicatedServer && !sndHit[HDS.hit_type].empty() && (ALife::eHitTypeTelepatic != HDS.hit_type)) { ref_sound& S = sndHit[HDS.hit_type][Random.randI(sndHit[HDS.hit_type].size())]; bool b_snd_hit_playing = sndHit[HDS.hit_type].end() != std::find_if(sndHit[HDS.hit_type].begin(), sndHit[HDS.hit_type].end(), playing_pred()); if(ALife::eHitTypeExplosion == HDS.hit_type) { if (this == Level().CurrentControlEntity()) { S.set_volume(10.0f); if(!m_sndShockEffector){ m_sndShockEffector = xr_new<SndShockEffector>(); m_sndShockEffector->Start(this, float(S._handle()->length_ms()), HDS.damage() ); } } else bPlaySound = false; } if (bPlaySound && !b_snd_hit_playing) { Fvector point = Position(); point.y += CameraHeight(); S.play_at_pos (this, point); }; } //slow actor, only when he gets hit if(HDS.hit_type == ALife::eHitTypeWound || HDS.hit_type == ALife::eHitTypeStrike) { hit_slowmo = HDS.damage(); clamp (hit_slowmo,0.0f,1.f); } else hit_slowmo = 0.f; //--------------------------------------------------------------- if (Level().CurrentViewEntity() == this && !g_pGamePersistent->bDedicatedServer && HDS.hit_type == ALife::eHitTypeFireWound) { CObject* pLastHitter = Level().Objects.net_Find(m_iLastHitterID); CObject* pLastHittingWeapon = Level().Objects.net_Find(m_iLastHittingWeaponID); HitSector(pLastHitter, pLastHittingWeapon); }; if ((mstate_real&mcSprint) && Level().CurrentControlEntity() == this && HDS.hit_type != ALife::eHitTypeTelepatic && HDS.hit_type != ALife::eHitTypeRadiation ) { // mstate_real &=~mcSprint; mstate_wishful &=~mcSprint; }; if(!g_pGamePersistent->bDedicatedServer) { HitMark (HDS.damage(), HDS.dir, HDS.who, HDS.bone(), HDS.p_in_bone_space, HDS.impulse, HDS.hit_type); } switch (GameID()) { case GAME_SINGLE: { float hit_power = HitArtefactsOnBelt(HDS.damage(), HDS.hit_type); if (GodMode())//psActorFlags.test(AF_GODMODE)) { HDS.power = 0.0f; // inherited::Hit(0.f,dir,who,element,position_in_bone_space,impulse, hit_type); inherited::Hit(&HDS); return; } else { //inherited::Hit (hit_power,dir,who,element,position_in_bone_space, impulse, hit_type); HDS.power = hit_power; inherited::Hit(&HDS); }; } break; default: { m_bWasBackStabbed = false; if (HDS.hit_type == ALife::eHitTypeWound_2 && Check_for_BackStab_Bone(HDS.bone())) { // convert impulse into local coordinate system Fmatrix mInvXForm; mInvXForm.invert (XFORM()); Fvector vLocalDir; mInvXForm.transform_dir (vLocalDir,HDS.dir); vLocalDir.invert (); Fvector a = {0,0,1}; float res = a.dotproduct(vLocalDir); if (res < -0.707) { game_PlayerState* ps = Game().GetPlayerByGameID(ID()); if (!ps || !ps->testFlag(GAME_PLAYER_FLAG_INVINCIBLE)) m_bWasBackStabbed = true; } }; float hit_power = 0; if (m_bWasBackStabbed) hit_power = 100000; else hit_power = HitArtefactsOnBelt(HDS.damage(), HDS.hit_type); HDS.power = hit_power; inherited::Hit (&HDS); //inherited::Hit (hit_power,dir,who,element,position_in_bone_space, impulse, hit_type, 0.0f); } break; } }
ui_core* UI () {return GamePersistent().m_pUI_core;};
void CActor::cam_Update(float dt, float fFOV) { if(m_holder) return; if( (mstate_real & mcClimb) && (cam_active!=eacFreeLook) ) camUpdateLadder(dt); on_weapon_shot_update(); float y_shift =0; if( GamePersistent().GameType() != eGameIDSingle && ik_cam_shift && character_physics_support() && character_physics_support()->ik_controller() ) { y_shift = character_physics_support()->ik_controller()->Shift(); float cam_smooth_k = 1.f; if(_abs(y_shift-current_ik_cam_shift)>ik_cam_shift_tolerance) { cam_smooth_k = 1.f - ik_cam_shift_speed * dt/0.01f; } if(_abs(y_shift)<ik_cam_shift_tolerance/2.f) cam_smooth_k = 1.f - ik_cam_shift_speed * 1.f/0.01f * dt; clamp( cam_smooth_k, 0.f, 1.f ); current_ik_cam_shift = cam_smooth_k * current_ik_cam_shift + y_shift * ( 1.f - cam_smooth_k ); } else current_ik_cam_shift = 0; Fvector point = {0,CameraHeight() + current_ik_cam_shift,0}; Fvector dangle = {0,0,0}; Fmatrix xform; xform.setXYZ (0,r_torso.yaw,0); xform.translate_over(XFORM().c); // lookout if (this == Level().CurrentControlEntity()) cam_Lookout( xform, point.y ); if (!fis_zero(r_torso.roll)) { float radius = point.y*0.5f; float valid_angle = r_torso.roll/2.f; calc_point (point,radius,0,valid_angle); dangle.z = (PI_DIV_2-((PI+valid_angle)/2)); } float flCurrentPlayerY = xform.c.y; // Smooth out stair step ups if ((character_physics_support()->movement()->Environment()==CPHMovementControl::peOnGround) && (flCurrentPlayerY-fPrevCamPos>0)){ fPrevCamPos += dt*1.5f; if (fPrevCamPos > flCurrentPlayerY) fPrevCamPos = flCurrentPlayerY; if (flCurrentPlayerY-fPrevCamPos>0.2f) fPrevCamPos = flCurrentPlayerY-0.2f; point.y += fPrevCamPos-flCurrentPlayerY; }else{ fPrevCamPos = flCurrentPlayerY; } float _viewport_near = VIEWPORT_NEAR; // calc point xform.transform_tiny (point); CCameraBase* C = cam_Active(); C->Update (point,dangle); C->f_fov = fFOV; if(eacFirstEye != cam_active) { cameras[eacFirstEye]->Update (point,dangle); cameras[eacFirstEye]->f_fov = fFOV; } if (Level().CurrentEntity() == this) { collide_camera( *cameras[eacFirstEye], _viewport_near, this ); } if( psActorFlags.test(AF_PSP) ) { Cameras().UpdateFromCamera (C); }else { Cameras().UpdateFromCamera (cameras[eacFirstEye]); } fCurAVelocity = vPrevCamDir.sub(cameras[eacFirstEye]->vDirection).magnitude()/Device.fTimeDelta; vPrevCamDir = cameras[eacFirstEye]->vDirection; #ifdef DEBUG if( dbg_draw_camera_collision ) { dbg_draw_viewport( *cameras[eacFirstEye], _viewport_near ); dbg_draw_viewport( Cameras(), _viewport_near ); } #endif if (Level().CurrentEntity() == this) { Level().Cameras().UpdateFromCamera (C); if(eacFirstEye == cam_active && !Level().Cameras().GetCamEffector(cefDemo)){ Cameras().ApplyDevice (_viewport_near); } } }