summaryrefslogtreecommitdiffstats
path: root/src/peds
diff options
context:
space:
mode:
Diffstat (limited to 'src/peds')
-rw-r--r--src/peds/Ped.cpp8
-rw-r--r--src/peds/PedFight.cpp14
-rw-r--r--src/peds/PlayerPed.cpp41
-rw-r--r--src/peds/PlayerPed.h6
4 files changed, 57 insertions, 12 deletions
diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp
index 96c1d094..6b28dcb0 100644
--- a/src/peds/Ped.cpp
+++ b/src/peds/Ped.cpp
@@ -1120,8 +1120,12 @@ CPed::ClearAimFlag(void)
#endif
}
- if (IsPlayer())
+ if (IsPlayer()) {
((CPlayerPed*)this)->m_fFPSMoveHeading = 0.0f;
+#ifdef FREE_CAM
+ ((CPlayerPed*)this)->m_bFreeAimActive = false;
+#endif
+ }
}
void
@@ -1361,7 +1365,7 @@ CPed::CalculateNewVelocity(void)
}
#ifdef FREE_CAM
- if (!TheCamera.Cams[0].Using3rdPersonMouseCam())
+ if (!CCamera::bFreeCam || !TheCamera.Cams[0].Using3rdPersonMouseCam())
#endif
if (IsPlayer() && m_nPedState == PED_ATTACK)
headAmount /= 4.0f;
diff --git a/src/peds/PedFight.cpp b/src/peds/PedFight.cpp
index 13d3930c..03d5c755 100644
--- a/src/peds/PedFight.cpp
+++ b/src/peds/PedFight.cpp
@@ -311,9 +311,14 @@ CPed::SetAttack(CEntity *victim)
m_pLookTarget->RegisterReference((CEntity **) &m_pLookTarget);
m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget);
}
+
if (m_pLookTarget) {
SetAimFlag(m_pLookTarget);
+#ifdef FREE_CAM
+ } else if (this != FindPlayerPed() || !((CPlayerPed*)this)->m_bFreeAimActive) {
+#else
} else {
+#endif
SetAimFlag(m_fRotationCur);
if (FindPlayerPed() == this && TheCamera.Cams[0].Using3rdPersonMouseCam())
@@ -737,6 +742,15 @@ CPed::Attack(void)
weaponAnimAssoc->flags &= ~ASSOC_RUNNING;
SetPointGunAt(m_pPointGunAt);
#endif
+#ifdef FREE_CAM
+ } else if (IsPlayer() && ((CPlayerPed*)this)->m_bFreeAimActive && GetWeapon()->m_eWeaponState != WEAPONSTATE_RELOADING) {
+ float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
+ SetLookFlag(limitedCam, true);
+ SetAimFlag(limitedCam);
+ SetLookTimer(INT32_MAX);
+ SetPointGunAt(nil);
+ ((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
+#endif
} else {
ClearAimFlag();
diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp
index 416fb949..deb409b5 100644
--- a/src/peds/PlayerPed.cpp
+++ b/src/peds/PlayerPed.cpp
@@ -504,7 +504,7 @@ CPlayerPed::DoWeaponSmoothSpray(void)
if (m_nPedState == PED_ATTACK && !m_pPointGunAt) {
eWeaponType weapon = GetWeapon()->m_eWeaponType;
#ifdef FREE_CAM
- if(TheCamera.Cams[0].Using3rdPersonMouseCam() && (weapon == WEAPONTYPE_COLT45 || weapon == WEAPONTYPE_UZI))
+ if(CCamera::bFreeCam && TheCamera.Cams[0].Using3rdPersonMouseCam() && (weapon == WEAPONTYPE_COLT45 || weapon == WEAPONTYPE_UZI))
return false;
#endif
if (weapon == WEAPONTYPE_FLAMETHROWER || weapon == WEAPONTYPE_COLT45 || weapon == WEAPONTYPE_UZI || weapon == WEAPONTYPE_SHOTGUN ||
@@ -1060,7 +1060,9 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
#ifdef FREE_CAM
static int8 changedHeadingRate = 0;
+ static int8 pointedGun = 0;
if (changedHeadingRate == 2) changedHeadingRate = 1;
+ if (pointedGun == 2) pointedGun = 1;
// Rotate player/arm when shooting. We don't have auto-rotation anymore
if (CCamera::m_bUseMouse3rdPerson && CCamera::bFreeCam &&
@@ -1071,22 +1073,28 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
if ((padUsed->GetTarget() && weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) || padUsed->GetWeapon()) {
float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
+ m_cachedCamSource = TheCamera.Cams[TheCamera.ActiveCam].Source;
+ m_cachedCamFront = TheCamera.Cams[TheCamera.ActiveCam].Front;
+ m_cachedCamUp = TheCamera.Cams[TheCamera.ActiveCam].Up;
+
// On this one we can rotate arm.
if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) {
- if (!padUsed->GetWeapon()) { // making this State != ATTACK still stops it after attack. Re-start it immediately!
- SetPointGunAt(nil);
- bIsPointingGunAt = false; // to not stop after attack
- }
-
+ pointedGun = 2;
+ m_bFreeAimActive = true;
SetLookFlag(limitedCam, true);
SetAimFlag(limitedCam);
#ifdef VC_PED_PORTS
SetLookTimer(INT32_MAX); // removing this makes head move for real, but I experinced some bugs.
#endif
+ ((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
+ if (m_nPedState != PED_ATTACK && m_nPedState != PED_AIM_GUN) {
+ // This is a seperate ped state just for pointing gun. Used for target button
+ SetPointGunAt(nil);
+ }
} else {
m_fRotationDest = limitedCam;
changedHeadingRate = 2;
- m_headingRate = 50.0f;
+ m_headingRate = 12.5f;
// Anim. fix for shotgun, ak47 and m16 (we must finish rot. it quickly)
if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM) && padUsed->WeaponJustDown()) {
@@ -1102,14 +1110,27 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
m_fRotationCur += (limitedRotDest - m_fRotationCur) / 2;
}
}
- } else if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM) && m_nPedState != PED_ATTACK)
- ClearPointGunAt();
+ }
}
}
if (changedHeadingRate == 1) {
changedHeadingRate = 0;
RestoreHeadingRate();
}
+ if (pointedGun == 1) {
+ if (m_nPedState == PED_ATTACK) {
+ if (!padUsed->GetWeapon() && (m_pedIK.m_flags & CPedIK::GUN_POINTED_SUCCESSFULLY) == 0) {
+ float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
+
+ SetAimFlag(limitedCam);
+ ((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
+ m_bFreeAimActive = true;
+ }
+ } else {
+ pointedGun = 0;
+ ClearPointGunAt();
+ }
+ }
#endif
if (padUsed->GetTarget() && m_nSelectedWepSlot == m_currentWeapon && m_nMoveState != PEDMOVE_SPRINT) {
@@ -1188,7 +1209,7 @@ CPlayerPed::PlayerControlZelda(CPad *padUsed)
}
#ifdef FREE_CAM
- if(TheCamera.Cams[0].Using3rdPersonMouseCam() && doSmoothSpray) {
+ if(CCamera::bFreeCam && TheCamera.Cams[0].Using3rdPersonMouseCam() && doSmoothSpray) {
padMoveInGameUnit = 0.0f;
smoothSprayWithoutMove = false;
}
diff --git a/src/peds/PlayerPed.h b/src/peds/PlayerPed.h
index e8173c8c..796a6ca0 100644
--- a/src/peds/PlayerPed.h
+++ b/src/peds/PlayerPed.h
@@ -34,6 +34,12 @@ public:
CPed *m_pPedAtSafePos[6];
float m_fWalkAngle;
float m_fFPSMoveHeading;
+#ifdef FREE_CAM
+ bool m_bFreeAimActive;
+ CVector m_cachedCamSource;
+ CVector m_cachedCamFront;
+ CVector m_cachedCamUp;
+#endif
CPlayerPed();
~CPlayerPed();