|
13 | 13 | #include "CHudSA.h" |
14 | 14 | #include "CGameSA.h" |
15 | 15 | #include "CCameraSA.h" |
| 16 | +#include "CPlayerInfoSA.h" |
| 17 | +#include "TaskAttackSA.h" |
16 | 18 |
|
17 | 19 | extern CGameSA* pGame; |
18 | 20 |
|
@@ -178,35 +180,51 @@ void CHudSA::ResetComponentAdjustment() |
178 | 180 |
|
179 | 181 | bool CHudSA::IsCrosshairVisible() |
180 | 182 | { |
181 | | - if (!IsComponentVisible(HUD_CROSSHAIR)) |
182 | | - return false; |
| 183 | + bool specialAiming = false; |
| 184 | + bool simpleAiming = false; |
183 | 185 |
|
| 186 | + // Get camera view mode |
184 | 187 | CCamera* camera = pGame->GetCamera(); |
185 | 188 | eCamMode cameraViewMode = static_cast<eCamMode>(camera->GetCam(camera->GetActiveCam())->GetMode()); |
186 | 189 |
|
187 | | - switch (cameraViewMode) |
| 190 | + // Get player |
| 191 | + CPed* playerPed = pGame->GetPedContext(); |
| 192 | + CWeapon* weapon = nullptr; |
| 193 | + eWeaponType weaponType; |
| 194 | + |
| 195 | + // Get player current weapon |
| 196 | + if (playerPed) |
| 197 | + { |
| 198 | + weapon = playerPed->GetWeapon(playerPed->GetCurrentWeaponSlot()); |
| 199 | + if (weapon) |
| 200 | + weaponType = weapon->GetType(); |
| 201 | + } |
| 202 | + |
| 203 | + // Special aiming |
| 204 | + if (cameraViewMode == MODE_SNIPER || cameraViewMode == MODE_1STPERSON || cameraViewMode == MODE_ROCKETLAUNCHER || cameraViewMode == MODE_ROCKETLAUNCHER_HS || cameraViewMode == MODE_M16_1STPERSON || cameraViewMode == MODE_HELICANNON_1STPERSON || cameraViewMode == MODE_CAMERA) |
| 205 | + { |
| 206 | + if (weapon && cameraViewMode != MODE_1STPERSON && pGame->GetWeaponInfo(weaponType, WEAPONSKILL_STD)->GetFireType() != FIRETYPE_MELEE) |
| 207 | + specialAiming = true; |
| 208 | + } |
| 209 | + |
| 210 | + // Simple aiming |
| 211 | + if (cameraViewMode == MODE_M16_1STPERSON_RUNABOUT || cameraViewMode == MODE_ROCKETLAUNCHER_RUNABOUT || cameraViewMode == MODE_ROCKETLAUNCHER_RUNABOUT_HS || cameraViewMode == MODE_SNIPER_RUNABOUT) |
| 212 | + simpleAiming = true; |
| 213 | + |
| 214 | + if ((playerPed && weapon) && !playerPed->GetTargetedObject() && playerPed->GetPedInterface()->pPlayerData->m_bFreeAiming) |
188 | 215 | { |
189 | | - case MODE_SNIPER_RUNABOUT: |
190 | | - case MODE_ROCKETLAUNCHER_RUNABOUT: |
191 | | - case MODE_ROCKETLAUNCHER_RUNABOUT_HS: |
192 | | - case MODE_M16_1STPERSON_RUNABOUT: |
193 | | - case MODE_1STPERSON_RUNABOUT: |
194 | | - case MODE_AIMWEAPON: |
195 | | - case MODE_AIMWEAPON_ATTACHED: |
196 | | - case MODE_AIMWEAPON_FROMCAR: |
197 | | - case MODE_M16_1STPERSON: |
198 | | - case MODE_HELICANNON_1STPERSON: |
199 | | - case MODE_SNIPER: |
200 | | - case MODE_ROCKETLAUNCHER: |
201 | | - case MODE_ROCKETLAUNCHER_HS: |
202 | | - case MODE_AIMING: |
203 | | - case MODE_CAMERA: |
204 | | - return true; |
205 | | - default: |
206 | | - break; |
| 216 | + CTaskSimpleUseGun* taskUseGun = playerPed->GetPedIntelligence()->GetTaskUseGun(); |
| 217 | + if ((!taskUseGun || !taskUseGun->GetSkipAim()) && (cameraViewMode == MODE_AIMWEAPON || cameraViewMode == MODE_AIMWEAPON_FROMCAR || cameraViewMode == MODE_AIMWEAPON_ATTACHED)) |
| 218 | + { |
| 219 | + if (playerPed->GetPedState() != PED_ENTER_CAR && playerPed->GetPedState() != PED_CARJACK) |
| 220 | + { |
| 221 | + if ((weaponType >= WEAPONTYPE_PISTOL && weaponType <= WEAPONTYPE_M4) || weaponType == WEAPONTYPE_TEC9 || weaponType == WEAPONTYPE_COUNTRYRIFLE || weaponType == WEAPONTYPE_MINIGUN || weaponType == WEAPONTYPE_FLAMETHROWER) |
| 222 | + simpleAiming = cameraViewMode != MODE_AIMWEAPON || camera->GetTransitionState() == 0; |
| 223 | + } |
| 224 | + } |
207 | 225 | } |
208 | 226 |
|
209 | 227 | // Check CTheScripts::bDrawCrossHair |
210 | 228 | std::uint8_t crossHairType = *reinterpret_cast<std::uint8_t*>(VAR_CTheScripts_bDrawCrossHair); |
211 | | - return crossHairType > 0; |
| 229 | + return specialAiming || simpleAiming || crossHairType > 0; |
212 | 230 | } |
0 commit comments