mirror of https://github.com/AxioDL/metaforce.git
CJellyZap fixes
This commit is contained in:
parent
f7fdbc07ba
commit
574fc9b840
|
@ -1,6 +1,7 @@
|
||||||
#include "Runtime/MP1/World/CJellyZap.hpp"
|
#include "Runtime/MP1/World/CJellyZap.hpp"
|
||||||
|
|
||||||
#include "Runtime/CStateManager.hpp"
|
#include "Runtime/CStateManager.hpp"
|
||||||
|
#include "Runtime/World/CFishCloud.hpp"
|
||||||
#include "Runtime/World/CPlayer.hpp"
|
#include "Runtime/World/CPlayer.hpp"
|
||||||
|
|
||||||
#include "TCastTo.hpp" // Generated file, do not modify include path
|
#include "TCastTo.hpp" // Generated file, do not modify include path
|
||||||
|
@ -20,9 +21,9 @@ CJellyZap::CJellyZap(TUniqueId uid, std::string_view name, const CEntityInfo& in
|
||||||
, x590_(f4)
|
, x590_(f4)
|
||||||
, x594_(f3)
|
, x594_(f3)
|
||||||
, x598_(f8)
|
, x598_(f8)
|
||||||
, x59c_(f9)
|
, x59c_priority(f9)
|
||||||
, x5a0_(f10)
|
, x5a0_repulseRadius(f10)
|
||||||
, x5a4_(f11)
|
, x5a4_attractRadius(f11)
|
||||||
, x5a8_attackDelay(f5)
|
, x5a8_attackDelay(f5)
|
||||||
, x5ac_(f6)
|
, x5ac_(f6)
|
||||||
, x5b0_(f7)
|
, x5b0_(f7)
|
||||||
|
@ -54,9 +55,9 @@ void CJellyZap::Think(float dt, CStateManager& mgr) {
|
||||||
if (x5b8_24_)
|
if (x5b8_24_)
|
||||||
x450_bodyController->FaceDirection(mgr.GetPlayer().GetTranslation() - GetTranslation(), dt);
|
x450_bodyController->FaceDirection(mgr.GetPlayer().GetTranslation() - GetTranslation(), dt);
|
||||||
|
|
||||||
float fv = (x5b8_25_ && x450_bodyController->GetPercentageFrozen() == 0.f ? x50c_baseDamageMag + (dt / 0.3f)
|
float damage = (x5b8_25_ && x450_bodyController->GetPercentageFrozen() == 0.f ? x50c_baseDamageMag + (dt / 0.3f)
|
||||||
: x50c_baseDamageMag - (dt / 0.75f));
|
: x50c_baseDamageMag - (dt / 0.75f));
|
||||||
x50c_baseDamageMag = zeus::clamp(0.f, fv, 1.f);
|
x50c_baseDamageMag = zeus::clamp(0.f, damage, 1.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CJellyZap::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) {
|
void CJellyZap::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) {
|
||||||
|
@ -67,6 +68,13 @@ void CJellyZap::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, E
|
||||||
CPatterned::DoUserAnimEvent(mgr, node, type, dt);
|
CPatterned::DoUserAnimEvent(mgr, node, type, dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CJellyZap::KnockBack(const zeus::CVector3f& pos, CStateManager& mgr, const CDamageInfo& info, EKnockBackType type,
|
||||||
|
bool inDeferred, float magnitude) {
|
||||||
|
if (info.GetWeaponMode().GetType() == EWeaponType::Ice) {
|
||||||
|
Freeze(mgr, {}, GetTransform().transposeRotate(pos), magnitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CJellyZap::Attack(CStateManager& mgr, EStateMsg msg, float arg) {
|
void CJellyZap::Attack(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
if (msg == EStateMsg::Activate) {
|
if (msg == EStateMsg::Activate) {
|
||||||
x32c_animState = EAnimState::Ready;
|
x32c_animState = EAnimState::Ready;
|
||||||
|
@ -101,18 +109,18 @@ void CJellyZap::Suck(CStateManager& mgr, EStateMsg msg, float arg) {
|
||||||
TryCommand(mgr, pas::EAnimationState::LoopReaction, &CPatterned::TryLoopReaction, 0);
|
TryCommand(mgr, pas::EAnimationState::LoopReaction, &CPatterned::TryLoopReaction, 0);
|
||||||
x450_bodyController->GetCommandMgr().SetTargetVector(
|
x450_bodyController->GetCommandMgr().SetTargetVector(
|
||||||
(mgr.GetPlayer().GetTranslation() + zeus::CVector3f(0.f, 0.f, 1.f)) - GetTranslation());
|
(mgr.GetPlayer().GetTranslation() + zeus::CVector3f(0.f, 0.f, 1.f)) - GetTranslation());
|
||||||
zeus::CVector3f diff = (mgr.GetPlayer().GetTranslation() - GetTranslation());
|
|
||||||
float f1 = diff.magnitude();
|
|
||||||
float f3 = 5.f;
|
|
||||||
float f2 = x58c_;
|
|
||||||
if (mgr.GetPlayer().GetMorphballTransitionState() == CPlayer::EPlayerMorphBallState::Morphed)
|
|
||||||
f2 = x594_;
|
|
||||||
else if (mgr.GetPlayerState()->GetCurrentSuitRaw() == CPlayerState::EPlayerSuit::Gravity)
|
|
||||||
f2 = x590_;
|
|
||||||
float f4 = f3 * f2;
|
|
||||||
float f5 = 1.f / f1;
|
|
||||||
|
|
||||||
|
float intensity = mgr.GetPlayerState()->HasPowerUp(CPlayerState::EItemType::GravitySuit) ? 0.1f : 1.f;
|
||||||
|
zeus::CVector3f posDiff = (mgr.GetPlayer().GetTranslation() - GetTranslation());
|
||||||
|
float mag = 1.f / posDiff.magnitude();
|
||||||
|
mgr.GetPlayer().ApplyImpulseWR((-posDiff * mag) * (arg * (5.f * mag * mgr.GetPlayer().GetMass()) * intensity), zeus::CAxisAngle());
|
||||||
|
mgr.GetPlayer().UseCollisionImpulses();
|
||||||
|
mgr.GetPlayerState()->GetStaticInterference().AddSource(GetUniqueId(), 0.1f, 0.1f);
|
||||||
} else if (msg == EStateMsg::Deactivate) {
|
} else if (msg == EStateMsg::Deactivate) {
|
||||||
|
x450_bodyController->GetCommandMgr().DeliverCmd(CBodyStateCmd(EBodyStateCmd::ExitState));
|
||||||
|
mgr.GetPlayerState()->GetStaticInterference().RemoveSource(GetUniqueId());
|
||||||
|
x5b8_24_ = false;
|
||||||
|
x5b8_25_ = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,13 +176,37 @@ bool CJellyZap::InDetectionRange(CStateManager& mgr, float arg) {
|
||||||
return (mgr.GetPlayer().GetFluidCounter() != 0 ? CPatterned::InDetectionRange(mgr, arg) : false);
|
return (mgr.GetPlayer().GetFluidCounter() != 0 ? CPatterned::InDetectionRange(mgr, arg) : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CJellyZap::AddSelfToFishCloud(CStateManager, float, bool b) {}
|
void CJellyZap::AddSelfToFishCloud(CStateManager& mgr, float radius, float priority, bool repulsor) {
|
||||||
|
for (const SConnection& conn : x20_conns) {
|
||||||
|
if (conn.x0_state != EScriptObjectState::ScanStart || conn.x4_msg != EScriptObjectMessage::Follow)
|
||||||
|
continue;
|
||||||
|
if (TCastToPtr<CFishCloud> cloud = mgr.ObjectById(mgr.GetIdForScript(conn.x8_objId))) {
|
||||||
|
if (repulsor) {
|
||||||
|
cloud->AddRepulsor(GetUniqueId(), false, radius, priority);
|
||||||
|
} else {
|
||||||
|
cloud->AddAttractor(GetUniqueId(), false, radius, priority);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CJellyZap::AddRepulsor(CStateManager&) {}
|
void CJellyZap::AddRepulsor(CStateManager& mgr) { AddSelfToFishCloud(mgr, x5a0_repulseRadius, x59c_priority, true); }
|
||||||
|
|
||||||
void CJellyZap::AddAttractor(CStateManager&) {}
|
void CJellyZap::AddAttractor(CStateManager& mgr) {
|
||||||
|
AddSelfToFishCloud(mgr, x5a0_repulseRadius, x59c_priority, true);
|
||||||
|
AddSelfToFishCloud(mgr, x5a4_attractRadius, x59c_priority, false);
|
||||||
|
}
|
||||||
|
|
||||||
void CJellyZap::RemoveSelfFromFishCloud(CStateManager&) {}
|
void CJellyZap::RemoveSelfFromFishCloud(CStateManager& mgr) {
|
||||||
|
for (const SConnection& conn : x20_conns) {
|
||||||
|
if (conn.x0_state != EScriptObjectState::ScanStart || conn.x4_msg != EScriptObjectMessage::Follow)
|
||||||
|
continue;
|
||||||
|
if (TCastToPtr<CFishCloud> cloud = mgr.ObjectById(mgr.GetIdForScript(conn.x8_objId))) {
|
||||||
|
cloud->RemoveAttractor(GetUniqueId());
|
||||||
|
cloud->RemoveRepulsor(GetUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CJellyZap::RemoveAllAttractors(CStateManager& mgr) { RemoveSelfFromFishCloud(mgr); }
|
void CJellyZap::RemoveAllAttractors(CStateManager& mgr) { RemoveSelfFromFishCloud(mgr); }
|
||||||
|
|
||||||
|
@ -184,7 +216,7 @@ bool CJellyZap::ClosestToPlayer(const CStateManager& mgr) const {
|
||||||
float closestDistance = ourDistance;
|
float closestDistance = ourDistance;
|
||||||
for (CEntity* ent : mgr.GetPhysicsActorObjectList()) {
|
for (CEntity* ent : mgr.GetPhysicsActorObjectList()) {
|
||||||
if (CJellyZap* zap = CPatterned::CastTo<CJellyZap>(ent)) {
|
if (CJellyZap* zap = CPatterned::CastTo<CJellyZap>(ent)) {
|
||||||
if (zap->GetAreaIdAlways() != GetAreaIdAlways())
|
if (zap->GetAreaIdAlways() != GetAreaIdAlways() || zap == this)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const float tmpDist = (playerPos - zap->GetTranslation()).magnitude();
|
const float tmpDist = (playerPos - zap->GetTranslation()).magnitude();
|
||||||
|
@ -197,4 +229,8 @@ bool CJellyZap::ClosestToPlayer(const CStateManager& mgr) const {
|
||||||
}
|
}
|
||||||
return zeus::close_enough(closestDistance, ourDistance);
|
return zeus::close_enough(closestDistance, ourDistance);
|
||||||
}
|
}
|
||||||
|
const CDamageVulnerability* CJellyZap::GetDamageVulnerability(const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
|
const CDamageInfo& info) const {
|
||||||
|
return CActor::GetDamageVulnerability(pos, dir, info);
|
||||||
|
}
|
||||||
} // namespace urde::MP1
|
} // namespace urde::MP1
|
|
@ -11,9 +11,9 @@ class CJellyZap : public CPatterned {
|
||||||
float x590_;
|
float x590_;
|
||||||
float x594_;
|
float x594_;
|
||||||
float x598_;
|
float x598_;
|
||||||
float x59c_;
|
float x59c_priority;
|
||||||
float x5a0_;
|
float x5a0_repulseRadius;
|
||||||
float x5a4_;
|
float x5a4_attractRadius;
|
||||||
float x5a8_attackDelay;
|
float x5a8_attackDelay;
|
||||||
float x5ac_;
|
float x5ac_;
|
||||||
float x5b0_;
|
float x5b0_;
|
||||||
|
@ -22,12 +22,13 @@ class CJellyZap : public CPatterned {
|
||||||
bool x5b8_25_ : 1;
|
bool x5b8_25_ : 1;
|
||||||
bool x5b8_26_ : 1;
|
bool x5b8_26_ : 1;
|
||||||
|
|
||||||
void AddSelfToFishCloud(CStateManager, float, bool);
|
void AddSelfToFishCloud(CStateManager&, float, float, bool);
|
||||||
void AddRepulsor(CStateManager&);
|
void AddRepulsor(CStateManager&);
|
||||||
void AddAttractor(CStateManager&);
|
void AddAttractor(CStateManager&);
|
||||||
void RemoveSelfFromFishCloud(CStateManager&);
|
void RemoveSelfFromFishCloud(CStateManager&);
|
||||||
void RemoveAllAttractors(CStateManager&);
|
void RemoveAllAttractors(CStateManager&);
|
||||||
bool ClosestToPlayer(const CStateManager&) const;
|
bool ClosestToPlayer(const CStateManager&) const;
|
||||||
|
bool sub801d8190() const { return x568_ != 1; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DEFINE_PATTERNED(JellyZap)
|
DEFINE_PATTERNED(JellyZap)
|
||||||
|
@ -40,6 +41,14 @@ public:
|
||||||
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override;
|
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override;
|
||||||
void Think(float, CStateManager&) override;
|
void Think(float, CStateManager&) override;
|
||||||
void DoUserAnimEvent(CStateManager&, const CInt32POINode&, EUserEventType, float dt) override;
|
void DoUserAnimEvent(CStateManager&, const CInt32POINode&, EUserEventType, float dt) override;
|
||||||
|
void KnockBack(const zeus::CVector3f &, CStateManager &, const CDamageInfo &info, EKnockBackType type, bool inDeferred, float magnitude) override;
|
||||||
|
const CDamageVulnerability* GetDamageVulnerability() const override { return CAi::GetDamageVulnerability(); }
|
||||||
|
const CDamageVulnerability* GetDamageVulnerability(const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
|
const CDamageInfo& info) const override;
|
||||||
|
EWeaponCollisionResponseTypes GetCollisionResponseType(const zeus::CVector3f&, const zeus::CVector3f&,
|
||||||
|
const CWeaponMode&, EProjectileAttrib) const override {
|
||||||
|
return sub801d8190() ? EWeaponCollisionResponseTypes::Unknown89 : EWeaponCollisionResponseTypes::Unknown39;
|
||||||
|
}
|
||||||
void Attack(CStateManager&, EStateMsg, float) override;
|
void Attack(CStateManager&, EStateMsg, float) override;
|
||||||
void Suck(CStateManager&, EStateMsg, float) override;
|
void Suck(CStateManager&, EStateMsg, float) override;
|
||||||
void Active(CStateManager&, EStateMsg, float) override;
|
void Active(CStateManager&, EStateMsg, float) override;
|
||||||
|
|
Loading…
Reference in New Issue