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

1279 lines
36 KiB
XML
Executable File

USING "minigames_helpers.sch"
USING "minigame_UIInputs.sch"
USING "socialclub_leaderboard.sch"
USING "script_conversion.sch"
USING "cheat_controller_public.sch"
USING "golf_buddies.sch"
USING "script_usecontext.sch"
USING "golf_splash.sch"
#IF NOT DEFINED(COMPILE_LOOKUPS)
CONST_INT COMPILE_LOOKUPS 0
#ENDIF
#IF NOT DEFINED(PUTTING_GREEN)
CONST_INT PUTTING_GREEN 0
#ENDIF
#IF NOT DEFINED(GOLF_IS_AI_ONLY)
CONST_INT GOLF_IS_AI_ONLY 0
#ENDIF
#IF NOT DEFINED(GOLF_USE_FALLTHROUGH_WORLD_CHECK)
CONST_INT GOLF_USE_FALLTHROUGH_WORLD_CHECK 0
#ENDIF
#IF IS_DEBUG_BUILD
VECTOR vRingScale = <<0, 0, 1>>
VECTOR vRingColour = <<0.037, 0.185, 0>>
Float fRingAlpha = 0.0
VECTOR vDebugBounds1 = <<-1274.15, 186.79, 61.970>>
VECTOR vDebugBounds2 = << -1255.380, 185.870, 0.0>>
VECTOR vDebugBounds3 = << -1326.063, 192.648, 61.760>>
VECTOR vDebugBounds4 = <<-1325.440, 183.78, 0.0>>
VECTOR vDebugBounds5 = << -1159.35, 226.630, 70>>
VECTOR vDebugBounds6 = <<-1152.920, 203.93, 0.0>>
BOOL bDisableNaturalClubSpinEffects = FALSE
#ENDIF
BOOL bPCGolfControlsSetup = FALSE
/// PURPOSE:
/// Initialises the PC controls in a safe way
PROC SETUP_PC_GOLF_CONTROLS()
IF bPCGolfControlsSetup = FALSE
INIT_PC_SCRIPTED_CONTROLS("Golf")
bPCGolfControlsSetup = TRUE
ENDIF
ENDPROC
// Cleans up the golf controls in a safe way
PROC CLEANUP_PC_GOLF_CONTROLS()
IF bPCGolfControlsSetup
SHUTDOWN_PC_SCRIPTED_CONTROLS()
bPCGolfControlsSetup = FALSE
ENDIF
ENDPROC
/// PURPOSE:
/// Meters to yards conversion, since the game runs on meters, but golf is traditionally represented in Yards/Feet
/// PARAMS:
/// fMeters - Meters to convert to yards
/// RETURNS:
/// Number of yards
FUNC FLOAT METERS_TO_YARDS(FLOAT fMeters)
RETURN fMeters * 1.0936133
ENDFUNC
FUNC FLOAT YARDS_TO_METERS(FLOAT fYards)
RETURN fYards/1.0936133
ENDFUNC
FUNC FLOAT FEET_TO_METERS(FLOAT fFeet)
RETURN fFeet*0.3048
ENDFUNC
FUNC FLOAT INCH_TO_CM(FLOAT fInch)
RETURN fInch * 2.54
ENDFUNC
/// PURPOSE:
/// Meters to feet conversion, since the game runs on meters, but golf is traditionally represented in Yards/Feet
/// PARAMS:
/// fMeters - Meters to convert to feet
/// RETURNS:
/// Number of feet
//FUNC FLOAT METERS_TO_FEET(FLOAT fMeters)
// RETURN fMeters * 3.2808
//ENDFUNC
TWEAK_FLOAT MAGIC_DISTANCE_CONVERSION 1.85 // This is so we can make the existing hole seem like the right length. Displayed distances are multiplied by this, and club tunings are divided by
//TWEAK_FLOAT predictWood1 1.0
//TWEAK_FLOAT predictWood3 1.0
//TWEAK_FLOAT predictWood5 70.0
//TWEAK_FLOAT predictIron3 65.0
//TWEAK_FLOAT predictIron4 60.0
//TWEAK_FLOAT predictIron5 55.0
//TWEAK_FLOAT predictIron6 50.0
//TWEAK_FLOAT predictIron7 45.0
//TWEAK_FLOAT predictIron8 40.0
//TWEAK_FLOAT predictIron9 35.0
//TWEAK_FLOAT predictPitch 30.0
//TWEAK_FLOAT predictSand 25.0
//TWEAK_FLOAT predictLob 20.0
TWEAK_INT CONST_TEE_PREVIEW_0 1000
TWEAK_INT CONST_TEE_PREVIEW_1 1300
TWEAK_INT CONST_TEE_PREVIEW_2 2500
TWEAK_INT CONST_TEE_PREVIEW_3 1200
TWEAK_INT CONST_TEE_PREVIEW_4 2000
TWEAK_INT CONST_TEE_PREVIEW_5 1800
TWEAK_INT CONST_TEE_PREVIEW_6 2000
TWEAK_INT CONST_TEE_PREVIEW_7 1800
TWEAK_INT CONST_TEE_PREVIEW_8 2100
TWEAK_INT CONST_GRAPH_TYPE 1
/// PURPOSE: Bitfield enum for controlling help and objective prints
ENUM GOLF_STREAMING_FLAGS
GSF_NO_STREAM_FLAG = 0,
GSF_STREAM_CUTBACK_AFTER_SHOT = BIT0,
GSF_STREAM_NEXT_SHOT_FOR_SKIPPING = BIT1,
GSF_END_GAME_XP_CALCULATED = BIT2,
GSF_SET_HELPER_BLIP_ADDRESS_NAME = BIT10,
GSF_SET_HELPER_BLIP_IN_FLIGHT_NAME = BIT11,
GSF_SKIP_AI_PRESSED = BIT12,
GSF_REACTION_CAMERA_SET_UP = BIT13,
GSF_SUCCESSFUL_LEADERBOARD_WRITE = BIT17,
GSF_DONT_ALLOW_SOCIAL_CLUB = BIT18,
GSF_SCORECARD_SOUND_PLAYED = BIT19,
GSF_SCORECARD_STREAMVOL_LOADED = BIT20,
GSF_SCORECARD_STREAMVOL_LOADINGNEXT = BIT21,
GSF_SCORECARD_INITIAL_LOAD_DONE = BIT22,
GSF_FORCE_SCORECARD_VOL_LOAD = BIT23,
GSF_TURNED_OFF_EXPANDED_MAP = BIT24
ENDENUM
/// PURPOSE: Enumeration for the state machine for the golf scripts
ENUM GOLF_MINIGAME_STATE
GMS_UNDEFINED = -1,
GMS_PRE_INIT,
GMS_PRE_INIT_WAIT,
GMS_INIT,
GMS_INIT_STREAMING_DONE,
GMS_INIT_POST_STREAMING,
GMS_INIT_DONE,
GMS_PLAY_GOLF,
GMS_EXIT_OK,
GMS_SCOREBOARD_OVERRIDE,
GMS_CLEANUP,
GMS_OUTRO_QUIT,
GMS_OUTRO_INIT,
GMS_OUTRO,
GMS_REMATCH,
GMS_FAIL,
GMS_RESET
ENDENUM
CONST_INT BIT31 (BIT30 * 2) // -2147483648 for 32-bit signed int, this definition works with code.
/// PURPOSE: Bitfield enumeration for human player control to commmunicate with AI foursomes
ENUM GOLF_CONTROL_FLAGS
GCF_NO_FLAGS = 0,
GCF_PLAYER_SKIP = BIT0,
GCF_PLAYER_DONE_WITH_HOLE = BIT1,
GCF_PLAYER_DONE_WITH_SHOT = BIT2,
GCF_AI_HIT_BALL_THIS_FRAME = BIT3,
GCF_WAS_PERFECT_HIT = BIT4,
GCF_BALL_JUST_HIT = BIT5,
GCF_BALL_JUST_LAND = BIT6,
GCF_BALL_OOB = BIT7,
GCF_STOP_INPUT = BIT8,
GCF_TELPORT_CART = BIT9,
GCF_MOVE_TO_REMATCH_SCREEN = BIT10,
GCF_MP_START_QUIT_MENU = BIT11,
GCF_MP_SYNC_SPLASH_TEXT = BIT12,
GCF_MOVE_TO_NEXT_SHOT_MP = BIT13,
GCF_MOVE_TO_NEXT_HOLE_MP = BIT14,
GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE = BIT15,
GCF_OPPONENT_DONE_WITH_SHOT = BIT16,
GCF_DONE_WITH_GAME = BIT17,
GCF_PLAYED_HIT_PARTICLE_EFFECT_MP = BIT18,
GCF_PLAYED_LAND_PARTICLE_EFFECT_MP = BIT19,
GCF_PLAYED_HIT_SOUND_EFFECT_MP = BIT20,
GCF_PLAYED_LAND_SOUND_EFFECT_MP = BIT21,
GCF_TURN_OFF_SCOREBOARD_MP_OVERRIDE = BIT22,
GCF_MP_OUTRO = BIT23, //send game to outro scene
GCF_MP_PLAYED_BALL_IN_HOLE_SOUND = BIT24,
GCF_BALL_IN_CUP_SOUND = BIT25,
GCF_DISPLAY_QUITTER = BIT26,
GCF_USING_CUTSCENE_SHADOW = BIT27,
GCF_BALL_POP_SOUND = BIT28,
GCF_BALL_IN_FOLIAGE = BIT29,
GCF_IS_FRIEND_ACTIVITY = BIT30,
GCF_PLAYER_NO_SKIP = BIT31 // This is so dangerous
ENDENUM
//Flags for the server
ENUM GOLF_CONTROL_FLAGS2
GCF2_NO_FLAG = 0,
GCF2_NEW_GOLFER_IS_SET = BIT1,
GCF2_SYNC_BALL_IN_WATER_SOUND = BIT2,
GCF2_BALL_CONTACT_SYNCED = BIT5,
GCF2_GO_TO_REMATCH = BIT6,
GCF2_PLAYER_HAS_TELEPORTED = BIT7,
GCF2_DETACH_GOLF_CLUB = BIT8,
GFC2_DISPLAYING_QUITING_PLAYER = BIT9,
GFC2_AT_GOLF_SCOREBOARD = BIT10,
GCF2_KICK_PLAYER = BIT12,
GCF2_VIEWING_ADDRESS_BALL = BIT20
ENDENUM
ENUM GOLF_UI_CONTROL
GUC_NONE = 0,
GUC_REFRESH_PERMANENT = BIT0,
GUC_REFRESH_INPUT = BIT1,
GUC_REFRESH_PUTT = BIT2,
GUC_REFRESH_NAVIGATE = BIT3,
GUC_REFRESH_ADDRESS = BIT4,
GUC_REFRESH_SWING = BIT5,
GUC_REFRESH_FLIGHT = BIT6,
GUC_REFRESH_AT_REST = BIT7,
GUC_REFRESH_IN_HOLE = BIT8,
GUC_REFRESH_FLOATING = BIT10,
GUC_REFRESH_GOLF_TRAIL = BIT11,
GUC_MP_PLAYERS_ADDED = BIT12,
GUC_USE_FILL_QUALITY = BIT13,
GUC_DISABLE_UI = BIT14,
GUC_END_GOLF_SCOREBOARD = BIT15,
GUC_DISABLE_FADE_IN = BIT16,
GUC_DISPLAY_NEW_BEST_SCORE = BIT17,
GUC_DISPLAY_FIR = BIT18,
GUC_DISPLAY_GIR = BIT19,
GUC_DISPLAY_LONGEST_DRIVE = BIT20,
GUC_DISPLAY_LONGEST_HOLE = BIT21,
GUC_DISPLAY_CLOSEST_TO_PIN = BIT22,
GUC_SPLASH_TEXT_DISPLAYED_THIS_TURN = BIT23,
GUC_SOCIAL_CLUB_BOARD_DISPLAYED = BIT24,
GUC_SOCIAL_CLUB_UI_DISPLAYED = BIT25,
GUC_SWING_METER_DISPLAYED = BIT26,
GUC_END_GAME_SPLASH_DISPLAYED = BIT27,
GUC_STYLE_HELP_DISPLAYED = BIT28,
GUC_SELECT_PLAYERS_DISPLAYED = BIT29,
GUC_SCOREBOARD_DISPLAYED = BIT30
ENDENUM
ENUM GOLF_DIALOGUE_FLAG
GDF_NONE = 0,
GDF_PARTNER_SAID_AIM_WARNING = BIT0,
GDF_PLAYER_GET_IN_CART = BIT1
ENDENUM
ENUM GOLF_HELP_DISPLAYED_FLAG
GHD_NONE = 0,
GHD_WOOD_DISPLAYED = BIT1,
GHD_IRON_DISPLAYED = BIT2,
GHD_WEDGE_DISPLAYED = BIT3,
GHD_PUTTER_DISPLAYED = BIT4,
GHD_STYLE_POWER_DISPLAYED = BIT5,
GHD_STYLE_APPROACH_DISPLAYED = BIT6,
GHD_STLYE_PUNCH_DISPLAYED = BIT7,
GHD_WARNING_UNPLAYABLE_LIE = BIT8,
GHD_WARNING_NEAR_LIMIT = BIT9,
GHD_WARNING_HAZARD_ROUGH = BIT10,
GHD_WARNING_HAZARD_SAND = BIT11,
GHD_WARNING_KICK_FOR_TIME = BIT12,
GHD_DISPLAY_UNPLAYABLE_LIE_HELP = BIT15,
GHD_DISPLAY_SCORECARD_HELP = BIT26,
GHD_START_TIE = BIT27,
GHD_APPROCH_BALL_FOOT_DISPLAYED = BIT28,
GHD_GOLF_TERMINATED_DISPLAYED = BIT30
ENDENUM
ENUM GOLF_KEYS_IN_USE_FLAG
GOLF_KEY_NONE = 0,
GOLF_KEY_SOCIAL_CLUB = BIT1,
GOLF_KEY_CONTINUE = BIT2,
GOLF_KEY_SCROLL = BIT3,
GOLF_KEY_QUIT = BIT4,
GOLF_KEY_REPLAY = BIT5,
GOLF_KEY_PROFILE = BIT6,
GOLF_KEY_ON_TEE = BIT7
ENDENUM
ENUM GOLF_OOB_REASON
OOB_NONE = 0,
OOB_WATER,
OOB_UKNOWN_LIE,
OOB_ON_WRONG_GREEN,
OOB_UNPLAYABLE_LIE,
OOB_OUTSIDE_BOUNDING_PLANES,
OOB_OUTSIDE_HOLE_BOUNDING_SPHERES,
OOB_RESTRICTIVE_POSITION
ENDENUM
ENUM GOLF_STATS_FLAG
GSF_NONE = 0,
GSF_UPDATED_STAT_SCORE = BIT1, //Updated Birdie Stat recently, so we should avoid calling it until the next hole
GSF_UPDATE_SOME_OTHER_STAT = BIT2
ENDENUM
//List of splash text, used for syncing splash text over network
ENUM GOLF_SPLASH_TEXT_ENUM
GOLF_SPLASH_NONE = 0,
GOLF_SPLASH_HOLE_IN_ONE,
GOLF_SPLASH_EAGLE2,
GOLF_SPLASH_EAGLE,
GOLF_SPLASH_BIRDIE,
GOLF_SPLASH_PAR,
GOLF_SPLASH_BOGEY,
GOLF_SPLASH_BOGEY2,
GOLF_SPLASH_BOGEY3,
GOLF_SPLASH_BOGEY4,
GOLF_SPLASH_BOGEY5,
GOLF_SPLASH_FIR,
GOLF_SPLASH_GIR,
GOLF_SPLASH_LONGEST_DIVE,
GOLF_SPLASH_LONGEST_HOLE,
GOLF_SPLASH_CLOSEST_TO_PIN,
GOLF_SPLASH_OOB,
GOLF_SPLASH_WATER,
GOLF_SPLASH_UNPLAYABLE,
GOLF_SPLASH_OBSTRUCTED,
GOLF_SPLASH_SCORE_LIMIT,
GOLF_SPLASH_PERFECT_HIT
ENDENUM
ENUM GOLF_UI_DISPLAY_STATE
GOLF_DISPLAY_NONE = 0,
GOLF_DISPLAY_HOLE = BIT0,
GOLF_DISPLAY_SHOT = BIT1,
GOLF_DISPLAY_METER = BIT2,
GOLF_DISPLAY_PLAYERCARD = BIT3,
GOLF_DISPLAY_SCOREBOARD = BIT4,
GOLF_DISPLAY_ALL = -1
ENDENUM
ENUM SHOT_DISPLAY_STATE
SHOT_DISPLAY_NONE = 0,
SHOT_DISPLAY_LIE = BIT0,
SHOT_DISPLAY_WIND = BIT1,
SHOT_DISPLAY_CLUB = BIT2,
SHOT_DISPLAY_SWING = BIT3,
SHOT_DISPLAY_SPIN = BIT4,
SHOT_DISPLAY_SHOT_NUM = BIT5,
SHOT_DISPLAY_ALL = -1
ENDENUM
ENUM GOLF_DISPLAYED_CONTROLS_STATE
GDCS_NONE = 0,
GDCS_SETUP_INTRO_KEYS,
GDCS_SETUP_SCOREBOARD_KEYS,
GDCS_SETUP_SOCIAL_CLUB_KEYS,
GDCS_SETUP_GOLF_SCOREBOARD_CONTROLS,
GDCS_SETUP_GOLF_NAV_CONTROLS,
GDCS_SETUP_GOLF_ADRESS_CONTROLS,
GDCS_SETUP_GOLF_SPECTATE_COMPUTER_CONTROLS,
GDCS_SETUP_GOLF_SPECTATE_MP_CONTROLS,
GDCS_SETUP_GOLF_BALL_IN_FLIGHT_CONTROLS,
GDCS_SETUP_GOLF_FAIL_CONTROLS
ENDENUM
USING "golf_clubs.sch"
/// PURPOSE: Single data representation for the golf game - contains global data used by all foursomes
STRUCT GOLF_GAME
GOLF_BAG golfBag
VECTOR vWindDirection
FLOAT fOldWindHeading
FLOAT fWindStrength
FLOAT fOldWindStrength
GOLF_CONTROL_FLAGS golfControlFlags
BOOL bPlayoffGame = FALSE
INT iPlayoffRound = 0
ENDSTRUCT
USING "golf_course.sch"
USING "golf_swing_meter.sch"
USING "golf_player.sch"
USING "golf_foursome.sch"
/// PURPOSE: State machine for intro cutscene
ENUM GOLF_INTRO_STATE
GIS_INTRO_FLYOVER_INIT,
GIS_INTRO_FLYOVER_CAMERA1,
GIS_INTRO_FLYOVER_CAMERA2,
GIS_INTRO_FLYOVER_CAMERA3,
GIS_INTRO_FLYOVER_CLEANUP,
GIS_INTRO_FLYOVER_OVER
ENDENUM
//the type of camera the spectating player is using
ENUM SPECTATOR_CAMERA_STATE
GOLF_SPECTATOR_ADDRESS_CAM = 0,
GOLF_SPECTATOR_CINEMATIC_CAM,
GOLF_SPECTATOR_POV_CAM
ENDENUM
STRUCT GOLF_TRAIL
VECTOR position0, velocity0, checkPointPos
FLOAT velocityScale, z1
VECTOR radius, colorStart, colorMid, colorEnd, vAlpha
INT numControlPoints, tessellation
BOOL ascend
FLOAT pixelThickness, pixelExpansion, fadeOpacity, fadeExponentBias, textureFill
ENDSTRUCT
STRUCT GOLF_INSTRUCTIONS
FLOAT fInstrRectX
FLOAT fInstrRectY
FLOAT fInstrRectWidth
FLOAT fInstrRectHeight
FLOAT fInstrTextX
FLOAT fInstrTextY
ENDSTRUCT
/// PURPOSE: Utility and helper data used by the local machine player for display of his foursome and thier play
STRUCT GOLF_HELPERS
SCALEFORM_INDEX golfUI
SCALEFORM_INDEX floatingUI
SCALEFORM_INDEX leaderboardUI
COMPLEX_USE_CONTEXT useContext
GOLF_UI_DISPLAY_STATE eCurrentGolfUIDisplay
GOLF_UI_DISPLAY_STATE ePreviousGolfUIDisplay
SHOT_DISPLAY_STATE eShotDisplayState
GOLF_UI_CONTROL golfUIControl
GOLF_DIALOGUE_FLAG golfDialogueFlag
GOLF_HELP_DISPLAYED_FLAG golfHelpDisplayed //the help text was displayed, display no longer
GOLF_HELP_DISPLAYED_FLAG golfHelpDisplaying //the help text is currently displaying
INT golfKeysInUse
GOLF_STATS_FLAG golfStatsFlag
GOLF_TRAIL golfTrail
GOLF_INSTRUCTIONS golfInstructionsBox
GOLF_BUDDIES currentBuddies
REL_GROUP_HASH golfersRelationshipHash
GROUP_INDEX golfGroupIndex
PED_VARIATION_STRUCT sPedVariations
PED_VARIATION_STRUCT sFriendVariation
PED_VARIATION_STRUCT sFriendVariationB
VEHICLE_INDEX playerLastVehicle
MODEL_NAMES vehicleName
INT iVehicleColor
INT iTimesPlayedGolf
structPedsForConversation golfConversation
//CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
GOLF_STREAMING_FLAGS golfStreaming
INT soundRolling = -1
CAMERA_INDEX camNavigate
CAMERA_INDEX camNavigate2
CAMERA_INDEX camFlight
CAMERA_INDEX camAddress
CAMERA_INDEX camPreview
CAMERA_INDEX camPreviewSplineForward
CAMERA_INDEX camLookAtGreen
CAMERA_INDEX camReaction
CAMERA_INDEX camMPApproach
CAMERA_INDEX camUpStart
CAMERA_INDEX camUpEnd
CAMERA_INDEX camPauseAnimCamera
CAMERA_INDEX camFlyover1, camFlyover2, camFlyover2End, camFlyover3
// VECTOR vMPApproachStartPos
// VECTOR vMPApproachStartRot
FLOAT fPreviewSplinePhase
FLOAT fHoleSplinePhase, fHoleSplineStartPhase
VECTOR vPreviewCamFinalPos
VECTOR vAdressCamStartPos
VECTOR vSpectateCamOffset
INT iNumTimesFallThroughWorldCheckFailed
VECTOR vLastSafeBallPosition
VECTOR vLastGoodAddressCamPos
FLOAT fCosShotAngleDevation
FLOAT fPlayerHeadingAtShot
GOLF_INTRO_STATE introState
SPECTATOR_CAMERA_STATE spectatorCamState
BOOL bTransitionToShotCamOver
BOOL bShotPreviewCam
INT bGreenPreviewCam
BOOL bJustSwitchedSpectatorCam
BOOL bIntroSkipped
INT iNumAutoSwings
INT iBlockNavMeshIndex = -1
INT iLastEndCameraIndex
INT iMatchHistoryID
BOOL bJustExitQuit
BOOL bGameIsReplay
BOOL bPlayerInVehicle
BOOL bAllowPlayerViewCam
BOOL bWantsTeleport
BOOL bKeepPlayerInvisible[MP_GOLF_MAX_PLAYERS]
STRUCTTIMER uiTimer // Generic UI timer (used for scoreboards, etc
STRUCTTIMER navTimer // Generic gameplay timer
STRUCTTIMER inputTimer // Generic input timer
STRUCTTIMER cameraTimer // Generic camera timer
STRUCTTIMER resetTimer
STRUCTTIMER taskTimer
STRUCTTIMER idleSpeechTimer
STRUCTTIMER idleTimer
STRUCTTIMER quitTimer //when player quits, gives us a little delay to display stuff
STRUCTTIMER skipTimer //Timeout for skiping to the next player shot
GOLF_SPLASH_TEXT_ENUM eLastSplashText
SWING_STYLE eLastPuttStyle
SWING_STYLE eLastSwingStyle
// Moved from PLAYER struct
OBJECT_INDEX objLongestDriveMarker
BLIP_INDEX blipCenterOfCourse
BLIP_INDEX blipPlayersBalls[MP_GOLF_MAX_PLAYERS]
BLIP_INDEX blipCurrentHole
BLIP_INDEX blipCurrentEstimate
BOOL bInputCleared
BOOL bWin = FALSE
BOOL bEndResetScriptCam = TRUE
INT iStartingHole
INT iEndingHole
INT iXPGained
VEHICLE_SETUP_STRUCT sPlayerVehicle
STREAMVOL_ID steamVolNextShot
STREAMVOL_ID streamVolScorecard
TEXT_LABEL_31 sAudioContext
TEXT_LABEL_23 sFailReason
PED_INDEX pedAudio
INT iCastroIndex = -1
GOLF_DISPLAYED_CONTROLS_STATE golfDisplayedControls
#IF GOLF_IS_MP
PED_INDEX pedSpectating
SCENARIO_BLOCKING_INDEX golfScenarioBlockingIndex
PED_COMP_NAME_ENUM eFeetProp = DUMMY_PED_COMP
#ENDIF
ENDSTRUCT
CONST_INT MAX_NUMBER_OF_GOLF_TRAIL_PROBES 13
#IF NOT GOLF_IS_AI_ONLY
SHAPETEST_INDEX golfTrailShapeTest[MAX_NUMBER_OF_GOLF_TRAIL_PROBES]
//INT iFramesForResults
INT iGolfShapeTestFlags
INT iLastSectionCompleted
VECTOR vLastValidIntersect
GOLF_LIE_TYPE eIntersectLie
INT iGolfResetSceneID = -1
BOOL bAllowLeaderboardUpload = TRUE
#ENDIF
#IF IS_DEBUG_BUILD
BOOL displayLines = FALSE
BOOL bDebugDrawForces = FALSE // DEBUG
BOOL bReattachClub
BOOL bDebugDrawAI
BOOL bRepositionPlayer
BOOL bOcclusionCheck
BOOL bInfiniteShots
BOOL bDisplayStats
BOOL bMaxSpin
BOOL bTestReplay
#IF GOLF_IS_AI_ONLY
BOOL bAmbientGolfersOff = FALSE
#ENDIF
#ENDIF
TWEAK_FLOAT DIST_TO_GREEN_HACK 55.0
#IF NOT GOLF_IS_AI_ONLY
TWEAK_FLOAT ACCEPTABLE_DRIVE_DIST 100.0
#ENDIF
TWEAK_FLOAT WIND_MULTIPLIER 0.5
TWEAK_FLOAT SPIN_MULTIPLIER_GROUND_DURATTION 25.0
TWEAK_FLOAT SPIN_MULTIPLIER_V_AIR 0.05
TWEAK_FLOAT SPIN_MULTIPLIER_H_AIR 0.2
TWEAK_FLOAT VELOCITY_DAMPEN_GREEN_C 2.960
TWEAK_FLOAT VELOCITY_DAMPEN_GREEN_V 0.0
TWEAK_FLOAT VELOCITY_DAMPEN_GREEN_A 0.0
TWEAK_FLOAT VELOCITY_DAMPEN_GREEN_APROACH 0.85
TWEAK_FLOAT VELOCITY_DAMPEN_FAIRWAY 0.85
TWEAK_FLOAT VELOCITY_DAMPEN_ROUGH 0.85
TWEAK_FLOAT VELOCITY_DAMPEN_BUNKER 0.35
TWEAK_FLOAT VELOCITY_DAMPEN_WATER 0.5
TWEAK_FLOAT VELOCITY_DAMPEN_CART_PATH 0.89
TWEAK_FLOAT VELOCITY_DAMPEN_FOLIAGE -5.0
TWEAK_FLOAT CART_PATH_BOUNCE_MULTIPLIER 0.75
TWEAK_FLOAT FAIRWAY_BOUNCE_MULTIPLIER 0.5
TWEAK_FLOAT GREEN_BOUNCE_MULTIPLIER 0.3
TWEAK_FLOAT ROUGH_BOUNCE_MULTIPLIER 0.25
TWEAK_FLOAT SAND_BOUNCE_MULTIPLIER 0.0
TWEAK_FLOAT CART_BOUNCE_SPEED_OVER_GROUND 0.2
TWEAK_FLOAT FAIRWAY_BOUNCE_SPEED_OVER_GROUND 0.55
TWEAK_FLOAT GREEN_BOUNCE_SPEED_OVER_GROUND 0.55
TWEAK_FLOAT ROUGH_BOUNCE_SPEED_OVER_GROUND 0.5
TWEAK_FLOAT SAND_BOUNCE_SPEED_OVER_GROUND 0.2
TWEAK_FLOAT BALL_VELOCITY_THRESHOLD_BOUNCE 9.5
TWEAK_FLOAT BALL_VELOCITY_THRESHOLD_NORMAL 0.5
TWEAK_FLOAT BALL_VELOCITY_THRESHOLD_GREEN 0.25
TWEAK_FLOAT BALL_VELOCITY_THRESHOLD_HOLE 6.0
TWEAK_FLOAT BALL_RADIUS 4.0 // m
TWEAK_FLOAT BALL_IN_VEHICLE_RADIUS 12.0
TWEAK_FLOAT FAR_AWAY_THRESHOLD 150.0
TWEAK_FLOAT DIST_FOR_GIMMIE 0.7
TWEAK_FLOAT MAX_ANGLE_DEVIATION 15.0
TWEAK_FLOAT GIMMIE_FORCE_RADIUS 0.1601 //0.1625 is too big, 1.60 is too small
TWEAK_FLOAT BALL_IN_HOLE_RADIUS 0.1
//FLOAT NEAR_SHOT_RADIUS = 50.0 //m
TWEAK_FLOAT DIST_FOR_AI_GIMMIE_EASY 1.0
TWEAK_FLOAT DIST_FOR_AI_GIMMIE_MEDIUM 1.5
TWEAK_FLOAT DIST_FOR_AI_GIMMIE_HARD 2.5
TWEAK_FLOAT SWING_METER_POS_X 0.632
TWEAK_FLOAT SWING_METER_POS_Y 0.55
FLOAT MINIMAP_POS_X = -1213.0
FLOAT MINIMAP_POS_Y = 118.179
FLOAT MINIMAP_ZOOM_RATIO = 1.0
INT MINIMAP_ANGLE = 0
TWEAK_FLOAT fWoodlHitTime 0.160
TWEAK_FLOAT fIronHitTime 0.134
TWEAK_FLOAT fWedgeHitTime 0.119
TWEAK_FLOAT fPuttHitTime 0.159
TWEAK_FLOAT fPowerAdjustPreviewLineApproach 1.060
TWEAK_FLOAT fPowerAdjustPreviewLinePunch 1.08
TWEAK_FLOAT fLoftAdjustPreviewLine 0.04
VECTOR vApproachBallOffset = <<0.57, 0.030, 0>>
FLOAT fApproachBallHeadingOffset = 50.0
CONST_FLOAT PREVIEWCAM_LERP 0.3
CONST_FLOAT CLOSE_PED_DIST2 1.0 //1*1
// Sand trap values
CONST_FLOAT SAND_STEP_DISTANCE 0.5
CONST_FLOAT SAND_STEP_GAP 0.25
CONST_FLOAT SAND_STEP_HEIGHT 1.0
CONST_FLOAT SAND_STEP_WIDTH 1.0
CONST_FLOAT GOLF_BALL_BLIP_SCALE 0.67
#IF GOLF_IS_MP
TWEAK_FLOAT fAutoSwingTime 60.0 // number of seconds before auto swing
#ENDIF
CONST_INT iMaxNumOfAutoSwingsBeforeKick 3
BOOL bDrivingRangeMode = FALSE// Debug
BOOL bPerfectAccuracyMode = FALSE// Debug
BOOL bDisableWindEffects = FALSE// Debug
BOOL bDisableSpinEffects = FALSE
#IF NOT GOLF_IS_AI_ONLY
#IF IS_DEBUG_BUILD
VECTOR vDebugShotPosition
INT iDebugShotHole
INT iDebugShotNumber
INT iDebugShotLie
BOOL bDebugShotUse = FALSE
BOOL bDebugHardCodedShotUse = FALSE
BOOL bMakePutt = FALSE
BOOL bStopMPTimer = FALSE
BOOL bHitOpponentBall = FALSE
BOOL bUseDebugWind = FALSE
INT iSetScore
BOOL bSetPlayerScore[4]
BOOL bGolfPause
FLOAT fDebugBlendWeight
BOOL bUseDebugBlendWeight
#ENDIF
#ENDIF
BOOL bFlagPassed = FALSE
CONST_INT NUM_ITERATIONS_IN_ESTIMATE 50
CONST_FLOAT MAX_EXPECTED_FLIGHT_TIME 5.0
CONST_FLOAT f_Vertical_decel -9.81
CONST_FLOAT f_forward_decel -4.0
//// ACCESSORS FOR HELPER STRUCT
///
///
/// PURPOSE:
/// Accessor for GOLF_HELPER long drive marker
FUNC OBJECT_INDEX GET_GOLF_HELPER_LONG_DRIVE_MARKER(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.objLongestDriveMarker
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER shot blip
FUNC BLIP_INDEX GET_GOLF_HELPER_BALL_BLIP(GOLF_HELPERS &thisHelpers, INT iPlayer)
RETURN thisHelpers.blipPlayersBalls[iPlayer]
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER shot blip
PROC SET_GOLF_HELPER_BALL_BLIP(GOLF_HELPERS &thisHelpers, BLIP_INDEX blipCurrentShot, INT iPlayer)
thisHelpers.blipPlayersBalls[iPlayer] = blipCurrentShot
ENDPROC
PROC CLEANUP_GOLF_HELPER_BALL_BLIP(GOLF_HELPERS &thisHelpers, INT iPlayer)
IF DOES_BLIP_EXIST(thisHelpers.blipPlayersBalls[iPlayer])
REMOVE_BLIP(thisHelpers.blipPlayersBalls[iPlayer])
ENDIF
ENDPROC
PROC CLEANUP_GOLF_HELPER_ALL_BALL_BLIPS(GOLF_HELPERS &thisHelpers)
INT index
FOR index = 0 TO COUNT_OF(thisHelpers.blipPlayersBalls)-1
CLEANUP_GOLF_HELPER_BALL_BLIP(thisHelpers, index)
ENDFOR
ENDPROC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
FUNC BLIP_INDEX GET_GOLF_HELPER_HOLE_BLIP(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.blipCurrentHole
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC SET_GOLF_HELPER_HOLE_BLIP(GOLF_HELPERS &thisHelpers, BLIP_INDEX blipCurrentHole)
thisHelpers.blipCurrentHole = blipCurrentHole
ENDPROC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC CLEANUP_GOLF_HELPER_HOLE_BLIP(GOLF_HELPERS &thisHelpers)
IF DOES_BLIP_EXIST(thisHelpers.blipCurrentHole)
REMOVE_BLIP(thisHelpers.blipCurrentHole)
ENDIF
ENDPROC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
FUNC BLIP_INDEX GET_GOLF_HELPER_ESTIMATE_BLIP(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.blipCurrentEstimate
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC SET_GOLF_HELPER_ESTIMATE_BLIP(GOLF_HELPERS &thisHelpers, BLIP_INDEX blipCurrentEstimate)
thisHelpers.blipCurrentEstimate = blipCurrentEstimate
ENDPROC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC CLEANUP_GOLF_HELPER_ESTIMATE_BLIP(GOLF_HELPERS &thisHelpers)
IF DOES_BLIP_EXIST(thisHelpers.blipCurrentEstimate)
REMOVE_BLIP(thisHelpers.blipCurrentEstimate)
ENDIF
ENDPROC
/* cart no longer has blip
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
FUNC BLIP_INDEX GET_GOLF_HELPER_VEHICLE_BLIP(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.blipCurrentVehicle
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC SET_GOLF_HELPER_VEHICLE_BLIP(GOLF_HELPERS &thisHelpers, BLIP_INDEX blipCurrentVehicle)
thisHelpers.blipCurrentVehicle = blipCurrentVehicle
ENDPROC
/// PURPOSE:
/// Accessor for GOLF_HELPER hole blip
PROC CLEANUP_GOLF_HELPER_VEHICLE_BLIP(GOLF_HELPERS &thisHelpers)
REMOVE_BLIP(thisHelpers.blipCurrentVehicle)
ENDPROC
//*/
/// PURPOSE:
/// Accessor for GOLF_HELPER input cleared bool
FUNC BOOL GET_GOLF_HELPER_INPUT_CLEARED(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.bInputCleared
ENDFUNC
/// PURPOSE:
/// Accessor for GOLF_HELPER input cleared bool
PROC SET_GOLF_HELPER_INPUT_CLEARED(GOLF_HELPERS &thisHelpers, BOOL bInputCleared)
thisHelpers.bInputCleared = bInputCleared
ENDPROC
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC GOLF_CONTROL_FLAGS GET_GOLF_CONTROL_FLAGS(GOLF_GAME &golfGame)
RETURN golfGame.golfControlFlags
ENDFUNC
PROC OVERWRITE_GOLF_CONTROL_FLAGS(GOLF_GAME &golfGame, GOLF_CONTROL_FLAGS golfControlFlags)
golfGame.golfControlFlags = golfControlFlags
ENDPROC
PROC SET_GOLF_CONTROL_FLAG(GOLF_GAME &golfGame, GOLF_CONTROL_FLAGS golfControlFlags)
golfGame.golfControlFlags = golfGame.golfControlFlags | golfControlFlags
ENDPROC
PROC CLEAR_GOLF_CONTROL_FLAG(GOLF_GAME &golfGame, GOLF_CONTROL_FLAGS golfControlFlags)
golfGame.golfControlFlags -= golfGame.golfControlFlags & golfControlFlags
ENDPROC
FUNC BOOL IS_GOLF_CONTROL_FLAG_SET(GOLF_GAME &golfGame, GOLF_CONTROL_FLAGS golfControlFlags)
RETURN (golfGame.golfControlFlags & golfControlFlags) != GCF_NO_FLAGS
ENDFUNC
PROC RESET_GLOBAL_GOLF_DATA()
g_sGolfGlobals.CurrrentPlayerHole = -1
g_sGolfGlobals.GlobalGolfControlFlag = ENUM_TO_INT(GGCF_NO_FLAGS)
ENDPROC
FUNC GOLF_UI_CONTROL GET_GOLF_UI_FLAGS(GOLF_HELPERS &golfHelpers)
RETURN golfHelpers.golfUIControl
ENDFUNC
PROC OVERWRITE_GOLF_UI_FLAGS(GOLF_HELPERS &golfHelpers, GOLF_UI_CONTROL golfUIControl)
golfHelpers.golfUIControl = golfUIControl
ENDPROC
PROC SET_GOLF_UI_FLAG(GOLF_HELPERS &golfHelpers, GOLF_UI_CONTROL golfUIControl)
golfHelpers.golfUIControl = golfHelpers.golfUIControl | golfUIControl
ENDPROC
PROC CLEAR_GOLF_UI_FLAG(GOLF_HELPERS &golfHelpers, GOLF_UI_CONTROL golfUIControl)
golfHelpers.golfUIControl -= golfHelpers.golfUIControl & golfUIControl
ENDPROC
FUNC BOOL IS_GOLF_UI_FLAG_SET(GOLF_HELPERS &golfHelpers, GOLF_UI_CONTROL golfUIControl)
RETURN (golfHelpers.golfUIControl & golfUIControl) != GUC_NONE
ENDFUNC
//Keep track is a ui element has ever been displayed
FUNC GOLF_HELP_DISPLAYED_FLAG GET_GOLF_HELP_DISPLAYED_FLAG(GOLF_HELPERS &golfHelpers)
RETURN golfHelpers.golfHelpDisplayed
ENDFUNC
PROC OVERWRITE_GOLF_HELP_DISPLAYED_FLAG(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplayed)
golfHelpers.golfHelpDisplayed = golfHelpDisplayed
ENDPROC
PROC SET_GOLF_HELP_DISPLAYED_FLAG(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplayed)
golfHelpers.golfHelpDisplayed = golfHelpers.golfHelpDisplayed| golfHelpDisplayed
ENDPROC
PROC CLEAR_GOLF_HELP_DISPLAYED_FLAG(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplayed)
golfHelpers.golfHelpDisplayed -= golfHelpers.golfHelpDisplayed & golfHelpDisplayed
ENDPROC
FUNC BOOL IS_GOLF_HELP_DISPLAYED_FLAG_SET(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplayed)
RETURN (golfHelpers.golfHelpDisplayed & golfHelpDisplayed) != GHD_NONE
ENDFUNC
PROC SET_GOLF_HELP_CURRENTLY_DISPLAYING(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplaying)
golfHelpers.golfHelpDisplaying = golfHelpers.golfHelpDisplaying| golfHelpDisplaying
ENDPROC
PROC CLEAR_GOLF_HELP_CURRENTLY_DISPLAYING(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplaying)
golfHelpers.golfHelpDisplaying -= golfHelpers.golfHelpDisplaying & golfHelpDisplaying
ENDPROC
FUNC BOOL IS_GOLF_HELP_CURRENTLY_DISPLAYING(GOLF_HELPERS &golfHelpers, GOLF_HELP_DISPLAYED_FLAG golfHelpDisplaying)
RETURN (golfHelpers.golfHelpDisplaying & golfHelpDisplaying) != GHD_NONE
ENDFUNC
//*/
//Dialogue flag
FUNC GOLF_DIALOGUE_FLAG GET_GOLF_HELP_GOLF_DIALOGUE_FLAG(GOLF_HELPERS &golfHelpers)
RETURN golfHelpers.golfDialogueFlag
ENDFUNC
PROC OVERWRITE_GOLF_DIALOGUE_FLAG(GOLF_HELPERS &golfHelpers, GOLF_DIALOGUE_FLAG golfDialogueFlag)
golfHelpers.golfDialogueFlag = golfDialogueFlag
ENDPROC
PROC SET_GOLF_DIALOGUE_FLAG(GOLF_HELPERS &golfHelpers, GOLF_DIALOGUE_FLAG golfDialogueFlag)
golfHelpers.golfDialogueFlag = golfHelpers.golfDialogueFlag| golfDialogueFlag
ENDPROC
PROC CLEAR_GOLF_DIALOGUE_FLAG(GOLF_HELPERS &golfHelpers, GOLF_DIALOGUE_FLAG golfDialogueFlag)
golfHelpers.golfDialogueFlag -= golfHelpers.golfDialogueFlag & golfDialogueFlag
ENDPROC
FUNC BOOL IS_GOLF_DIALOGUE_FLAG_SET(GOLF_HELPERS &golfHelpers, GOLF_DIALOGUE_FLAG golfDialogueFlag)
RETURN (golfHelpers.golfDialogueFlag & golfDialogueFlag) != GDF_NONE
ENDFUNC
//*/
FUNC GOLF_STREAMING_FLAGS GET_GOLF_STREAMING_FLAGS(GOLF_HELPERS &golfHelpers)
RETURN golfHelpers.golfStreaming
ENDFUNC
PROC OVERWRITE_GOLF_STREAMING_FLAGS(GOLF_HELPERS &golfHelpers, GOLF_STREAMING_FLAGS golfStreaming)
golfHelpers.golfStreaming = golfStreaming
ENDPROC
PROC SET_GOLF_STREAMING_FLAG(GOLF_HELPERS &golfHelpers, GOLF_STREAMING_FLAGS golfStreaming)
golfHelpers.golfStreaming = golfHelpers.golfStreaming | golfStreaming
ENDPROC
PROC CLEAR_GOLF_STREAMING_FLAG(GOLF_HELPERS &golfHelpers, GOLF_STREAMING_FLAGS golfStreaming)
golfHelpers.golfStreaming -= golfHelpers.golfStreaming & golfStreaming
ENDPROC
FUNC BOOL IS_GOLF_STREAMING_FLAG_SET(GOLF_HELPERS &golfHelpers, GOLF_STREAMING_FLAGS golfStreaming)
RETURN (golfHelpers.golfStreaming & golfStreaming) != GSF_NO_STREAM_FLAG
ENDFUNC
PROC SET_GOLF_STATS_FLAG(GOLF_HELPERS &golfHelpers, GOLF_STATS_FLAG golfStatsFlag)
golfHelpers.golfStatsFlag = golfHelpers.golfStatsFlag | golfStatsFlag
ENDPROC
PROC CLEAR_GOLF_STATS_FLAG(GOLF_HELPERS &golfHelpers, GOLF_STATS_FLAG golfStatsFlag)
golfHelpers.golfStatsFlag -= golfHelpers.golfStatsFlag & golfStatsFlag
ENDPROC
FUNC BOOL IS_GOLF_STATS_FLAG_SET(GOLF_HELPERS &golfHelpers, GOLF_STATS_FLAG golfStatsFlag)
RETURN (golfHelpers.golfStatsFlag & golfStatsFlag) != GSF_NONE
ENDFUNC
FUNC STRING GET_GOLF_TEXTURE_DICTIONARY_NAME()
RETURN "GolfPutting"
ENDFUNC
FUNC BOOL IS_GOLF_FOURSOME_MP()
#IF GOLF_IS_MP
RETURN TRUE
#ENDIF
RETURN FALSE
ENDFUNC
PROC GOLF_PRINT_HELP(STRING txtHelp, BOOL bForever = FALSE, BOOL bNoSound = FALSE)
IF IS_GOLF_SPLASH_DISPLAYING() AND IS_GOLF_FOURSOME_MP()
EXIT
ENDIF
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(txtHelp)
//CDEBUG1LN(DEBUG_GOLF,"Displaying help ", txtHelp)
bForever = bForever
IF bForever
IF bNoSound
//this will probably assert
PRINT_HELP_FOREVER_WITH_STRING_NO_SOUND (txtHelp, "")
ELSE
PRINT_HELP_FOREVER(txtHelp)
ENDIF
ELSE
IF bNoSound
PRINT_HELP_NO_SOUND(txtHelp)
ELSE
PRINT_HELP(txtHelp)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC GOLF_PRINT_GOD_TEXT(STRING txtHelp)
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED(txtHelp)
PRINT_NOW(txtHelp, DEFAULT_GOD_TEXT_TIME, 1)
//ENDIF
ENDPROC
PROC SET_GOLF_TRAIL_INTERSECT_FLAG(BOOL bSet)
bSet = bSet
#IF NOT GOLF_IS_AI_ONLY
IF bSet
SET_BIT(iGolfShapeTestFlags, 13)
ELSE
CLEAR_BIT(iGolfShapeTestFlags, 13)
ENDIF
#ENDIF
ENDPROC
PROC SET_GOLF_TRAIL_STYLE_CHANGE_FLAG(BOOL bSet)
bSet = bSet
#IF NOT GOLF_IS_AI_ONLY
IF bSet
SET_BIT(iGolfShapeTestFlags, 14)
ELSE
CLEAR_BIT(iGolfShapeTestFlags, 14)
ENDIF
#ENDIF
ENDPROC
PROC SET_GOLF_SHAPE_TEST_CREATE_FLAG(INT index, BOOl bSet)
bSet = bSet
index = index
#IF NOT GOLF_IS_AI_ONLY
IF bSet
SET_BIT(iGolfShapeTestFlags, index)
ELSE
CLEAR_BIT(iGolfShapeTestFlags, index)
ENDIF
#ENDIF
ENDPROC
FUNC BOOL IS_GOLF_TRAIL_INTERSECT_FLAG_SET()
#IF NOT GOLF_IS_AI_ONLY
RETURN IS_BIT_SET(iGolfShapeTestFlags, 13)
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_GOLF_TRAIL_STYLE_CHANGE_FLAG_SET()
#IF NOT GOLF_IS_AI_ONLY
RETURN IS_BIT_SET(iGolfShapeTestFlags, 14)
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_GOLF_SHAPE_TEST_CREATE_FLAG_SET(INT index)
index = index
#IF NOT GOLF_IS_AI_ONLY
RETURN IS_BIT_SET(iGolfShapeTestFlags, index)
#ENDIF
RETURN FALSE
ENDFUNC
PROC SET_GOLF_SHPAE_TEST_LAST_COMPLETED_SECTION(INT iSection)
iSection = iSection
#IF NOT GOLF_IS_AI_ONLY
iLastSectionCompleted = iSection
#ENDIF
ENDPROC
FUNC INT GET_GOLF_SHAPE_TEST_LAST_COMPLETED_SECTION()
#IF NOT GOLF_IS_AI_ONLY
RETURN iLastSectionCompleted
#ENDIF
RETURN 0
ENDFUNC
PROC SET_GOLF_SHAPE_TEST_LAST_VALID_INTERSECT(VECTOR vIntersect)
vIntersect.z = vIntersect.z
#IF NOT GOLF_IS_AI_ONLY
vLastValidIntersect = vIntersect
#ENDIF
ENDPROC
FUNC VECTOR GET_GOLF_SHAPE_TEST_LAST_VALID_INTERSECT()
#IF NOT GOLF_IS_AI_ONLY
RETURN vLastValidIntersect
#ENDIF
RETURN <<0,0,0>>
ENDFUNC
PROC SET_GOLF_INTERSECT_LIE(GOLF_LIE_TYPE eLieType)
eLieType = eLieType
#IF NOT GOLF_IS_AI_ONLY
eIntersectLie = eLieType
#ENDIF
ENDPROC
FUNC GOLF_LIE_TYPE GET_GOLF_INTERSECT_LIE()
#IF NOT GOLF_IS_AI_ONLY
RETURN eIntersectLie
#ENDIF
RETURN LIE_UNKNOWN
ENDFUNC
FUNC BOOL IS_GOLF_LIE_SAFE(GOLF_LIE_TYPE lieType)
// CDEBUG1LN(DEBUG_GOLF,"Intersect lie is ", GET_GOLF_INTERSECT_LIE())
IF lieType = LIE_FAIRWAY
OR lieType = LIE_ROUGH
OR lieType = LIE_GREEN
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_GOLF_LIE_SAFE_FOR_TELEPORT(GOLF_LIE_TYPE lieType)
IF lieType = LIE_FAIRWAY
OR lieType = LIE_ROUGH
OR lieType = LIE_GREEN
OR lieType = LIE_CART_PATH
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CLEAR_GOLF_LINE_FLAGS()
CDEBUG1LN(DEBUG_GOLF,"Clearing line flags")
INT i
//CDEBUG1LN(DEBUG_GOLF,"Clearing golf line flags")
REPEAT MAX_NUMBER_OF_GOLF_TRAIL_PROBES i
SET_GOLF_SHAPE_TEST_CREATE_FLAG(i, FALSE)
ENDREPEAT
SET_GOLF_SHPAE_TEST_LAST_COMPLETED_SECTION(0)
SET_GOLF_TRAIL_INTERSECT_FLAG(FALSE)
//DEBUG_PRINTCALLSTACK()
ENDPROC
FUNC VECTOR CONVERT_GOLF_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
ENDFUNC
//Finds the z value and checks if the change is too dramatic so we don't end up in a tree or something
FUNC BOOL GOLF_FIND_GROUND_Z(VECTOR &retVector, FLOAT fTolerance = 2.0, FLOAT fZOffset = 1.0)
FLOAT fHeight
IF GET_GROUND_Z_FOR_3D_COORD(retVector+<<0,0,fZOffset>>, fHeight)
IF ABSF(retVector.z - fHeight) < fTolerance //make sure the change in z position isn't too dramatic
retVector.z = fHeight
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MAKE_PUTT_SET()
#IF IS_DEBUG_BUILD
#IF NOT GOLF_IS_AI_ONLY
RETURN bMakePutt
#ENDIF
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL GOLF_CAN_DISPLAY_SOCAIL_CLUB_LEADERBOARD()
RETURN NETWORK_IS_SIGNED_ONLINE() AND NETWORK_IS_SIGNED_IN() AND SCRIPT_IS_CLOUD_AVAILABLE() AND IS_PLAYER_ONLINE()
ENDFUNC
FUNC STRING GET_GOLF_BASIC_ANIMATION_DICTIONARY_NAME()
RETURN "MINI@GOLFAI"
ENDFUNC
FUNC STRING GET_GOLF_EXTRA_ANIMATION_DICTIONARY_NAME()
RETURN "MINI@GOLF"
ENDFUNC
FUNC STRING GET_GOLF_ANIMATION_DICTIONARY_NAME(BOOL bUseExtraAnimations = FALSE)
#IF GOLF_IS_AI_ONLY
RETURN GET_GOLF_BASIC_ANIMATION_DICTIONARY_NAME()
#ENDIF
IF NOT bUseExtraAnimations
RETURN GET_GOLF_BASIC_ANIMATION_DICTIONARY_NAME()
ELSE
RETURN GET_GOLF_EXTRA_ANIMATION_DICTIONARY_NAME()
ENDIF
ENDFUNC
FUNC BOOL IS_GOLF_FULL_ROUND(GOLF_HELPERS &thisHelpers)
RETURN thisHelpers.iStartingHole = 0 AND thisHelpers.iEndingHole = 8
ENDFUNC
FUNC BOOL IS_HOLE_IN_PLAY(GOLF_HELPERS &thisHelpers, INT iHole)
RETURN thisHelpers.iStartingHole <= iHole AND iHole <= thisHelpers.iEndingHole
ENDFUNC
FUNC BOOL IS_GOLF_CAM_ACTIVE(CAMERA_INDEX &golfCam)
IF DOES_CAM_EXIST(golfCam)
IF IS_CAM_ACTIVE(golfCam)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_GOLF_CAM_RENDERING(CAMERA_INDEX &golfCam)
IF IS_GOLF_CAM_ACTIVE(golfCam)
RETURN IS_CAM_RENDERING(golfCam)
ENDIF
RETURN FALSE
ENDFUNC
FUNC enumCharacterList GET_GOLF_PED_ENUM(PED_INDEX pedIndex)
IF GET_PLAYER_PED_ENUM(pedIndex) = NO_CHARACTER
RETURN GET_NPC_PED_ENUM(pedIndex)
ENDIF
RETURN GET_PLAYER_PED_ENUM(pedIndex)
ENDFUNC
FUNC BOOL GOLF_SHOULD_USE_FOREIGN_DISTANCE()
RETURN DOES_CURRENT_LANGUAGE_USE_METRIC_SYSTEM()
AND GET_CURRENT_LANGUAGE() != LANGUAGE_JAPANESE AND GET_CURRENT_LANGUAGE() != LANGUAGE_CHINESE AND GET_CURRENT_LANGUAGE() != LANGUAGE_KOREAN
AND GET_CURRENT_LANGUAGE() != LANGUAGE_CHINESE_SIMPLIFIED
//RETURN TRUE
ENDFUNC
PROC FREEZE_GOLF_BALL(OBJECT_INDEX golfBall, BOOL bFreeze)
FREEZE_ENTITY_POSITION(golfBall, bFreeze)
ENDPROC
#IF NOT GOLF_IS_AI_ONLY
USING "golf_stats.sch"
#ENDIF