2020-03-26 22:09:50 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Runtime/World/CActor.hpp"
|
|
|
|
#include "Runtime/World/CDamageInfo.hpp"
|
|
|
|
#include "Runtime/Particle/CElementGen.hpp"
|
|
|
|
|
2020-03-31 07:29:00 +00:00
|
|
|
namespace urde::MP1 {
|
2020-03-26 22:09:50 +00:00
|
|
|
struct SShockWaveData {
|
2020-04-01 06:41:31 +00:00
|
|
|
private:
|
2020-03-26 22:09:50 +00:00
|
|
|
u32 x0_ = 8;
|
|
|
|
CAssetId x4_particleDesc;
|
|
|
|
CDamageInfo x8_damageInfo;
|
|
|
|
float x24_ = 0.f;
|
|
|
|
float x28_ = 0.5f;
|
|
|
|
float x2c_ = 16.5217f;
|
|
|
|
float x30_ = 0.f;
|
|
|
|
CAssetId x34_weaponDesc;
|
2020-04-01 06:41:31 +00:00
|
|
|
u16 x38_electrocuteSfx;
|
|
|
|
|
|
|
|
public:
|
|
|
|
SShockWaveData(CAssetId part, const CDamageInfo& dInfo, CAssetId weapon, u16 sfx)
|
|
|
|
: x4_particleDesc(part), x8_damageInfo(dInfo), x34_weaponDesc(weapon), x38_electrocuteSfx(sfx) {}
|
2020-03-26 22:09:50 +00:00
|
|
|
|
2020-04-01 06:41:31 +00:00
|
|
|
[[nodiscard]] CAssetId GetParticleDescId() const { return x4_particleDesc; }
|
|
|
|
[[nodiscard]] const CDamageInfo& GetDamageInfo() const { return x8_damageInfo; }
|
|
|
|
[[nodiscard]] float GetX24() const { return x24_; }
|
|
|
|
[[nodiscard]] float GetX28() const { return x28_; }
|
|
|
|
[[nodiscard]] float GetX2C() const { return x2c_; }
|
|
|
|
[[nodiscard]] float GetX30() const { return x30_; }
|
|
|
|
[[nodiscard]] CAssetId GetWeaponDescId() const { return x34_weaponDesc; }
|
|
|
|
[[nodiscard]] u16 GetElectrocuteSfx() const { return x38_electrocuteSfx; }
|
2020-03-26 22:09:50 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class CShockWave : public CActor {
|
2020-03-31 07:29:00 +00:00
|
|
|
private:
|
2020-03-26 22:09:50 +00:00
|
|
|
TUniqueId xe8_id1;
|
|
|
|
CDamageInfo xec_damageInfo;
|
|
|
|
TToken<CGenDescription> x108_elementGenDesc;
|
|
|
|
std::unique_ptr<CElementGen> x110_elementGen;
|
|
|
|
SShockWaveData x114_data;
|
|
|
|
float x150_;
|
|
|
|
float x154_;
|
2020-04-01 18:54:01 +00:00
|
|
|
float x158_activeTime = 0.f;
|
|
|
|
float x15c_minActiveTime;
|
|
|
|
float x160_knockback;
|
2020-04-01 06:41:31 +00:00
|
|
|
float x164_timeSinceHitPlayerInAir = 0.f;
|
|
|
|
float x168_timeSinceHitPlayer = 0.f;
|
|
|
|
bool x16c_hitPlayerInAir = false;
|
|
|
|
bool x16d_hitPlayer = false;
|
|
|
|
rstl::reserved_vector<TUniqueId, 1024> x170_hitIds;
|
2020-03-26 22:09:50 +00:00
|
|
|
std::optional<TToken<CElectricDescription>> x974_electricDesc;
|
|
|
|
TUniqueId x980_id2 = kInvalidUniqueId;
|
|
|
|
|
2020-03-31 07:29:00 +00:00
|
|
|
public:
|
2020-03-26 22:09:50 +00:00
|
|
|
CShockWave(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
|
2020-04-01 18:54:01 +00:00
|
|
|
TUniqueId parent, const SShockWaveData& data, float minActiveTime, float knockback);
|
2020-03-26 22:09:50 +00:00
|
|
|
|
|
|
|
void Accept(IVisitor& visitor) override;
|
|
|
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
|
|
|
|
void AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const override;
|
2020-03-31 07:29:00 +00:00
|
|
|
[[nodiscard]] std::optional<zeus::CAABox> GetTouchBounds() const override;
|
2020-03-26 22:09:50 +00:00
|
|
|
void Render(const CStateManager& mgr) const override;
|
|
|
|
void Think(float dt, CStateManager& mgr) override;
|
|
|
|
void Touch(CActor& actor, CStateManager& mgr) override;
|
2020-04-01 06:41:31 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
[[nodiscard]] bool IsHit(TUniqueId id) const;
|
2020-03-26 22:09:50 +00:00
|
|
|
};
|
2020-04-01 06:41:31 +00:00
|
|
|
} // namespace urde::MP1
|