2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 15:47:46 +00:00

More CPlayer implementations

This commit is contained in:
Jack Andersen
2017-07-19 07:47:57 -10:00
parent ccc3b99940
commit c5514b3374
6 changed files with 122 additions and 13 deletions

View File

@@ -67,7 +67,7 @@ CPlayer::CPlayer(TUniqueId uid, const zeus::CTransform& xf, const zeus::CAABox&
SetInertiaTensorScalar(xe8_mass);
x1f4_lastNonCollidingState = GetMotionState();
x490_gun->SetX3e8(x34_transform);
x490_gun->SetTransform(x34_transform);
x490_gun->GetGrappleArm().SetX220(x34_transform);
InitializeBallTransition();
@@ -1204,7 +1204,7 @@ void CPlayer::UpdateFootstepSounds(const CFinalInput& input, CStateManager& mgr,
if (x790_footstepSfxSel != EFootstepSfx::None && x78c_footstepSfxTimer > sfxDelay)
{
static float EarHeight = GetEyeHeight() - 0.1f;
if (xe6_24_fluidCounter && x828_waterLevelOnPlayer > 0.f && x828_waterLevelOnPlayer < EarHeight)
if (xe6_24_fluidCounter != 0 && x828_waterLevelOnPlayer > 0.f && x828_waterLevelOnPlayer < EarHeight)
{
if (x82c_inLava)
{
@@ -1289,11 +1289,52 @@ void CPlayer::UpdateGunState(const CFinalInput&, CStateManager& mgr)
{
}
void CPlayer::ForceGunOrientation(const zeus::CTransform&, CStateManager& mgr) {}
void CPlayer::ResetGun(CStateManager& mgr)
{
x498_gunHolsterState = EGunHolsterState::Holstered;
x49c_gunNotFiringTimeout = 0.f;
x490_gun->CancelFiring(mgr);
ResetAimTargetPrediction(kInvalidUniqueId);
}
void CPlayer::UpdateCameraState(CStateManager& mgr) {}
void CPlayer::UpdateArmAndGunTransforms(float dt, CStateManager& mgr)
{
zeus::CVector3f grappleOffset;
zeus::CVector3f gunOffset;
if (x2f8_morphTransState == EPlayerMorphBallState::Morphed)
{
gunOffset = {0.f, 0.f, 0.6f};
}
else
{
gunOffset = g_tweakPlayerGun->GetGunPosition();
grappleOffset = x490_gun->GetGrappleArm().IsArmMoving() ?
zeus::CVector3f::skZero : g_tweakPlayerGun->GetGrapplingArmPosition();
gunOffset.z += GetEyeHeight();
grappleOffset.z += GetEyeHeight();
}
void CPlayer::UpdateDebugCamera(CStateManager& mgr) {}
UpdateGunTransform(gunOffset + x76c_cameraBob->GetGunBobTransformation().origin, mgr);
UpdateGrappleArmTransform(grappleOffset, mgr, dt);
}
void CPlayer::ForceGunOrientation(const zeus::CTransform& xf, CStateManager& mgr)
{
ResetGun(mgr);
x530_ = xf.basis[1];
x490_gun->SetTransform(xf);
UpdateArmAndGunTransforms(0.01f, mgr);
}
void CPlayer::UpdateCameraState(CStateManager& mgr)
{
UpdateCinematicState(mgr);
}
void CPlayer::UpdateDebugCamera(CStateManager& mgr)
{
// Empty
}
void CPlayer::UpdateCameraTimers(float dt, const CFinalInput& input)
{
@@ -1335,7 +1376,65 @@ CFirstPersonCamera& CPlayer::GetFirstPersonCamera(CStateManager& mgr)
return *mgr.GetCameraManager()->GetFirstPersonCamera();
}
void CPlayer::UpdateGunTransform(const zeus::CVector3f&, float, CStateManager& mgr, bool) {}
void CPlayer::UpdateGunTransform(const zeus::CVector3f& gunPos, CStateManager& mgr)
{
float eyeHeight = GetEyeHeight();
zeus::CTransform camXf = mgr.GetCameraManager()->GetCurrentCameraTransform(mgr);
zeus::CTransform gunXf = camXf;
zeus::CVector3f viewGunPos;
if (x2f8_morphTransState == EPlayerMorphBallState::Morphing)
viewGunPos = camXf * (gunPos - zeus::CVector3f(0.f, 0.f, eyeHeight));
else
viewGunPos = camXf.rotate(gunPos - zeus::CVector3f(0.f, 0.f, eyeHeight)) + GetEyePosition();
zeus::CUnitVector3f rightDir(gunXf.basis[0]);
gunXf.origin = viewGunPos;
switch (x498_gunHolsterState)
{
case EGunHolsterState::Drawing:
{
float liftAngle = zeus::clamp(-1.f, x49c_gunNotFiringTimeout / 0.45f, 1.f);
if (liftAngle > 0.01f)
{
gunXf = zeus::CQuaternion::fromAxisAngle(rightDir, -liftAngle *
g_tweakPlayerGun->GetFixedVerticalAim()).toTransform() *
camXf.getRotation();
gunXf.origin = viewGunPos;
}
break;
}
case EGunHolsterState::Holstered:
{
gunXf = zeus::CQuaternion::fromAxisAngle(rightDir, -g_tweakPlayerGun->GetFixedVerticalAim()).toTransform() *
camXf.getRotation();
gunXf.origin = viewGunPos;
break;
}
case EGunHolsterState::Holstering:
{
float liftAngle = 1.f -
zeus::clamp(-1.f, x49c_gunNotFiringTimeout / g_tweakPlayerGun->GetGunHolsterTime(), 1.f);
if (x2f8_morphTransState == EPlayerMorphBallState::Morphing)
liftAngle = 1.f - zeus::clamp(-1.f, x49c_gunNotFiringTimeout / 0.1f, 1.f);
if (liftAngle > 0.01f)
{
gunXf = zeus::CQuaternion::fromAxisAngle(rightDir, -liftAngle *
g_tweakPlayerGun->GetFixedVerticalAim()).toTransform() *
camXf.getRotation();
gunXf.origin = viewGunPos;
}
break;
}
default:
break;
}
x490_gun->SetTransform(gunXf);
UpdateAimTargetPrediction(gunXf, mgr);
UpdateAssistedAiming(gunXf, mgr);
}
void CPlayer::UpdateAssistedAiming(const zeus::CTransform& xf, const CStateManager& mgr)
{