#include "CNewFlameThrower.hpp" #include "GameGlobalObjects.hpp" #include "CSimplePool.hpp" #include "CStateManager.hpp" #include "World/CGameLight.hpp" namespace urde { CNewFlameThrower::CNewFlameThrower(const TToken& desc, std::string_view name, EWeaponType wType, const CAssetId resInfo[8], const zeus::CTransform& xf, EMaterialTypes matType, const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, EProjectileAttrib attribs) : CGameProjectile(false, desc, name, wType, xf, matType, dInfo, uid, aid, owner, kInvalidUniqueId, attribs, false, zeus::CVector3f::skOne, {}, -1, false) , x304_mainFire(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[0]})) , x310_mainSmoke(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[1]})) , x31c_secondarySmoke(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[4]})) , x328_secondaryFire(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[5]})) , x334_secondarySparks(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[6]})) , x340_swooshCenter(g_SimplePool->GetObj(SObjectTag{FOURCC('SWHC'), resInfo[2]})) , x34c_swooshFire(g_SimplePool->GetObj(SObjectTag{FOURCC('SWHC'), resInfo[3]})) { x304_mainFire.GetObj(); x310_mainSmoke.GetObj(); x31c_secondarySmoke.GetObj(); x328_secondaryFire.GetObj(); x334_secondarySparks.GetObj(); x340_swooshCenter.GetObj(); x34c_swooshFire.GetObj(); x37c_24_renderAuxEffects = false; x37c_25_firing = false; x37c_26_ = false; x37c_27_ = true; x37c_28_ = false; x380_.resize(3); } void CNewFlameThrower::DeleteLightObjects(CStateManager& mgr) { for (TUniqueId id : x3b8_lightIds) mgr.FreeScriptObject(id); x3b8_lightIds.clear(); } void CNewFlameThrower::CreateLightObjects(CStateManager& mgr) { DeleteLightObjects(mgr); for (int i = 0; i < 4; ++i) { TUniqueId uid = mgr.AllocateUniqueId(); CLight lObj = x358_mainFireGen->GetLight(); CGameLight* light = new CGameLight(uid, GetAreaId(), false, "FlamethrowerLight", zeus::CTransform::Identity(), x8_uid, lObj, u32(reinterpret_cast(this) + (i & 0x1)), 0, 0.f); mgr.AddObject(light); x3b8_lightIds.push_back(uid); } } void CNewFlameThrower::EnableFx(CStateManager& mgr) { DeleteProjectileLight(mgr); x358_mainFireGen = std::make_unique(x304_mainFire); x35c_mainSmokeGen = std::make_unique(x310_mainSmoke); x360_secondarySmokeGen = std::make_unique(x31c_secondarySmoke); x364_secondaryFireGen = std::make_unique(x328_secondaryFire); x368_secondarySparksGen = std::make_unique(x334_secondarySparks); x36c_swooshCenterGen = std::make_unique(x340_swooshCenter, 0); x36c_swooshCenterGen->SetRenderGaps(true); x370_swooshFireGen = std::make_unique(x34c_swooshFire, 0); x370_swooshFireGen->SetRenderGaps(true); if (x358_mainFireGen && x358_mainFireGen->SystemHasLight() && x3b8_lightIds.empty()) CreateLightObjects(mgr); } void CNewFlameThrower::StartFiring(const zeus::CTransform& xf, CStateManager& mgr) { SetActive(true); x37c_25_firing = true; x37c_24_renderAuxEffects = true; x374_ = 1; EnableFx(mgr); } bool CNewFlameThrower::AreEffectsFinished() const { if (x358_mainFireGen && x358_mainFireGen->GetParticleCount() != 0) return false; if (x35c_mainSmokeGen && x35c_mainSmokeGen->GetParticleCount() != 0) return false; if (x360_secondarySmokeGen && x360_secondarySmokeGen->GetParticleCount() != 0) return false; if (x364_secondaryFireGen && x364_secondaryFireGen->GetParticleCount() != 0) return false; return !(x368_secondarySparksGen && x368_secondarySparksGen->GetParticleCount() != 0); } void CNewFlameThrower::UpdateFx(const zeus::CTransform& xf, float dt, CStateManager& mgr) {} void CNewFlameThrower::Reset(CStateManager& mgr, bool deactivate) {} } // namespace urde