prime/include/MetroidPrime/Weapons/CGameProjectile.hpp

81 lines
3.0 KiB
C++
Raw Normal View History

#ifndef _CGAMEPROJECTILE
#define _CGAMEPROJECTILE
2022-10-04 00:00:46 +00:00
#include "types.h"
2022-11-24 16:29:09 +00:00
#include "MetroidPrime/CStateManager.hpp"
2022-10-04 00:00:46 +00:00
#include "MetroidPrime/Weapons/CProjectileWeapon.hpp"
#include "MetroidPrime/Weapons/CWeapon.hpp"
#include "Kyoto/TToken.hpp"
#include "rstl/optional_object.hpp"
#include "rstl/vector.hpp"
class CGenDescription;
class CProjectileTouchResult;
class CGameProjectile : public CWeapon {
public:
2022-11-24 16:29:09 +00:00
CGameProjectile(bool active, const TToken< CWeaponDescription >&, const rstl::string& name,
EWeaponType wType, const CTransform4f& xf, EMaterialTypes excludeMat,
const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner,
TUniqueId homingTarget, uint attribs, bool underwater,
const CVector3f& scale,
const rstl::optional_object< TLockedToken< CGenDescription > >& visorParticle,
ushort visorSfx, bool sendCollideMsg);
2022-10-04 00:00:46 +00:00
// CEntity
~CGameProjectile();
void Accept(IVisitor& visitor);
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr);
2022-10-04 00:00:46 +00:00
// CActor
void Render(const CStateManager&) const;
rstl::optional_object< CAABox > GetTouchBounds() const;
void FluidFXThink(EFluidState, CScriptWater&, CStateManager&);
2022-10-04 00:00:46 +00:00
// CGameProjectile
virtual void ResolveCollisionWithActor(const CRayCastResult& res, CActor& act,
CStateManager& mgr);
2022-11-11 09:44:43 +00:00
const CProjectileWeapon& GetProjectile() const { return x170_projectile; }
2022-10-29 04:22:07 +00:00
const CVector3f& GetPreviousPos() const { return x298_previousPos; }
2022-10-04 00:00:46 +00:00
TUniqueId GetHomingTargetId() const { return x2c0_homingTargetId; }
2022-11-11 02:25:54 +00:00
TUniqueId GetHitProjectileOwner() const { return x2c4_hitProjectileOwner; }
void SetHitProjectileOwner(TUniqueId id) { x2c4_hitProjectileOwner = id; }
bool GetWeaponActive() const { return x2e4_24_active; }
2022-11-23 23:49:52 +00:00
void DeleteProjectileLight(CStateManager&);
2022-10-04 00:00:46 +00:00
2022-11-24 16:29:09 +00:00
void ApplyDamageToActors(CStateManager& mgr, const CDamageInfo& dInfo);
CRayCastResult RayCollisionCheckWithWorld(TUniqueId& idOut, const CVector3f& start, const CVector3f& end,
float mag, const TEntityList& nearList, CStateManager& mgr);
2022-11-03 18:14:41 +00:00
protected:
2022-10-04 00:00:46 +00:00
rstl::optional_object< TLockedToken< CGenDescription > > x158_visorParticle;
ushort x168_visorSfx;
2022-10-04 00:00:46 +00:00
CProjectileWeapon x170_projectile;
CVector3f x298_previousPos;
float x2a4_projExtent;
float x2a8_homingDt;
double x2b0_targetHomingTime;
double x2b8_curHomingTime;
TUniqueId x2c0_homingTargetId;
TUniqueId x2c2_lastResolvedObj;
TUniqueId x2c4_hitProjectileOwner;
TUniqueId x2c6_pendingDamagee;
TUniqueId x2c8_projectileLight;
CAssetId x2cc_wpscId;
rstl::vector< CProjectileTouchResult > x2d0_touchResults;
float x2e0_minHomingDist;
bool x2e4_24_active : 1;
bool x2e4_25_startedUnderwater : 1;
bool x2e4_26_waterUpdate : 1;
bool x2e4_27_inWater : 1;
bool x2e4_28_sendProjectileCollideMsg : 1;
};
CHECK_SIZEOF(CGameProjectile, 0x2e8)
#endif // _CGAMEPROJECTILE