summaryrefslogtreecommitdiffstats
path: root/src/peds/PedIK.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/peds/PedIK.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/peds/PedIK.cpp b/src/peds/PedIK.cpp
index 9b3f401f..3d5bcfb5 100644
--- a/src/peds/PedIK.cpp
+++ b/src/peds/PedIK.cpp
@@ -8,6 +8,8 @@ WRAPPER bool CPedIK::PointGunAtPosition(CVector *position) { EAXJMP(0x4ED920); }
WRAPPER void CPedIK::ExtractYawAndPitchLocal(RwMatrixTag*, float*, float*) { EAXJMP(0x4ED2C0); }
WRAPPER void CPedIK::ExtractYawAndPitchWorld(RwMatrixTag*, float*, float*) { EAXJMP(0x4ED140); }
+LimbMovementInfo &CPedIK::ms_torsoInfo = *(LimbMovementInfo*)0x5F9F8C;
+
CPedIK::CPedIK(CPed *ped)
{
m_ped = ped;
@@ -102,8 +104,61 @@ CPedIK::GetWorldMatrix(RwFrame *source, RwMatrix *destination)
return destination;
}
+// A helper function that adjusts "limb" parameter according to limitations. Doesn't move the limb.
+int8
+CPedIK::MoveLimb(LimbOrientation &limb, float approxPhi, float approxTheta, LimbMovementInfo &moveInfo)
+{
+ int result = 1;
+
+ // phi
+
+ if (limb.phi > approxPhi) {
+ limb.phi -= moveInfo.yawD;
+ } else if (limb.phi < approxPhi) {
+ limb.phi += moveInfo.yawD;
+ }
+
+ if (Abs(limb.phi - approxPhi) < moveInfo.yawD) {
+ limb.phi = approxPhi;
+ result = 2;
+ }
+ if (limb.phi > moveInfo.maxYaw || limb.phi < moveInfo.minYaw) {
+ limb.phi = clamp(limb.phi, moveInfo.minYaw, moveInfo.maxYaw);
+ result = 0;
+ }
+
+ // theta
+
+ if (limb.theta > approxTheta) {
+ limb.theta -= moveInfo.pitchD;
+ } else if (limb.theta < approxTheta) {
+ limb.theta += moveInfo.pitchD;
+ }
+
+ if (Abs(limb.theta - approxTheta) < moveInfo.pitchD)
+ limb.theta = approxTheta;
+ else
+ result = 1;
+
+ if (limb.theta > moveInfo.maxPitch || limb.theta < moveInfo.minPitch) {
+ limb.theta = clamp(limb.theta, moveInfo.minPitch, moveInfo.maxPitch);
+ result = 0;
+ }
+ return result;
+}
+
+bool
+CPedIK::RestoreGunPosn(void)
+{
+ int limbStatus = MoveLimb(m_torsoOrient, 0.0f, 0.0f, ms_torsoInfo);
+ RotateTorso(m_ped->m_pFrames[PED_MID], &m_torsoOrient, false);
+ return limbStatus == 2;
+}
+
STARTPATCHES
InjectHook(0x4ED0F0, &CPedIK::GetComponentPosition, PATCH_JUMP);
InjectHook(0x4ED060, &CPedIK::GetWorldMatrix, PATCH_JUMP);
InjectHook(0x4EDDB0, &CPedIK::RotateTorso, PATCH_JUMP);
+ InjectHook(0x4ED440, &CPedIK::MoveLimb, PATCH_JUMP);
+ InjectHook(0x4EDD70, &CPedIK::RestoreGunPosn, PATCH_JUMP);
ENDPATCHES \ No newline at end of file