BVB Source Codes

CRYENGINE Show VehicleDamageBehaviorEffect.cpp Source code

Return Download CRYENGINE: download VehicleDamageBehaviorEffect.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "VehicleDamageBehaviorEffect.h"
  5.  
  6. #include <CryParticleSystem/ParticleParams.h>
  7. #include "IVehicleSystem.h"
  8. #include "VehicleCVars.h"
  9.  
  10. DEFINE_SHARED_PARAMS_TYPE_INFO(CVehicleDamageBehaviorEffect::SSharedParams)
  11.  
  12. //------------------------------------------------------------------------
  13. bool CVehicleDamageBehaviorEffect::Init(IVehicle* pVehicle, const CVehicleParams& table)
  14. {
  15.         m_pVehicle = pVehicle;
  16.         m_pDamageEffect = NULL;
  17.         m_slot = -1;
  18.  
  19.         CVehicleParams effectParams = table.findChild("Effect");
  20.         if (!effectParams)
  21.         {
  22.                 return false;
  23.         }
  24.  
  25.         string effectName = effectParams.getAttr("effect");
  26.  
  27.         CryFixedStringT<256> sharedParamsName;
  28.         sharedParamsName.Format("%s::DamageBehaviorEffect::%s", pVehicle->GetEntity()->GetClass()->GetName(), effectName.c_str());
  29.  
  30.         ISharedParamsManager* pSharedParamsManager = CCryAction::GetCryAction()->GetISharedParamsManager();
  31.         CRY_ASSERT(pSharedParamsManager);
  32.  
  33.         m_pSharedParams = CastSharedParamsPtr<SSharedParams>(pSharedParamsManager->Get(sharedParamsName));
  34.  
  35.         if (!m_pSharedParams)
  36.         {
  37.                 SSharedParams sharedParams;
  38.  
  39.                 sharedParams.effectName = effectName;
  40.  
  41.                 sharedParams.damageRatioMin = 1.0f;
  42.                 table.getAttr("damageRatioMin", sharedParams.damageRatioMin);
  43.  
  44.                 sharedParams.disableAfterExplosion = false;
  45.                 effectParams.getAttr("disableAfterExplosion", sharedParams.disableAfterExplosion);
  46.  
  47.                 sharedParams.updateFromHelper = false;
  48.                 effectParams.getAttr("updateFromHelper", sharedParams.updateFromHelper);
  49.  
  50.                 m_pSharedParams = CastSharedParamsPtr<SSharedParams>(pSharedParamsManager->Register(sharedParamsName, sharedParams));
  51.         }
  52.  
  53.         CRY_ASSERT(m_pSharedParams.get());
  54.  
  55.         return true;
  56. }
  57.  
  58. //------------------------------------------------------------------------
  59. void CVehicleDamageBehaviorEffect::Reset()
  60. {
  61.         if (m_slot != -1)
  62.         {
  63.                 SEntitySlotInfo info;
  64.  
  65.                 if (m_pVehicle->GetEntity()->GetSlotInfo(m_slot, info) && info.pParticleEmitter)
  66.                 {
  67.                         info.pParticleEmitter->Activate(false);
  68.                         if (m_pSharedParams->updateFromHelper)
  69.                         {
  70.                                 m_pVehicle->NeedsUpdate(IVehicle::eVOU_NoUpdate);
  71.                         }
  72.                 }
  73.  
  74.                 m_pVehicle->GetEntity()->FreeSlot(m_slot);
  75.  
  76.                 m_slot = -1;
  77.         }
  78. }
  79.  
  80. //------------------------------------------------------------------------
  81. void CVehicleDamageBehaviorEffect::OnDamageEvent(EVehicleDamageBehaviorEvent event, const SVehicleDamageBehaviorEventParams& behaviorParams)
  82. {
  83.         if (event == eVDBE_MaxRatioExceeded || (event == eVDBE_VehicleDestroyed && m_pSharedParams->disableAfterExplosion) || (event == eVDBE_Repair && behaviorParams.componentDamageRatio < m_pSharedParams->damageRatioMin))
  84.         {
  85.                 Reset();
  86.  
  87.                 return;
  88.         }
  89.  
  90.         if (event == eVDBE_Hit || event == eVDBE_ComponentDestroyed || event == eVDBE_Repair || (event == eVDBE_VehicleDestroyed && !m_pSharedParams->disableAfterExplosion))
  91.         {
  92.                 if (m_slot == -1 && !(m_pSharedParams->disableAfterExplosion && m_pVehicle->GetStatus().health <= 0.0f) && event != eVDBE_Repair)
  93.                 {
  94. #if ENABLE_VEHICLE_DEBUG
  95.                         if (VehicleCVars().v_debugdraw == eVDB_Damage)
  96.                         {
  97.                                 CryLog("Vehicle damage %.2f", behaviorParams.componentDamageRatio);
  98.                         }
  99. #endif
  100.  
  101.                         LoadEffect(behaviorParams.pVehicleComponent);
  102.                 }
  103.  
  104.                 if (m_slot > -1)
  105.                 {
  106.                         UpdateEffect(behaviorParams.randomness, behaviorParams.componentDamageRatio);
  107.                 }
  108.         }
  109. }
  110.  
  111. //------------------------------------------------------------------------
  112. void CVehicleDamageBehaviorEffect::GetMemoryUsage(ICrySizer* pSizer) const
  113. {
  114.         pSizer->AddObject(this, sizeof(*this));
  115. }
  116.  
  117. //------------------------------------------------------------------------
  118. void CVehicleDamageBehaviorEffect::Serialize(TSerialize ser, EEntityAspects aspects)
  119. {
  120.         bool isEffectActive = m_slot > -1;
  121.  
  122.         ser.Value("isActive", isEffectActive);
  123.  
  124.         int slot = m_slot;
  125.  
  126.         ser.ValueWithDefault("slot", slot, -1);
  127.  
  128.         if (ser.IsReading())
  129.         {
  130.                 if (!isEffectActive && m_slot > -1)
  131.                 {
  132.                         Reset();
  133.                 }
  134.  
  135.                 m_slot = slot;
  136.         }
  137. }
  138.  
  139. //------------------------------------------------------------------------
  140. void CVehicleDamageBehaviorEffect::LoadEffect(IVehicleComponent* pComponent)
  141. {
  142.         if (!m_pDamageEffect)
  143.         {
  144.                 const SDamageEffect* pDamageEffect = m_pVehicle->GetParticleParams()->GetDamageEffect(m_pSharedParams->effectName.c_str());
  145.  
  146.                 if (!pDamageEffect)
  147.                 {
  148. #if ENABLE_VEHICLE_DEBUG
  149.                         if (VehicleCVars().v_debugdraw == eVDB_Damage)
  150.                         {
  151.                                 CryLog("Failed to find damage effect %s", m_pSharedParams->effectName.c_str());
  152.                         }
  153. #endif
  154.  
  155.                         return;
  156.                 }
  157.  
  158. #if ENABLE_VEHICLE_DEBUG
  159.                 if (VehicleCVars().v_debugdraw == eVDB_Damage)
  160.                 {
  161.                         CryLog("Found effect %s", m_pSharedParams->effectName.c_str());
  162.                 }
  163. #endif
  164.  
  165.                 m_pDamageEffect = pDamageEffect;
  166.         }
  167.  
  168.         if (m_pDamageEffect)
  169.         {
  170. #if ENABLE_VEHICLE_DEBUG
  171.                 if (VehicleCVars().v_debugdraw == eVDB_Damage)
  172.                 {
  173.                         CryLog("Starting vehicle damage effect: %s", m_pDamageEffect->effectName.c_str());
  174.                 }
  175. #endif
  176.  
  177.                 if (IParticleEffect* pEffect = gEnv->pParticleManager->FindEffect(m_pDamageEffect->effectName.c_str(), "VehicleDamageBehaviorEffect"))
  178.                 {
  179.                         IEntity* pEntity = m_pVehicle->GetEntity();
  180.  
  181.                         CRY_ASSERT(pEntity);
  182.  
  183.                         m_slot = pEntity->LoadParticleEmitter(m_slot, pEffect, NULL, false, true);
  184.  
  185.                         if (m_pDamageEffect->pHelper)
  186.                         {
  187.                                 Matrix34 tm;
  188.  
  189.                                 m_pDamageEffect->pHelper->GetVehicleTM(tm);
  190.  
  191.                                 pEntity->SetSlotLocalTM(m_slot, tm);
  192.  
  193.                                 if (m_pSharedParams->updateFromHelper)
  194.                                 {
  195.                                         m_pVehicle->SetObjectUpdate(this, IVehicle::eVOU_AlwaysUpdate);
  196.                                 }
  197.                         }
  198.                         else if (pComponent)
  199.                         {
  200.                                 Matrix34 tm(IDENTITY);
  201.  
  202.                                 tm.SetTranslation(pComponent->GetBounds().GetCenter());
  203.  
  204.                                 pEntity->SetSlotLocalTM(m_slot, tm);
  205.                         }
  206.                 }
  207.         }
  208. }
  209.  
  210. //------------------------------------------------------------------------
  211. void CVehicleDamageBehaviorEffect::UpdateEffect(float randomness, float damageRatio)
  212. {
  213.         CRY_ASSERT(m_pDamageEffect);
  214.  
  215.         if (m_pDamageEffect)
  216.         {
  217.                 if (IParticleEmitter* pParticleEmitter = m_pVehicle->GetEntity()->GetParticleEmitter(m_slot))
  218.                 {
  219.                         SpawnParams spawnParams;
  220.  
  221.                         spawnParams.fPulsePeriod = m_pDamageEffect->pulsePeriod * ((1.0f - randomness) * cry_random(0.0f, 1.0f));
  222.  
  223.                         pParticleEmitter->SetSpawnParams(spawnParams);
  224.                 }
  225.         }
  226. }
  227.  
  228. void CVehicleDamageBehaviorEffect::Update(const float deltaTime)
  229. {
  230.         SEntitySlotInfo slotInfo;
  231.         if (m_pVehicle->GetEntity()->GetSlotInfo(m_slot, slotInfo) && slotInfo.pParticleEmitter)
  232.         {
  233.                 Matrix34 tm;
  234.                 m_pDamageEffect->pHelper->GetVehicleTM(tm);
  235.                 m_pVehicle->GetEntity()->SetSlotLocalTM(m_slot, tm);
  236.         }
  237. }
  238.  
  239. DEFINE_VEHICLEOBJECT(CVehicleDamageBehaviorEffect);
  240.  
downloadVehicleDamageBehaviorEffect.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top