metaforce/Runtime/Weapon/CGameProjectile.hpp

95 lines
4.4 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
#include <optional>
#include <vector>
#include "Runtime/CToken.hpp"
#include "Runtime/RetroTypes.hpp"
#include "Runtime/Collision/CMaterialList.hpp"
#include "Runtime/Collision/CRayCastResult.hpp"
#include "Runtime/Weapon/CProjectileWeapon.hpp"
#include "Runtime/Weapon/CWeapon.hpp"
#include "Runtime/Weapon/CWeaponMode.hpp"
#include "Runtime/World/CDamageInfo.hpp"
#include <zeus/CAABox.hpp>
#include <zeus/CVector3f.hpp>
2021-04-10 08:42:06 +00:00
namespace metaforce {
class CGenDescription;
class CWeaponDescription;
2018-02-09 07:12:26 +00:00
2018-12-08 05:30:43 +00:00
class CProjectileTouchResult {
TUniqueId x0_id;
std::optional<CRayCastResult> x4_result;
2018-12-08 05:30:43 +00:00
2018-02-09 07:12:26 +00:00
public:
2020-09-26 05:34:13 +00:00
CProjectileTouchResult(TUniqueId id, const std::optional<CRayCastResult>& result) : x0_id(id), x4_result(result) {}
2018-12-08 05:30:43 +00:00
TUniqueId GetActorId() const { return x0_id; }
bool HasRayCastResult() const { return x4_result.operator bool(); }
const CRayCastResult& GetRayCastResult() const { return *x4_result; }
2018-02-09 07:12:26 +00:00
};
2018-12-08 05:30:43 +00:00
class CGameProjectile : public CWeapon {
2018-02-11 05:27:00 +00:00
protected:
std::optional<TLockedToken<CGenDescription>> x158_visorParticle;
2018-12-08 05:30:43 +00:00
u16 x168_visorSfx;
CProjectileWeapon x170_projectile;
2019-01-03 03:47:28 +00:00
zeus::CVector3f x298_previousPos;
2018-12-08 05:30:43 +00:00
float x2a4_projExtent;
float x2a8_homingDt = 0.03f;
double x2b0_targetHomingTime = 0.0;
double x2b8_curHomingTime = x2a8_homingDt;
TUniqueId x2c0_homingTargetId;
TUniqueId x2c2_lastResolvedObj = kInvalidUniqueId;
TUniqueId x2c4_hitProjectileOwner = kInvalidUniqueId;
2018-12-08 05:30:43 +00:00
TUniqueId x2c6_pendingDamagee = kInvalidUniqueId;
TUniqueId x2c8_projectileLight = kInvalidUniqueId;
CAssetId x2cc_wpscId;
std::vector<CProjectileTouchResult> x2d0_touchResults;
float x2e0_minHomingDist = 0.f;
bool x2e4_24_active : 1 = true;
bool x2e4_25_startedUnderwater : 1;
bool x2e4_26_waterUpdate : 1;
bool x2e4_27_inWater : 1;
bool x2e4_28_sendProjectileCollideMsg : 1;
2018-12-08 05:30:43 +00:00
public:
2021-05-26 14:00:57 +00:00
DEFINE_ENTITY
2018-12-08 05:30:43 +00:00
CGameProjectile(bool active, const TToken<CWeaponDescription>&, std::string_view name, EWeaponType wType,
const zeus::CTransform& xf, EMaterialTypes excludeMat, const CDamageInfo& dInfo, TUniqueId uid,
TAreaId aid, TUniqueId owner, TUniqueId homingTarget, EProjectileAttrib attribs, bool underwater,
const zeus::CVector3f& scale, std::optional<TLockedToken<CGenDescription>> visorParticle,
u16 visorSfx, bool sendCollideMsg);
void Accept(IVisitor& visitor) override;
2018-12-08 05:30:43 +00:00
virtual void ResolveCollisionWithActor(const CRayCastResult& res, CActor& act, CStateManager& mgr);
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override;
2020-09-26 05:34:13 +00:00
void Render(CStateManager& mgr) override;
2018-12-08 05:30:43 +00:00
static EProjectileAttrib GetBeamAttribType(EWeaponType wType);
void DeleteProjectileLight(CStateManager&);
void CreateProjectileLight(std::string_view, const CLight&, CStateManager&);
void Chase(float dt, CStateManager& mgr);
void UpdateHoming(float dt, CStateManager& mgr);
void UpdateProjectileMovement(float dt, CStateManager& mgr);
CRayCastResult DoCollisionCheck(TUniqueId& idOut, CStateManager& mgr);
void ApplyDamageToActors(CStateManager& mgr, const CDamageInfo& dInfo);
void FluidFXThink(EFluidState state, CScriptWater& water, CStateManager& mgr) override;
2018-12-08 05:30:43 +00:00
CRayCastResult RayCollisionCheckWithWorld(TUniqueId& idOut, const zeus::CVector3f& start, const zeus::CVector3f& end,
2021-06-06 23:53:41 +00:00
float mag, const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
2018-12-08 05:30:43 +00:00
CStateManager& mgr);
CProjectileTouchResult CanCollideWith(CActor& act, CStateManager& mgr) const;
CProjectileTouchResult CanCollideWithComplexCollision(const CActor& act, const CStateManager& mgr) const;
CProjectileTouchResult CanCollideWithGameObject(CActor& act, CStateManager& mgr) const;
CProjectileTouchResult CanCollideWithTrigger(const CActor& act, const CStateManager& mgr) const;
2018-12-08 05:30:43 +00:00
zeus::CAABox GetProjectileBounds() const;
std::optional<zeus::CAABox> GetTouchBounds() const override;
2019-03-24 05:45:47 +00:00
CProjectileWeapon& ProjectileWeapon() { return x170_projectile; }
const CProjectileWeapon& GetProjectileWeapon() const { return x170_projectile; }
2018-12-08 05:30:43 +00:00
TUniqueId GetHomingTargetId() const { return x2c0_homingTargetId; }
2019-01-03 03:47:28 +00:00
zeus::CVector3f GetPreviousPos() const { return x298_previousPos; }
2020-03-06 15:16:55 +00:00
void SetMinHomingDistance(float dist) { x2e0_minHomingDist = dist; }
void SetHitProjectileOwner(TUniqueId id) { x2c4_hitProjectileOwner = id; }
};
2021-04-10 08:42:06 +00:00
} // namespace metaforce