From 435b8fe52e7564bfcf6ff32d36b0625316cbf12f Mon Sep 17 00:00:00 2001 From: erorcun Date: Sat, 14 Aug 2021 22:11:33 +0300 Subject: Fix impossible bullets --- src/peds/Ped.cpp | 6 +++++- src/peds/PedFight.cpp | 28 +++++++++++++++++++++++----- src/peds/PlayerPed.cpp | 38 ++++++++++++++++++++++++++++---------- src/peds/PlayerPed.h | 6 ++++++ 4 files changed, 62 insertions(+), 16 deletions(-) (limited to 'src/peds') diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index fbe63a1a..6cbe7484 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -1233,8 +1233,12 @@ CPed::ClearAimFlag(void) m_lookTimer = 0; } - if (IsPlayer()) + if (IsPlayer()) { ((CPlayerPed*)this)->m_fFPSMoveHeading = 0.0f; +#ifdef FREE_CAM + ((CPlayerPed*)this)->m_bFreeAimActive = false; +#endif + } } void diff --git a/src/peds/PedFight.cpp b/src/peds/PedFight.cpp index 20df6553..43ded57a 100644 --- a/src/peds/PedFight.cpp +++ b/src/peds/PedFight.cpp @@ -345,11 +345,17 @@ CPed::SetAttack(CEntity *victim) if (m_pLookTarget) { SetAimFlag(m_pLookTarget); - } else if (this == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam()) { - SetAimFlag(m_fRotationCur); - ((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch(); - } else if (curWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) { - SetAimFlag(m_fRotationCur); +#ifdef FREE_CAM + } else if (this != FindPlayerPed() || !((CPlayerPed*)this)->m_bFreeAimActive) { +#else + } else { +#endif + if (this == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam()) { + SetAimFlag(m_fRotationCur); + ((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch(); + } else if (curWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) { + SetAimFlag(m_fRotationCur); + } } } #ifdef FIX_BUGS @@ -821,6 +827,9 @@ CPed::Attack(void) if (!bIsDucking && !GetFireAnimNotDucking(ourWeapon) && ourWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM; else +#ifdef FREE_CAM + if (!IsPlayer() || !((CPlayerPed*)this)->m_bFreeAimActive) +#endif m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM; } @@ -1017,6 +1026,15 @@ CPed::Attack(void) weaponAnimAssoc->SetCurrentTime(animLoopEnd); weaponAnimAssoc->flags &= ~ASSOC_RUNNING; SetPointGunAt(m_pPointGunAt); +#ifdef FREE_CAM + } else if (IsPlayer() && ((CPlayerPed*)this)->m_bFreeAimActive && GetWeapon()->m_eWeaponState != WEAPONSTATE_RELOADING) { + float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation); + SetLookFlag(limitedCam, true, 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 1d96ba6d..b0b82640 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -98,6 +98,9 @@ CPlayerPed::CPlayerPed(void) : CPed(PEDTYPE_PLAYER1) m_nAttackDirToCheck = 0; m_nLastBusFareCollected = 0; idleAnimBlockIndex = CAnimManager::GetAnimationBlockIndex("playidles"); +#ifdef FREE_CAM + m_bFreeAimActive = false; +#endif } void @@ -1342,17 +1345,22 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) if ((padUsed->GetTarget() && CAN_AIM_WITH_ARM) || 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 (CAN_AIM_WITH_ARM) { - 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; - SetLookFlag(limitedCam, true); + m_bFreeAimActive = true; + SetLookFlag(limitedCam, true, true); SetAimFlag(limitedCam); - SetLookTimer(INT32_MAX); // removing this makes head move for real, but I experinced some bugs. - + SetLookTimer(INT32_MAX); + ((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; @@ -1380,9 +1388,19 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) changedHeadingRate = 0; RestoreHeadingRate(); } - if (pointedGun == 1 && m_nPedState != PED_ATTACK) { - pointedGun = 0; - ClearPointGunAt(); + 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 diff --git a/src/peds/PlayerPed.h b/src/peds/PlayerPed.h index 1b7158b5..30b67199 100644 --- a/src/peds/PlayerPed.h +++ b/src/peds/PlayerPed.h @@ -44,6 +44,12 @@ public: float m_fGunSpinAngle; unsigned int m_nPadDownPressedInMilliseconds; unsigned int m_nLastBusFareCollected; +#ifdef FREE_CAM + bool m_bFreeAimActive; + CVector m_cachedCamSource; + CVector m_cachedCamFront; + CVector m_cachedCamUp; +#endif static bool bDontAllowWeaponChange; #ifndef MASTER -- cgit v1.2.3