void CPhysicsShellHolder::activate_physic_shell() { VERIFY (!m_pPhysicsShell); create_physic_shell (); Fvector l_fw, l_up; l_fw.set (XFORM().k); l_up.set (XFORM().j); l_fw.mul (2.f); l_up.mul (2.f); Fmatrix l_p1, l_p2; l_p1.set (XFORM()); l_p2.set (XFORM()); l_fw.mul (2.f); l_p2.c.add (l_fw); m_pPhysicsShell->Activate (l_p1, 0, l_p2); if(H_Parent()&&H_Parent()->Visual()) { smart_cast<CKinematics*>(H_Parent()->Visual())->CalculateBones_Invalidate (); smart_cast<CKinematics*>(H_Parent()->Visual())->CalculateBones (); } smart_cast<CKinematics*>(Visual())->CalculateBones_Invalidate (); smart_cast<CKinematics*>(Visual())->CalculateBones(); if(!IsGameTypeSingle()) { if(!smart_cast<CCustomRocket*>(this)&&!smart_cast<CGrenade*>(this)) PPhysicsShell()->SetIgnoreDynamic(); } // XFORM().set (l_p1); correct_spawn_pos(); m_pPhysicsShell->set_LinearVel(l_fw); m_pPhysicsShell->GetGlobalTransformDynamic(&XFORM()); }
void CBlackGraviArtefact::UpdateCLChild() { VERIFY(!ph_world->Processing()); inherited::UpdateCLChild (); if (getVisible() && m_pPhysicsShell) { if (m_bStrike) { Fvector P; P.set(Position()); feel_touch_update(P,m_fRadius); GraviStrike(); CParticlesObject* pStaticPG; pStaticPG = CParticlesObject::Create(*m_sParticleName,TRUE); Fmatrix pos; pos.set(XFORM()); Fvector vel; //vel.sub(Position(),ps_Element(0).vPosition); //vel.div((Level().timeServer()-ps_Element(0).dwTime)/1000.f); vel.set(0,0,0); pStaticPG->UpdateParent(pos, vel); pStaticPG->Play(); m_bStrike = false; } }else if(H_Parent()) XFORM().set(H_Parent()->XFORM()); }
void CWeaponKnife::OnAnimationEnd(u32 state) { switch (state) { case eHiding: SwitchState(eHidden); break; case eFire: case eFire2: { if(m_attackStart) { m_attackStart = false; if(GetState()==eFire) m_pHUD->animPlay(random_anim(mhud_attack_e), TRUE, this, GetState()); else m_pHUD->animPlay(random_anim(mhud_attack2_e), TRUE, this, GetState()); Fvector p1, d; p1.set(get_LastFP()); d.set(get_LastFD()); if(H_Parent()) smart_cast<CEntity*>(H_Parent())->g_fireParams(this, p1,d); else break; KnifeStrike(p1,d); } else SwitchState(eIdle); }break; case eShowing: case eIdle: SwitchState(eIdle); break; } }
void CWeaponMagazined::OnZoomIn() { inherited::OnZoomIn(); if (GetState() == eIdle) PlayAnimIdle(); CActor* pActor = smart_cast<CActor*>(H_Parent()); if (pActor) { HUD_SOUND::StopSound(sndSightsUp); //daemonion - iron sight audio - sights being raised HUD_SOUND::StopSound(sndSightsDown); // bool b_hud_mode = (Level().CurrentEntity() == H_Parent()); // HUD_SOUND::PlaySound(sndSightsUp, H_Parent()->Position(), H_Parent(), b_hud_mode); //--END CEffectorZoomInertion* S = smart_cast<CEffectorZoomInertion*> (pActor->Cameras().GetCamEffector(eCEZoom)); if (!S) { S = (CEffectorZoomInertion*)pActor->Cameras().AddCamEffector(xr_new<CEffectorZoomInertion>()); S->Init(this); }; S->SetRndSeed(pActor->GetZoomRndSeed()); R_ASSERT(S); } }
void CGrenade::Throw() { if (!m_fake_missile || m_thrown) return; CGrenade *pGrenade = smart_cast<CGrenade*>(m_fake_missile); VERIFY (pGrenade); if (pGrenade) { pGrenade->set_destroy_time(m_dwDestroyTimeMax); //установить ID того кто кинул гранату pGrenade->SetInitiator( H_Parent()->ID() ); } inherited::Throw (); m_fake_missile->processing_activate();//@sliph m_thrown = true; // Real Wolf.Start.18.12.14 auto parent = smart_cast<CGameObject*>(H_Parent()); auto obj = smart_cast<CGameObject*>(m_fake_missile); if (parent && obj) { parent->callback(GameObject::eOnThrowGrenade)(obj->lua_game_object()); } // Real Wolf.End.18.12.14 }
void CWeaponKnife::KnifeStrike(const Fvector& pos, const Fvector& dir) { CCartridge cartridge; cartridge.param_s.buckShot = 1; cartridge.param_s.impair = 1.0f; cartridge.param_s.kDisp = 1.0f; cartridge.param_s.kHit = 1.0f; cartridge.param_s.kCritical = 1.0f; cartridge.param_s.kImpulse = 1.0f; cartridge.param_s.kAP = 1.0f; cartridge.m_flags.set (CCartridge::cfTracer, FALSE); cartridge.m_flags.set (CCartridge::cfRicochet, FALSE); cartridge.param_s.fWallmarkSize = fWallmarkSize; cartridge.bullet_material_idx = knife_material_idx; while(m_magazine.size() < 2) m_magazine.push_back(cartridge); iAmmoElapsed = m_magazine.size(); bool SendHit = SendHitAllowed(H_Parent()); PlaySound ("sndShot",pos); Level().BulletManager().AddBullet( pos, dir, m_fStartBulletSpeed, fCurrentHit, fCurrentHitCritical, fHitImpulse_cur, H_Parent()->ID(), ID(), m_eHitType, fireDistance, cartridge, SendHit); }
// Function for callbacks added by Cribbledirge. void CWeaponMagazined::StateSwitchCallback(GameObject::ECallbackType actor_type, GameObject::ECallbackType npc_type) { xr_string ammo_type; if (GetAmmoElapsed() == 0 || m_magazine.empty()) { ammo_type = *m_ammoTypes[m_ammoType]; } else { ammo_type = *m_ammoTypes[m_magazine.back().m_LocalAmmoType]; } if (g_actor) { if (smart_cast<CActor*>(H_Parent())) // This is an actor. { Actor()->callback(actor_type)( lua_game_object(), // The weapon as a game object. ammo_type.c_str() // The caliber of the weapon. ); } else if (smart_cast<CEntityAlive*>(H_Parent())) // This is an NPC. { Actor()->callback(npc_type)( smart_cast<CEntityAlive*>(H_Parent())->lua_game_object(), // The owner of the weapon. lua_game_object(), // The weapon itself. ammo_type.c_str() // The caliber of the weapon. ); } } }
void CWeapon::SwitchState(u32 S) { if (OnClient()) return; #ifndef MASTER_GOLD if ( bDebug ) { Msg("---Server is going to send GE_WPN_STATE_CHANGE to [%d], weapon_section[%s], parent[%s]", S, cNameSect().c_str(), H_Parent() ? H_Parent()->cName().c_str() : "NULL Parent"); } #endif // #ifndef MASTER_GOLD SetNextState ( S ); if (CHudItem::object().Local() && !CHudItem::object().getDestroy() && m_pInventory && OnServer()) { // !!! Just single entry for given state !!! NET_Packet P; CHudItem::object().u_EventGen (P,GE_WPN_STATE_CHANGE,CHudItem::object().ID()); P.w_u8 (u8(S)); P.w_u8 (u8(m_sub_state)); P.w_u8 (m_ammoType); P.w_u8 (u8(iAmmoElapsed & 0xff)); P.w_u8 (m_set_next_ammoType_on_reload); CHudItem::object().u_EventSend (P, net_flags(TRUE, TRUE, FALSE, TRUE)); } }
void CArtefact::UpdateWorkload (u32 dt) { VERIFY(!physics_world()->Processing()); // particles - velocity Fvector vel = {0, 0, 0}; if (H_Parent()) { CPhysicsShellHolder* pPhysicsShellHolder = smart_cast<CPhysicsShellHolder*>(H_Parent()); if(pPhysicsShellHolder) pPhysicsShellHolder->PHGetLinearVell(vel); } CParticlesPlayer::SetParentVel (vel); // UpdateLights (); if(m_activationObj && m_activationObj->IsInProgress()) { CPHUpdateObject::Activate (); m_activationObj->UpdateActivation (); return; } // custom-logic if(!CAttachableItem::enabled()) UpdateCLChild (); }
void CArtefact::ActivateArtefact () { VERIFY(m_bCanSpawnZone); VERIFY( H_Parent() ); m_activationObj = xr_new<SArtefactActivation>(this,H_Parent()->ID()); m_activationObj->Start(); }
void CWeapon::UpdateCL () { inherited::UpdateCL (); UpdateHUDAddonsVisibility(); //подсветка от выстрела UpdateLight (); //нарисовать партиклы UpdateFlameParticles (); UpdateFlameParticles2 (); if(!IsGameTypeSingle()) make_Interpolation (); if( (GetNextState()==GetState()) && IsGameTypeSingle() && H_Parent()==Level().CurrentEntity()) { CActor* pActor = smart_cast<CActor*>(H_Parent()); if(pActor && !pActor->AnyMove() && this==pActor->inventory().ActiveItem()) { if (hud_adj_mode==0 && GetState()==eIdle && (Device.dwTimeGlobal-m_dw_curr_substate_time>20000) && !IsZoomed()&& g_player_hud->attached_item(1)==NULL) { if(AllowBore()) SwitchState (eBore); ResetSubStateTime (); } } } if(m_zoom_params.m_pNight_vision && !need_renderable()) { if(!m_zoom_params.m_pNight_vision->IsActive()) { CActor *pA = smart_cast<CActor *>(H_Parent()); R_ASSERT(pA); CTorch* pTorch = smart_cast<CTorch*>( pA->inventory().ItemFromSlot(TORCH_SLOT) ); if ( pTorch && pTorch->GetNightVisionStatus() ) { m_bRememberActorNVisnStatus = pTorch->GetNightVisionStatus(); pTorch->SwitchNightVision(false, false); } m_zoom_params.m_pNight_vision->Start(m_zoom_params.m_sUseZoomPostprocess, pA, false); } } else if(m_bRememberActorNVisnStatus) { m_bRememberActorNVisnStatus = false; EnableActorNVisnAfterZoom(); } if(m_zoom_params.m_pVision) m_zoom_params.m_pVision->Update(); }
void CWeaponMagazined::state_Fire(float dt) { VERIFY(fTimeToFire > 0.f); Fvector p1, d; p1.set(get_LastFP()); d.set(get_LastFD()); if (!H_Parent()) return; CInventoryOwner* io = smart_cast<CInventoryOwner*>(H_Parent()); if (NULL == io->inventory().ActiveItem()) { Log("current_state", GetState()); Log("next_state", GetNextState()); Log("state_time", m_dwStateTime); Log("item_sect", cNameSect().c_str()); Log("H_Parent", H_Parent()->cNameSect().c_str()); } smart_cast<CEntity*> (H_Parent())->g_fireParams(this, p1, d); if (m_iShotNum == 0) { m_vStartPos = p1; m_vStartDir = d; }; VERIFY(!m_magazine.empty()); // Msg("%d && %d && (%d || %d) && (%d || %d)", !m_magazine.empty(), fTime<=0, IsWorking(), m_bFireSingleShot, m_iQueueSize < 0, m_iShotNum < m_iQueueSize); while (!m_magazine.empty() && fTime <= 0 && (IsWorking() || m_bFireSingleShot) && (m_iQueueSize < 0 || m_iShotNum < m_iQueueSize)) { m_bFireSingleShot = false; VERIFY(fTimeToFire > 0.f); fTime += fTimeToFire; ++m_iShotNum; OnShot(); static int i = 0; if (i || m_iShotNum > m_iShootEffectorStart) { // Do Weapon Callback. (Cribbledirge) StateSwitchCallback(GameObject::eOnActorWeaponFire, GameObject::eOnNPCWeaponFire); FireTrace(p1, d); } else { FireTrace(m_vStartPos, m_vStartDir); } } if (m_iShotNum == m_iQueueSize) m_bStopedAfterQueueFired = true; UpdateSounds(); }
void CWeaponRPG7::switch2_Fire() { m_iShotNum = 0; m_bFireSingleShot = true; bWorking = false; if(GetState()==eFire && getRocketCount()) { Fvector p1, d1, p; Fvector p2, d2, d; p1.set (get_LastFP()); d1.set (get_LastFD()); p = p1; d = d1; CEntity* E = smart_cast<CEntity*> (H_Parent()); if(E) { E->g_fireParams (this, p2,d2); p = p2; d = d2; if(IsHudModeNow()) { Fvector p0; float dist = HUD().GetCurrentRayQuery().range; p0.mul (d2,dist); p0.add (p1); p = p1; d.sub (p0,p1); d.normalize_safe(); } } Fmatrix launch_matrix; launch_matrix.identity (); launch_matrix.k.set (d); Fvector::generate_orthonormal_basis(launch_matrix.k, launch_matrix.j, launch_matrix.i); launch_matrix.c.set (p); d.normalize (); d.mul (m_fLaunchSpeed); CRocketLauncher::LaunchRocket (launch_matrix, d, zero_vel); CExplosiveRocket* pGrenade = smart_cast<CExplosiveRocket*>(getCurrentRocket()); VERIFY (pGrenade); pGrenade->SetInitiator (H_Parent()->ID()); if (OnServer()) { NET_Packet P; u_EventGen (P,GE_LAUNCH_ROCKET,ID()); P.w_u16 (u16(getCurrentRocket()->ID())); u_EventSend (P); } } }
void CPda::feel_touch_delete(CObject* O) { if(!H_Parent()) return; if ( CInventoryOwner* pLostContactInvOwner = smart_cast<CInventoryOwner*>(O) ) { CInventoryOwner* pOwner = smart_cast<CInventoryOwner*>( H_Parent() );VERIFY(pOwner); pOwner->LostPdaContact (pLostContactInvOwner); } }
void CScientificDetector::shedule_Update(u32 dt) { inherited::shedule_Update (dt); if(!H_Parent()) return; Fvector P; P.set (H_Parent()->Position()); m_zones.feel_touch_update (P,m_fAfDetectRadius); }
void CWeapon::net_Import(NET_Packet& P) { inherited::net_Import (P); float _cond; P.r_float_q8 (_cond,0.0f,1.0f); SetCondition (_cond); u8 flags = 0; P.r_u8 (flags); u16 ammo_elapsed = 0; P.r_u16 (ammo_elapsed); u8 NewAddonState; P.r_u8 (NewAddonState); m_flagsAddOnState = NewAddonState; UpdateAddonsVisibility (); u8 ammoType, wstate; P.r_u8 (ammoType); P.r_u8 (wstate); u8 Zoom; P.r_u8 ((u8)Zoom); if (H_Parent() && H_Parent()->Remote()) { if (Zoom) OnZoomIn(); else OnZoomOut(); }; switch (wstate) { case eFire: case eFire2: case eSwitch: case eReload: { }break; default: { if (ammoType >= m_ammoTypes.size()) Msg("!! Weapon [%d], State - [%d]", ID(), wstate); else { m_ammoType = ammoType; SetAmmoElapsed((ammo_elapsed)); } }break; } VERIFY((u32)iAmmoElapsed == m_magazine.size()); }
void CPhysicsShellHolder::correct_spawn_pos() { VERIFY (PPhysicsShell()); if( H_Parent() ) { CPhysicsShellHolder * P = smart_cast<CPhysicsShellHolder*>(H_Parent()); if( P && P->has_shell_collision_place(this) ) return; } Fvector size; Fvector c; get_box (PPhysicsShell(),XFORM(),size,c); R_ASSERT2( _valid( c ), make_string( "object: %s model: %s ", cName().c_str(), cNameVisual().c_str() ) ); R_ASSERT2( _valid( size ), make_string( "object: %s model: %s ", cName().c_str(), cNameVisual().c_str() ) ); R_ASSERT2( _valid( XFORM() ), make_string( "object: %s model: %s ", cName().c_str(), cNameVisual().c_str() ) ); CPHActivationShape activation_shape; activation_shape.Create (c,size,this); activation_shape.set_rotation (XFORM()); PPhysicsShell()->DisableCollision (); activation_shape.Activate (size,1,1.f,M_PI/8.f); //// VERIFY (valid_pos(activation_shape.Position(),phBoundaries)); // if (!valid_pos(activation_shape.Position(),phBoundaries)) { // CPHActivationShape activation_shape; // activation_shape.Create (c,size,this); // activation_shape.set_rotation (XFORM()); // activation_shape.Activate (size,1,1.f,M_PI/8.f); //// VERIFY (valid_pos(activation_shape.Position(),phBoundaries)); // } PPhysicsShell()->EnableCollision (); Fvector ap = activation_shape.Position(); #ifdef DEBUG if (!valid_pos(ap,phBoundaries)) { Msg("not valid position %f,%f,%f",ap.x,ap.y,ap.z); Msg("size %f,%f,%f",size.x,size.y,size.z); Msg("Object: %s",Name()); Msg("Visual: %s",*(cNameVisual())); Msg("Object pos %f,%f,%f",Position().x,Position().y,Position().z); } #endif // DEBUG VERIFY (valid_pos(activation_shape.Position(),phBoundaries)); Fmatrix trans; trans.identity (); trans.c.sub (ap,c); PPhysicsShell()->TransformPosition (trans); PPhysicsShell()->GetGlobalTransformDynamic(&XFORM()); activation_shape.Destroy (); }
void CCustomDetector::shedule_Update(u32 dt) { inherited::shedule_Update(dt); if( !IsWorking() ) return; Position().set(H_Parent()->Position()); Fvector P; P.set (H_Parent()->Position()); m_artefacts.feel_touch_update(P,m_fAfDetectRadius); }
void CCustomDetector::feel_touch_new(CObject* O) { if (!H_Parent() || H_Parent() != Level().CurrentViewEntity()) return; CCustomZone *pZone = smart_cast<CCustomZone*>(O); if(pZone && pZone->IsEnabled()) { m_ZoneInfoMap[pZone].snd_time = 0; AddRemoveMapSpot(pZone,true); } }
//текущая дисперсия (в радианах) оружия с учетом используемого патрона float CWeapon::GetFireDispersion (float cartridge_k, bool for_crosshair) { //учет базовой дисперсии, состояние оружия и влияение патрона float fire_disp = GetBaseDispersion(cartridge_k); //вычислить дисперсию, вносимую самим стрелком if(H_Parent()) { const CInventoryOwner* pOwner = smart_cast<const CInventoryOwner*>(H_Parent()); float parent_disp = pOwner->GetWeaponAccuracy(); fire_disp += parent_disp; } return fire_disp; }
void CPda::OnH_A_Chield() { VERIFY(IsOff()); //включить PDA только если оно находится у первого владельца if(H_Parent()->ID() == m_idOriginalOwner){ TurnOn (); if(m_sFullName.empty()){ m_sFullName.assign( NameItem() ); m_sFullName += " "; m_sFullName += (smart_cast<CInventoryOwner*>(H_Parent()))->Name(); } }; inherited::OnH_A_Chield (); }
void CCustomDetector::shedule_Update(u32 dt) { inherited::shedule_Update (dt); if( !IsWorking() ) return; if( !H_Parent() ) return; Position().set(H_Parent()->Position()); Fvector P; P.set (H_Parent()->Position()); feel_touch_update (P,m_fRadius); UpdateNightVisionMode(); }
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 CWeaponKnife::OnMotionMark(u32 state, const motion_marks& M) { inherited::OnMotionMark(state, M); if(state==eFire || state==eFire2) { Fvector p1, d; p1.set (get_LastFP()); d.set (get_LastFD()); if(H_Parent()) { smart_cast<CEntity*>(H_Parent())->g_fireParams(this, p1,d); KnifeStrike(p1,d); } } }
void CGrenade::State(u32 state) { switch (state) { case MS_THREATEN: { Fvector C; Center (C); PlaySound (sndCheckout,C); }break; case MS_HIDDEN: { if(m_thrown) { if (m_pPhysicsShell) m_pPhysicsShell->Deactivate(); xr_delete (m_pPhysicsShell); m_dwDestroyTime = 0xffffffff; if(H_Parent()) PutNextToSlot (); if (Local()) { #ifdef DEBUG Msg("Destroying local grenade[%d][%d]",ID(),Device.dwFrame); #endif DestroyObject (); } }; }break; }; inherited::State(state); }
void CArtefact::CreateArtefactActivation() { if (m_activationObj) { return; } m_activationObj = xr_new<SArtefactActivation>(this, H_Parent()->ID()); }
ALife::_TIME_ID CWeapon::TimePassedAfterIndependant() const { if(!H_Parent() && m_dwWeaponIndependencyTime != 0) return Level().timeServer() - m_dwWeaponIndependencyTime; else return 0; }
bool CMPPlayersBag::NeedToDestroyObject() const { if (H_Parent()) return false; if (g_iWeaponRemove == -1) return false; if (g_iWeaponRemove == 0) return true; return (TimePassedAfterIndependant() > BAG_REMOVE_TIME); }
void CWeaponMagazined::OnStateSwitch (u32 S) { inherited::OnStateSwitch(S); switch (S) { case eIdle: switch2_Idle (); break; case eFire: switch2_Fire (); break; case eFire2: switch2_Fire2 (); break; case eMisfire: if(smart_cast<CActor*>(this->H_Parent()) && (Level().CurrentViewEntity()==H_Parent()) ) HUD().GetUI()->AddInfoMessage("gun_jammed"); break; case eMagEmpty: switch2_Empty (); break; case eReload: switch2_Reload (); break; case eShowing: switch2_Showing (); break; case eHiding: switch2_Hiding (); break; case eHidden: switch2_Hidden (); break; } }
void CArtefact::OnAnimationEnd(u32 state) { switch (state) { case eHiding: { SwitchState(eHidden); }break; case eShowing: { SwitchState(eIdle); }break; case eActivating: { if(Local()) { SwitchState (eHiding); NET_Packet P; u_EventGen (P, GEG_PLAYER_ACTIVATEARTEFACT, H_Parent()->ID()); P.w_u16 (ID()); u_EventSend (P); } }break; }; }