Files
2025-09-29 00:52:08 +02:00

5228 lines
170 KiB
XML
Executable File

/*
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_camera.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "common/flow/flow_public_core_override.sch"
USING "Commands_streaming.sch"
USING "commands_ped.sch"
USING "Overlay_Effects.sch"
USING "commands_task.sch"
USING "commands_object.sch"
USING "selector_public.sch"
USING "commands_fire.sch"
USING "commands_event.sch"
using "commands_misc.sch"
USING "commands_graphics.sch"
USING "commands_path.sch"
USING "beam_effect.sch"
*/
USING "net_include.sch"
USING "net_scoring_common.sch"
USING "net_mission.sch"
USING "menu_public.sch"
USINg "net_spawn.sch"
USING "rage_builtins.sch"
USING "globals.sch"
using "cellphone_public.sch"
USING "commands_camera.sch"
USING "commands_clock.sch"
using "commands_misc.sch"
USING "script_maths.sch"
USING "Script_player.sch"
using "commands_path.sch"
//using "beam_effect.sch"
using "script_blips.sch"
using "usefulCommands.sch"
USING "commands_shapetest.sch"
USING "commands_path.sch"
USING "selector_public.sch"
USING "rgeneral_include.sch"
#IF IS_DEBUG_BUILD
USING "script_debug.sch"
#ENDIF
USING "VehicleTurretHeader.sch"
//vector vStoreHit
//╒═════════════════════════════════════════════════════════════════════════════╕
//│ Author: KB Date: 01/07/2010 │
//╞═════════════════════════════════════════════════════════════════════════════╡
//│ │
//│ │
//│ Police Chopper HUD │
//│ │
//│ │
//╘═════════════════════════════════════════════════════════════════════════════╛
CONST_INT HUD_FRIEND 0
CONST_INT HUD_BYSTANDER 1
CONST_INT HUD_FOE 2
CONST_INT HUD_UNKNOWN 3
//aaa
TWEAK_FLOAT HUD_PAN_FACTOR_DEFAULT 0.0075
//FLOAT fStoredArrowPos
VECTOR vStoredRotation
INT iCamFrameCounter
BOOL bCamMovementStopped
//CONST_INT MAX_SCANNABLE_PEDS 40
//CONST_INT MAX_HELIHUD_COORD_COUNT 10 //how many target icons can be displayed on HUD
CONST_FLOAT MAX_CAMERA_PITCH -75.0
CONST_FLOAT MAX_CAMERA_PITCH_GROUNDED -25.0
CONST_FLOAT MIN_CAMERA_PITCH 6.0
CONST_FLOAT MIN_CAMERA_HEADING -180.0
CONST_FLOAT MAX_CAMERA_HEADING 180.0
CONST_INT MAX_GROUND_CLIP_FRAMES 10
//CONST_INT MAX_MESSAGES 12
TWEAK_FLOAT cfVOLATOL_NOSE_CAM_X 0.0
TWEAK_FLOAT cfVOLATOL_NOSE_CAM_Y 0.180
TWEAK_FLOAT cfVOLATOL_NOSE_CAM_Z 0.0
TWEAK_FLOAT cfVOLATOL_ROOF_CAM_X 0.0
TWEAK_FLOAT cfVOLATOL_ROOF_CAM_Y 0.0
TWEAK_FLOAT cfVOLATOL_ROOF_CAM_Z 0.50
CONST_FLOAT cfVOLATOL_NOSE_BASE_X 0.00
CONST_FLOAT cfVOLATOL_NOSE_BASE_Y 7.10
CONST_FLOAT cfVOLATOL_NOSE_BASE_Z -1.52
CONST_FLOAT cfVOLATOL_ROOF_BASE_X 0.00
CONST_FLOAT cfVOLATOL_ROOF_BASE_Y 4.70
CONST_FLOAT cfVOLATOL_ROOF_BASE_Z 2.56
TWEAK_FLOAT cfAVENGER_T0_X 0.0 // <<0.0454, 9.8, -2.4>>
TWEAK_FLOAT cfAVENGER_T0_Y 9.8
TWEAK_FLOAT cfAVENGER_T0_Z -2.315
TWEAK_FLOAT cfAVENGER_T0_RX 0.0
TWEAK_FLOAT cfAVENGER_T0_RY 0.0
TWEAK_FLOAT cfAVENGER_T0_RZ 0.0
TWEAK_FLOAT cfAVENGER_T1_X 0.0 //<<-0.0007, -1.8604, 2.6528>>
TWEAK_FLOAT cfAVENGER_T1_Y -1.85
TWEAK_FLOAT cfAVENGER_T1_Z 2.650
TWEAK_FLOAT cfAVENGER_T1_RX 0.0
TWEAK_FLOAT cfAVENGER_T1_RY 0.0
TWEAK_FLOAT cfAVENGER_T1_RZ 180.0
TWEAK_FLOAT cfAVENGER_T2_X 0.0 //<<-0.0078, -9.3894, 0.2028>>
TWEAK_FLOAT cfAVENGER_T2_Y -9.50
TWEAK_FLOAT cfAVENGER_T2_Z 0.11
TWEAK_FLOAT cfAVENGER_T2_RX 0.0
TWEAK_FLOAT cfAVENGER_T2_RY 0.0
TWEAK_FLOAT cfAVENGER_T2_RZ 180.0
TWEAK_FLOAT cfAKULA_T1_X 1.260
TWEAK_FLOAT cfAKULA_T1_Y 3.278
TWEAK_FLOAT cfAKULA_T1_Z 0.695
TWEAK_FLOAT cfAKULA_T1_RX 0.0
TWEAK_FLOAT cfAKULA_T1_RY 0.0
TWEAK_FLOAT cfAKULA_T1_RZ -90.0
TWEAK_FLOAT cfMOC2_0_X 0.0
TWEAK_FLOAT cfMOC2_0_Y 0.0
TWEAK_FLOAT cfMOC2_0_Z 0.0
TWEAK_FLOAT cfMOC2_0_RX 0.0
TWEAK_FLOAT cfMOC2_0_RY 0.0
TWEAK_FLOAT cfMOC2_0_RZ 0.0
TWEAK_FLOAT cfMOC2_1_X 0.0
TWEAK_FLOAT cfMOC2_1_Y 0.0
TWEAK_FLOAT cfMOC2_1_Z 0.0
TWEAK_FLOAT cfMOC2_1_RX 0.0
TWEAK_FLOAT cfMOC2_1_RY 0.0
TWEAK_FLOAT cfMOC2_1_RZ 0.0
struct messageStruct //Displays fancy streaming police messages on HUD
int messageID //unique number for this message
bool messagePrinting
//TEXT_LABEL_63 HelicopterHudlabel
//string HelicopterHudTextLabel
//int labelLength
int charsDisplayed
float fx,fy
int nextchartime
float size
int textSpeed
int pauseBeforePrinting
int pauseOnCompletion
bool deleteOnCompletion
int waitForMessage
int deletePreviousMessages
bool active, completed
int r,g,b,a
ENDSTRUCT
ENUM HELIHUD_MARKER_TYPE
MARKER_CROSS,
MARKER_BOX
ENDENUM
STRUCT structPedList //each ped that is scannable is stored in this.
PED_INDEX pedID
int lastSeenTime
int BITPedData
float fScanTime
int relType
int BITnamesAndCrimes
#if ENABLE_ENHANCED_HUD_FEATURES
int iSpecialNameCase = -1
#ENDIF
vector vLostLocation
SHAPETEST_INDEX shapeTest
//TEXT_LABEL_63 name
//int status
//TEXT_LABEL_63 crimes
ENDSTRUCT
/*
struct structPedNames
TEXT_LABEL_63 nameMale
TEXT_LABEL_63 nameFemale
text_label_63 surname
ENDSTRUCT
*/
STRUCT HELIHUD_MARKER
vector coord
vehicle_index veh = null
ped_index ped = null
int entry = -1
HELIHUD_MARKER_TYPE markerType
BLIP_INDEX blip
int r,g,b
ENDSTRUCT
struct colourStruct
int r,g,b
endstruct
//view blocking
#if ENABLE_ENHANCED_HUD_FEATURES
CONST_INT MAX_SPHERE_BLOCKERS 7
CONST_INT MAX_QUAD_BLOCKS 6
float zSpeed
struct quadBlockStruct
vector vCorner[4]
endstruct
quadBlockStruct quadBlocks[MAX_QUAD_BLOCKS]
STRUCT sphereBlockerStruct
vector vLoc
float fRad
bool inUse
ENDSTRUCT
#endif
STRUCT structHelicopterHUDVars
bool bHUDInitiated
bool bHUDIsActive
bool canScan
//Widgets
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID CopChopperWidget
VECTOR vTurretCamOffset //= <<-1, -1, -1>>
#ENDIF // IS_DEBUG_BUILD
bool bActivateChopper
bool isMultiplayerMode
//------------------------------------------Chopper Variables-------------------------------
bool onlyShowHUDmarkers
bool bMoveChopper
bool mpCamFudge
vehicle_INDEX vehChopper
ENTITY_INDEX camEntity
float fChopperSpeed
float fChopperRotateSpeed
float nearClip = 0.5
float maxNearClip = 5.0
//hud stuff
int minutes
float fMaxChopperSpeed=40.0,fminChopperSpeed
float fHeight, fTargetHeight=150.0, fChopperVerticalSpeed, fChopperVerticlAccel, fMaxVertSpeedFactor, fChopperHeight
int flyUpdateTime
FLOAT fMinCameraYaw
FLOAT fMaxCameraYaw = 0.0
float angUpLow = 1.059
float angUpHigh = 2.073
float angDownLow = 2.052
float angDownHigh = 2.826
float angLow = -58.95
float AngHigh = -9.858
//-------------------------------------------chopper cam variables --------------------------
CAMERA_INDEX camChopper
bool bActivateChopperCam
bool bDeactivateChopperCam
bool bIsCamAttached
float chopperPanFactor
float ChopperZoomFactor
float maxFOV = 28.0
float minFOV = 10.0
float fFOV
float chopperHeading
#if ENABLE_ENHANCED_HUD_FEATURES
bool bBlockTargetLost
int minChopperHours=-1
int maxChopperHours=-1
bool bShowData
bool bSphereBlockersActive
bool bHoverInArea,bGettoPoint,moveByCamera
float speedMultiplier=1.0
bool bheadingfixed
float fFixedHeading
float visibleHeading
bool bDisableCamMovement
vector vGetToPoint,vLastGetToPoint,vHoverPoint
float rangeToTarget
int flightTime
bool slowOnArrival
float circleRadius
float actualSpeed
float hoverHitRange
vector lastPos
float speedLastFrame
vector vHoverCenter
float fHoverRadius
float lastVx,lastVy
float actualZAcc
float targetZAcc
float lastRotVel
float rotVelChange
bool bSphereBlockActive
sphereBlockerStruct sphereBlocker[MAX_SPHERE_BLOCKERS]
#ENDIF
//temp variables
VECTOR vCamRot
vector vTargetedGround
//-------------------------------------------chopper HUD variables------------------------------
int iCurrentPedScanCount
bool scanning
bool bDisplayHUD
bool bDisplayMinimap
bool bShowTargetOffScreen
bool targetIsLost
float fLineAInset
//scanning memory
ped_index lastScannedPed
float fStickPitch, fStickYaw
int colR
int colG
int colB
int colA
//colours
colourStruct boxColourUnscanned
colourStruct boxColourtarget
colourStruct boxColourFriendly
colourStruct scanningColour
float fBoxSize
float fTextY
int iPedGivenLOScheck
float fSightRangeMultiplier
float fSightRangeMultiplier2
float fRangeMultiplier
float fLineAWidth
float hudBarY
float hudReticuleSize
float hudHorizY
float hudHorizWidth
float hudHorizHeight
//bool flags
bool bTexturesLoaded
bool bDisableScanner
//vertical element vars
float elementWidth
float elementHeight
float elementArrowX
float elementArrowSize
//peds to scan
int nearestPed
int lastIdentifiedPed
int scanButtonPressedRemovalTimer
TEXT_LABEL pedCrimes[11]
TEXT_LABEL pedStatus[4]
float fMinFindPedOnScreenRange
//#if ENABLE_ENHANCED_HUD_FEATURES
SHAPETEST_INDEX shpTest
vector vAimAt
//#ENDIF
//coord markers
int helihudMarkerCount
HELIHUD_MARKER helihudMarker[MAX_HELIHUD_COORD_COUNT]
//structs
structPedList pedScanList[MAX_SCANNABLE_PEDS]
//structPedNames pedNames[MAX_PED_NAMES]
//building up display messages
#if ENABLE_ENHANCED_HUD_FEATURES
messageStruct message[MAX_MESSAGES]
int messageCounter = 0
int CharTimeGap = 100 //ms
int currentMessage
float fTrackBeztime
TEXT_LABEL specialNames[7]
#ENDIF
VECTOR vAttachedCamRotationOffset
VECTOR vAttachedEntityRotation
//-------------------------------Ped control vars----------------------------
bool bAllowPedOrders
PED_INDEX selectedPed=null
int selectID
//--------------------------------TEST VARS-------------------------------
float fTextRangeScale
float textSpace
//
float fCheckHUDFocusRange = 20.0
int nextGroundCheckTime
float GroundHeightAccum
//AUDIO
bool bAudioLoaded
bool rangeSoundPlaying
int soundID_zoom = -1
int soundID_turn = -1
int soundID_scan = -1
int soundID_background = -1
int soundID_scanloop = -1
int soundID_scangood = -1
int soundID_scanbad = -1
int soundID_scanRange = -1
#IF IS_DEBUG_BUILD
//debug
bool bSaveDebug
BOOL bDebugDrawRelRot = FALSE
#ENDIF
INT iCollideFrameCount = 0
INT iSceneSoundId = -1
BOOL bCamRotSet = FALSE
BOOL bDelayRenderScriptCams = FALSE
BOOL bLimitCamWhileGrounded
ENDSTRUCT
#IF IS_DEBUG_BUILD
//WIDGET_GROUP_ID parentWidget
#ENDIF
//float textXPos = 0.35, textYPos = 0.6, textScale = 2.0
//#if ENABLE_ENHANCED_HUD_FEATURES
// bool resetTime
//#ENDIF
//int itextSpeed
SCALEFORM_INDEX mov
//view blocking checks
FUNC BOOL POINT_IN_TRI(vector vPointOnPlane, vector vCorner1,vector vCorner2,vector vCorner3)
vector v0 = vCorner3 - vCorner1
vector v1 = vCorner2 - vCorner1
vector v2 = vPointOnPlane - vCorner1
float dot00 = DOT_PRODUCT(v0, v0)
float dot01 = DOT_PRODUCT(v0, v1)
float dot02 = DOT_PRODUCT(v0, v2)
float dot11 = DOT_PRODUCT(v1, v1)
float dot12 = DOT_PRODUCT(v1, v2)
float invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
float u = (dot11 * dot02 - dot01 * dot12) * invDenom
float v = (dot00 * dot12 - dot01 * dot02) * invDenom
IF (u >= 0) AND (v >= 0) AND (u + v < 1)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_LINE_INTERSECT_QUAD(vector p1, vector p2, vector vCorner1,vector vCorner2,vector vCorner3,vector vCorner4)
vector vPointOnPlane
vector normal = CROSS_PRODUCT(vCorner2 - vCorner1, vCorner3 - vCorner1)
IF NOT IS_VECTOR_ZERO(normal)
normal = NORMALISE_VECTOR(normal)
IF GET_LINE_PLANE_INTERSECT(vPointOnPlane, p1, p2, normal, vCorner1)
IF GET_DISTANCE_BETWEEN_COORDS(p1,vPointOnPlane) < GET_DISTANCE_BETWEEN_COORDS(p1,p2)
IF POINT_IN_TRI(vPointOnPlane,vCorner1,vCorner2,vCorner3)
RETURN TRUE
ENDIF
ENDIF
ENDIF
normal = CROSS_PRODUCT(vCorner3 - vCorner1, vCorner4 - vCorner1)
normal = NORMALISE_VECTOR(normal)
IF NOT IS_VECTOR_ZERO(normal)
IF GET_LINE_PLANE_INTERSECT(vPointOnPlane, p1, p2, normal, vCorner1)
IF GET_DISTANCE_BETWEEN_COORDS(p1,vPointOnPlane) < GET_DISTANCE_BETWEEN_COORDS(p1,p2)
IF POINT_IN_TRI(vPointOnPlane,vCorner1,vCorner4,vCorner3)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIf
return false
ENDFUNC
#if ENABLE_ENHANCED_HUD_FEATURES
FUNC BOOL IS_POINT_BLOCKED_BY_QUAD(vector vCoord)
int i
IF DOES_CAM_EXIST(GET_RENDERING_CAM())
IF IS_CAM_RENDERING(GET_RENDERING_CAM())
vector vCam = GET_CAM_COORD(GET_RENDERING_CAM())
REPEAT COUNT_OF(quadBlocks) i
IF DOES_LINE_INTERSECT_QUAD(vCam,vCoord,quadBlocks[i].vCorner[0],quadBlocks[i].vCorner[1],quadBlocks[i].vCorner[2],quadBlocks[i].vCorner[3])
RETURN TRUE
ENDIF
ENDREPEAT
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC ADD_BLOCKING_PLANE(int iEntry,vector v1,vector v2,vector v3,vector v4)
quadBlocks[iEntry].vCorner[0] = v1
quadBlocks[iEntry].vCorner[1] = v2
quadBlocks[iEntry].vCorner[2] = v3
quadBlocks[iEntry].vCorner[3] = v4
endproc
#endif
#IF IS_DEBUG_BUILD
PROC DISPLAY_STRING_WITH_NUMBER(float xi, float yi,string aString,float fNum)
SET_TEXT_SCALE(0.5,0.5)
TEXT_LABEL_63 aLabel
aLabel += aString
aLabel += GET_STRING_FROM_FLOAT(fNum)
DISPLAY_TEXT_WITH_LITERAL_STRING(xi,yi,"string",aLabel)
ENDPROC
proc DISPLAY_NUMBER(int iNum, float xi, float yi)
DISPLAY_TEXT_WITH_NUMBER(xi,yi,"NUM_0",iNum)
ENDPROC
#ENDIF
FUNC BOOL CHOPPER_INIT(structHelicopterHUDVars &HUD, bool onlyShowHUDmarkers = FALSE)
// #IF IS_DEBUG_BUILD
// parentWidget = parentW
// #ENDIF
hud.onlyShowHUDmarkers = onlyShowHUDmarkers
hud.boxColourUnscanned.r = 93
hud.boxColourUnscanned.g = 182
hud.boxColourUnscanned.b = 229
hud.boxColourtarget.r = 255
hud.boxColourtarget.g = 0
hud.boxColourtarget.b = 0
hud.boxColourFriendly.r = 255//137
hud.boxColourFriendly.g = 255//180
hud.boxColourFriendly.b = 255//45
hud.scanningColour.r = 255
hud.scanningColour.g = 40
hud.scanningColour.b = 0
HUD.fMaxChopperSpeed = 40.0
HUD.chopperPanFactor = HUD_PAN_FACTOR_DEFAULT
HUD.ChopperZoomFactor = 20 //4.35
HUD.fFov = 28.0
IF IS_PLAYER_IN_CREATOR_AIRCRAFT(PLAYER_ID())
OR IS_PLAYER_IN_ARMORY_AIRCRAFT(PLAYER_ID())
HUD.fFov = 40
ENDIF
HUD.fLineAInset = 0.234
HUD.colR = 22
HUD.colG = 201
HUD.colB = 39
HUD.colA = 181
HUD.fBoxSize = 0.044
HUD.fTextY = 0.02
HUD.fSightRangeMultiplier = 1240.0
HUD.fSightRangeMultiplier2 = 5000.0
HUD.fRangeMultiplier = 1000.0
HUD.hudBarY = 0.829
HUD.hudReticuleSize = 0.096
HUD.hudHorizY = 0.865
HUD.hudHorizWidth = 0.567
HUD.hudHorizHeight = 0.087
HUD.fTargetHeight = 140.0
HUD.fChopperVerticalSpeed = 1.0
HUD.fChopperVerticlAccel = 3.0
HUD.fMaxVertSpeedFactor = 1.0
HUD.elementWidth = 0.052
HUD.elementHeight = 0.75
HUD.elementArrowX = 0.86
HUD.elementArrowSize =0.02
HUD.fTextRangeScale = 0.65
HUD.textSpace = 0.024
HUD.fMinFindPedOnScreenRange = 0.12
IF NETWORK_IS_GAME_IN_PROGRESS()
REQUEST_ADDITIONAL_TEXT("CHOPPER",OBJECT_TEXT_SLOT)
IF HAS_THIS_ADDITIONAL_TEXT_LOADED("CHOPPER",OBJECT_TEXT_SLOT)
RETURN TRUE
ENDIF
ELSE
REQUEST_ADDITIONAL_TEXT("CHOPPER",MINIGAME_TEXT_SLOT)
IF HAS_THIS_ADDITIONAL_TEXT_LOADED("CHOPPER",MINIGAME_TEXT_SLOT)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC FLOAT GET_HUD_HEADING_FROM_COORDS(vector oldCoords,vector newCoords, bool invert=FALSE)
float heading
float dX = newCoords.x - oldCoords.x
float dY = newCoords.y - oldCoords.y
if dY != 0
heading = ATAN2(dX,dY)
ELSE
if dX < 0
heading = -90
ELSE
heading = 90
ENDIF
ENDIF
//flip because for some odd reason the coders think west is a heading of 90 degrees, so this'll match the output of commands such as GET_ENTITY_HEADING()
IF invert = TRUE
heading *= -1.0
//below not necessary but helps for debugging
IF heading < 0
heading += 360.0
ENDIF
ENDIF
RETURN heading
ENDFUNC
FUNC BOOL IS_HELIHUD_ACTIVE(structHelicopterHUDVars &HUD)
IF HUD.bHUDIsActive = TRUE
return TRUE
ENDIF
RETURN FALSE
ENDFUNC
func bool getHUDBoxColour(structHelicopterHUDVars &HUD,int pedRelType, int &r, int &g, int&b)
SWITCH pedRelType
CASE 0 //unscanned
r = hud.boxColourUnscanned.r
g = hud.boxColourUnscanned.g
b = hud.boxColourUnscanned.b
return TRUE
BREAK
CASE 1
r = 255
g = 255
b = 0
return TRUE
BREAK
CASE 2
r = hud.boxColourtarget.r
g = hud.boxColourtarget.g
b = hud.boxColourtarget.b
return TRUE
BREAK
CASE 3
r = hud.boxColourFriendly.r //40
g = hud.boxColourFriendly.g //253
b = hud.boxColourFriendly.b //40
return TRUE
BREAK
ENDSWITCH
return FALSE
ENDFUNC
PROC SET_INFRARED(bool bOnOff, bool dontResetChopperCam=FALSE)
if bOnOff = TRUE
IF NOT dontResetChopperCam
CLEAR_TIMECYCLE_MODIFIER()
cprintln(debug_trevor3,"CLEAR modifier infrared")
ENDIF
SET_SEETHROUGH(TRUE)
//SEETHROUGH_SET_MAX_THICKNESS(80)
//SEETHROUGH_SET_FADE_STARTDISTANCE(st_2)
//SEETHROUGH_SET_FADE_ENDDISTANCE(st_3)
//SEETHROUGH_SET_HIGHLIGHT_NOISE(st_4)
//SEETHROUGH_SET_HILIGHT_INTENSITY(st_5)
else
SET_SEETHROUGH(FALSE)
IF NOT dontResetChopperCam
SET_TIMECYCLE_MODIFIER("eyeinthesky")
cprintln(debug_trevor3,"Set modifier infrared")
ENDIF
ENDIF
ENDPROC
proc set_chopper_to_autopilot(structHelicopterHUDVars &HUD,VEHICLE_INDEX vehChopper,bool setAutopilotOn)
if IS_VEHICLE_DRIVEABLE(vehChopper)
hud.vehChopper = vehChopper
if setAutopilotOn
HUD.bMoveChopper = TRUE
hud.chopperHeading = GET_ENTITY_HEADING(vehChopper)
ELSE
HUD.bMoveChopper = FALSE
ENDIF
ENDIF
ENDPROC
proc set_chopper_speed_limits(structHelicopterHUDVars &HUD, float minSpeed = 0.0, float maxSpeed=40.0)
hud.fMaxChopperSpeed = maxSpeed
hud.fminChopperSpeed = minSpeed
ENDPROC
#if ENABLE_ENHANCED_HUD_FEATURES
PROC ADD_HUD_VIEW_SPHERE_BLOCKING(structHelicopterHUDVars &HUD,int iIndex,vector vLoc,float fRadius)
hud.bSphereBlockersActive = TRUE
hud.sphereBlocker[iIndex].inUse = TRUE
hud.sphereBlocker[iIndex].vLoc = vLoc
hud.sphereBlocker[iIndex].frad = fRadius
ENDPROC
FUNC BOOL IS_VIEW_BLOCKED_BY_SPHERES(structHelicopterHUDVars &HUD, ped_index pedToView)
int iR
IF hud.bSphereBlockersActive = TRUE
IF DOES_ENTITY_EXIST(HUD.camEntity)
REPEAT COUNT_OF(hud.sphereBlocker) iR
IF DOES_LINE_SPHERE_INTERSECT(GET_ENTITY_COORDS(HUD.camEntity),GET_ENTITY_COORDS(pedToView),hud.sphereBlocker[iR].vLoc,hud.sphereBlocker[iR].frad)
RETURN TRUE
ENDIF
ENDREPEAT
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
PROC SET_TEXT_FOR_HUD(int r,int g,int b, float fScale, bool shadow=FALSE)
// float fFontScale=0.319
SET_TEXT_SCALE(fScale,fScale)
SET_TEXT_COLOUR(r,g,b,150)
IF shadow
SET_TEXT_DROPSHADOW(5,0,0,0,255)
ENDIF
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STANDARD)
ENDPROC
#if ENABLE_ENHANCED_HUD_FEATURES
func int FIND_HUD_MESSAGE_ENTRY(structHelicopterHUDVars &HUD,int thisEntry)
int i
REPEAT COUNT_OF(HUD.message) i
if HUD.message[i].messageID = thisEntry
if HUD.message[i].active = true
return i
ENDIF
ENDIF
ENDREPEAT
return -1
ENDFUNC
func int ADD_HUD_MESSAGE(structHelicopterHUDVars &HUD,STRING textLabel, float x, float y, float size, int thisSpeed, int pauseBeforePrinting = 0, int pauseOnCompletion=-1, bool deleteOnCompletion=FALSE, int waitUntilThisMessageCompleted=-1,int deletePreviousMessages=-1)
int i
bool bEntryFound
textLabel=textLabel
while bEntryFound = FALSE
if HUD.message[i].active = FALSE
HUD.message[i].messageID = HUD.messageCounter
/*
#IF __ALLOW_CALLS_TO_LITERAL_STRING_COMMANDS
HUD.message[i].HelicopterHudLabel = GET_STRING_FROM_TEXT_FILE(textLabel)
#ENDIF
HUD.message[i].HelicopterHudTextlabel = textLabel
*/
HUD.message[i].charsDisplayed = 0
HUD.message[i].fx = x
HUD.message[i].fy = y
HUD.message[i].size = size
HUD.message[i].nextCharTime = 0
// HUD.message[i].labelLength = GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(textLabel)
HUD.message[i].textSpeed = thisSpeed
HUD.message[i].pauseBeforePrinting = pauseBeforePrinting
HUD.message[i].pauseOnCompletion = pauseOnCompletion
HUD.message[i].waitForMessage = waitUntilThisMessageCompleted
HUD.message[i].deleteOnCompletion = deleteOnCompletion
HUD.message[i].deletePreviousMessages = deletePreviousMessages
HUD.message[i].g=255
HUD.message[i].active = TRUE
HUD.message[i].messagePrinting = FALSE
HUD.message[i].completed = FALSE
HUD.messageCounter++
if HUD.message[i].waitForMessage = -1
HUD.message[i].pauseBeforePrinting += TIMERA()
ENDIF
return HUD.messageCounter-1
ENDIF
i++
if i = MAX_MESSAGES
SCRIPT_ASSERT("Helihud message array overrun. Increase MAX_MESSAGES const.")
return -1
ENDIF
ENDWHILE
return -1
ENDFUNC
/*
func int ADD_HUD_MESSAGE_WITH_NUMBER(structHelicopterHUDVars &HUD,STRING textLabel, int number, float x, float y, float size, int thisSpeed, int pauseBeforePrinting = 0, int pauseOnCompletion=-1, bool deleteOnCompletion=FALSE, int waitUntilThisMessageCompleted=-1,int deletePreviousMessages=-1)
int thisMes = ADD_HUD_MESSAGE(HUD,textLabel,x,y,size,thisSpeed,pauseBeforePrinting,pauseOnCompletion,deleteOnCompletion,waitUntilThisMessageCompleted,deletePreviousMessages)
int iEntry = FIND_HUD_MESSAGE_ENTRY(HUD,thisMes)
HUD.message[iEntry].HelicopterHudLabel += number
return thisMes
ENDFUNC
*/
func bool IS_HUD_MESSAGE_DISPLAYING(structHelicopterHUDVars &HUD,int iEntry)
int iMes = FIND_HUD_MESSAGE_ENTRY(HUD,iEntry)
if iMes != -1
if HUD.message[iMes].charsDisplayed > 0
return TRUE
ENDIF
ENDIF
return FALSE
ENDFUNC
func bool REMOVE_HUD_MESSAGE(structHelicopterHUDVars &HUD,int messageID)
int iMes = FIND_HUD_MESSAGE_ENTRY(HUD,messageID)
if iMes != -1
HUD.message[iMes].active = FALSE
ENDIF
return TRUE
ENDFUNC
PROC RELEASE_ALL_HUD_MESSAGES(structHelicopterHUDVars &HUD)
int i
repeat COUNT_OF(HUD.message) i
HUD.message[i].active = FALSE
ENDrepeat
ENDPROC
PROC SET_HUD_MESSAGE_COLOUR(structHelicopterHUDVars &HUD,int iEntry,int r,int g,int b)
int iMes = FIND_HUD_MESSAGE_ENTRY(HUD,iEntry)
HUD.message[iMes].r = r
HUD.message[iMes].g = g
HUD.message[iMes].b = b
ENDPROC
/*
PROC DISPLAY_HUD_MESSAGES(structHelicopterHUDVars &HUD)
int i
TEXT_LABEL_63 hudMessage
if resetTime = TRUE
resetTime = FALSE
i=0
HUD.message[i].charsDisplayed = 0
HUD.message[i+1].charsDisplayed = 0
HUD.currentMessage = 0
ENDIF
bool bTemp
for i = 0 to MAX_MESSAGES-1
if HUD.message[i].active = TRUE
if HUD.message[i].messagePrinting = FALSE
if HUD.message[i].waitForMessage != -1
int iPrevMes = FIND_HUD_MESSAGE_ENTRY(HUD,HUD.message[i].waitForMessage)
bTemp = false
if iPrevMes = -1
bTemp = true
endif
if iPrevMes != -1
if HUD.message[iPrevMes].completed = true
bTemp = TRUE
ENDIF
endif
if bTemp = TRUE
if HUD.message[i].pauseBeforePrinting > 0
HUD.message[i].pauseBeforePrinting += TIMERA()
HUD.message[i].waitForMessage = -1
ELSE
HUD.message[i].messagePrinting = TRUE
ENDIF
ENDIF
ELSE
if TIMERA() > HUD.message[i].pauseBeforePrinting
HUD.message[i].messagePrinting = TRUE
ENDIF
ENDIF
ENDIF
if HUD.message[i].messagePrinting = TRUE
SET_TEXT_FOR_HUD(HUD.message[i].r,HUD.message[i].g,HUD.message[i].b,HUD.message[i].size)
if HUD.message[i].charsDisplayed = 0
HUD.message[i].nextCharTime = TIMERA()-1
ENDIF
if HUD.message[i].charsDisplayed < HUD.message[i].labelLength
if TIMERA() > HUD.message[i].nextCharTime
HUD.message[i].nextCharTime += HUD.message[i].textSpeed
HUD.message[i].charsDisplayed++
ENDIF
hudMessage = GET_FIRST_N_CHARACTERS_OF_LITERAL_STRING(HUD.message[i].label,HUD.message[i].charsDisplayed)
#IF IS_DEBUG_BUILD
DISPLAY_TEXT_WITH_LITERAL_STRING(HUD.message[i].fx,HUD.message[i].fy,"STRING",hudMessage)
#ENDIF
if HUD.message[i].charsDisplayed = HUD.message[i].labelLength
if HUD.message[i].pauseOnCompletion != -1
HUD.message[i].pauseOnCompletion += TIMERA()
ELSE
HUD.message[i].completed = TRUE
if HUD.message[i].deletePreviousMessages != -1
REMOVE_HUD_MESSAGE(HUD,HUD.message[i].deletePreviousMessages)
ENDIF
if HUD.message[i].deleteOnCompletion = TRUE
REMOVE_HUD_MESSAGE(HUD,HUD.message[i].messageID)
endif
ENDIF
ENDIF
ELSE
hudMessage = HUD.message[i].label
#IF IS_DEBUG_BUILD
DISPLAY_TEXT_WITH_LITERAL_STRING(HUD.message[i].fx,HUD.message[i].fy,"STRING",hudMessage)
#ENDIF
if HUD.message[i].pauseOnCompletion != -1
if TIMERA()>HUD.message[i].pauseOnCompletion
HUD.message[i].completed = TRUE
if HUD.message[i].deletePreviousMessages != -1
REMOVE_HUD_MESSAGE(HUD,HUD.message[i].deletePreviousMessages)
ENDIF
if HUD.message[i].deleteOnCompletion = TRUE
REMOVE_HUD_MESSAGE(HUD,HUD.message[i].messageID)
endif
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
*/
#ENDIF
#IF IS_DEBUG_BUILD
int iDebugScanPed
bool bHighlight, bshowlist
//bool bpedBit[10]
//bool bForceScan
//bool bWidgetMade
PROC setUpWidgets(structHelicopterHUDVars &HUD, WIDGET_GROUP_ID thisParentWidget)
if not DOES_WIDGET_GROUP_EXIST(HUD.CopChopperWidget)
// bWidgetMade = true
IF DOES_WIDGET_GROUP_EXIST(thisParentWidget)
SET_CURRENT_WIDGET_GROUP(thisParentWidget)
HUD.CopChopperWidget = START_WIDGET_GROUP("Cop Chopper Widget")
#if ENABLE_ENHANCED_HUD_FEATURES
ADD_WIDGET_BOOL("Show heli data",HUD.bShowData)
ADD_WIDGET_BOOL("HUD.bHoverInArea",HUD.bHoverInArea)
ADD_WIDGET_FLOAT_READ_ONLY("field of view",HUD.ffov)
ADD_WIDGET_FLOAT_READ_ONLY("max speed",HUD.fMaxChopperSpeed)
ADD_WIDGET_VECTOR_SLIDER("HUD.vHoverCenter",HUD.vHoverCenter,-8000.0,8000.0,1.0)
ADD_WIDGET_VECTOR_SLIDER("hud.vHoverPoint",hud.vHoverPoint,-8000.0,8000.0,1.0)
ADD_WIDGET_INT_SLIDER("Red",hud.boxColourFriendly.r,0,255,1)
ADD_WIDGET_INT_SLIDER("Green",hud.boxColourFriendly.g,0,255,1)
ADD_WIDGET_INT_SLIDER("Blue",hud.boxColourFriendly.b,0,255,1)
ADD_WIDGET_FLOAT_SLIDER("Z speed",zSpeed,-20.0,20.0,0.01)
ADD_WIDGET_FLOAT_SLIDER("Near Clip",HUD.nearClip,0,20.0,0.01)
ADD_WIDGET_FLOAT_SLIDER("maxNearClip",HUD.maxNearClip,0,20.0,0.01)
ADD_WIDGET_FLOAT_SLIDER("up ang LOW",HUD.angUPLow,0,3,0.01)
ADD_WIDGET_FLOAT_SLIDER("up ang High",HUD.angUpHigh,0,3,0.01)
ADD_WIDGET_FLOAT_SLIDER("down ang LOW",HUD.angDownLow,0,3,0.01)
ADD_WIDGET_FLOAT_SLIDER("down ang High",HUD.angDownHigh,0,3,0.01)
ADD_WIDGET_FLOAT_SLIDER("ang range up",HUD.AngHigh,-90,0,0.01)
ADD_WIDGET_FLOAT_SLIDER("ang range down",HUD.angLow,-90,0,0.01)
#ENDIF
//ADD_WIDGET_BOOL("show ped scan list",bshowlist)
//ADD_WIDGET_INT_READ_ONLY("No of remembered peds",HUD.iCurrentPedScanCount)
//ADD_WIDGET_INT_SLIDER("Select ped in scan group",iDebugScanPed,0,MAX_SCANNABLE_PEDS-1,1)
//ADD_WIDGET_BOOL("Highlight selected ped",bHighlight)
/*
START_WIDGET_GROUP("Scan ped data")
wPedTextData = ADD_TEXT_WIDGET("Ped Type")
//ADD_WIDGET_STRING(sPedType)
ADD_WIDGET_BOOL("Ped scanned",bpedBit[0])
ADD_WIDGET_BOOL("bShowOffScreenArrow",bpedBit[1])
ADD_WIDGET_BOOL("bAlwaysShow",bpedBit[2])
ADD_WIDGET_BOOL("bAlwaysShowOnceScanned",bpedBit[3])
ADD_WIDGET_BOOL("dataHeld",bpedBit[4])
ADD_WIDGET_BOOL("enhancedData",bpedBit[5])
ADD_WIDGET_BOOL("is criminal",bpedBit[6])
ADD_WIDGET_BOOL("bSelected",bpedBit[7])
ADD_WIDGET_BOOL("scan ped now",bForceScan)
STOP_WIDGET_GROUP()
*/
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(thisParentWidget)
ENDIF
ELSE
ENDIF
ENDPROC
proc debugChopper(structHelicopterHUDVars &HUD)
if DOES_WIDGET_GROUP_EXIST(HUD.CopChopperWidget) //or bWidgetMade = true
/*
if HUD.pedScanList[iDebugScanPed].relType = HUD_FRIEND
sPedType = "Ped type: HUD_FRIEND"
ELSE
if HUD.pedScanList[iDebugScanPed].relType = HUD_BYSTANDER
sPedType = "Ped type: HUD_BYSTANDER"
ELSE
if HUD.pedScanList[iDebugScanPed].relType = HUD_FOE
sPedType = "Ped type: HUD_FOE"
ELSE
if HUD.pedScanList[iDebugScanPed].relType = HUD_UNKNOWN
sPedType = "Ped type: HUD_UNKNOWN"
ENDIF
ENDIF
ENDIF
ENDIF
SET_CONTENTS_OF_TEXT_WIDGET(wPedTextData,sPedType)
for i = 0 to 9
if IS_BIT_SET(HUD.pedScanList[iDebugScanPed].BITPedData,i)
// bpedBit[i] = true
ELSE
// bpedBit[i] = FALSE
ENDIF
ENDFOR
*/
if bHighlight = TRUE
if not IS_ENTITY_DEAD(HUD.pedScanList[iDebugScanPed].pedID)
DRAW_MARKER(MARKER_CYLINDER, GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[iDebugScanPed].pedID,0), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, <<3, 3, 3>>, 255, 0, 128, 178)
DRAW_DEBUG_CROSS(GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[iDebugScanPed].pedID,0),0.1)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC bool save_debug(structHelicopterHUDVars &HUD, string toPrint, int iEntry=-1, float fEntry=-1.0, bool bEntry=FALSE)
if HUD.bSaveDebug = TRUE
SAVE_STRING_TO_DEBUG_FILE(toPrint)
SAVE_STRING_TO_DEBUG_FILE(" ")
if iEntry != -1
SAVE_INT_TO_DEBUG_FILE(iEntry)
ELSE
if fEntry != -1.0
SAVE_float_TO_DEBUG_FILE(fEntry)
ELSE
if bEntry = FALSE
SAVE_STRING_TO_DEBUG_FILE("FALSE")
ELSE
SAVE_STRING_TO_DEBUG_FILE("TRUE")
ENDIF
ENDIF
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDIF
RETURN TRUE
ENDFUNC
#ENDIF
proc controlAudio(structHelicopterHUDVars &HUD)
IF HUD.bAudioLoaded = FALSE
IF REQUEST_AMBIENT_AUDIO_BANK("SCRIPT\\POLICE_CHOPPER_CAM")
HUD.bAudioLoaded = TRUE
HUD.soundID_zoom = GET_SOUND_ID()
HUD.soundID_turn = GET_SOUND_ID()
HUD.soundID_background = GET_SOUND_ID()
HUD.soundID_scan = GET_SOUND_ID()
HUD.soundID_scanloop = GET_SOUND_ID()
HUD.soundID_scangood = GET_SOUND_ID()
HUD.soundID_scanbad = GET_SOUND_ID()
HUD.soundID_scanRange = GET_SOUND_ID()
ENDIF
ENDIF
ENDPROC
/*
FUNC BOOL ACTIVATE_CHOPPER_HUD(structHelicopterHUDVars &HUD, VEHICLE_INDEX vChopper)
vector vCoords
if not IS_ENTITY_DEAD(vChopper)
if not IS_ENTITY_DEAD(PLAYER_PED_ID())
HUD.bMoveChopper = TRUE
HUD.bActivateChopperCam = TRUE
HUD.bDisplayHUD = TRUE
HUD.camEntity = vChopper
vCoords = GET_ENTITY_COORDS(vChopper)
HUD.fChopperHeight = vCoords.z
SET_PLAYER_CONTROL(PLAYER_ID(),FALSE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(),vChopper)
return TRUE
ENDIF
ENDIF
SCRIPT_ASSERT("ACTIVATE_CHOPPER_HUD: Vehicle doesn't exist.")
return FALSE
ENDFUNC
*/
proc GET_HUD_COORD(structHelicopterHUDVars &HUD)
if DOES_CAM_EXIST(hud.camChopper) and HUD.mpCamFudge = FALSE and HUD.bIsCamAttached
#IF USE_TU_CHANGES
and not HUD.isMultiplayerMode
#ENDIF
//if HUD.fStickPitch != 0 or HUD.fStickYaw != 0 or IS_VECTOR_ZERO(hud.vAimAt)
vector vTempCoord,vRot,vTargetCoord
float fx,fy,fLength
int iPoint = 2
iPoint=iPoint
vTempCoord = GET_CAM_COORD(hud.camChopper)//GET_RENDERING_CAM())
vRot = GET_CAM_ROT(hud.camChopper)
//if groundHeight = 0
//GET_GROUND_Z_FOR_3D_COORD(vTempCoord,fz)
//GET_CLOSEST_VEHICLE_NODE(vTempCoord,vReturnedCoord)
//first check if player is aiming at a scan ped
int j
vector vPedPos
float foundHeight=0.0
bool hitFound=FALSE
bool foundPedHeight=FALSE
foundPedHeight=foundPedHeight
float heightOnLine = vTempCoord.z
heightOnLine=heightOnLine
IF hitFound = FALSE
float heightFromPoint=0
float fSegLength
// int FoundLengthSeg
//float fHeightDiff =999999.0
fSegLength = cos(vRot.x) * 50.0
#if ENABLE_ENHANCED_HUD_FEATURES
SET_CAM_NEAR_CLIP(hud.camChopper,HUD.nearClip)
IF HUD.bShowData
/*
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
vector vLookAt
float horizDist = absf(cos(vRot.x)) * 1000.0
vLookAt.x = (SIN(vRot.z) * horizDist) *-1.0
vLookAt.y = COS(vRot.z) * horizDist
vLookAt.z = SIN(vRot.x) * 1000.0
vLookAt += vTempCoord
vLookAt=vLookAt
DRAW_DEBUG_LINE(vTempCoord,vLookAt,255,0,0)
*/
//cprintln(debug_Trevor3,HUD.ffov)
endif
#endif
while ipoint<21
iPoint++
fLength = fSegLength * ipoint
fx = (SIN(vRot.z) * fLength) *-1.0
fy = COS(vRot.z) * fLength
heightfromPoint = GET_APPROX_HEIGHT_FOR_AREA(vTempCoord.x+fx-3.0,vTempCoord.y+fy-3.0,vTempCoord.x+fx+3.0,vTempCoord.y+fy+3.0)
heightfromPoint -= 20.0
heightOnLine = vTempCoord.z + (sin(vRot.x) * (50.0 * ipoint))
#if ENABLE_ENHANCED_HUD_FEATURES
IF HUD.bShowData
/*
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_BOX(<<vTempCoord.x+fx-3.0,vTempCoord.y+fy-3.0,vTempCoord.z-2.0>>,<<vTempCoord.x+fx+3.0,vTempCoord.y+fy+3.0,vTempCoord.z+2.0>>)
DRAW_DEBUG_BOX(<<vTempCoord.x+fx-3.0,vTempCoord.y+fy-3.0,heightOnLine-2.0>>,<<vTempCoord.x+fx+3.0,vTempCoord.y+fy+3.0,heightOnLine+2.0>>,255,0,0)
DRAW_DEBUG_LINE(<<vTempCoord.x+fx,vTempCoord.y+fy,vTempCoord.z>>,<<vTempCoord.x+fx,vTempCoord.y+fy,heightfromPoint>>)
*/
ENDIF
#endif
if heightfromPoint > heightOnLine
if hitFound = FALSE
hitFound = TRUE
foundHeight = heightfromPoint
ipoint = 21
// FoundLengthSeg = ipoint
//fHeightDiff = heightfromPoint - heightOnLine
ELSE
/*
if heightfromPoint - heightOnLine < fHeightDiff
foundHeight = heightfromPoint
// FoundLengthSeg = ipoint
fHeightDiff = heightfromPoint - heightOnLine
ENDIF
*/
ENDIF
// ELSE
// hitFound = FALSE
ENDIF
ENDWHILE
endif
// hitFound = FALSE
float fCheckHeight
if hitFound = FALSE
float fGroundHeight
IF GET_GROUND_Z_FOR_3D_COORD(vTempCoord,fGroundHeight)
fCheckHeight = vTempCoord.z - fGroundHeight
IF fCheckHeight < 150
fCheckHeight = 150
ENDIF
ELSE
fCheckHeight = 150
ENDIF
IF vRot.x < 0
fLength = ABSF(fCheckHeight / TAN(vRot.X))
// fx = (SIN(vRot.z) * fLength) *-1.0
// fy = COS(vRot.z) * fLength
foundHeight = vTempCoord.z - fCheckHeight
ELSE //cam is looking up
fLength = 1000.0
// fx = (SIN(vRot.z) * fLength) *-1.0
// fy = COS(vRot.z) * fLength
foundHeight = vTempCoord.z + (fLength * TAN(vRot.X))
ENDIF
//extract hit point from cam angle, presuming the chopper to be 150 above ground
ELSE
/*
if vTempCoord.z-foundHeight < 60.0
//prevent found height being too close to chopper camera
foundHeight=vTempCoord.z-60.0
ELSE
IF NOT foundPedHeight
foundHeight -= 10.0
ENDIF
ENDIF
if vRot.x = 0.0
flength = 1000.0
ELSE
flength = absf((vTempCoord.z-foundHeight)/tan(vRot.x))
ENDIF*/
//CPRINTLN(DEBUG_TREVOR3,"pASS")
ENDIF
fx = (SIN(vRot.z) * fLength) *-1.0
fy = COS(vRot.z) * fLength
vTargetCoord = <<fx+vTempCoord.x,fy+vTempCoord.y,foundHeight>>
repeat count_of(Hud.pedScanList) j
If NOT IS_PED_INJURED(Hud.pedScanList[j].pedID)
IF is_point_in_screeen_area(GET_ENTITY_COORDS(Hud.pedScanList[j].pedID),0.4,0.4,0.6,0.6)
hitFound = TRUE
foundPedHeight=TRUE
vTargetCoord = GET_ENTITY_COORDS(Hud.pedScanList[j].pedID)
foundHeight = vPedPos.z
endif
endif
ENDREPEAT
//showFloatOnScreen(0.1,0.1,vTargetCoord.x)
// showFloatOnScreen(0.17,0.1,vTargetCoord.y)
// showFloatOnScreen(0.24,0.1,vTargetCoord.z)
HUD.vAimAt = vTargetCoord
//RETURN vTargetCoord
// ENDIF
ENDIF
#if ENABLE_ENHANCED_HUD_FEATURES
IF HUD.bShowData
/*
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_SPHERE(HUD.vAimAt,4.0)
//PRINTLN(HUD.vAimAt)
//PRINTLN("Chopper : ",vTempCoord.z," gound : ",vTargetCoord.z," above ground : ",fCheckHeight)
*/
ENDIF
#endif
//RETURN <<0,0,0>>
ENDPROC
/*
//INFO:
//PARAM NOTES:
//PURPOSE: Gets the coords of a point on the ground projected from the rendering camera.
proc GET_HUD_COORD(structHelicopterHUDVars &HUD)
float zOff
//CAMERA_INDEX cam
if DOES_CAM_EXIST(HUD.camChopper) //GET_RENDERING_CAM())
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(true)
//cam = GET_RENDERING_CAM()
int iHit
bool doShapeState
vector vFound
float fHeight, fZ
vector vRot, vTempCoord, vTargetCoord, vReturnedCoord
switch GET_SHAPE_TEST_LOS_PROBE_RESULT(hUD.shptest, iHit, vFound)
case SHAPETEST_STATUS_RESULTS_READY
if iHit != 0
HUD.vAimAt=vFound
//vStoreHit = vFound
ELSE
ENDIF
doShapeState=true
BREAK
case SHAPETEST_STATUS_NONEXISTENT
doShapeState=true
BREAK
case SHAPETEST_STATUS_RESULTS_NOTREADY
doShapeState=FALSE
break
ENDSWITCH
if doShapeState = true
vTempCoord = GET_CAM_COORD(HUD.camChopper) + <<0,0,-0.5>>//GET_RENDERING_CAM())
vRot = GET_CAM_ROT(HUD.camChopper)
zOff = 400.0 * sin(vRot.x)
float fDist = 400.0 * cos(vRot.x)
float xOff = SIN(vRot.z) * fDist
float yOff = COS(vRot.z) * fDist
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(true)
//DRAW_DEBUG_LINE(vTempCoord,vTempCoord+<<-xOff,yOff,zOff>>)
hUD.shptest = START_SHAPE_TEST_LOS_PROBE(vTempCoord,vTempCoord+<<-xOff,yOff,zOff>>)
ENDIF
vTempCoord = GET_CAM_COORD(HUD.camChopper)//GET_RENDERING_CAM())
fz = HUD.vAimAt.z
fHeight = vTempCoord.z - fZ
vRot = GET_CAM_ROT(HUD.camChopper)//cam)
float fDist = fHeight / ABSF(TAN(vRot.x))
float xOff = SIN(vRot.z) * fDist
float yOff = COS(vRot.z) * fDist
vTargetCoord = <<vTempCoord.x-xOff,vTempCoord.y+yOff,fZ>>
//float fSphereRadius = GET_DISTANCE_BETWEEN_COORDS(vGroundLoc,GET_CAM_COORD(HUD.camChopper))//150.0 //distance to point on ground
// HUD.vTargetedGround.x = (COS(HUD.vCamRot .x) * fSphereRadius) * sin(-HUD.vCamRot .z)
// HUD.vTargetedGround.y = (COS(HUD.vCamRot .x) * fSphereRadius) * cos(-HUD.vCamRot .z)
// HUD.vTargetedGround.z = (sin(HUD.vCamRot .x) * fSphereRadius)
// HUD.vTargetedGround += GET_CAM_COORD(HUD.camChopper)
HUD.vAimAt = vTargetCoord
// DRAW_DEBUG_BOX(HUD.vAimAt-<<5.0,5.0,5.0>>,HUD.vAimAt+<<5.0,5.0,5.0>>)
// DRAW_DEBUG_BOX(vStoreHit-<<5.0,5.0,5.0>>,vStoreHit+<<5.0,5.0,5.0>>,255,0,0,255)
ENDIF
ENDPROC
*/
#IF IS_DEBUG_BUILD
proc debugShowScanList(structHelicopterHUDVars &HUD)
int i
repeat COUNT_OF(HUD.pedScanList) i
showIntOnScreen(0.1,0.1+(i*0.04),NATIVE_TO_INT(HUD.pedScanList[i].pedID))
ENDREPEAT
ENDPROC
#ENDIF
proc REMOVE_PED_FROM_SCAN_LIST(structHelicopterHUDVars &HUD,PED_INDEX pedID)
//find ped in scan list
int i
bool bEntryFound = FALSE
IF pedID != null
repeat COUNT_OF(HUD.pedScanList) i
if HUD.pedScanList[i].pedID = pedID
#if ENABLE_ENHANCED_HUD_FEATURES
IF HUD.pedScanList[i].iSpecialNameCase != -1
HUD.specialNames[HUD.pedScanList[i].iSpecialNameCase] = ""
endif
HUD.pedScanList[i].iSpecialNameCase = -1
#endif
bEntryFound = TRUE
ENDIF
if bEntryFound = TRUE
if i<COUNT_OF(HUD.pedScanList)-1
HUD.pedScanList[i] = HUD.pedScanList[i+1]
ELSE
HUD.pedScanList[i].lastSeenTime = 0
HUD.pedScanList[i].pedID = NULL
HUD.pedScanList[i].lastSeenTime = 0
HUD.pedScanList[i].fScanTime = 0
HUD.pedScanList[i].BITnamesAndCrimes = 0
HUD.pedScanList[i].BITPedData = 0
CLEAR_BIT(HUD.pedScanList[i].BITPedData,0) //scanned = false
CLEAR_BIT(HUD.pedScanList[i].BITPedData,1) //bShowOffScreenArrow = FALSE
CLEAR_BIT(HUD.pedScanList[i].BITPedData,2) //bAlwaysShow = false
CLEAR_BIT(HUD.pedScanList[i].BITPedData,3) //bAlwaysShowOnceScanned = FALSE
CLEAR_BIT(HUD.pedScanList[i].BITPedData,4) //dataHeld = false
CLEAR_BIT(HUD.pedScanList[i].BITPedData,5) //enhancedData = false
CLEAR_BIT(HUD.pedScanList[i].BITPedData,6) //is criminal = false
CLEAR_BIT(HUD.pedScanList[i].BITPedData,7) //bSelected = FALSE
CLEAR_BIT(HUD.pedScanList[i].BITPedData,8) //is multiplayer ped
CLEAR_BIT(HUD.pedScanList[i].BITPedData,9) //offscreen arrow
#if ENABLE_ENHANCED_HUD_FEATURES
HUD.pedScanList[i].iSpecialNameCase = -1
#endif
ENDIF
ENDIF
ENDREPEAT
if bEntryFound = TRUE
HUD.iCurrentPedScanCount--
ENDIF
endif
ENDPROC
proc CLEAR_SCAN_LIST(structHelicopterHUDVars &HUD)
int i
for i = 0 to HUD.iCurrentPedScanCount-1
HUD.pedScanList[i].pedID = NULL
HUD.pedScanList[i].lastSeenTime = 0
HUD.pedScanList[i].fScanTime = 0
HUD.pedScanList[i].BITnamesAndCrimes = 0
HUD.pedScanList[i].BITPedData = 0
ENDFOR
#if ENABLE_ENHANCED_HUD_FEATURES
repeat COUNT_OF(HUD.specialNames) i
HUD.specialNames[i] = ""
ENDREPEAT
#endif
HUD.iCurrentPedScanCount=0
ENDPROC
func bool HAS_PED_BEEN_SCANNED(structHelicopterHUDVars &HUD,PED_INDEX pedID)
int i
for i = 0 to HUD.iCurrentPedScanCount-1
if HUD.pedScanList[i].pedID = pedID
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,0) //scanned bit
return TRUE
ELSE
return FALSE
ENDIF
ENDIF
ENDFOR
return FALSE
ENDFUNC
func bool IS_PED_IN_SCAN_LIST(structHelicopterHUDVars &HUD,PED_INDEX pedID)
int i
REPEAT COUNT_OF(HUD.pedScanList) i
if HUD.pedScanList[i].pedID = pedID
return TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
func int GET_PED_ENTRY_IN_SCAN_LIST(structHelicopterHUDVars &HUD,PED_INDEX pedID)
int i
REPEAT COUNT_OF(HUD.pedScanList) i
if HUD.pedScanList[i].pedID = pedID
return i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
PROC EMPTY_SCAN_LIST(structHelicopterHUDVars &HUD)
HUD.iCurrentPedScanCount = 0
ENDPROC
FUNC BOOL ADD_PED_TO_SCAN_LIST(structHelicopterHUDVars &HUD,PED_INDEX pedID, bool bShowAdvancedData, int HUDtype=HUD_BYSTANDER, bool scanned=FALSE, bool AlwaysShow=FALSE, bool alwaysShowOnceScanned=false, bool ShowOffScreenArrow=FALSE, bool isMultiplayerPed=FALSE)
//int i, crimeCount, crime
//int rememberCrimesAdded[4]
//rememberCrimesAdded[0] = -1
//rememberCrimesAdded[1] = -1
//rememberCrimesAdded[2] = -1
//rememberCrimesAdded[3] = -1
//ensure ped not already in scan list
int i
REPEAT COUNT_OF(HUD.pedScanList) i
if i < MAX_SCANNABLE_PEDS
if HUD.pedScanList[i].pedID = pedID
return FALSE
ENDIF
ENDIF
ENDREPEAT
if HUD.iCurrentPedScanCount < MAX_SCANNABLE_PEDS
AND HUD.iCurrentPedScanCount >= 0
if scanned = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,0)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,0)
ENDIF
if ShowOffScreenArrow = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,1)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,1)
ENDIF
if AlwaysShow = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,2)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,2)
ENDIF
if alwaysShowOnceScanned = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,3)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,3)
ENDIF
if bShowAdvancedData = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,5)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,5)
ENDIF
if isMultiplayerPed = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,8)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,8)
ENDIF
if ShowOffScreenArrow = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,9)
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITPedData,9)
ENDIF
HUD.pedScanList[HUD.iCurrentPedScanCount].pedID = pedID
HUD.pedScanList[HUD.iCurrentPedScanCount].relType = HUDtype
HUD.pedScanList[HUD.iCurrentPedScanCount].lastSeenTime = 0
HUD.pedScanList[HUD.iCurrentPedScanCount].fScanTime = 0
//insert data about ped
// TEXT_LABEL_15 text_filename = ""
if not IS_ENTITY_DEAD(pedID)
if IS_PED_MALE(pedID)
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITnamesAndCrimes,GET_RANDOM_INT_IN_RANGE(0,7)) //first name
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITnamesAndCrimes,GET_RANDOM_INT_IN_RANGE(0,7)+16) //surname
ELSE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITnamesAndCrimes,GET_RANDOM_INT_IN_RANGE(8,15)) //first name
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITnamesAndCrimes,GET_RANDOM_INT_IN_RANGE(0,7)+16)
ENDIF
ENDIF
if HUDtype = HUD_BYSTANDER
if GET_RANDOM_INT_IN_RANGE(0,3) > 0
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,4) //dataHeld = TRUE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,6) //isCriminal = FALSE
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,4) //dataHeld = FALSE
ENDIF
ENDIF
IF HUDtype = HUD_FOE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,4) //dataHeld = TRUE
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,6) //isCriminal = TRUE
ENDIF
IF HUDtype = HUD_UNKNOWN
if GET_RANDOM_INT_IN_RANGE(0,5) < 4
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,4) //dataHeld = TRUE
if GET_RANDOM_INT_IN_RANGE(0,5) < 2
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,6) //isCriminal = TRUE
ENDIF
ELSE
CLEAR_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].bitPedData,4) //dataHeld = FALSE
ENDIF
ENDIF
if IS_BIT_SET(HUD.pedScanList[HUD.iCurrentPedScanCount].BITpedData,6) //isCriminal = TRUE
// HUD.pedScanList[HUD.iCurrentPedScanCount].status = GET_RANDOM_INT_IN_RANGE(0,3)
int crimeCount = GET_RANDOM_INT_IN_RANGE(1,4)
int crime
// float fTemp
i = 0
for i = 0 to crimeCount - 1
crime = GET_RANDOM_INT_IN_RANGE(1,7) //prevent prostitution coming up randomly
SET_BIT(HUD.pedScanList[HUD.iCurrentPedScanCount].BITnamesAndCrimes,crime+24)
ENDFOR
ENDIF
HUD.iCurrentPedScanCount++
return TRUE
ELSE
SCRIPT_ASSERT("Maximum allowed scannable peds reached (40). Ask Kev B to increase this if a problem.")
RETURN FALSE
ENDIF
ENDFUNC
proc set_ped_scan_crime(structHelicopterHUDVars &HUD, ped_index yourPed, int iCrime1, int iCrime2=-1, int iCrime3=-1, int iCrime4=-1)
int i,iThisPed
REPEAT COUNT_OF(HUD.pedScanList) i
if i < MAX_SCANNABLE_PEDS
if HUD.pedScanList[i].pedID = yourPed
iThisPed = i
i = COUNT_OF(HUD.pedScanList)
ENDIF
ENDIF
ENDREPEAT
set_bit(HUD.pedScanList[iThisPed].BITpedData,6)
SET_BIT(HUD.pedScanList[iThisPed].BITnamesAndCrimes,iCrime1+24)
IF iCrime2 != -1 SET_BIT(HUD.pedScanList[iThisPed].BITnamesAndCrimes,iCrime2+24) ENDIF
IF iCrime3 != -1 SET_BIT(HUD.pedScanList[iThisPed].BITnamesAndCrimes,iCrime3+24) ENDIF
IF iCrime4 != -1 SET_BIT(HUD.pedScanList[iThisPed].BITnamesAndCrimes,iCrime4+24) ENDIF
endproc
func bool SET_PED_IN_SCAN_LIST_AS_SCANNED(structHelicopterHUDVars &HUD, ped_index yourPed, bool hasBeenScanned=true)
int iPedEntry = GET_PED_ENTRY_IN_SCAN_LIST(HUD,yourPed)
if iPedEntry != -1
If hasBeenScanned = TRUE
SET_BIT(HUD.pedScanList[iPedEntry].BITPedData,0)
ELSE
CLEAR_BIT(HUD.pedScanList[iPedEntry].BITPedData,0)
ENDIF
return true
ELSE
return FALSE
ENDIF
ENDFUNC
#if ENABLE_ENHANCED_HUD_FEATURES
func bool ADD_SPECIAL_NAME_CASE_TO_SCAN_LIST(structHelicopterHUDVars &HUD,PED_INDEX ped,string sName, int iCrime=-1) //,string name, string crime)
int i,r,v
repeat COUNT_OF(HUD.pedScanList) i
if HUD.pedScanList[i].pedID = ped
repeat COUNT_OF(HUD.specialNames) r
if are_strings_equal(HUD.specialNames[r],"")
HUD.specialNames[r] = sName
HUD.pedScanList[i].iSpecialNameCase = r
//PRINTLN("---Trying to add crime")
if iCrime !=-1
for v = 0 to 7
CLEAR_BIT(HUD.pedScanList[i].BITnamesAndCrimes,24+v)
ENDFOR
SET_BIT(HUD.pedScanList[i].BITnamesAndCrimes,23+iCrime)
ENDIF
return true
ENDIF
ENDREPEAT
ENDIF
endrepeat
//PRINTLN("---No crime added")
return FALSE
ENDFUNC
#ENDIF
func bool IS_HUD_PED_VISIBLE(structHelicopterHUDVars &HUD,PED_INDEX pedID)
int iEntry = GET_PED_ENTRY_IN_SCAN_LIST(HUD,pedID)
if TIMERA() - HUD.pedScanList[iEntry].lastSeenTime < 500
return TRUE
ENDIF
return FALSE
ENDFUNC
/*
func bool ADD_HELIHUD_PED_NAME(structHelicopterHUDVars &HUD,int i,string pedName)
if i < MAX_SCANNABLE_PEDS
HUD.pedScanList[i].name = pedName
return TRUE
ELSE
SCRIPT_ASSERT("Helihud max scannable peds array overrun")
return FALSE
ENDIF
ENDFUNC
func bool ADD_HELIHUD_PED_CRIME(structHelicopterHUDVars &HUD,int i,string pedCrime)
if i < MAX_SCANNABLE_PEDS
HUD.pedScanList[i].isCriminal = TRUE
HUD.pedScanList[i].dataHeld = TRUE
HUD.pedScanList[i].crimes = pedCrime
return TRUE
ELSE
SCRIPT_ASSERT("Helihud max scannable peds array overrun")
return FALSE
ENDIF
ENDFUNC
*/
func bool ADD_HELIHUD_MARKER(structHelicopterHUDVars &HUD, HELIHUD_MARKER &hudMarker)
int i
if HUD.helihudMarkerCount < MAX_HELIHUD_COORD_COUNT
FOR i = 0 to MAX_HELIHUD_COORD_COUNT-1
if HUD.helihudMarker[i].entry =-1
HUD.helihudMarker[i] = hudMarker
HUD.helihudMarker[i].entry = i
HUD.helihudMarkerCount++
hudMarker.entry = i
return true
ENDIF
ENDFOR
ENDIF
SCRIPT_ASSERT("Max HUD coord markers reached (10). Need to increase MAX_HELIHUD_COORD_COUNT in helicopterhud.sch")
return FALSE
ENDFUNC
FUNC HELIHUD_MARKER ADD_HELIHUD_MARKER_FOR_COORD(structHelicopterHUDVars &HUD, vector vCoord,int r=255,int g=255, int b=0, helihud_MARKER_TYPE type = MARKER_CROSS)
HELIHUD_MARKER thisMarker
thisMarker.coord = vCoord
thisMarker.markerType = type
thisMarker.r = r
thisMarker.g = g
thisMarker.b = b
//thisMarker.blip = CREATE_BLIP_FOR_COORD(vCoord,FALSE)
ADD_HELIHUD_MARKER(HUD,thisMarker)
return thisMarker
ENDFUNC
FUNC HELIHUD_MARKER ADD_HELIHUD_MARKER_FOR_VEHICLE(structHelicopterHUDVars &HUD, vehicle_index veh,HELIHUD_MARKER_TYPE markerType, int r, int g, int b)
HELIHUD_MARKER thisMarker
thisMarker.markerType = markerType
thisMarker.veh = veh
thisMarker.r = r
thisMarker.g = g
thisMarker.b = b
//thisMarker.blip = CREATE_BLIP_FOR_VEHICLE(veh,FALSE)
ADD_HELIHUD_MARKER(HUD,thisMarker)
return thisMarker
ENDFUNC
FUNC HELIHUD_MARKER ADD_HELIHUD_MARKER_FOR_PED(structHelicopterHUDVars &HUD, PED_INDEX ped,HELIHUD_MARKER_TYPE markerType, int r, int g, int b)
HELIHUD_MARKER thisMarker
thisMarker.markerType = markerType
thisMarker.ped = ped
thisMarker.r = r
thisMarker.g = g
thisMarker.b = b
//thisMarker.blip = CREATE_BLIP_FOR_PED(ped,FALSE)
ADD_HELIHUD_MARKER(HUD,thisMarker)
return thisMarker
ENDFUNC
PROC remove_helihud_marker(structHelicopterHUDVars &HUD,HELIHUD_MARKER &markerID)
if markerID.entry >= 0 and markerID.entry < MAX_HELIHUD_COORD_COUNT
HUD.helihudMarker[markerID.entry].entry = -1
HUD.helihudMarker[markerID.entry].ped = NULL
HUD.helihudMarker[markerID.entry].veh = NULL
HUD.helihudMarker[markerID.entry].coord = <<0,0,0>>
// IF DOES_BLIP_EXIST(HUD.helihudMarker[markerID.entry].blip)
// REMOVE_BLIP(HUD.helihudMarker[markerID.entry].blip)
// ENDIF
markerID.entry =-1
HUD.helihudMarkerCount-= 1
ENDIF
ENDPROC
PROC REMOVE_ALL_HELIHUD_MARKERS(structHelicopterHUDVars &HUD)
int i = 0
repeat COUNT_OF(HUD.helihudMarker) i
HUD.helihudMarker[i].entry = -1
HUD.helihudMarker[i].ped = NULL
HUD.helihudMarker[i].veh = NULL
HUD.helihudMarker[i].coord = <<0,0,0>>
//IF DOES_BLIP_EXIST(HUD.helihudMarker[i].blip)
// REMOVE_BLIP(HUD.helihudMarker[i].blip)
//ENDIF
ENDREPEAT
HUD.helihudMarkerCount= 0
ENDPROC
//INFO:
//PARAM NOTES:
//PURPOSE: Checks if the HUD marker is within the specified range of the active rendering camera.
func bool IS_HELIHUD_MARKER_IN_RANGE(structHelicopterHUDVars &HUD, HELIHUD_MARKER &markerID, float fRangeToCheck, bool removeMarkerIfInRange)
CAMERA_INDEX thisCam
if markerID.entry != -1
thisCam = GET_RENDERING_CAM()
if DOES_CAM_EXIST(thisCam)
if GET_DISTANCE_BETWEEN_COORDS(GET_CAM_COORD(thisCam),HUD.helihudMarker[markerID.entry].coord,FALSE) < fRangeToCheck
if removeMarkerIfInRange = TRUE
HUD.helihudMarker[markerID.entry].entry = -1
markerID.entry =-1
HUD.helihudMarkerCount-= 1
ENDIF
return TRUE
ENDIf
ENDIF
ENDIF
return FALSE
ENDFUNC
PROC ReviseHudMarkers(structHelicopterHUDVars &HUD)
int i
repeat COUNT_OF(HUD.helihudMarker) i
if HUD.helihudMarker[i].entry != -1
if HUD.helihudMarker[i].veh != NULL
if not IS_ENTITY_DEAD(HUD.helihudMarker[i].veh)
HUD.helihudMarker[i].coord = GET_ENTITY_COORDS(HUD.helihudMarker[i].veh)
ENDIF
ENDIF
if HUD.helihudMarker[i].ped != NULL
if not IS_ENTITY_DEAD(HUD.helihudMarker[i].ped)
HUD.helihudMarker[i].coord = GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.helihudMarker[i].ped,0)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
#if ENABLE_ENHANCED_HUD_FEATURES
proc createHoverInArea(structHelicopterHUDVars &HUD, vector hoverCenter, float hoverRadius, float hoverHitRange = 6.0, bool avoidBuildings = true)
HUD.bHoverInArea = TRUE
if avoidBuildings = TRUE hoverCenter.z = -1.0 endif
HUD.vHoverCenter = hoverCenter
HUD.hoverHitRange = hoverHitRange
hud.vHoverPoint = <<0,0,0>>
hud.fHoverRadius = hoverRadius
ENDPROC
proc fixChopperHeading(structHelicopterHUDVars &HUD, float fHeading, BOOL fixHeading=true)
if fixHeading = true
hud.bheadingfixed = TRUE
hud.fFixedHeading = fHeading
hud.visibleHeading = hud.chopperHeading
ELSE
hud.bheadingfixed = FALSE
hud.chopperHeading = hud.visibleHeading
ENDIF
ENDPROC
func bool is_heading_fixed(structHelicopterHUDVars &HUD)
if hud.bheadingfixed = TRUE
return true
ENDIF
return FALSE
ENDFUNC
proc clearHoverInArea(structHelicopterHUDVars &HUD)
HUD.bHoverInArea = FALSE
if is_heading_fixed(hud)
fixChopperHeading(HUD,hud.chopperHeading,FALSE)
ENDIF
ENDPROC
func BOOL GET_TO_POINT(structHelicopterHUDVars &HUD,vector vCoord, float passWithinRange=5.0, float circleRadius=-1.0, int arriveInMS=-1, bool slowOnArrival=FALSE, bool overrideExisting = true)
if overrideExisting = TRUE or (overrideExisting = FALSE and HUD.bGettoPoint = FALSE)
HUD.vGetToPoint = vCoord
HUD.flightTime = arriveInMS
HUD.slowOnArrival = slowOnArrival
HUD.bGettoPoint = TRUE
HUD.circleRadius = circleRadius
if not ARE_VECTORS_EQUAL(HUD.vGetToPoint,HUD.vLastGetToPoint)
hud.rangeToTarget = 999999.0
HUD.vLastGetToPoint = HUD.vGetToPoint
ENDIF
if IS_VEHICLE_DRIVEABLE(hud.vehChopper)
float fRange= GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(hud.vehChopper),vCoord,FALSE)
if fRange < passWithinRange
return true
ENDIF
hud.rangeToTarget = fRange
ENDIF
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(true)
// DRAW_DEBUG_SPHERE(hud.vGetToPoint,passWithinRange,255,0,0,65)
ENDIF
return FALSE
ENDfunc
proc CONTROL_GET_TO_POINT(structHelicopterHUDVars &HUD)
//actual chopper speed
//actual rotate speed
//set movement acceleration
//set rotate acceleration
vector vVel,vPos
vector vTempRot
vVel=vVel
if HUD.bGettoPoint = TRUE
HUD.bGettoPoint = FALSE
if IS_VEHICLE_DRIVEABLE(HUD.vehChopper)
SET_VEHICLE_GRAVITY(HUD.vehChopper,FALSE)
SET_ENTITY_HAS_GRAVITY(HUD.vehChopper,FALSE)
// vVel = GET_ENTITY_VELOCITY(HUD.vehChopper) //GET_ENTITY_VELOCITY(HUD.vehChopper)
vector vActual
vPos = GET_ENTITY_COORDS(HUD.vehChopper)
if IS_VECTOR_ZERO(hud.lastpos)
vActual = <<0,0,0>>
ELSE
vActual = <<(vpos.x - hud.lastpos.x)/TIMESTEP(),(vpos.y - hud.lastpos.y)/TIMESTEP(),0>>
ENDIF
float gameSpeed = SQRT( (vActual.x * vActual.x) + (vActual.y * vActual.y) )
float fHeading = hud.chopperHeading * -1.0
vector vTarget
//if a circle radius has been specified for circling around a point rather than flying straight to it
if HUD.circleRadius != -1.0
float fHeadingToPoint = GET_HUD_HEADING_FROM_COORDS(vPos,HUD.vGetToPoint)
float fHeadingLeft = fHeadingToPoint + 160.0
float fHeadingRight = fHeadingToPoint - 160.0
vector vLeft = HUD.vGetToPoint + <<HUD.circleRadius*sin(fHeadingLeft),HUD.circleRadius*cos(fHeadingLeft),0>>
vector vRight = HUD.vGetToPoint + <<HUD.circleRadius*sin(fHeadingRight),HUD.circleRadius*cos(fHeadingRight),0>>
//find point which closest matches the chopper current heading
float fRotToLeft = atan((vLeft.x-vPos.x)/(vLeft.y-vPos.y))
if vLeft.y-vPos.y < 0 fRotToLeft+= 180.0 ENDIF
float fRotToRight = atan((vRight.x-vPos.x)/(vRight.y-vPos.y))
if vRight.y-vPos.y < 0 fRotToRight+= 180.0 ENDIF
fRotToLeft = fRotToLeft - fHeading
fRotToRight = fRotToRight - fHeading
fRotToLeft = WRAP(fRotToLeft,-180.0,180.0)
fRotToRight = WRAP(fRotToRight,-180.0,180.0)
if ABSF(fRotToLeft) < ABSF(fRotToRight)
vTarget = vLeft
//DRAW_DEBUG_SPHERE(vLeft,1.0,0,255,0,255)
//DRAW_DEBUG_SPHERE(vRight,1.0,255,0,0,255)
ELSE
vTarget = vRight
//DRAW_DEBUG_SPHERE(vLeft,1.0,255,0,0,255)
//DRAW_DEBUG_SPHERE(vRight,1.0,0,255,0,255)
ENDIF
ELSE
vTarget = HUD.vGetToPoint
endif
//set the rotational speed
float fRotToPoint = GET_HEADING_FROM_COORDS(vPos,vTarget,FALSE)
float fAngleBla = fRotToPoint - fHeading //GET_ANGLE_BETWEEN_2D_VECTORS(sin(chopperHeading),cos(chopperHeading),vTarget.x-vPos.x,vTarget.y-vPos.y)
IF fAngleBla < -180.0 fAngleBla += 360.0 endif
if fAngleBla > 180.0 fAngleBla -= 360.0 endif
//find target height
float actualSpeed = hud.actualspeed //SQRT( (vVel.x * vVel.x) + (vVel.y * vVel.y) )
if TIMERA() > HUD.nextGroundCheckTime
float zHeight
HUD.nextGroundCheckTime += 500
HUD.GroundHeightAccum *= 0.9
GET_GROUND_Z_FOR_3D_COORD(vpos,zHeight)
HUD.GroundHeightAccum += zHeight
ENDIF
vector vOffset = <<sin(-fHeading)* actualSpeed * -5.0,cos(-fHeading)* actualSpeed * 5.0,0.0>>
if HUD.circleRadius != -1.0 or vtarget.z = -1.0
float fHeight = GET_APPROX_HEIGHT_FOR_AREA(vpos.x+vOffset.x-(actualSpeed * 5.0),vpos.y+vOffset.y-(actualSpeed * 5.0),vpos.x+vOffset.x+(actualSpeed * 5.0),vpos.y+vOffset.y+(actualSpeed * 5.0))
float FMAXheight
if fHeight > HUD.GroundHeightAccum/10.0
FMAXHeight = fHeight
ELSE
FMAXHeight = (HUD.GroundHeightAccum/10.0) + 40.0
ENDIF
vTarget.z = FMAXHeight + 100.0
ENDIF
//setting vetical speed
/*float fRealSpeed
if not IS_VECTOR_ZERO(hud.lastpos)
fRealSpeed = (vpos.z - hud.lastpos.z) / TIMESTEP()
ELSE
fRealSpeed = 0.0
ENDIF
*/
float timeToTarget = GET_DISTANCE_BETWEEN_COORDS(vpos,vTarget)
IF timeToTarget > 6
timeToTarget = 6
ENDIF
float targetZSpeed = (vTarget.z - vPos.z) / timeToTarget
float diffToTargetspeed = targetZSpeed - HUD.actualZAcc//vVel.z
vVel.z += (diffToTargetspeed * TIMESTEP())
HUD.actualZAcc += (diffToTargetspeed * TIMESTEP())
vVel.z = HUD.actualZAcc - 0.57
/*
float targetZSpeed = (vTarget.z +1.7 - vpos.z) / 5.0
float hitTargetMultiplier = ((vTarget.z - vPos.z) / targetZSpeed) / (GET_DISTANCE_BETWEEN_COORDS(vpos,vTarget,FALSE) / gameSpeed)
//if chopper is going to miss target for being too high, apply the multiplier.
IF hitTargetMultiplier > 1.0
AND (vTarget.z - vPos.z) / targetZSpeed > 0
targetZSpeed *= hitTargetMultiplier
ENDIF
if targetZSpeed > 20.0 targetZSpeed = 20.0 ENDIF
if targetZSpeed < -20.0 targetZSpeed = -20.0 ENDIF
HUD.targetZAcc = ((targetZSpeed - fRealSpeed)*3.0)
IF HUD.actualZAcc < HUD.targetZAcc
HUD.actualZAcc += 20.0 * TIMESTEP()
IF HUD.actualZAcc > HUD.targetZAcc
HUD.actualZAcc = HUD.targetZAcc
ENDIF
ELSE
HUD.actualZAcc -= 20.0 * TIMESTEP()
IF HUD.actualZAcc < HUD.targetZAcc
HUD.actualZAcc = HUD.targetZAcc
ENDIF
ENDIF
if HUD.actualZAcc > 40.0 HUD.actualZAcc = 40.0 ENDIF
if HUD.actualZAcc < -40.0 HUD.actualZAcc = -40.0 ENDIF
vVel.z += (HUD.actualZAcc * TIMESTEP()) //targetZSpeed
*/
//set entity forward velocity
//forward velocity based on angle to heading and distance to heading
//further distance to heading means faster movement while turning
//closer to target means slower movement while turning
float fDistanceToTarget = GET_DISTANCE_BETWEEN_COORDS(vPos,vTarget,FALSE)
float fTurnMultiplierForRange = 1.0
fTurnMultiplierForRange=fTurnMultiplierForRange
gamespeed=gamespeed
float targetSpeed = fDistanceToTarget / 5.0
if hud.slowOnArrival = FALSE
if targetSpeed < 30.0 targetSpeed = 30.0 ENDIF
ENDIF
if ABSF((vTarget.z - vPos.z)) > 2.0
float maxForwardSpeedToHitHeight = fDistanceToTarget * 10.0 / ABSF(vTarget.z - vPos.z) //dist / time
if targetSpeed > maxForwardSpeedToHitHeight
targetSpeed = maxForwardSpeedToHitHeight
ENDIF
ENDIF
if targetSpeed > hud.fMaxChopperSpeed targetSpeed = hud.fMaxChopperSpeed ENDIF
if targetSpeed < hud.fminChopperSpeed targetSpeed = hud.fminChopperSpeed ENDIF
if hud.actualspeed < targetSpeed
if ABSF(hud.actualspeed - targetSpeed) < 2.0
hud.actualspeed += 1.0 * TIMESTEP()
ELSE
hud.actualspeed += 5.0 * TIMESTEP()
ENDIF
ENDIF
if hud.actualspeed > targetSpeed
if ABSF(hud.actualspeed - targetSpeed) < 2.0
hud.actualspeed -= 1.0 * TIMESTEP()
ELSE
hud.actualspeed -= 7.0 * TIMESTEP()
ENDIF
ENDIF
//hud.actualspeed = clamp(hud.actualspeed,hud.fminChopperSpeed,hud.fmaxChopperSpeed)
vVel.x = sin(fHeading) * hud.actualspeed
vVel.y = cos(fHeading) * hud.actualspeed
hud.lastVx = vVel.x
hud.lastVy = vVel.y
//set chopper rotational speed
//if the chopper has been given a fixed heading
float desiredRotVel
if hud.bHeadingFixed = TRUE
float angleToFixedHeading = hud.fFixedHeading - hud.visibleHeading //GET_ANGLE_BETWEEN_2D_VECTORS(sin(chopperHeading),cos(chopperHeading),vTarget.x-vPos.x,vTarget.y-vPos.y)
angleToFixedHeading = WRAP(angleToFixedHeading,-180.0,180.0)
desiredRotVel = angleToFixedHeading /8.0
if desiredRotVel < 0
desiredRotVel = clamp(desiredRotVel,-20.0,-0.01)
ELSE
desiredRotVel = clamp(desiredRotVel,20.0,0.01)
ENDIF
hud.visibleHeading += desiredRotVel * TIMESTEP()
ENDIF
//desiredRotVel = fAngleBla /2.0 //original
desiredRotVel = fAngleBla
// originally not commented out
if desiredRotVel < -60
desiredRotVel = -60.0
//clamp(desiredRotVel,-60.0,-0.01)
endif
if desiredRotVel > 60.0
desiredRotVel = 60.0
//ELSE
// clamp(desiredRotVel,60.0,0.01)
ENDIF
float upperAllowedRotVel = hud.rotVelChange + (10 * timestep())
float lowerAllowedRotVel = hud.rotVelChange - (10 * timestep())
IF upperAllowedRotVel > 1
upperAllowedRotVel = 1
endif
If lowerAllowedRotVel < -1
lowerAllowedRotVel = -1
endif
IF desiredRotVel > hud.lastRotVel + upperAllowedRotVel
desiredRotVel = hud.lastRotVel + upperAllowedRotVel
hud.rotVelChange = upperAllowedRotVel
ELIF desiredRotVel < hud.lastRotVel + lowerAllowedRotVel
desiredRotVel = hud.lastRotVel + lowerAllowedRotVel
hud.rotVelChange = lowerAllowedRotVel
else
hud.rotVelChange = desiredRotVel - hud.lastRotVel
endif
hud.lastRotVel = desiredRotVel //clamp(desiredRotVel,hud.lastRotVel-(12.0*TIMESTEP()),hud.lastRotVel+(12.0*TIMESTEP()))
hud.chopperHeading += -hud.lastRotVel * TIMESTEP()
vTempRot = GET_ENTITY_ROTATION(HUD.vehChopper)
vTempRot.y += ((desiredRotVel/2.0) - vTempRot.y) * TIMESTEP()
if hud.bHeadingFixed = TRUE
SET_ENTITY_ROTATION(HUD.vehChopper,<<0,vTempRot.y,hud.visibleHeading >>)
ELSE
SET_ENTITY_ROTATION(HUD.vehChopper,<<0,vTempRot.y,hud.chopperHeading>>)
ENDIF
hud.lastPos = vPos
zSpeed=zSpeed
SET_ENTITY_VELOCITY(HUD.vehChopper,vVel+<<0,0,0.1>>) //<<0,0,zSpeed+(zSpeed - fRealSpeed)>>)//vVel)
hud.speedLastFrame = gameSpeed
ENDIF
ENDIF
ENDPROC
PROC NAVIGATE_TO_POINT(structHelicopterHUDVars &HUD,entity_index veh,VECTOR vCoord)
veh=veh
vCoord.z = 150.0
GET_TO_POINT(HUD,vCoord,5,100.0,-1,true,FALSE)
ENDPROC
#ENDIF
proc moveChopper(structHelicopterHUDVars &HUD)
if HUD.bMoveChopper = TRUE
#if ENABLE_ENHANCED_HUD_FEATURES
if hud.bHoverInArea = TRUE
if IS_VECTOR_ZERO(hud.vHoverPoint)
hud.vHoverPoint = HUD.vHoverCenter + <<sin(GET_RANDOM_FLOAT_IN_RANGE(0,360)) * hud.fHoverRadius,cos(GET_RANDOM_FLOAT_IN_RANGE(0,360)) * hud.fHoverRadius,0>>
ENDIF
if GET_TO_POINT(hud,hud.vHoverPoint,hud.hoverHitRange,-1,-1,true)
if not is_heading_fixed(hud)
fixChopperHeading(HUD,hud.chopperHeading)
ENDIF
hud.vHoverPoint = <<0,0,0>>
ENDIF
else
if not IS_ENTITY_DEAD(HUD.camEntity)
if HUD.moveByCamera = TRUE
NAVIGATE_TO_POINT(HUD,HUD.camEntity,hud.vaimAt)
ENDIF
ENDIF
ENDIF
CONTROL_GET_TO_POINT(HUD) //get to a specific point
#ENDIF
ELSE
if DOES_ENTITY_EXIST(HUD.camEntity)
if not IS_ENTITY_DEAD(HUD.camEntity)
//FREEZE_ENTITY_POSITION(HUD.camEntity,TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
proc POINT_CHOPPER_CAM_AT_COORD(structHelicopterHUDVars &HUD, vector vPointAtCoord)
IF NOT IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
AND NOT DOES_INTERIOR_USE_TURRETS()
OR g_iShouldLaunchTruckTurret != -1
HUD.vTargetedGround = vPointAtCoord
POINT_CAM_AT_COORD(HUD.camChopper,HUD.vTargetedGround)
hud.vaimat = vPointAtCoord
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "POINT_CHOPPER_CAM_AT_COORD")
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_TURRET_DISPLAY(structHelicopterHUDVars &HUD)
IF GET_COMMANDLINE_PARAM_EXISTS("sc_DrawDebugBombushka")
INT iStrOffset = 0, iColumn = 0, iRow = 0
INT iRed, iGreen, iBlue, iAlpha
FLOAT fYvar = 0.017
TEXT_LABEL_63 str
FLOAT fCamRotSpeed
IF g_BombushkaTurretCamRotSpeedMultiplier = -1
fCamRotSpeed = (((HUD.fFOV-(HUD.minFOV-1)) / (HUD.maxFOV-(HUD.minFOV-1)))*6)
ELSE
fCamRotSpeed = (((HUD.fFOV-(HUD.minFOV-1)) / (HUD.maxFOV-(HUD.minFOV-1)))*g_BombushkaTurretCamRotSpeedMultiplier)
ENDIF
str += "fCamRotSpeed: "
str += GET_STRING_FROM_FLOAT(fCamRotSpeed)
GET_HUD_COLOUR(INT_TO_ENUM(HUD_COLOURS, iStrOffset), iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_TEXT_2D(str, <<0.3,0.2,0>>+(<<0.0,0.01,0>>*TO_FLOAT(iStrOffset))+(<<0.2,0.0,0>>*TO_FLOAT(iColumn)+(<<0.0,fYvar,0>>*TO_FLOAT(iRow))), iRed, iGreen, iBlue, iAlpha)
iGreen = 0
iRed = 0
str = ""
iRow++
INT iCamZoomSpeed
IF g_BombushkaTurretCamZoomSpeedMultiplier = -1
iCamZoomSpeed = 4
ELSE
iCamZoomSpeed = g_BombushkaTurretCamZoomSpeedMultiplier
ENDIF
str += "iCamZoomSpeed: "
str += GET_STRING_FROM_INT(iCamZoomSpeed)
GET_HUD_COLOUR(INT_TO_ENUM(HUD_COLOURS, iStrOffset), iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_TEXT_2D(str, <<0.3,0.2,0>>+(<<0.0,0.01,0>>*TO_FLOAT(iStrOffset))+(<<0.2,0.0,0>>*TO_FLOAT(iColumn)+(<<0.0,fYvar,0>>*TO_FLOAT(iRow))), iRed, iGreen, iBlue, iAlpha)
iGreen = 0
iRed = 0
str = ""
iRow++
ENDIF
ENDPROC
#ENDIF
FUNC TURRET_FIRE_SOUND_SET GET_TURRET_AUDIO_SET()
IF IS_PLAYER_IN_ARMORY_TRUCK(PLAYER_ID())
OR IS_PLAYER_IN_CREATOR_TRAILER(PLAYER_ID())
RETURN (TFSS_MOC)
ELIF IS_PLAYER_IN_ARMORY_AIRCRAFT(PLAYER_ID())
OR IS_PLAYER_IN_CREATOR_AIRCRAFT(PLAYER_ID())
RETURN (TFSS_AOC)
ELIF IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
RETURN (TFSS_IAA)
ENDIF
RETURN (TFSS_INVALID)
ENDFUNC
proc ControlChopperCamera( structHelicopterHUDVars &HUD,
FLOAT fMinPitchOverride = MIN_CAMERA_PITCH, FLOAT fMaxPitchOverride = MAX_CAMERA_PITCH,
FLOAT fMinHeadingOverride = MIN_CAMERA_HEADING, FLOAT fMaxHeadingOverride = MAX_CAMERA_HEADING,
FLOAT fDeadzoneMagnitude = 0.15 )
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera")
int iZoom
int iStickYaw
int iStickPitch
FLOAT fStickPitch
FLOAT fStickYaw
FLOAT fMaxCamPitch = fMaxPitchOverride
IF HUD.bLimitCamWhileGrounded
fMaxCamPitch = MAX_CAMERA_PITCH_GROUNDED
ENDIF
#IF IS_DEBUG_BUILD
DEBUG_TURRET_DISPLAY(HUD)
#ENDIF
VECTOR vCamPos
FLOAT fCamZ
if HUD.bActivateChopperCam = TRUE
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera: bActivateChopperCam = TRUE ")
if DOES_CAM_EXIST(HUD.camChopper)
if NOT IS_CAM_ACTIVE(HUD.camChopper)
SET_CAM_ACTIVE(HUD.camChopper,TRUE)
IF g_iShouldLaunchTruckTurret != -1
OR g_iInteriorTurretSeat != -1
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera - NOT rendering script cameras, waiting for all elements to load.")
HUD.bDelayRenderScriptCams = TRUE
ELSE
RENDER_SCRIPT_CAMS(true,FALSE)
ENDIF
ENDIF
ENDIF
// Blank out cam if cam pos is below ground
IF HUD.bIsCamAttached
IF DOES_CAM_EXIST(HUD.camChopper)
vCamPos = GET_CAM_COORD(HUD.camChopper)
g_bUsingTurretHeliCam = TRUE
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera vCamPos = ", vCamPos)
IF GET_GROUND_Z_FOR_3D_COORD(<<vCamPos.x, vCamPos.y, vCamPos.z+1>>, fCamZ)
OR IS_ENTITY_IN_WATER(HUD.vehChopper)
IF fCamZ > vCamPos.z
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera Cam is BELOW ground")
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera vCamPos = ", vCamPos, ", fCamZ = ", fCamZ)
IF g_iShouldLaunchTruckTurret != -1
OR g_iInteriorTurretSeat != -1
IF HUD.iCollideFrameCount > MAX_GROUND_CLIP_FRAMES
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera iCollideFrameCount = ",HUD.iCollideFrameCount,", max allowance (",MAX_GROUND_CLIP_FRAMES,") exceeded, removing player from cam.")
IF GET_ENTITY_SUBMERGED_LEVEL(HUD.vehChopper) >= 0.01
IF g_iShouldLaunchTruckTurret != -1
OR g_iInteriorTurretSeat != -1
PRINT_HELP("TUR_WATER")
HUD.bDeactivateChopperCam = TRUE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera HUD.bDeactivateChopperCam = TRUE, IS_ENTITY_IN_WATER(HUD.vehChopper) = TRUE")
ENDIF
ENDIF
//-- Check if we can find a ground z below the camera. If so, probably going under a bridge
IF GET_GROUND_Z_FOR_3D_COORD(<<vCamPos.x, vCamPos.y, vCamPos.z - 1>>, fCamZ)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera got ground z below vCamPos, won't bail, vCamPos = ", vCamPos, ", fCamZ = ", fCamZ)
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera Failed to get ground z below vCamPos, bailing. vCamPos = ", vCamPos)
IF g_iInteriorTurretSeat != -1
PRINT_HELP("TUR_GR")
ENDIF
HUD.bDeactivateChopperCam = TRUE
ENDIF
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera iCollideFrameCount = ",HUD.iCollideFrameCount,", incrementing total below ground frame allowance.")
HUD.iCollideFrameCount = HUD.iCollideFrameCount + 1
ENDIF
ELSE
HUD.bDeactivateChopperCam = TRUE
ENDIF
ELSE
IF HUD.iCollideFrameCount != 0
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera resetting iCollideFrameCount")
HUD.iCollideFrameCount = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
if HUD.bIsCamAttached = FALSE
if DOES_CAM_EXIST(HUD.camChopper)
if DOES_ENTITY_EXIST(HUD.camEntity)
if not IS_ENTITY_DEAD(HUD.camEntity)
IF HUD.isMultiplayerMode
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera: HUD.camEntity = ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(HUD.camEntity)))
VECTOR vTempOffset
SWITCH GET_ENTITY_MODEL(HUD.camEntity)
CASE VALKYRIE ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.000,5.320,-0.300>>,TRUE) BREAK
CASE POLMAV ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,2.75,-1.25>>,TRUE) BREAK
CASE MAVERICK ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,2.75,-1.25>>,TRUE) BREAK
CASE SAVAGE ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,5.75,-0.75>>,TRUE) BREAK
CASE HUNTER ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<-0.0066, 8.9038, -0.5>>,TRUE) BREAK
CASE TRAILERLARGE
SWITCH g_iShouldLaunchTruckTurret
CASE 1
vTempOffset = <<0, 8.4, 1.3>>
BREAK
CASE 2
vTempOffset = <<-2.400, -7.6, 0.920>>
BREAK
CASE 3
vTempOffset = <<2.400, -7.6, 0.920>>
BREAK
ENDSWITCH
ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,vTempOffset,TRUE)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "CalculateTurretCamera1: Offset = ", vTempOffset)
BREAK
CASE ADDER
VECTOR vAdderPos
vAdderPos = <<2065.8484, 2967.3196, 45.2947>>
VECTOR vTurretPos1
vTurretPos1 = <<2049.6121, 2947.6570, 49.5560>>
VECTOR vTurretPos2
vTurretPos2 = <<2045.0913, 2943.2578, 49.4991>>
VECTOR vTurretPos3
vTurretPos3 = <<2040.3645, 2952.7544, 49.5688>>
VECTOR vTurretPos4
vTurretPos4 = <<2049.3848, 2953.9709, 49.9635>>
SWITCH g_iInteriorTurretSeat
CASE 1
vTempOffset = vTurretPos1 - vAdderPos
BREAK
CASE 2
vTempOffset = vTurretPos2 - vAdderPos
BREAK
CASE 3
vTempOffset = vTurretPos3 - vAdderPos
BREAK
CASE 4
vTempOffset = vTurretPos4 - vAdderPos
BREAK
ENDSWITCH
ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,vTempOffset,TRUE)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "CalculateTurretCamera1: for ADDER: Offset = ", vTempOffset)
BREAK
// CASE TITAN
// CDEBUG1LN(DEBUG_NET_ACTIVITY_CREATOR, "GETTING TITAN cam Coords, g_iShouldLaunchTruckTurret = ", g_iShouldLaunchTruckTurret)
// SWITCH g_iShouldLaunchTruckTurret
// CASE 1
// vTempOffset = <<0.0454, 10.5501, 1.9211>>
// BREAK
// CASE 2
// vTempOffset = <<0.0454, 10.5501, 1.9211>>
// BREAK
// CASE 3
// vTempOffset = <<0.0454, 10.5501, 1.9211>>
// BREAK
// ENDSWITCH
//
// ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,vTempOffset,TRUE)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "CalculateTurretCamera: Offset = ", vTempOffset)
// BREAK
DEFAULT ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,1.958,-0.618>>,TRUE) BREAK
ENDSWITCH
ELSE
SWITCH GET_ENTITY_MODEL(HUD.camEntity)
// Eye in the sky.
CASE BUZZARD ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,1.958,-0.468>>,TRUE) BREAK
CASE POLMAV ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,2.75,-1.25>>,TRUE) BREAK
// Free mode scripted gun.
// CASE HUNTER ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,3.25,-3.0>>,TRUE) BREAK - leave commented, do not remove.
// CASE ANNIHILATOR ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,2.25,-1.0>>,TRUE) BREAK
CASE BUZZARD2 ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,1.958,-0.618>>,TRUE) BREAK
CASE VALKYRIE ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.000,5.320,-0.300>>,TRUE) BREAK
DEFAULT ATTACH_CAM_TO_ENTITY(HUD.camChopper,HUD.camEntity,<<0.0,1.958,-0.618>>,TRUE) BREAK
ENDSWITCH
ENDIF
HUD.bIsCamAttached = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "bIsCamAttached = ", HUD.bIsCamAttached, ", mpCamFudge: ", HUD.mpCamFudge )
IF HUD.bIsCamAttached = TRUE and HUD.mpCamFudge=FALSE #IF ENABLE_ENHANCED_HUD_FEATURES and HUD.bDisableCamMovement = FALSE #ENDIF
FLOAT inputScale = 128
if DOES_CAM_EXIST(HUD.camChopper)
if IS_CAM_ACTIVE(HUD.camChopper)
IF NOT IS_SELECTOR_ONSCREEN()
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL,INPUT_CHARACTER_WHEEL)
AND NOT IS_PAUSE_MENU_ACTIVE()
SET_INPUT_EXCLUSIVE( PLAYER_CONTROL, INPUT_SNIPER_ZOOM) // Needed for PC, as sniper zoom is the same as weapon cycle.
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
inputScale = 15
// Mouse uses float for better precision.
fStickPitch = GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_SCALED_LOOK_UD) * -inputScale
fStickYaw = GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_SCALED_LOOK_LR) * inputScale
ELSE
iStickPitch = floor(GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_SCALED_LOOK_UD) * -inputScale)
iStickYaw = floor(GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_SCALED_LOOK_LR) * inputScale)
ENDIF
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "iZoom = ", iZoom)
iZoom = floor(GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_SNIPER_ZOOM) * 128)
ELSE
CPRINTLN(debug_trevor3,"player selecting switch control")
ENDIF
// No need to dead-zone on mouse
IF NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
INT iDeadzoneMagnitude = ROUND(fDeadzoneMagnitude * inputScale)
//Deadzone zoom
IF ABSI(iZoom) < iDeadzoneMagnitude
iZoom = 0
ENDIF
//Deadzone camera movement
VECTOR vecInput = <<iStickPitch, iStickYaw, 0>>
IF VMAG(vecInput) < iDeadzoneMagnitude
iStickPitch = 0
iStickYaw = 0
ENDIF
ENDIF
CDEBUG2LN(DEBUG_NET_GUN_TURRET, "HUD.vCamRot = ", HUD.vCamRot)
float fYawMultiplier = ((HUD.vCamRot.x / fMaxPitchOverride) * 0.5)
IF fYawMultiplier > 0
fYawMultiplier += 1.0
ELSE
fYawMultiplier = 1.0
ENDIF
// Using TIMESTEP() with mouse breaks mouse movement.
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
// Mouse uses float for better precision.
HUD.fStickPitch = (fStickPitch * HUD.fFOV) * HUD.chopperPanFactor
HUD.fStickYaw = ((fStickYaw * HUD.fFOV) * HUD.chopperPanFactor) * fYawMultiplier
ELSE
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera, HUD.chopperPanFactor = ", HUD.chopperPanFactor, ", HUD.fStickPitch = ", HUD.fStickPitch)
HUD.fStickPitch = ((TO_FLOAT(iStickPitch) * HUD.fFOV) * HUD.chopperPanFactor) * TIMESTEP()
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera, fYawMultiplier = ", fYawMultiplier, ", HUD.fStickYaw = ", HUD.fStickYaw)
HUD.fStickYaw = (((TO_FLOAT(iStickYaw) * HUD.fFOV) * HUD.chopperPanFactor) * fYawMultiplier) * TIMESTEP()
ENDIF
HUD.fStickYaw = RESTRICT_HEADING(HUD.fStickYaw, fMinHeadingOverride, fMaxHeadingOverride)
if are_vectors_equal(HUD.vTargetedGround,<<0,0,0>>)
vector vTemp = GET_CAM_COORD(HUD.camChopper)
HUD.vTargetedGround.x = SIN(HUD.vCamRot.z) * 150.0
HUD.vTargetedGround.y = COS(HUD.vCamRot.z) * 150.0
HUD.vTargetedGround.z = vTemp.z
ENDIF
#IF USE_TU_CHANGES
IF HUD.isMultiplayerMode
IF NOT IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
AND NOT DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
OR g_iShouldLaunchTruckTurret != -1
IF iStickPitch != 0
AND iStickYaw != 0
HUD.vCamRot = GET_CAM_ROT(HUD.camChopper)
ENDIF
ENDIF
ELSE
HUD.vCamRot = GET_CAM_ROT(HUD.camChopper)
ENDIF
#ENDIF
#IF NOT USE_TU_CHANGES
HUD.vCamRot = GET_CAM_ROT(HUD.camChopper)
#ENDIF
If not are_vectors_equal(GET_CAM_COORD(HUD.camChopper),<<0,0,0>>)
bool bMaxYawReached
IF HUD.fMaxCameraYaw != 0.0
AND NOT IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
AND NOT DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
OR g_iShouldLaunchTruckTurret != -1
IF IS_VEHICLE_DRIVEABLE(hud.vehchopper)
float fVehHeading = GET_ENTITY_HEADING(hud.vehchopper)
IF g_iShouldLaunchTruckTurret = 2
OR g_iShouldLaunchTruckTurret = 3
fVehHeading = fVehHeading -174.4552
ENDIF
float fCamVehDiff = fVehHeading - HUD.vCamRot .z
int safeAbort
WHILE absf(fCamVehDiff) >= 180
AND safeAbort < 30
#IF USE_TU_CHANGES
IF fCamVehDiff < 0
fCamVehDiff += 360
else
fCamVehDiff -= 360
endif
#ENDIF
#IF NOT USE_TU_CHANGES
IF fCamVehDiff < 0
fCamVehDiff += 360
endif
if fCamVehDiff > 0
fCamVehDiff -= 360
endif
#ENDIF
safeAbort++
IF safeAbort = 30
SCRIPT_ASSERT("Stuck in while loop in helicopterHud.sch")
ENDIF
endwhile
IF g_iShouldLaunchTruckTurret != -1
IF fCamVehDiff >= fMaxHeadingOverride
bMaxYawReached = true
IF fCamVehDiff > 0
HUD.vCamRot.z = fVehHeading - fMaxHeadingOverride
ELSE
HUD.vCamRot.z = fVehHeading + fMaxHeadingOverride
ENDIF
ENDIF
IF fCamVehDiff < fMinHeadingOverride
bMaxYawReached = true
IF fCamVehDiff > 0
HUD.vCamRot.z = fVehHeading - ABSF(fMinHeadingOverride)
ELSE
HUD.vCamRot.z = fVehHeading + ABSF(fMinHeadingOverride)
ENDIF
ENDIF
ELSE
IF absf(fCamVehDiff) > HUD.fMaxCameraYaw
bMaxYawReached = true
If fCamVehDiff > 0
HUD.vCamRot .z = fVehHeading - HUD.fMaxCameraYaw
ELSE
HUD.vCamRot .z = fVehHeading + HUD.fMaxCameraYaw
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// When we use the attach method we should track the difference each frame so we can try and correct the heading/pitch of the turret.
FLOAT fVehicleDiffX = 0.0
FLOAT fVehicleDiffY = 0.0
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
IF ARE_VECTORS_EQUAL( HUD.vAttachedEntityRotation, <<0,0,0>>)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ARE_VECTORS_EQUAL( HUD.vAttachedEntityRotation, <<0,0,0>>) = TRUE")
VECTOR vTempRotYall = GET_ENTITY_ROTATION(HUD.vehChopper)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "GET_ENTITY_ROTATION(HUD.vehChopper) = ", vTempRotYall)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "GET_ENTITY_MODEL(HUD.camEntity) = ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(HUD.camEntity)))
HUD.vAttachedEntityRotation = GET_ENTITY_ROTATION(HUD.vehChopper)
ELSE
VECTOR vCurrentRot = GET_ENTITY_ROTATION(HUD.vehChopper)
// The Bombushka attachment rotations are different for each turret as we are attaching
// the camera to the ped who sits at different angles.
// Since we decided to use vAttachedCamRotationOffset to determine the heading difference
// we will need to offset.
FLOAT fPitchScale
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
SWITCH g_iVehicleTurretSeat
CASE 0 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK // top
CASE 1 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK // nose
CASE 2 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / -90.0) BREAK // rear
DEFAULT fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK
ENDSWITCH
ENDIF
IF DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
SWITCH GET_ENTITY_MODEL(HUD.vehChopper)
CASE AVENGER
SWITCH g_iInteriorTurretSeat
CASE 1 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK // nose
CASE 2 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / -90.0) BREAK // Top
CASE 3 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / -90.0) BREAK // rear
DEFAULT fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK
ENDSWITCH
BREAK
DEFAULT
SWITCH g_iInteriorTurretSeat
CASE 1 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK // nose
CASE 2 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK // Top
CASE 3 fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / -90.0) BREAK // rear
DEFAULT fPitchScale = ((ABSF(HUD.vAttachedCamRotationOffset.z)-90.0) / 90.0) BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[OCH] fPitchScale: ", fPitchScale, ", g_iInteriorTurretSeat: ", g_iInteriorTurretSeat, ", HUD.vAttachedCamRotationOffset.z = ", HUD.vAttachedCamRotationOffset.z)
fVehicleDiffX -= ((vCurrentRot.x - HUD.vAttachedEntityRotation.x)*fPitchScale)
fVehicleDiffY += (vCurrentRot.z - HUD.vAttachedEntityRotation.z)
// CDEBUG2LN(DEBUG_NET_GUN_TURRET, "fVehicleDiffX = ", fVehicleDiffX)
// CDEBUG2LN(DEBUG_NET_GUN_TURRET, "fVehicleDiffY = ", fVehicleDiffY)
// Keep the heading within the -180 to 180 range.
IF fVehicleDiffY > 180
fVehicleDiffY -= 360
ENDIF
IF fVehicleDiffY < -180
fVehicleDiffY += 360
ENDIF
// Limit the pitch update to avoid gimbal lock.
IF vCurrentRot.x < -80
OR vCurrentRot.x > 80
fVehicleDiffX = 0.0
fVehicleDiffY = 0.0
ENDIF
IF IS_ENTITY_UPSIDEDOWN(HUD.vehChopper)
fVehicleDiffX = 0.0
fVehicleDiffY = 0.0
ENDIF
HUD.vAttachedEntityRotation = vCurrentRot
ENDIF
ENDIF
// We don't want to include the auto adjust heading/pitch audio so need to handle movement audio separately.
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
IF (HUD.fStickYaw != 0 AND NOT ((HUD.vAttachedCamRotationOffset.z = (-HUD.fMaxCameraYaw / 2.0) OR HUD.vAttachedCamRotationOffset.z = (HUD.fMaxCameraYaw / 2.0))))
bCamMovementStopped = FALSE
iCamFrameCounter = 0
ELIF (HUD.fStickPitch != 0 AND NOT ((HUD.vAttachedCamRotationOffset.x = fMaxCamPitch OR HUD.vAttachedCamRotationOffset.x = fMinPitchOverride)))
bCamMovementStopped = FALSE
iCamFrameCounter = 0
ELIF iCamFrameCounter > 5
bCamMovementStopped = TRUE
ENDIF
iCamFrameCounter++
ENDIF
if HUD.fStickPitch != 0 or HUD.fStickYaw != 0
OR fVehicleDiffX != 0.0 OR fVehicleDiffY != 0.0
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera ++++++")
MODEL_NAMES eHeliModel
IF IS_VEHICLE_DRIVEABLE(HUD.vehChopper)
eHeliModel = GET_ENTITY_MODEL(HUD.vehChopper)
ENDIF
IF g_iVehicleTurretSeat != -1
OR g_iInteriorTurretSeat != -1
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera HUD.fFOV = ", HUD.fFOV)
FLOAT fCamRotSpeed
IF NOT IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
fCamRotSpeed = (((HUD.fFOV-(HUD.minFOV-1)) / (HUD.maxFOV-(HUD.minFOV-1)))*6)
ELIF IS_PLAYER_IN_DEFUNCT_BASE(PLAYER_ID())
OR IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
// g_BombushkaTurretCamRotSpeedMultiplier = 10
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "g_BombushkaTurretCamRotSpeedMultiplier = 15")
fCamRotSpeed = (((HUD.fFOV-(HUD.minFOV-1)) / (HUD.maxFOV-(HUD.minFOV-1)))*8)
// ELSE
// fCamRotSpeed = (((HUD.fFOV-(HUD.minFOV-1)) / (HUD.maxFOV-(HUD.minFOV-1)))*g_BombushkaTurretCamRotSpeedMultiplier)
ENDIF
// Lower limit
IF fCamRotSpeed < 3.0
fCamRotSpeed = 3.0
ENDIF
HUD.fStickPitch = HUD.fStickPitch * fCamRotSpeed
HUD.fStickYaw = HUD.fStickYaw * fCamRotSpeed
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera fCamRotSpeed: ", fCamRotSpeed, " HUD.fStickPitch: ", HUD.fStickPitch, " HUD.fStickYaw: ", HUD.fStickYaw)
ELIF eHeliModel = HUNTER
HUD.fStickPitch = HUD.fStickPitch * 4
HUD.fStickYaw = HUD.fStickYaw * 4
ENDIF
// Camera attaches to Bombuska so track yaw and pitch offsets separately.
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
HUD.vAttachedCamRotationOffset.x += HUD.fStickPitch
HUD.vAttachedCamRotationOffset.z -= HUD.fStickYaw
HUD.vAttachedCamRotationOffset.x -= fVehicleDiffX
HUD.vAttachedCamRotationOffset.z -= fVehicleDiffY
IF HUD.vAttachedCamRotationOffset.x < fMaxCamPitch
HUD.vAttachedCamRotationOffset.x = fMaxCamPitch
ENDIF
IF HUD.vAttachedCamRotationOffset.x > fMinPitchOverride
HUD.vAttachedCamRotationOffset.x = fMinPitchOverride
ENDIF
IF HUD.fMaxCameraYaw >= 360.0
WHILE HUD.vAttachedCamRotationOffset.z > 180.0
HUD.vAttachedCamRotationOffset.z -= 360.0
ENDWHILE
WHILE HUD.vAttachedCamRotationOffset.z < -180.0
HUD.vAttachedCamRotationOffset.z += 360.0
ENDWHILE
ELSE
IF HUD.vAttachedCamRotationOffset.z < (-HUD.fMaxCameraYaw / 2.0)
HUD.vAttachedCamRotationOffset.z = (-HUD.fMaxCameraYaw / 2.0)
bMaxYawReached = true
ENDIF
IF HUD.vAttachedCamRotationOffset.z > (HUD.fMaxCameraYaw / 2.0)
HUD.vAttachedCamRotationOffset.z = (HUD.fMaxCameraYaw / 2.0)
bMaxYawReached = true
ENDIF
ENDIF
ELSE
iCamFrameCounter++
HUD.vCamRot += <<HUD.fStickPitch,0,-HUD.fStickYaw>>
if HUD.vCamRot.x < fMaxCamPitch
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera: HUD.vCamRot.x < fMaxCamPitch: HUD.vCamRot.x = ", HUD.vCamRot.x)
HUD.vCamRot.x = fMaxCamPitch
ENDIF
if HUD.vCamRot.x > fMinPitchOverride
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera: HUD.vCamRot.x > fMinPitchOverride: HUD.vCamRot.x = ", HUD.vCamRot.x)
HUD.vCamRot.x = fMinPitchOverride
ENDIF
IF iCamFrameCounter > 5
IF !ARE_VECTORS_ALMOST_EQUAL(vStoredRotation, HUD.vCamRot, 0.05)
vStoredRotation = HUD.vCamRot
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera !ARE_VECTORS_ALMOST_EQUAL vStoredRotation = ", vStoredRotation)
bCamMovementStopped = FALSE
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera bCamMovementStopped")
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera ARE_VECTORS_ALMOST_EQUAL vStoredRotation = ", vStoredRotation)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera ARE_VECTORS_ALMOST_EQUAL HUD.vCamRot = ", HUD.vCamRot)
bCamMovementStopped = TRUE
ENDIF
iCamFrameCounter = 0
ENDIF
ENDIF
IF HUD.soundID_turn != -1
//IF NOT HAS_SOUND_FINISHED(HUD.soundID_turn)
float fRotateSound
IF bMaxYawReached
fRotateSound = 0.0
else
fRotateSound += ABSF(HUD.fStickYaw)
IF (ABSF(HUD.fStickYaw) > 0)
bCamMovementStopped = FALSE
ENDIF
endif
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
IF HUD.vAttachedCamRotationOffset.x < fMinPitchOverride AND HUD.vAttachedCamRotationOffset.x > fMaxPitchOverride
fRotateSound += ABSF(HUD.fStickPitch)
IF (ABSF(HUD.fStickPitch) > 0)
bCamMovementStopped = FALSE
ENDIF
endif
ELSE
IF HUD.vCamRot.x < fMinPitchOverride AND HUD.vCamRot.x > fMaxPitchOverride
fRotateSound += ABSF(HUD.fStickPitch)
IF (ABSF(HUD.fStickPitch) > 0)
bCamMovementStopped = FALSE
ENDIF
endif
ENDIF
IF HAS_SOUND_FINISHED(HUD.soundID_turn)
AND !bCamMovementStopped
IF IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
PLAY_SOUND_FRONTEND(HUD.soundID_turn,"Pan_Loop", GET_TURRET_FIRE_SOUNDS_NAME(TFSS_IAA))
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND Pan_Loop with set ", GET_TURRET_FIRE_SOUNDS_NAME(TFSS_IAA), " HUD.soundID_turn = ", HUD.soundID_turn)
ELSE
TURRET_FIRE_SOUND_SET soundset = GET_TURRET_AUDIO_SET()
IF soundset != TFSS_INVALID
PLAY_SOUND_FRONTEND(HUD.soundID_turn,"Pan", GET_TURRET_FIRE_SOUNDS_NAME(soundset))
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND Pan set ", GET_TURRET_FIRE_SOUNDS_NAME(soundset))
ELSE
PLAY_SOUND_FRONTEND(HUD.soundID_turn,"COP_HELI_CAM_TURN")
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND COP_HELI_CAM_TURN ")
ENDIF
ENDIF
// PLAY_SOUND_FRONTEND(HUD.soundID_turn,"COP_HELI_CAM_TURN")
ENDIF
IF NOT HAS_SOUND_FINISHED(HUD.soundID_turn)
IF !bCamMovementStopped
AND fRotateSound > 0
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera SET_VARIABLE_ON_SOUND Ctrl = ", fRotateSound)
SET_VARIABLE_ON_SOUND(HUD.soundID_turn,"Ctrl",fRotateSound)
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera STOP_SOUND")
STOP_SOUND(HUD.soundID_turn)
bCamMovementStopped = TRUE
iCamFrameCounter = 6
ENDIF
ENDIF
ENDIF
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "ControlChopperCamera =======")
ELSE
IF HUD.soundID_turn != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_turn)
STOP_SOUND(HUD.soundID_turn)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera STOP_SOUND 2")
bCamMovementStopped = TRUE
iCamFrameCounter = 6
ENDIF
ENDIF
ENDIF
IF NOT IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
AND NOT DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
OR g_iShouldLaunchTruckTurret != -1
vector vGroundLoc = hud.vaimat
#IF USE_TU_CHANGES
float fSphereRadius
IF HUD.isMultiplayerMode
fSphereRadius = 150
ELSE
fSphereRadius = GET_DISTANCE_BETWEEN_COORDS(vGroundLoc,GET_CAM_COORD(HUD.camChopper))//150.0 //distance to point on ground
ENDIF
#ENDIF
#IF NOT USE_TU_CHANGES
float fSphereRadius = GET_DISTANCE_BETWEEN_COORDS(vGroundLoc,GET_CAM_COORD(HUD.camChopper))//150.0 //distance to point on ground
#ENDIF
HUD.vTargetedGround.x = (COS(HUD.vCamRot .x) * fSphereRadius) * sin(-HUD.vCamRot .z)
HUD.vTargetedGround.y = (COS(HUD.vCamRot .x) * fSphereRadius) * cos(-HUD.vCamRot .z)
HUD.vTargetedGround.z = (sin(HUD.vCamRot .x) * fSphereRadius)
HUD.vTargetedGround += GET_CAM_COORD(HUD.camChopper)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "++POINT_CAM_AT_COORD")
POINT_CAM_AT_COORD(HUD.camChopper,HUD.vTargetedGround)
ELSE
VECTOR vTempPosOffset, vTempRotOffset
IF GET_ENTITY_MODEL(HUD.camEntity) = INT_TO_ENUM(MODEL_NAMES, HASH("VOLATOL"))
VECTOR vTurretOffsetFromVeh
SWITCH g_iVehicleTurretSeat
CASE 1 // nose
vTurretOffsetFromVeh = <<cfVOLATOL_NOSE_BASE_X, cfVOLATOL_NOSE_BASE_Y, cfVOLATOL_NOSE_BASE_Z>>
vTempPosOffset = vTurretOffsetFromVeh + ROTATE_VECTOR_ABOUT_Z(<<cfVOLATOL_NOSE_CAM_X, cfVOLATOL_NOSE_CAM_Y, cfVOLATOL_NOSE_CAM_Z>>, HUD.vAttachedCamRotationOffset.z)
vTempRotOffset = <<-7, 0.0, 0.0>>
BREAK
CASE 2 // Top
vTurretOffsetFromVeh = <<cfVOLATOL_ROOF_BASE_X, cfVOLATOL_ROOF_BASE_Y, cfVOLATOL_ROOF_BASE_Z>>
vTempPosOffset = vTurretOffsetFromVeh + ROTATE_VECTOR_ABOUT_Z(<<cfVOLATOL_ROOF_CAM_X, cfVOLATOL_ROOF_CAM_Y, cfVOLATOL_ROOF_CAM_Z>>, HUD.vAttachedCamRotationOffset.z)
vTempRotOffset = <<-5.8, 0.0, 0.0>>
BREAK
ENDSWITCH
ENDIF
IF GET_ENTITY_MODEL(HUD.camEntity) = INT_TO_ENUM(MODEL_NAMES, HASH("BOMBUSHKA"))
SWITCH g_iVehicleTurretSeat
CASE 0 // top
vTempPosOffset = <<-3.420, -4.260, 2.430>> +<<2.82,-1.25,0>>
vTempRotOffset = <<0.0, 0.0, 0.0>>
BREAK
CASE 1 // nose
IF NOT IS_ENTITY_DEAD(HUD.vehChopper)
AND GET_VEHICLE_MOD(HUD.vehChopper, MOD_ROOF) = 0 //Modded (-1 = default)
vTempPosOffset = <<-5.20, -0.22, -1.50>> +<<0.2,0.0, -0.4>>
vTempRotOffset = <<0.0, 0.0, 90.0 >>
ELSE
vTempPosOffset = <<-5.20, -0.3, -1.50>>
vTempRotOffset = <<0.0, 0.0, 90.0 >>
ENDIF
BREAK
CASE 2 // butt
vTempPosOffset = <<23.000, -0.180, 1.230>>
vTempRotOffset = <<0.0, 0.0, -90.0 >>
BREAK
ENDSWITCH
ENDIF
IF GET_ENTITY_MODEL(HUD.camEntity) = INT_TO_ENUM(MODEL_NAMES, HASH("AVENGER"))
SWITCH g_iInteriorTurretSeat
CASE 1
vTempPosOffset = <<cfAVENGER_T0_X, cfAVENGER_T0_Y, cfAVENGER_T0_z>>
vTempRotOffset = <<cfAVENGER_T0_RX, cfAVENGER_T0_RY, cfAVENGER_T0_RZ>>
BREAK
CASE 2
vTempPosOffset = <<cfAVENGER_T1_X, cfAVENGER_T1_Y, cfAVENGER_T1_Z>>
vTempRotOffset = <<cfAVENGER_T1_RX, cfAVENGER_T1_RY, cfAVENGER_T1_RZ>>
BREAK
CASE 3
vTempPosOffset = <<cfAVENGER_T2_X, cfAVENGER_T2_Y, cfAVENGER_T2_Z>>
vTempRotOffset = <<cfAVENGER_T2_RX, cfAVENGER_T2_RY, cfAVENGER_T2_RZ>>
BREAK
ENDSWITCH
ENDIF
IF GET_ENTITY_MODEL(HUD.camEntity) = INT_TO_ENUM(MODEL_NAMES, HASH("AKULA"))
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "CalculateTurretCamera2: GET_ENTITY_MODEL(HUD.camEntity) = AKULA, g_iInteriorTurretSeat = ", g_iInteriorTurretSeat)
SWITCH g_iVehicleTurretSeat
CASE 0
vTempPosOffset = <<-0.00, 9.0, -1.2>>
vTempRotOffset = <<-10.2537, -0.0000, 0.0>>
BREAK
CASE 1
vTempPosOffset = <<-cfAKULA_T1_X, cfAKULA_T1_Y, cfAKULA_T1_Z>>
vTempRotOffset = <<cfAKULA_T1_RX, cfAKULA_T1_RY, -cfAKULA_T1_RZ>>
BREAK
CASE 2
vTempPosOffset = <<cfAKULA_T1_X, cfAKULA_T1_Y, cfAKULA_T1_Z>>
vTempRotOffset = <<cfAKULA_T1_RX, cfAKULA_T1_RY, cfAKULA_T1_RZ>>
BREAK
ENDSWITCH
ELSE
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "CalculateTurretCamera2: GET_ENTITY_MODEL(HUD.camEntity) != AKULA, GET_ENTITY_MODEL(HUD.camEntity) = ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(HUD.camEntity)))
ENDIF
IF GET_ENTITY_MODEL(HUD.camEntity) = PHANTOM3 //@@ MOC2 << -- Change this when MOC2 model is in
SWITCH g_iVehicleTurretSeat
CASE 0 // Front
vTempPosOffset = <<cfMOC2_0_X, cfMOC2_0_Y, cfMOC2_0_Z>>
vTempRotOffset = <<cfMOC2_0_RX, cfMOC2_0_RY, cfMOC2_0_RZ>>
BREAK
CASE 1 //Back
vTempPosOffset = <<cfMOC2_1_X, cfMOC2_1_Y, cfMOC2_1_Z>>
vTempRotOffset = <<cfMOC2_1_RX, cfMOC2_1_RY, cfMOC2_1_RZ>>
BREAK
ENDSWITCH
ENDIF
IF GET_ENTITY_MODEL(HUD.vehChopper) = BOMBUSHKA
HARD_ATTACH_CAM_TO_PED_BONE(HUD.camChopper, PLAYER_PED_ID(), BONETAG_NULL, vTempRotOffset + << HUD.vAttachedCamRotationOffset.x, 0.0, HUD.vAttachedCamRotationOffset.z>>, vTempPosOffset, TRUE)
ELIF g_iInteriorTurretSeat != -1
OR IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
AND GET_ENTITY_MODEL(HUD.vehChopper) != BOMBUSHKA
#IF IS_DEBUG_BUILD
IF HUD.bDebugDrawRelRot
TEXT_LABEL_15 txtDebug = "Yaw(z) : "
txtDebug += FLOAT_TO_STRING(HUD.vAttachedCamRotationOffset.z)
SET_TEXT_SCALE(0.4, 0.4)
SET_TEXT_COLOUR(0, 0, 255, 255)
SET_TEXT_JUSTIFICATION(FONT_LEFT)
SET_TEXT_FONT(FONT_STANDARD)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.2, 0.1, "STRING", txtDebug)
txtDebug = "Pitch(x) : "
txtDebug += FLOAT_TO_STRING(HUD.vAttachedCamRotationOffset.x)
SET_TEXT_SCALE(0.4, 0.4)
SET_TEXT_COLOUR(0, 0, 255, 255)
SET_TEXT_JUSTIFICATION(FONT_LEFT)
SET_TEXT_FONT(FONT_STANDARD)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.2, 0.2, "STRING", txtDebug)
ENDIF
#ENDIF
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "camChopper: vTempRotOffset = ", vTempPosOffset, ", HUD.vAttachedCamRotationOffset = ", HUD.vAttachedCamRotationOffset)
ATTACH_CAM_TO_VEHICLE_BONE(HUD.camChopper, HUD.camEntity, 0, TRUE , vTempRotOffset + << HUD.vAttachedCamRotationOffset.x, 0.0, HUD.vAttachedCamRotationOffset.z>>, vTempPosOffset, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT (iZoom = 0 OR HUD.fFov = HUD.maxFOV OR HUD.fFov = HUD.minFOV)
IF HUD.soundID_zoom != -1
IF HAS_SOUND_FINISHED(HUD.soundID_zoom)
IF IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
PLAY_SOUND_FRONTEND(HUD.soundID_zoom,"Zoom_Loop", GET_TURRET_FIRE_SOUNDS_NAME(TFSS_IAA))
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND Zoom_Loop with set ", GET_TURRET_FIRE_SOUNDS_NAME(TFSS_IAA))
ELSE
TURRET_FIRE_SOUND_SET soundset = GET_TURRET_AUDIO_SET()
IF soundset != TFSS_INVALID
PLAY_SOUND_FRONTEND(HUD.soundID_zoom,"Zoom", GET_TURRET_FIRE_SOUNDS_NAME(soundset))
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND Zoom set ", GET_TURRET_FIRE_SOUNDS_NAME(soundset))
ELSE
PLAY_SOUND_FRONTEND(HUD.soundID_zoom,"COP_HELI_CAM_ZOOM")
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "[SOUNDCAM] ControlChopperCamera PLAY_SOUND_FRONTEND COP_HELI_CAM_ZOOM ")
ENDIF
ENDIF
ENDIF
ENDIF
IF HUD.soundID_zoom != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_zoom)
SET_VARIABLE_ON_SOUND(HUD.soundID_zoom,"Ctrl",ABSF(TO_FLOAT(iZoom) / 128))
IF iZoom < 0
SET_VARIABLE_ON_SOUND(HUD.soundID_zoom,"Dir",-1)
ELSE
// SET_VARIABLE_ON_SOUND(HUD.soundID_zoom,"Dir",0)
ENDIF
ENDIF
ENDIF
ELSE
IF HUD.soundID_zoom != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_zoom)
STOP_SOUND(HUD.soundID_zoom)
ENDIF
ENDIF
ENDIF
// cprintln(debug_Trevor3,HUD.vCamRot .x)
// IF iZoom < 0
// HUD.fFOV += (TO_FLOAT(iZoom) / HUD.ChopperZoomFactor) * TIMESTEP() * sin(absf(HUD.vCamRot .x))
// ELSE
INT iCamZoomSpeed
#IF IS_DEBUG_BUILD
IF g_BombushkaTurretCamZoomSpeedMultiplier = -1
#ENDIF
iCamZoomSpeed = 4
#IF IS_DEBUG_BUILD
ELSE
iCamZoomSpeed = g_BombushkaTurretCamZoomSpeedMultiplier
ENDIF
#ENDIF
IF IS_THIS_ROCKSTAR_MISSION_GANGOPS_MISSION_OF_TYPE(ciGANGOPS_FLOW_MISSION_IAABASE_FINALE)
HUD.ChopperZoomFactor = 5
ENDIF
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
HUD.fFOV += (TO_FLOAT(iZoom) / HUD.ChopperZoomFactor) * TIMESTEP() * iCamZoomSpeed
ELSE
HUD.fFOV += (TO_FLOAT(iZoom) / HUD.ChopperZoomFactor) * TIMESTEP()
ENDIF
// ENDIF
/*
if HUD.vCamRot .x < -20 and HUD.vCamRot .x > -35
float fovLimit = sin(absf(HUD.vCamRot .x))-25)
if fovLimit < 0.5 fovlimit = 0.5 endif
float minfov = 28 - (fovLimit * 23)
float fovToSet = HUD.fFOV
IF fovToSet < minfov HUD.fFOV = minfov endif
*/
if HUD.fFov > HUD.maxFOV
HUD.fFov = HUD.maxFOV
ENDIF
if HUD.fFov < HUD.minFOV
HUD.fFov = HUD.minFOV
ENDIF
SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(1.0)
//restrict camera pitch
/*
if HUD.fStickPitch < MAX_CAMERA_PITCH
HUD.fStickPitch = MAX_CAMERA_PITCH
ENDIF
if HUD.fStickPitch > MIN_CAMERA_PITCH
HUD.fStickPitch = MIN_CAMERA_PITCH
ENDIF
HUD.vCamRot = <<HUD.fStickPitch,0,HUD.fStickYaw>>
*/
//if not IS_ENTITY_DEAD(HUD.camEntity)
// HUD.chopperHeading = GET_ENTITY_HEADING(HUD.camEntity)
//ENDIF
//SET_CAM_ROT(HUD.camChopper,HUD.vCamRot)//+<<0,0,HUD.chopperHeading>>)
SET_CAM_FOV(HUD.camChopper,HUD.fFOV)
float fBlurOverride = (HUD.fFOV - 5.0) /42.0
SET_DISTANCE_BLUR_STRENGTH_OVERRIDE(fBlurOverride)
ENDIF
ENDIF
ENDIF
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "HUD.bIsCamAttached: ", HUD.bIsCamAttached, ", HUD.mpCamFudge = ", HUD.mpCamFudge)
if HUD.bIsCamAttached = TRUE and HUD.mpCamFudge=true
vector vGroundLoc = hud.vaimat
float fSphereRadius = GET_DISTANCE_BETWEEN_COORDS(vGroundLoc,GET_CAM_COORD(HUD.camChopper))//150.0 //distance to point on ground
HUD.vTargetedGround.x = (COS(HUD.vCamRot .x) * fSphereRadius) * sin(-HUD.vCamRot .z)
HUD.vTargetedGround.y = (COS(HUD.vCamRot .x) * fSphereRadius) * cos(-HUD.vCamRot .z)
HUD.vTargetedGround.z = (sin(HUD.vCamRot .x) * fSphereRadius)
HUD.vTargetedGround += GET_CAM_COORD(HUD.camChopper)
POINT_CAM_AT_COORD(HUD.camChopper,HUD.vTargetedGround)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "POINT_CAM_AT_COORD")
SET_CAM_FOV(HUD.camChopper,HUD.fFOV)
ENDIF
ENDIF
ELSE
if DOES_CAM_EXIST(HUD.camChopper)
if IS_CAM_ACTIVE(HUD.camChopper)
SET_CAM_ACTIVE(HUD.camChopper,FALSE)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC float angleToProportioon(float angle)
angle = angle%360
if angle < 0
angle += 360
ENDIF
angle /= 360.0
return angle
ENDFUNC
FUNC bool DISPLAY_SMALL_PED_DATA(structHelicopterHUDVars &HUD,int pedEntry,float fx, float fy,int r,int g,int b,float fScale,bool isThreat=FALSE)//int i,int r,int g,int b)
//string aString
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
if fScale < 0.7
fScale = 0.7
ENDIF
if fScale > 1.5
fScale = 1.5
ENDIF
TEXT_LABEL_15 tLabelA
int i
//get name from bit variable
#if ENABLE_ENHANCED_HUD_FEATURES
if HUD.pedScanList[pedEntry].iSpecialNameCase != -1
tLabelA = HUD.specialNames[HUD.pedScanList[pedEntry].iSpecialNameCase]
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
DISPLAY_TEXT(0.5,0.68,tLabelA,1)
ELSE
#ENDIF
IF IS_BIT_SET(HUD.pedScanList[pedEntry].BITpedData,8) // Is a multiplayer ped
// Find this player ped's name
/* //player can no longer be a criminal
INT iPlayer
REPEAT NUM_NETWORK_PLAYERS iPlayer
IF IS_NET_PLAYER_OK(INT_TO_PLAYERINDEX(iPlayer))
IF GET_PLAYER_PED(INT_TO_PLAYERINDEX(iPlayer)) = HUD.pedScanList[pedEntry].pedID
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(GET_PLAYER_NAME(INT_TO_PLAYERINDEX(iPlayer)))
END_TEXT_COMMAND_DISPLAY_TEXT(fx, fy)
ENDIF
ENDIF
ENDREPEAT
*/
ELSE
/*
for i = 0 to 23
if IS_BIT_SET(HUD.pedScanList[pedEntry].BITnamesAndCrimes,i)
if i < 8
tLabelA = "NAME_MA"
tLabelA+= i+1
i=15
ELSE
if i < 16
tLabelA += "NAME_FA"
tLabelA+= i-7
//sName += GET_STRING_FROM_TEXT_FILE(tName)
i=15
ELSE
tLabelB = "NAME_S"
tLabelB+= i-15
//sName += GET_STRING_FROM_TEXT_FILE(tName)
i=24
ENDIF
ENDIF
ENDIF
ENDFOR
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
//float fTWidth = GET_STRING_WIDTH(tLabelA)
DISPLAY_TEXT_WITH_TWO_STRINGS(0.5,0.68,"NAMES",tLabelA,tLabelB)
*/
ENDIF
#if ENABLE_ENHANCED_HUD_FEATURES
ENDIF
#ENDIF
int iCrimeCount//, iStringLength
// float ftotalLength
for i = 24 to 31
if IS_BIT_SET(HUD.pedScanList[pedEntry].BITnamesAndCrimes,i)
tLabelA = "crimes_"
tLabelA+= i-23
//SET_TEXT_FOR_HUD(r,g,b,fScale,true)
//if iStringLength + GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(tLabelA) + 2 < 24
/* if iCrimeCount>0
iStringLength+= 2
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
DISPLAY_TEXT(fx+ftotalLength,fy+(HUD.textSpace*fScale),"comma")
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
ftotalLength+= GET_STRING_WIDTH("comma")
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
ftotalLength+= (GET_STRING_WIDTH("space") * 0.3)
ENDIF*/
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
DISPLAY_TEXT(0.5,0.68+(0.037*(iCrimeCount+1)),tLabelA,1)
//SET_TEXT_FOR_HUD(r,g,b,fScale,true)
//ftotalLength+= GET_STRING_WIDTH(tLabelA)
// tCrimes += GET_STRING_FROM_TEXT_FILE(tName)
//SAVE_STRING_TO_DEBUG_FILE(tCrimes)
//SAVE_NEWLINE_TO_DEBUG_FILE()
//iStringLength += GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(tLabelA)
iCrimeCount++
//sENDIF
ENDIF
ENDFOR
if iCrimeCount = 0
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
DISPLAY_TEXT(fx,fy+(HUD.textSpace*fScale),"unknown",1)
ENDIF
if HUD.pedScanList[pedEntry].relType = HUD_FRIEND
SET_TEXT_FOR_HUD(r,g,b,0.43,isThreat)
DISPLAY_TEXT(fx,fy+(HUD.textSpace*fScale),"HUD_ID2",1)
//ELSE
// SET_TEXT_FOR_HUD(r,g,b,fScale,true)
// DISPLAY_TEXT_WITH_LITERAL_STRING(fx,fy+(HUD.textSpace*fScale),"string",tCrimes)
ENDIF
/*
if HUD.pedScanList[pedEntry].dataHeld = TRUE
if DOES_PED_HAVE_NAME(pedEntry) //not ARE_STRINGS_EQUAL(HUD.pedScanList[pedEntry].name,"")
DISPLAY_TEXT_WITH_LITERAL_STRING(fx,fy,"string",HUD.pedScanList[pedEntry].name)
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
if HUD.pedScanList[pedEntry].isCriminal = TRUE
if not ARE_STRINGS_EQUAL(HUD.pedStatus[HUD.pedScanList[pedEntry].status],"")
DISPLAY_TEXT(fx,fy+(HUD.textSpace*fScale),HUD.pedStatus[HUD.pedScanList[pedEntry].status])
ENDIF
ENDIF
if HUD.pedScanList[pedEntry].enhancedData = TRUE
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
if not ARE_STRINGS_EQUAL(HUD.pedScanList[pedEntry].crimes,"")
DISPLAY_TEXT_WITH_LITERAL_STRING(fx,fy+(HUD.textSpace*2*fScale),"string",HUD.pedScanList[pedEntry].crimes)
ENDIF
ENDIF
ENDIF
ELSE
if HUD.pedScanList[pedEntry].relType = HUD_FRIEND
if not ARE_STRINGS_EQUAL(HUD.pedScanList[pedEntry].name,"")
DISPLAY_TEXT_WITH_LITERAL_STRING(fx,fy,"string",HUD.pedScanList[pedEntry].name)
SET_TEXT_FOR_HUD(r,g,b,fScale,true)
DISPLAY_TEXT(fx,fy+(HUD.textSpace*fScale),"HUD_ID2")
ENDIF
ELSE
DISPLAY_TEXT(fx,fy,"unknown")
ENDIF
ENDIF
//DISPLAY_TEXT(0,0,pedStatus[0])
*/
return true
ENDFUNC
func float GET_BOX_SIZE(structHelicopterHUDVars &HUD,ped_index aPed, entity_index veh)
if not IS_ENTITY_DEAD(aPed)
vector vPedCoord = GET_WORLD_POSITION_OF_ENTITY_BONE(aPed,0)
if not IS_ENTITY_DEAD(veh)
float fPedRange = GET_DISTANCE_BETWEEN_COORDS(vPedCoord,GET_ENTITY_COORDS(veh))
float fBoxScaler = HUD.fRangeMultiplier / (HUD.fFOV * fPedRange)
if fBoxScaler < 0.4
fBoxScaler = 0.4
ENDIF
if fBoxScaler > 2.0
fBoxScaler = 2.0
ENDIF
RETURN fBoxScaler
ENDIF
endif
RETURN 0.0
ENDFUNC
PROC DRAW_RANGE_TEXT(float scale,vector v1, vector v2, float screenX, float screenY, int r, int g, int b)
float fRange = GET_DISTANCE_BETWEEN_COORDS(v1,v2,FALSE)
int iRange = floor(fRange)
SET_TEXT_FOR_HUD(r,g,b,scale,true)
if iRange < 10
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.015,"NUM_0",iRange)
else
if iRange < 100
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.015,"NUM_0",iRange)
ELSE
if iRange < 1000
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.015,"NUM_0",iRange)
ELSE
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.015,"NUM_0",iRange)
endif
ENDIF
ENDIF
ENDPROC
PROC DRAW_OFFSCREEN_ARROW_FOR_COORD(structHelicopterHUDVars &HUD,vector vDestCoord, int r=255, int g=255, int b=0)
float fpos
if DOES_CAM_EXIST(GET_RENDERING_CAM())
if not GET_SCREEN_COORD_FROM_WORLD_COORD(vDestCoord,fpos,fpos)
vector camCoord = GET_CAM_COORD(GET_RENDERING_CAM())
vector camRot = GET_CAM_ROT(GET_RENDERING_CAM())
float dist = GET_DISTANCE_BETWEEN_COORDS(<<camCoord.x,camCoord.y,0>>,<<vDestCoord.x,vDestCoord.y,0>>)
float height = vDestCoord.z - camCoord.z
float fPitchToPed
if dist > 0
fPitchToPed = ATAN(height/dist)
ELSE
fPitchToPed = 0
ENDIF
float fHeadingToPed = GET_HUD_HEADING_FROM_COORDS(camCoord,vDestCoord)
//float angleToPoint=ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1),SIN(lon2-lon1)*COS(lat2))
float angleToPoint=ATAN2(COS(camRot.x)*SIN(fPitchToPed)-SIN(camRot.x)*COS(fPitchToPed)*COS((fHeadingToPed*-1)-camRot.z),SIN((fHeadingToPed*-1)-camRot.z)*COS(fPitchToPed))
if HUD.fChopperSpeed > 0
endif
float sX = 0.5 - (cos(angleToPoint)*0.29)
float sY = 0.5 - (sin(angleToPoint)*0.29)
// float stx = 0.5 - (cos(angleToPoint)*0.25)
// float sty = 0.5 - (sin(angleToPoint)*0.25) - 0.02
DRAW_SPRITE("helicopterhud", "hudArrow", sX,sY , 0.02, 0.04, angleToPoint-90, r,g,b, 255,TRUE)
SET_TEXT_CENTRE(TRUE)
// DRAW_RANGE_TEXT(1.0,camCoord,vDestCoord,stx,sty,r,g,b)
ENDIF
ENDIF
ENDPROC
proc drawBoneBoxes(structHelicopterHUDVars &HUD,float fscanTime, float scanFirst, float scanDuration, float fNudgeX, float fNudgeY, float fBoxScaler, float fBoneX2, float fBoneX1, float fBoneY2, float fBoneY1, float scaler=1.0)
int iB
float fAlpha
float scanGap = scanDuration / 10.0 //0.03
for iB = 0 to 10
fAlpha = fscanTime - (scanFirst+(iB * scanGap)) //0.4 - (0.3 + 0.15)
if fAlpha > 0 and fAlpha < 0.3
fAlpha = SIN(fAlpha * 600.0)
DRAW_SPRITE("helicopterhud","hud_line",fNudgeX*iB,fNudgeY*iB,fBoxScaler*scaler*0.01,fBoxScaler*scaler*0.01,GET_ANGLE_BETWEEN_2D_VECTORS(0.0,1.0,fBoneX2-fBoneX1,fBoneY2-fBoneY1),hud.scanningColour.r,hud.scanningColour.g,hud.scanningColour.b,floor(fAlpha*32),TRUE)
ENDIF
ENDFOR
ENDPROC
proc draw_scan_ped(structHelicopterHUDVars &HUD,ped_index scanPed,float fscanTime, float fBoxscaler)
vector vBone1,vBone2
float fNudgeX,fNudgeY
float fBoneX1,fBoneY1,fBoneX2,fBoneY2
vector vNull = <<0,0,0>>
float scanFirst, scanDuration
//****************************** scan left leg **********************************
if fscanTime < 0.5
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_FOOT,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_CALF,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.0
scanDuration = 0.3
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud, fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
/*
for iB = 0 to 10
fAlpha = fscanTime - (scanFirst+(iB * scanGap))
if fAlpha > 0 and fAlpha < 0.1
fAlpha = SIN(fAlpha * 1800.0)
DRAW_NAMED_SPRITE("helicopterhud","hud_line",fNudgeX*iB,fNudgeY*iB,fBoxScaler*0.01,fBoxScaler*0.01,GET_ANGLE_BETWEEN_2D_VECTORS(0.0,1.0,fBoneX2-fBoneX1,fBoneY2-fBoneY1),0,255,0,floor(fAlpha*128))
ENDIF
ENDFOR
*/
//****************************** scan right leg **********************************
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_FOOT,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_CALF,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.0
scanDuration = 0.3
//scanGap = scanDuration / 10.0
drawBoneBoxes(HUD,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
/*
for iB = 0 to 10
fAlpha = fscanTime - (scanFirst+(iB * scanGap))
if fAlpha > 0 and fAlpha < 0.1
fAlpha = SIN(fAlpha * 1800.0)
DRAW_NAMED_SPRITE("helicopterhud","hud_line",fNudgeX*iB,fNudgeY*iB,fBoxScaler*0.01,fBoxScaler*0.01,GET_ANGLE_BETWEEN_2D_VECTORS(0.0,1.0,fBoneX2-fBoneX1,fBoneY2-fBoneY1),0,255,0,floor(fAlpha*128))
ENDIF
ENDFOR*/
ENDIF
if fscanTime > 0.15 and fscanTime < 0.7
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_CALF,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_THIGH,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.15
scanDuration = 0.3
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
//****************************** scan right leg **********************************
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_CALF,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_THIGH,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.15
scanDuration = 0.3
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
ENDIF
//body
if fscanTime > 0.3 and fscanTime < 1.0
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_PELVIS,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_NECK,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.3
scanDuration = 0.5
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1,2.0)
ENDIF
//head
if fscanTime > 0.6 and fscanTime < 1.0
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_HEAD,vnull)
vBone2 = vBone1 + ((vBone1 - GET_PED_BONE_COORDS(scanPed,BONETAG_NECK,vnull)) * 3.0)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.6
scanDuration = 0.3
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1,1.3)
ENDIF
//upper arms
if fscanTime > 0.6 and fscanTime < 1.0
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_UPPERARM,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_FOREARM,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.6
scanDuration = 0.3
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
//****************************** scan left arm **********************************
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_UPPERARM,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_FOREARM,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.6
scanDuration = 0.3
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
ENDIF
//lower arms
if fscanTime > 0.75 and fscanTime < 1.0
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_FOREARM,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_R_HAND,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.75
scanDuration = 0.25
//scanGap = scanDuration / 10.0
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
//****************************** scan left arm **********************************
if not IS_PED_INJURED(scanPed)
vBone1 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_FOREARM,vnull)
vBone2 = GET_PED_BONE_COORDS(scanPed,BONETAG_L_HAND,vnull)
SET_DRAW_ORIGIN(vBone1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone1,fBoneX1,fBoneY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vBone2,fBoneX2,fBoneY2)
fNudgeX = (fBoneX2-fBoneX1) / 10.0
fNudgeY = (fBoneY2-fBoneY1) / 10.0
ENDIF
scanFirst = 0.75
scanDuration = 0.3
drawBoneBoxes(hud,fscanTime,scanFirst,scanDuration,fNudgeX,fNudgeY,fBoxScaler,fBoneX2,fBoneX1,fBoneY2,fBoneY1)
ENDIF
/*
int iB
for iB = 0 to 9
DRAW_NAMED_SPRITE("helicopterhud","hud_line",fNudgeX*iB,fNudgeY*iB,fBoxScaler*0.01,fBoxScaler*0.01,GET_ANGLE_BETWEEN_2D_VECTORS(0.0,1.0,fBoneX2-fBoneX1,fBoneY2-fBoneY1),0,255,0,fAlpha)
ENDFOR
fXGap = fBoneX2 - fBoneX1
fYGap = fBoneY2 - fBoneY1
if fYGap >= fXGap
fMultiplier = fXGap / fYGap
ELSE
fMultiplier = fYGap / fXGap
ENDIF
fDrawOffset = fBoxScaler * fMultiplier
if fYGap >= fXGap
//DRAW_LINE_2D(0,0,fBoneX2-fBoneX1,fBoneY2-fBoney1,0.001,250,0,0,128)
//DRAW_LINE_2D(fBoneX1-fBoxScaler,fBoneY1-fDrawOffset,fBoneX2+fBoxScaler,fBoneY2+fDrawOffset,0.05,250,0,0,128)
ELSE
//DRAW_LINE_2D(0,0,fBoneX2-fBoneX1,fBoneY2-fBoney1,0.001,250,0,0,128)
//DRAW_LINE_2D(fBoneX1-fBoxScaler,fBoneY1-fDrawOffset,fBoneX2+fBoxScaler,fBoneY2+fDrawOffset,0.05,250,0,0,128)
ENDIF
*/
CLEAR_DRAW_ORIGIN()
ENDPROC
proc draw_ped_outline(structHelicopterHUDVars &HUD, vector vPedCoord,float fScale,int relType, int r=-1,int g=-1,int b=-1)//, bool bIsTargetted=FALSE)
int targetR,targetG,targetB
getHUDBoxColour(hud,relType,targetR,targetG,targetB)
SET_DRAW_ORIGIN(vPedCoord)
if r!=-1
targetR = r
targetG = g
targetB = b
ENDIF
fScale *= 0.03
DRAW_SPRITE("helicopterhud", "hud_corner",-fScale*0.5,-fScale,0.013,0.013,0,targetR,targetG,targetB, 200,TRUE)
DRAW_SPRITE("helicopterhud", "hud_corner",fScale*0.5,-fScale,0.013,0.013,90,targetR,targetG,targetB, 200,TRUE)
DRAW_SPRITE("helicopterhud", "hud_corner",-fScale*0.5,fScale,0.013,0.013,270,targetR,targetG,targetB, 200,TRUE)
DRAW_SPRITE("helicopterhud", "hud_corner",fScale*0.5,fScale,0.013,0.013,180,targetR,targetG,targetB, 200,TRUE)
/*IF bIsTargetted
DRAW_SPRITE("helicopterhud", "hud_corner",(-fScale*0.5)-0.003,(-fScale)-0.003,0.013,0.013,0,targetR,targetG,targetB, 200)
DRAW_SPRITE("helicopterhud", "hud_corner",(fScale*0.5)+0.003,-fScale-0.003,0.013,0.013,90,targetR,targetG,targetB, 200)
DRAW_SPRITE("helicopterhud", "hud_corner",(-fScale*0.5)-0.003,fScale+0.003,0.013,0.013,270,targetR,targetG,targetB, 200)
DRAW_SPRITE("helicopterhud", "hud_corner",(fScale*0.5)+0.003,fScale+0.003,0.013,0.013,180,targetR,targetG,targetB, 200)
ENDIF*/
CLEAR_DRAW_ORIGIN()
ENDPROC
proc displayChopperHud( structHelicopterHUDVars &HUD, bool onlyShowHudMarkers = FALSE,
FLOAT fMinHeadingOverride = MIN_CAMERA_HEADING, FLOAT fMaxHeadingOverride = MAX_CAMERA_HEADING)
if HUD.bDisplayHUD = TRUE
float fMulti
//fMulti = HUD.vCamRot.x / -75
fMulti = (HUD.vCamRot.x - HUD.AngHigh) / (HUD.angLow - HUD.AngHigh)
IF fMulti < 0 fMulti = 0 ENDIF
IF fMulti > 1 fMulti = 1 ENDIF
float fLowLOD,fHighLOD
fLowLod = HUD.angUpLow +((HUD.angDownLow-HUD.angUpLow)*fMulti)
fHighLod = HUD.angUpHigh +((HUD.angDownHigh-HUD.angUpHigh)*fMulti)
// cprintln(debug_Trevor3,"Low LOD = ",fLowLod," high lod = ",fHighLod)
REMAP_LODSCALE_RANGE_THIS_FRAME(1.7,4.7,fLowLod,fHighLod)
float fCheckSpeed = GET_ENTITY_SPEED(HUD.vehChopper)
IF fCheckSpeed > 30
SUPPRESS_HD_MAP_STREAMING_THIS_FRAME()
ENDIF
cprintln(debug_trevor3,"FORCE_ALLOW_TIME_BASED_FADING_THIS_FRAME()")
FORCE_ALLOW_TIME_BASED_FADING_THIS_FRAME()
int i
#if ENABLE_ENHANCED_HUD_FEATURES
IF IS_VEHICLE_DRIVEABLE(HUD.vehChopper)
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
SET_HELI_BLADES_FULL_SPEED(HUD.vehChopper)
ENDIF
ENDIF
IF HUD.minChopperHours != -1
IF HUD.maxChopperHours < HUD.minChopperHours
IF GET_CLOCK_HOURS() < HUD.minChopperHours
AND GET_CLOCK_HOURS()> HUD.maxChopperHours + 1
SET_CLOCK_TIME(HUD.minChopperHours,0,0)
ELSE
IF GET_CLOCK_HOURS() >= HUD.maxChopperHours
AND GET_CLOCK_HOURS() < HUD.minChopperHours
SET_CLOCK_TIME(HUD.maxChopperHours,0,0)
ENDIF
ENDIF
ELSe
IF GET_CLOCK_HOURS() < HUD.minChopperHours
SET_CLOCK_TIME(HUD.minChopperHours,0,0)
ELSE
IF GET_CLOCK_HOURS() >= HUD.maxChopperHours
SET_CLOCK_TIME(HUD.maxChopperHours,0,0)
ENDIF
ENDIF
ENDIF
ENDIF
#endif
int targetR, targetG, targetB
if (not HAS_STREAMED_TEXTURE_DICT_LOADED("helicopterhud")) or (onlyshowhudmarkers=FALSE AND not HAS_SCALEFORM_MOVIE_LOADED(mov))
cprintln(debug_trevor3,"no scaleform time: ",GET_GAME_TIMER())
HUD.bTexturesLoaded = FALSE
ELSE
HUD.fLineAWidth = (1.0 - (2*HUD.fLineAInset))
//SET_SPRITES_DRAW_BEFORE_FADE(true)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
IF onlyshowhudmarkers=FALSE
IF (g_iShouldLaunchTruckTurret != -1) AND HUD.bDelayRenderScriptCams
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "DISPLAYCHOPPERHUD: Delay rendering scaleform, waiting for NOT bDelayRenderScriptCams.")
ELSE
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD_PRIORITY_LOW)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(mov,255,255,255,0,1)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
IF NOT HUD.bTexturesLoaded
IF IS_VEHICLE_DRIVEABLE(hud.vehChopper)
IF GET_ENTITY_MODEL(hud.vehChopper) = POLMAV
AND GET_VEHICLE_LIVERY(hud.vehChopper) = 0
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_CAM_LOGO")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_CAM_LOGO")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_CAM_LOGO")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDIF
ENDIF
ENDIF
HUD.bTexturesLoaded = TRUE
ENDIF
if HUD.bTexturesLoaded = TRUE
IF onlyshowhudmarkers=FALSE
ENDIF
// CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(movieID,"METHOD_NAME",...))
//draw horiz marker at bottom of screen
/*
float markerPos = HUD.vCamRot.z + HUD.chopperHeading
startMarker = markerPos - (HUD.fFOV/2)
endMarker = markerPos + (HUD.fFov/2)
markerPos = angleToProportioon(markerPos)
startMarker = angleToProportioon(startMarker)
endMarker = angleToProportioon(endMarker)
IF onlyshowhudmarkers=FALSE
if startMarker > endMarker
drawX0 = 1.0 - HUD.fLineAInset - (HUD.fLineAWidth-(HUD.fLineAWidth * startMarker))
drawX1 = 1.0 - HUD.fLineAInset
DRAW_SPRITE("helicopterhud", "hud_block", (drawX0+drawX1)/2, HUD.hudBarY, (drawX1-drawX0)+0.02, 0.025,0, 7, 253, 30, 200)
DRAW_RECT((drawX0+drawX1)/2,HUD.hudBarY,drawX1-drawX0,0.01,HUD.colR,HUD.colG,HUD.colB,HUD.colA)
drawX0 = HUD.fLineAInset //1.0 - fLineAInset - (fLineAWidth * startMarker)
drawX1 = HUD.fLineAInset + (HUD.fLineAWidth * endMarker)
DRAW_SPRITE("helicopterhud", "hud_block", (drawX0+drawX1)/2, HUD.hudBarY, (drawX1-drawX0)+0.02, 0.025,0, 7, 253, 30, 200)
DRAW_RECT((drawX0+drawX1)/2,HUD.hudBarY,drawX1-drawX0,0.01,HUD.colR,HUD.colG,HUD.colB,HUD.colA)
ELSE
drawX0 = HUD.fLineAInset + (HUD.fLineAWidth * startMarker)
drawX1 = HUD.fLineAInset + (HUD.fLineAWidth * endMarker)
DRAW_SPRITE("helicopterhud", "hud_block", (drawX0+drawX1)/2, HUD.hudBarY, (drawX1-drawX0)+0.02, 0.025,0, 7, 253, 30, 200)
DRAW_RECT((drawX0+drawX1)/2,HUD.hudBarY,drawX1-drawX0,0.01,HUD.colR,HUD.colG,HUD.colB,HUD.colA)
ENDIF
ENDIF
*/
//Draw reticule over peds for face recognition
float xPos
float yPos
float nearX, nearY
VECTOR vPedCoord
float screenRange
float fPedRange
float fBoxDrawSize
// float fPitchtoPed
// float fPitchVariation
// float fHeadingToPed
// float fHeadingVariation
// float fAngletoPed
float closestRange = HUD.fMinFindPedOnScreenRange
float zHeight
int newNearestPed = -1
float fBoxScaler
// float fFontScale=0.319
// string sRange
vector vChopper
if not IS_ENTITY_DEAD(HUD.camEntity)
vChopper = GET_ENTITY_COORDS(HUD.camEntity)
ENDIF
if HUD.bDisableScanner = FALSE
//show off screen arrows for peds
i = 0
//reset this each frame
HUD.targetIsLost = FALSE
REPEAT COUNT_OF(HUD.pedScanList) i
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,9)
if DOES_ENTITY_EXIST(HUD.pedScanList[i].pedID)
if not IS_ENTITY_DEAD(HUD.pedScanList[i].pedID)
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,0) //scanned
switch HUD.pedScanList[i].relType
case HUD_FOE
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourtarget.r,hud.boxColourtarget.g,hud.boxColourtarget.b)
BREAK
case HUD_UNKNOWN
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourFriendly.r,hud.boxColourFriendly.g,hud.boxColourFriendly.b)
break
case HUD_FRIEND
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourUnscanned.r,hud.boxColourUnscanned.g,hud.boxColourUnscanned.b)
break
case HUD_BYSTANDER
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourFriendly.r,hud.boxColourFriendly.g,hud.boxColourFriendly.b)
break
ENDSWITCH
ELSE
if GET_CLOCK_HOURS() < 19 and GET_CLOCK_HOURS() > 7
//DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,fBoxDrawSize,fBoxDrawSize*2,0, 255,170,170) //targetR,targetG,targetB, 70)
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourUnscanned.r,hud.boxColourUnscanned.g,hud.boxColourUnscanned.b)
ELSE
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID,0),hud.boxColourUnscanned.r,hud.boxColourUnscanned.g,hud.boxColourUnscanned.b)
//DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,fBoxDrawSize,fBoxDrawSize*2,0, 130,64,64)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
if not IS_ENTITY_DEAD(HUD.camEntity)
GET_GROUND_Z_FOR_3D_COORD(vChopper,zHeight)
//scan one ped each frame to avoid to many LOS checks
if HUD.bShowTargetOffScreen = FALSE and HUD.iCurrentPedScanCount>0
for i = 0 to HUD.iCurrentPedScanCount-1
//REPEAT COUNT_OF(pedScanList) i
if DOES_ENTITY_EXIST(HUD.pedScanList[i].pedID)
if not IS_ENTITY_DEAD(HUD.pedScanList[i].pedID) and not IS_ENTITY_DEAD(PLAYER_PED_ID())
//vPedCoord = GET_ENTITY_COORDS(HUD.pedScanList[i].pedID)
vPedCoord = GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[i].pedID, 0)
if IS_ENTITY_ON_SCREEN(HUD.pedScanList[i].pedID)
xpos=0
ypos=0
fPedRange = GET_DISTANCE_BETWEEN_COORDS(vPedCoord,GET_ENTITY_COORDS(HUD.camEntity))
fBoxScaler = GET_BOX_SIZE(HUD,HUD.pedScanList[i].pedID,HUD.camEntity)
fBoxDrawSize = HUD.fBoxSize * fBoxScaler
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,2) or i = HUD.nearestPed //BIT = always show ped
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,0) //scanned = true
if TIMERA() - HUD.pedScanList[i].lastSeenTime < 500
#if enable_enhanced_hud_features
and not IS_VIEW_BLOCKED_BY_SPHERES(HUD,HUD.pedScanList[i].pedID)
and not IS_POINT_BLOCKED_BY_QUAD(GET_ENTITY_COORDS(HUD.pedScanList[i].pedID))
#endif
draw_ped_outline(hud,vPedCoord,fBoxScaler,HUD.pedScanList[i].relType)
HUD.pedScanList[i].vLostLocation = GET_ENTITY_COORDS(HUD.pedScanList[i].pedID)
ELSE
getHUDBoxColour(hud,HUD.pedScanList[i].relType,targetR,targetG,targetB)
SET_DRAW_ORIGIN(HUD.pedScanList[i].vLostLocation)
DRAW_SPRITE("helicopterhud", "TargetLost",xpos,ypos,fBoxDrawSize,fBoxDrawSize*2,0, targetR,targetG,targetB, 200,TRUE)
CLEAR_DRAW_ORIGIN()
// SET_TEXT_FOR_HUD(targetR,targetG,targetB,0.5,true)
SET_TEXT_FOR_HUD(targetR,targetG,targetB,0.5,true)
/*
#if enable_enhanced_hud_features
IF NOT HUD.bBlockTargetLost
#endif
DISPLAY_TEXT(0.5,0.68,"HUD_LST")
#if enable_enhanced_hud_features
ENDIF
#endif */
HUD.targetIsLost = true
ENDIF
ELSE
getHUDBoxColour(hud,HUD_UNKNOWN,targetR,targetG,targetB)
IF i = HUD.nearestPed
draw_ped_outline(hud,vPedCoord,fBoxScaler,HUD.pedScanList[i].relType,hud.boxColourUnscanned.r,hud.boxColourUnscanned.g,hud.boxColourUnscanned.b)//,TRUE)
ELSE
draw_ped_outline(hud,vPedCoord,fBoxScaler,HUD.pedScanList[i].relType,hud.boxColourUnscanned.r,hud.boxColourUnscanned.g,hud.boxColourUnscanned.b)
ENDIF
ENDIF
if IS_BIT_SET(HUD.pedScanList[i].BITPedData,7)
draw_ped_outline(hud,vPedCoord,fBoxScaler,HUD.pedScanList[i].relType,227,24,234)
//SET_DRAW_ORIGIN(vPedCoord)
//DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,fBoxDrawSize*1.1,(fBoxDrawSize*2)*1.1,0, 227,24,234, 200)
//CLEAR_DRAW_ORIGIN()
ENDIF
ENDIF
int iHit
iHit = 0
vector vTemp1
vTemp1 = <<0,0,0>>
ENTITY_INDEX hitEntity
hitEntity = NULL
SWITCH GET_SHAPE_TEST_RESULT(HUD.pedScanList[i].shapeTest,iHit,vTemp1,vTemp1,hitEntity)
CASE SHAPETEST_STATUS_NONEXISTENT //create a new shape test
vector v1,v2
v1 = GET_ENTITY_COORDS(hud.vehChopper)
v2 = GET_ENTITY_COORDS(HUD.pedScanList[i].pedID) + <<0,0,0.5>>
HUD.pedScanList[i].shapeTest = START_SHAPE_TEST_LOS_PROBE(v1,v2,SCRIPT_INCLUDE_MOVER)
BREAK
CASE SHAPETEST_STATUS_RESULTS_READY
IF iHit = 0 //nothing is blocking shapetest.
HUD.pedScanList[i].lastSeenTime = TIMERA()
//HUD.pedScanList[i].vLostLocation = GET_ENTITY_COORDS(HUD.pedScanList[i].pedID)
ENDIF
BREAK
ENDSWITCH
if TIMERA() - HUD.pedScanList[i].lastSeenTime < 1500 or IS_BIT_SET( HUD.pedScanList[i].BITPedData,0) //scanned = true
if HUD.fSightRangeMultiplier2/(HUD.fFOV*fPedRange) > 1.0
GET_SCREEN_COORD_FROM_WORLD_COORD(vPedCoord,xpos,ypos)
screenRange = SQRT(((xPos-0.5)*(xPos-0.5))+((yPos-0.5)*(yPos-0.5)))
//save_debug("screen range:",-1,screenRange)
//save_debug("closestRange:",-1,closestRange)
if screenRange < closestRange
nearX = xPos
nearY = yPos
nearX =nearX
nearY = nearY
closestRange = screenRange
newNearestPed = i
//save_debug("new near ped:",i)
ENDIF
ENDIF
ENDIF
CLEAR_DRAW_ORIGIN()
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
HUD.iPedGivenLOScheck++
if HUD.iPedGivenLOScheck > HUD.iCurrentPedScanCount-1
HUD.iPedGivenLOScheck = 0
ENDIF
ENDIF
if HUD.nearestPed != newNearestPed
IF HUD.soundID_scan != -1
IF HAS_SOUND_FINISHED(HUD.soundID_scan)
PLAY_SOUND_FRONTEND(HUD.soundID_scan,"COP_HELI_CAM_BLEEP")
ENDIF
ENDIF
ENDIF
HUD.nearestPed = newNearestPed
HUD.scanning = FALSE
if HUD.nearestPed!= -1 and HUD.canScan = true
//if ped hasn't already been scanned
if not is_bit_set(HUD.pedScanList[HUD.nearestPed].BITPedData,0) //scanned = FALSE
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL,INPUT_SCRIPT_RT)
//is ped within scan range
if HUD.fSightRangeMultiplier/(HUD.fFOV*fPedRange) > 0.5
#if ENABLE_ENHANCED_HUD_FEATURES
AND NOT IS_POINT_BLOCKED_BY_QUAD(GET_ENTITY_COORDS(HUD.pedScanList[HUD.nearestPed].pedID))
AND NOT IS_VIEW_BLOCKED_BY_SPHERES(HUD,HUD.pedScanList[HUD.nearestPed].pedID)
#endif
IF HUD.rangeSoundPlaying = TRUE
IF HUD.soundID_scanRange != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanRange)
STOP_SOUND(HUD.soundID_scanRange)
ENDIF
ENDIF
HUD.rangeSoundPlaying = FALSE
ENDIF
HUD.scanning = TRUE
//has scan completed?
if HUD.pedScanList[HUD.nearestPed].fScanTime < 1.0
IF HUD.soundID_scanloop != -1
IF HAS_SOUND_FINISHED(HUD.soundID_scanloop)
PLAY_SOUND_FRONTEND(HUD.soundID_scanloop,"COP_HELI_CAM_SCAN_PED_LOOP")
ENDIF
ENDIF
closestRange = ABSF(1.0 - closestRange)
HUD.pedScanList[HUD.nearestPed].fScanTime += (closestRange * TIMESTEP()) /3.5
fBoxScaler = GET_BOX_SIZE(HUD,HUD.pedScanList[HUD.nearestPed].pedID,HUD.camEntity)
fBoxDrawSize = HUD.fBoxSize * fBoxScaler
SET_TEXT_FOR_HUD(255,0,0,0.5,true)
//-(fBoxDrawSize/2)+(fBoxDrawSize*0.04),ypos+fBoxDrawSize+0.005
IF TIMERA()%600<300
//DISPLAY_TEXT(nearX-(HUD.fBoxSize/2.0),nearY+(HUD.fBoxSize/2.0)+HUD.fTextY,"scan")
DISPLAY_TEXT(0.5,0.68,"scan",1)
// DISPLAY_TEXT_WITH_LITERAL_STRING(nearX-(HUD.fBoxSize/2.0),nearY+(HUD.fBoxSize/2.0)+HUD.fTextY,"STRING","SCANNING...")
ENDIF
fBoxScaler = GET_BOX_SIZE(HUD,HUD.pedScanList[HUD.nearestPed].pedID,HUD.camEntity)
fBoxDrawSize = 0.03//(HUD.fBoxSize * fBoxScaler)-0.01
SET_DRAW_ORIGIN(GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[HUD.nearestPed].pedID, 0))
draw_scan_ped(HUD,HUD.pedScanList[HUD.nearestPed].pedID,HUD.pedScanList[HUD.nearestPed].fScanTime,fBoxScaler)
CLEAR_DRAW_ORIGIN()
ELSE
if IS_BIT_SET(HUD.pedScanList[HUD.nearestPed].BITPedData,3) //bAlwaysShowOnceScanned = true
SET_BIT(HUD.pedScanList[HUD.nearestPed].BITPedData,2) //bAlwaysShow = TRUE
ENDIF
SET_BIT(HUD.pedScanList[HUD.nearestPed].BITPedData,0) //scanned = TRUE
HUD.lastScannedPed=HUD.pedScanList[HUD.nearestPed].pedID
//sounds
IF HUD.soundID_scanloop != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanloop)
STOP_SOUND(HUD.soundID_scanloop)
ENDIF
ENDIF
IF HUD.pedScanList[HUD.nearestPed].relType = HUD_FOE
IF HUD.soundID_scangood != -1
IF HAS_SOUND_FINISHED(HUD.soundID_scangood)
PLAY_SOUND_FRONTEND(HUD.soundID_scangood,"COP_HELI_CAM_SCAN_PED_SUCCESS")
ENDIF
ENDIF
ELSE
IF HUD.soundID_scanbad != -1
IF HAS_SOUND_FINISHED(HUD.soundID_scanbad)
PLAY_SOUND_FRONTEND(HUD.soundID_scanbad,"COP_HELI_CAM_SCAN_PED_FAILURE")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
fBoxScaler = GET_BOX_SIZE(HUD,HUD.pedScanList[HUD.nearestPed].pedID,HUD.camEntity)
fBoxDrawSize = HUD.fBoxSize * fBoxScaler
SET_TEXT_FOR_HUD(255,0,0,0.5,true)
DISPLAY_TEXT(0.5,0.68,"HUD_RNG")
IF NOT HUD.rangeSoundPlaying
cprintln(debug_trevor3,"TRY BLEEP 1")
IF HUD.soundID_scanRange != -1
cprintln(debug_trevor3,"TRY BLEEP 2")
IF HAS_SOUND_FINISHED(HUD.soundID_scanRange)
cprintln(debug_trevor3,"BLEEP BLEEP")
PLAY_SOUND_FRONTEND(HUD.soundID_scanRange,"COP_HELI_CAM_BLEEP_TOO_FAR")
HUD.rangeSoundPlaying = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HUD.rangeSoundPlaying = TRUE
IF HUD.soundID_scanRange != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanRange)
STOP_SOUND(HUD.soundID_scanRange)
ENDIF
ENDIF
HUD.rangeSoundPlaying = FALSE
ENDIF
ENDIF
ELSE
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL,INPUT_SCRIPT_RT)
OR (GET_GAME_TIMER() < HUD.scanButtonPressedRemovalTimer AND HUD.lastIdentifiedPed = HUD.nearestPed)
if not IS_ENTITY_DEAD(HUD.pedScanList[HUD.nearestPed].pedID)
if (TIMERA() - HUD.pedScanList[HUD.nearestPed].lastSeenTime < 500)
IF NOT HUD.targetIsLost
HUD.lastIdentifiedPed = HUD.nearestPed
HUD.scanButtonPressedRemovalTimer = GET_GAME_TIMER() + 3000
SET_DRAW_ORIGIN(GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[HUD.nearestPed].pedID, 0))
fBoxScaler = GET_BOX_SIZE(HUD,HUD.pedScanList[HUD.nearestPed].pedID,HUD.camEntity)
//GET_SCREEN_COORD_FROM_WORLD_COORD(GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[HUD.nearestPed].pedID, 0),xpos,ypos)
xpos=0
ypos=0
//GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(HUD.pedScanList[HUD.nearestPed].pedID),xpos,ypos)
getHUDBoxColour(HUD,HUD.pedScanList[HUD.nearestPed].relType,targetR,targetG,targetB)
CLEAR_DRAW_ORIGIN()
IF HUD.pedScanList[HUD.nearestPed].relType = 2
DISPLAY_SMALL_PED_DATA(HUD,HUD.nearestPed,xpos-(fBoxDrawSize/2)+(fBoxDrawSize*0.04),ypos+fBoxDrawSize+0.005,targetR,targetG,targetB,fBoxScaler,TRUE)
ELSE
DISPLAY_SMALL_PED_DATA(HUD,HUD.nearestPed,xpos-(fBoxDrawSize/2)+(fBoxDrawSize*0.04),ypos+fBoxDrawSize+0.005,targetR,targetG,targetB,fBoxScaler)
ENDIF
endif
endif
ENDIF
ENDIF
ENDIF
ENDIF
if HUD.scanning = FALSE
IF HUD.soundID_scanloop != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanloop)
STOP_SOUND(HUD.soundID_scanloop)
ENDIF
ENDIF
ENDIF
ENDIF
if HUD.helihudMarkerCount>0
for i = 0 to MAX_HELIHUD_COORD_COUNT-1
if HUD.helihudMarker[i].entry != -1
if GET_SCREEN_COORD_FROM_WORLD_COORD(HUD.helihudMarker[i].coord,xpos,ypos)
vector camCoord
IF DOES_ENTITY_EXIST(HUD.vehChopper) AND IS_VEHICLE_DRIVEABLE(HUD.vehChopper)
camCoord = GET_ENTITY_COORDS(hud.vehChopper)
ELif DOES_ENTITY_EXIST(hud.camEntity) and not IS_ENTITY_DEAD(hud.camEntity)
camCoord = GET_ENTITY_COORDS(hud.camEntity)
ENDIF
SET_DRAW_ORIGIN(HUD.helihudMarker[i].coord)
xpos = 0.0
ypos = 0.0
if HUD.helihudMarker[i].markerType = MARKER_BOX //for fake ped box at long range
fPedRange = GET_DISTANCE_BETWEEN_COORDS(HUD.helihudMarker[i].coord,camCoord)
fBoxScaler = HUD.fRangeMultiplier / (HUD.fFOV * fPedRange)
if fBoxScaler < 0.4
fBoxScaler = 0.4
ENDIF
if fBoxScaler > 2.0
fBoxScaler = 2.0
ENDIF
draw_ped_outline(hud,HUD.helihudMarker[i].coord,fBoxScaler,0)
SET_DRAW_ORIGIN(HUD.helihudMarker[i].coord)
// DRAW_SPRITE("helicopterhud", "hud_outline", xpos, ypos, 0.022,0.042,0,HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b,255)
// DRAW_RANGE_TEXT(HUD.fTextRangeScale,vChopper,HUD.helihudMarker[i].coord,xpos-0.011,ypos+0.005,HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b)
ELSE
DRAW_SPRITE("helicopterhud", "hud_dest", xpos, ypos, 0.042,0.042,0, HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b,255,TRUE)
// DRAW_RANGE_TEXT(HUD.fTextRangeScale,vChopper,HUD.helihudMarker[i].coord,xpos,ypos,HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b)
ENDIF
CLEAR_DRAW_ORIGIN()
//draw numerical range on screen
ELSE
if HUD.helihudMarker[i].markerType = MARKER_BOX
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,HUD.helihudMarker[i].coord,HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b)
ELSE
DRAW_OFFSCREEN_ARROW_FOR_COORD(HUD,HUD.helihudMarker[i].coord,HUD.helihudMarker[i].r,HUD.helihudMarker[i].g,HUD.helihudMarker[i].b)
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
if onlyshowhudmarkers = FALSE
float fDrawAng = HUD.vCamRot.z
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
fDrawAng = HUD.vAttachedCamRotationOffset.z
ENDIF
vector vPos = <<0.0, 0.0 ,0.0>>
FLOAT fArrowPos, fHeliHeading, fBarMinH, fBarMaxH, fBarCamH
if DOES_ENTITY_EXIST(hud.camEntity)
if not IS_ENTITY_DEAD(hud.camEntity)
vPos = GET_ENTITY_COORDS(hud.camEntity)
fHeliHeading = GET_ENTITY_HEADING(hud.camEntity)
ENDIF
ENDIF
IF g_iShouldLaunchTruckTurret != -1
IF g_iShouldLaunchTruckTurret = 2
OR g_iShouldLaunchTruckTurret = 3
fHeliHeading = fHeliHeading -174.4552
ENDIF
ENDIF
//Make camera more than 0
WHILE fDrawAng < 0.0 fDrawAng += 360.0 ENDWHILE
WHILE fDrawAng > 360.0 fDrawAng -= 360.0 ENDWHILE
//Make Heli heading more than 0
WHILE fHeliHeading < 0.0 fHeliHeading += 360.0 ENDWHILE
WHILE fHeliHeading > 360.0 fHeliHeading -= 360.0 ENDWHILE
//The heading is = to the cam heading
fBarCamH = fDrawAng
IF g_iShouldLaunchTruckTurret != -1
//Get the min heading !! THIS IS ACTUALLY MAX, DON'T BLAME ME - AMEC
fBarMinH = fHeliHeading - ABSF(fMaxHeadingOverride)
//get the max heading !! THIS IS ACTUALLY MIN, DON'T BLAME ME - AMEC
fBarMaxH = fHeliHeading + ABSF(fMinHeadingOverride)
ELIF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(HUD.vehChopper)
OR DOES_INTERIOR_USE_FLYING_CAM_TURRETS()
//Get the min heading
fBarMinH = -(HUD.fMaxCameraYaw*0.5)
//get the max heading
fBarMaxH = (HUD.fMaxCameraYaw*0.5)
ELSE
//Get the min heading
fBarMinH = fHeliHeading - HUD.fMaxCameraYaw
//get the max heading
fBarMaxH = fHeliHeading + HUD.fMaxCameraYaw
ENDIF
//If its a radian out then move it
IF fBarCamH < fBarMinH
AND (fBarCamH + 360.0) <= fBarMaxH
fBarCamH += 360.0
ENDIF
IF fBarCamH > fBarMaxH
AND (fBarCamH - 360.0) >= fBarMinH
fBarCamH -= 360.0
ENDIF
//Get the current heading as a ratio between these and make it a %
fArrowPos = (fBarCamH - fBarMinH)/(fBarMaxH - fBarMinH)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "### SUMMARY ###")
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fHeliHeading = ", fHeliHeading)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fBarMinH = ", fBarMinH)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fBarMaxH = ", fBarMaxH)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fBarCamH = ", fBarCamH)
// CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = ", fArrowPos)
//Cap it
IF fArrowPos = 2.0
fArrowPos = 0.0
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 0.0 x")
ELIF fArrowPos = -1.0
fArrowPos = 1.0
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 1.0 x")
ELIF fArrowPos < 0.0
AND fArrowPos >= -0.5
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 0.0")
fArrowPos = 0.0
ELIF fArrowPos < 0.0
AND fArrowPos > -1.0
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 1.0 y")
fArrowPos = 1.0
ELIF fArrowPos > 1.5
AND fArrowPos < 2.0
fArrowPos = 0.0
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 0.0 y")
ELIF fArrowPos > 2.0
OR fArrowPos < -1.0
fArrowPos = 0.5
//CDEBUG1LN(DEBUG_NET_GUN_TURRET, "fArrowPos = 0.5")
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov,"SET_ALT_FOV_HEADING")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(vPos.z)
IF NETWORK_IS_GAME_IN_PROGRESS()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fArrowPos)
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT((hud.fFOV - hud.minFOV) / (HUD.maxFOV - hud.minFOV))
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fDrawAng)
END_SCALEFORM_MOVIE_METHOD()
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
IF NOT HUD.bDisplayMinimap
HIDE_HUD_AND_RADAR_THIS_FRAME()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
#if ENABLE_ENHANCED_HUD_FEATURES
PROC FIX_CHOPPER_HUD_TIME(structHelicopterHUDVars &HUD,int iHoursMin, int iHoursMax)
HUD.minChopperHours = iHoursMin
HUD.maxChopperHours = iHoursMax
ENDPROC
#endif
FUNC STRING GET_SCALEFORM_MOVIE_TURRET_HUD()
IF IS_PLAYER_IN_ARMORY_AIRCRAFT(PLAYER_ID())
OR IS_PLAYER_IN_CREATOR_AIRCRAFT(PLAYER_ID())
OR IS_PLAYER_IN_ARMORY_TRUCK(PLAYER_ID())
OR IS_PLAYER_IN_CREATOR_TRAILER(PLAYER_ID())
OR g_iInteriorTurretSeat != -1
RETURN "turret_cam"
ENDIF
RETURN "heli_cam"
ENDFUNC
FUNC BOOL SET_CHOPPER_HUD_ACTIVE(structHelicopterHUDVars &HUD,entity_INDEX vChopper, bool setActive, VEHICLE_INDEX vHeli, bool rememberData=FALSE)
vector vCoords, vrot
#if ENABLE_ENHANCED_HUD_FEATURES
hud.lastpos = <<0,0,0>>
#ENDIF
if setActive = TRUE and HUD.bHUDIsActive = FALSE
IF HUD.onlyshowhudmarkers=FALSE
IF g_iShouldLaunchTruckTurret != -1
mov = REQUEST_SCALEFORM_MOVIE(GET_SCALEFORM_MOVIE_TURRET_HUD())
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "SET_CHOPPER_HUD_ACTIVE: Using turret specific UI: turret_cam.")
ELSE
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "SET_CHOPPER_HUD_ACTIVE: Using heli specific UI: heli_cam.")
mov = REQUEST_SCALEFORM_MOVIE(GET_SCALEFORM_MOVIE_TURRET_HUD())
ENDIF
ENDIF
REQUEST_STREAMED_TEXTURE_DICT("helicopterhud")
#IF IS_DEBUG_BUILD
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(true)
#ENDIF
IF NOT DOES_CAM_EXIST(HUD.camChopper)
HUD.bIsCamAttached = FALSE
HUD.camChopper = CREATE_CAM("default_scripted_camera",FALSE)
IF IS_VEHICLE_SUITABLE_FOR_VEHICLE_SEAT_TURRET(vHeli)
OR DOES_INTERIOR_USE_TURRETS()
HUD.nearClip = 0.1
ENDIF
SET_CAM_NEAR_CLIP(HUD.camChopper,HUD.nearClip)
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "SET_CHOPPER_HUD_ACTIVE: CREATE_CAM: default_scripted_camera")
//SET_CAM_CUSTOM_MAX_NEAR_CLIP(HUD.camChopper,HUD.maxNearClip)
ENDIF
#if ENABLE_ENHANCED_HUD_FEATURES
HUD.moveByCamera = true
#ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_HELICAM)
SET_MULTIHEAD_SAFE(TRUE,TRUE)
if not IS_ENTITY_DEAD(vChopper)
if not IS_ENTITY_DEAD(PLAYER_PED_ID())
// if IS_PED_IN_VEHICLE(PLAYER_PED_ID(),vChopper)
if IS_ENTITY_A_VEHICLE(vChopper)
hud.vehchopper = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(vChopper)
#if ENABLE_ENHANCED_HUD_FEATURES
IF NOT HUD.isMultiplayerMode
SET_ENTITY_HAS_GRAVITY(hud.vehChopper,FALSE)
ENDIF
#endif
SET_LIGHTS_CUTOFF_DISTANCE_TWEAK(300)
ENDIF
SET_LIGHTS_CUTOFF_DISTANCE_TWEAK(300)
HUD.bMoveChopper = TRUE
HUD.bActivateChopperCam = TRUE
HUD.bDisplayHUD = TRUE
HUD.canScan = true
HUD.camEntity = vChopper
vCoords = GET_ENTITY_COORDS(vChopper)
HUD.fChopperHeight = vCoords.z
vrot = GET_ENTITY_ROTATION(vChopper)
hud.chopperHeading = vRot.z
IF HUD.isMultiplayerMode
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_ALLOW_PLAYER_DAMAGE|SPC_PREVENT_EVERYBODY_BACKOFF)
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
ELSE
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
//SET_PLAYER_CONTROL(PLAYER_ID(),FALSE)
SET_EVERYONE_IGNORE_PLAYER(player_id(),TRUE)
ENDIF
#if ENABLE_ENHANCED_HUD_FEATURES
vector vVel = GET_ENTITY_VELOCITY(vChopper)
hud.lastVx = vVel.x
hud.lastVy = vVel.y
#ENDIF
PUSH_TIMECYCLE_MODIFIER()
#if USE_TU_CHANGES
MODEL_NAMES eHeliModel
IF IS_VEHICLE_DRIVEABLE(HUD.vehChopper)
eHeliModel = GET_ENTITY_MODEL(HUD.vehChopper)
ENDIF
IF eHeliModel = BUZZARD
OR eHeliModel = SAVAGE
SET_TIMECYCLE_MODIFIER("heliGunCam")
ELIF eHeliModel = VALKYRIE
OR eHeliModel = HUNTER
SET_TIMECYCLE_MODIFIER("heliGunCam")
ELSE
IF g_iShouldLaunchTruckTurret != -1
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "SET_CHOPPER_HUD_ACTIVE: Delay timecycle modifiers.")
ELSE
SET_TIMECYCLE_MODIFIER("eyeinthesky")
CDEBUG1LN(DEBUG_NET_GUN_TURRET, "SET_CHOPPER_HUD_ACTIVE: Set timecycle modifier: eyeinthesky")
ENDIF
ENDIF
#endif
#IF NOT USE_TU_CHANGES
IF HUD.isMultiplayerMode
SET_TIMECYCLE_MODIFIER("MP_heli_cam")
ELSE
cprintln(debug_trevor3,"Set modifier 1")
SET_TIMECYCLE_MODIFIER("eyeinthesky")
ENDIF
#endif
PRINTLN("PUSH_TIMECYCLE_MODIFIER()")
CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE)
float zHeight
GET_GROUND_Z_FOR_3D_COORD(vCoords,zHeight)
HUD.GroundHeightAccum = zHeight*10
IF HUD.bAudioLoaded = TRUE
IF HUD.soundID_background != -1
IF g_iShouldLaunchTruckTurret = -1
IF HAS_SOUND_FINISHED(HUD.soundID_background)
PLAY_SOUND_FRONTEND(HUD.soundID_background,"COP_HELI_CAM_BACKGROUND")
ENDIF
ENDIF
ENDIF
ENDIF
controlAudio(HUD)
HUD.bHUDIsActive = true
ENDIF
ENDIF
//SCRIPT_ASSERT("SET_CHOPPER_HUD_ACTIVE(): Vehicle doesn't exist.")
return FALSE
ELSE
if HUD.bHUDIsActive = true and setActive = true
if HUD.bTexturesLoaded = FALSE
displayChopperHud(HUD)
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
Else
return true
ENDIF
ENDIF
if HUD.bHUDIsActive = true and setActive = FALSE
//SAVE_STRING_TO_DEBUG_FILE("turn off")
if rememberData = FALSE
HUD.iCurrentPedScanCount = 0
ENDIF
HUD.bMoveChopper = FALSE
HUD.bActivateChopperCam = FALSE
HUD.bDisplayHUD = FALSE
HUD.camEntity = null
HUD.canScan = FALSE
HUD.lastScannedPed = null
#if ENABLE_ENHANCED_HUD_FEATURES
clearHoverInArea(hud)
#ENDIF
if not IS_ENTITY_DEAD(PLAYER_PED_ID())
ENABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
SET_EVERYONE_IGNORE_PLAYER(player_id(),FALSE)
//SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
ENDIF
#IF IS_DEBUG_BUILD
//DELETE_WIDGET_GROUP(HUD.CopChopperWidget)
#ENDIF
IF IS_VEHICLE_DRIVEABLE(hud.vehChopper)
IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(hud.vehChopper)
DETACH_ENTITY(hud.vehChopper)
ENDIF
IF NOT HUD.isMultiplayerMode
FREEZE_ENTITY_POSITION(hud.vehChopper,FALSE)
SET_ENTITY_INVINCIBLE(hud.vehChopper,FALSE)
SET_ENTITY_HAS_GRAVITY(hud.vehChopper,TRUE)
SET_VEHICLE_GRAVITY(hud.vehChopper,TRUE)
ENDIF
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
IF DOES_CAM_EXIST(HUD.camChopper)
if IS_CAM_ACTIVE(HUD.camChopper)
SET_CAM_ACTIVE(HUD.camChopper,FALSE)
ENDIF
if IS_CAM_RENDERING(HUD.camChopper)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
ENDIF
DESTROY_CAM(HUD.camChopper)
ENDIF
IF HUD.soundID_zoom != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_zoom)
STOP_SOUND(HUD.soundID_zoom)
ENDIF
ENDIF
IF HUD.soundID_turn != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_turn)
STOP_SOUND(HUD.soundID_turn)
ENDIF
ENDIF
IF HUD.soundID_scan != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scan)
STOP_SOUND(HUD.soundID_scan)
ENDIF
ENDIF
IF HUD.soundID_scanloop != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanloop)
STOP_SOUND(HUD.soundID_scanloop)
ENDIF
ENDIF
IF HUD.soundID_scangood != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scangood)
STOP_SOUND(HUD.soundID_scangood)
ENDIF
ENDIF
IF HUD.soundID_scanbad != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanbad)
STOP_SOUND(HUD.soundID_scanbad)
ENDIF
ENDIF
IF HUD.soundID_background != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_background)
STOP_SOUND(HUD.soundID_background)
ENDIF
ENDIF
IF HUD.soundID_scanRange != -1
IF NOT HAS_SOUND_FINISHED(HUD.soundID_scanRange)
STOP_SOUND(HUD.soundID_scanRange)
ENDIF
ENDIF
IF HUD.bAudioLoaded = TRUE
RELEASE_AMBIENT_AUDIO_BANK()
RELEASE_SOUND_ID(HUD.soundID_background)
RELEASE_SOUND_ID(HUD.soundID_zoom)
RELEASE_SOUND_ID(HUD.soundID_turn)
RELEASE_SOUND_ID(HUD.soundID_scan)
RELEASE_SOUND_ID(HUD.soundID_scanloop)
RELEASE_SOUND_ID(HUD.soundID_scangood)
RELEASE_SOUND_ID(HUD.soundID_scanbad)
RELEASE_SOUND_ID(HUD.soundID_scanRange)
HUD.soundID_background = -1
HUD.soundID_zoom = -1
HUD.soundID_turn = -1
HUD.soundID_scan = -1
HUD.soundID_scanloop = -1
HUD.soundID_scangood = -1
HUD.soundID_scanbad = -1
HUD.soundID_scanRange = -1
HUD.bAudioLoaded = FALSE
ENDIF
// SAVE_STRING_TO_DEBUG_FILE("CLEAR_TIMECYCLE_MODIFIER()")
CLEAR_TIMECYCLE_MODIFIER()
cprintln(debug_trevor3,"clear modifier 1")
CASCADE_SHADOWS_SET_AIRCRAFT_MODE(FALSE)
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("helicopterHUD")
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
POP_TIMECYCLE_MODIFIER()
SET_MULTIHEAD_SAFE(FALSE)
#IF IS_DEBUG_BUILD
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE)
#ENDIF
#if ENABLE_ENHANCED_HUD_FEATURES
hud.bSphereBlockersActive = FALSE
int iR
IF DOES_ENTITY_EXIST(hud.camEntity)
REPEAT COUNT_OF(hud.sphereBlocker) iR
hud.sphereBlocker[iR].inUse = FALSE
ENDREPEAT
ENDIF
#endif
hud.vehChopper = null
HUD.bHUDIsActive = FALSE
controlAudio(HUD)
return TRUE
ENDIF
ENDIF
return FALSE
ENDFUNC
/*
PROC ControlCops(structHelicopterHUDVars &HUD)
if HUD.bAllowPedOrders = TRUE
//deselect ped
if IS_BUTTON_JUST_PRESSED(PAD1,TRIANGLE)
if HUD.iSelectedPed != -1
HUD.iSelectedPed = -1
ENDIF
ENDIF
if IS_BUTTON_JUST_PRESSED(PAD1,CROSS)
if HUD.iSelectedPed = -1
if HUD.nearestPed != -1
if HUD.pedScanList[HUD.nearestPed].relType = HUD_FRIEND
HUD.iSelectedPed = HUD.nearestPed
ENDIF
ENDIF
ELSE
if HUD.iSelectedPed = HUD.nearestPed
HUD.iSelectedPed =-1
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
*/
func bool GET_LAST_SCANNED_PED(structHelicopterHUDVars &HUD, ped_index &returnedPed)
if does_entity_exist(HUD.lastScannedPed)
returnedPed = HUD.lastScannedPed
HUD.lastScannedPed = null
return true
ELSE
return FALSE
ENDIF
ENDFUNC
func bool IS_PED_BEING_SCANNED(structHelicopterHUDVars &HUD, PED_INDEX checkPed)
if HUD.scanning = true and HUD.nearestPed = GET_PED_ENTRY_IN_SCAN_LIST(HUD,checkPed)
return true
ENDIF
return FALSE
ENDFUNC
func int GET_HELIHUD_SELECTED(structHelicopterHUDVars &HUD, bool isPedScanned, ped_index &selectedPed, int &selectedPedentry, vector &selectedCoord)
if HUD.nearestPed != -1
if (isPedScanned = true and IS_BIT_SET(HUD.pedScanList[HUD.nearestPed].bitPedData,0)) or (isPedScanned = FALSE)
if HUD.pedScanList[HUD.nearestPed].relType = HUD_FRIEND
selectedPed = HUD.pedScanList[HUD.nearestPed].pedID
selectedPedentry = HUD.nearestPed
return 1
ELSE
if HUD.pedScanList[HUD.nearestPed].relType = HUD_BYSTANDER
selectedPed = HUD.pedScanList[HUD.nearestPed].pedID
return 3
ELSE
if HUD.pedScanList[HUD.nearestPed].relType = HUD_FOE
selectedPed = HUD.pedScanList[HUD.nearestPed].pedID
return 4
ELSE
if HUD.pedScanList[HUD.nearestPed].relType = HUD_UNKNOWN
selectedPed = HUD.pedScanList[HUD.nearestPed].pedID
return 5
ELSE
if not IS_ENTITY_DEAD(HUD.pedScanList[HUD.nearestPed].pedID)
// vector vPedCoords = GET_WORLD_POSITION_OF_ENTITY_BONE(HUD.pedScanList[HUD.nearestPed].pedID, 0)
// GET_ENTITY_COORDS(HUD.pedScanList[HUD.nearestPed].pedID)
selectedCoord = hud.vaimat
return 2
ELSE
return 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
return 0
ENDIF
ELSE
if DOES_ENTITY_EXIST(selectedPed)
if not IS_ENTITY_DEAD(selectedPed)
// vector vPedCoords = GET_WORLD_POSITION_OF_ENTITY_BONE(selectedPed,0)
selectedCoord = hud.vaimat
HUD.selectedPed = null
return 2
ELSE
selectedCoord = hud.vaimat
return 0
ENDIF
ELSE
selectedCoord = hud.vaimat
return 0
ENDIF
ENDIF
return 0
ENDFUNC
func bool IS_HELIHUD_CAM_FOCUSING_PED(structHelicopterHUDVars &HUD,ped_index checkPed)
if not IS_ENTITY_DEAD(checkPed) and not IS_ENTITY_DEAD(HUD.camEntity)
IF IS_ENTITY_ON_SCREEN(checkPed)
float fWidth = TAN(HUD.fFov/2.0) * GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(HUD.camEntity),GET_WORLD_POSITION_OF_ENTITY_BONE(checkPed,0))
if fWidth < HUD.fCheckHUDFocusRange
return TRUE
ENDIF
ENDIF
ENDIF
return FALSE
ENDFUNC
func bool GET_HELIHUD_SELECTED_PED(structHelicopterHUDVars &HUD, ped_index &selectedPed)
if HUD.nearestPed =-1
return FALSE
ELSE
selectedPed = HUD.pedScanList[HUD.nearestPed].pedID
RETURN TRUE
ENDIF
ENDFUNC
func ped_index GET_OBSERVED_HELIHUD_PED(structHelicopterHUDVars &HUD)
if HUD.nearestPed != -1
IF HUD.fFov < 15
RETURN HUD.pedScanList[HUD.nearestPed].pedID
ENDIF
ENDIF
RETURN NULL
ENDFUNC
PROC ALLOW_HELIHUD_COP_ORDER(structHelicopterHUDVars &HUD,bool switchOrdersOn)
if switchOrdersOn = TRUE
HUD.bAllowPedOrders = true
ELSE
HUD.bAllowPedOrders = FALSE
ENDIF
ENDPROC
PROC SET_HUD_TO_SHOW_FOR_HELI(structHelicopterHUDVars &HUD,bool enableMinimap)
HUD.bDisplayMinimap = enableMinimap
ENDPROC
PROC RUN_HELICOPTER_HUD(structHelicopterHUDVars &HUD, bool onlyShowPedMarkers = FALSE,
FLOAT fMinPitchOverride = MIN_CAMERA_PITCH, FLOAT fMaxPitchOverride = MAX_CAMERA_PITCH,
FLOAT fMinHeadingOverride = MIN_CAMERA_HEADING, FLOAT fMaxHeadingOverride = MAX_CAMERA_HEADING,
FLOAT fDeadzoneMagnitude = 0.15)
if DOES_CAM_EXIST(HUD.camChopper)
//SET_CAM_CUSTOM_MAX_NEAR_CLIP(HUD.camChopper,HUD.maxNearClip)
endif
if DOES_ENTITY_EXIST(hud.vehchopper)
hud.camEntity = CONVERT_TO_ENTITY_INDEX(hud.vehchopper)
ENDIF
if HUD.bHUDInitiated = FALSE
IF CHOPPER_INIT(HUD,onlyShowPedMarkers)
HUD.bHUDInitiated = TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
debugChopper(HUD)
if bshowlist = TRUE
debugShowScanList(HUD)
ENDIF
#ENDIF
IF onlyShowPedMarkers=FALSE
GET_HUD_COORD(HUD) //this runs bevore controlchoppercamera and it finds the coord of the chopper camera before it is attached to the chopper!
#if ENABLE_ENHANCED_HUD_FEATURES
moveChopper(HUD)
#ENDIF
ControlChopperCamera(HUD, fMinPitchOverride, fMaxPitchOverride, fMinHeadingOverride, fMaxHeadingOverride, fDeadzoneMagnitude)
ReviseHudMarkers(HUD)
ENDIF
controlAudio(HUD)
displayChopperHud(HUD, onlyShowPedMarkers, fMinHeadingOverride, fMaxHeadingOverride)
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
ENDIF
ENDPROC