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

587 lines
14 KiB
XML
Executable File

USING "minigames_helpers.sch"
/// PURPOSE: Enumeration of all supported club types
ENUM eCLUB_TYPE
eCLUB_INVALID,
eCLUB_WOOD_1, // Driver // 7
eCLUB_WOOD_2, // Brassie // 12
eCLUB_WOOD_3, // 15
eCLUB_WOOD_4, // 18
eCLUB_WOOD_5, // Baffing Spoon ?? // 21
eCLUB_IRON_2, // Cleek // 17
eCLUB_IRON_3, // Mid Mashie // 20
eCLUB_IRON_4, // Mashie Iron // 23
eCLUB_IRON_5, // Mashie // 26
eCLUB_IRON_6, // Spade Mashie // 29
eCLUB_IRON_7, // Mashie Niblick // 30
eCLUB_IRON_8, // Pitching Niblick // 37
eCLUB_IRON_9, // Niblick // 41
eCLUB_WEDGE_PITCH, // 45
eCLUB_WEDGE_APPROACH, // 50
eCLUB_WEDGE_SAND, // 55
eCLUB_WEDGE_LOB, // 60
eCLUB_WEDGE_LOB_ULTRA, // 64
eCLUB_PUTTER
ENDENUM
/// PURPOSE: Struct that represents all data needed to represent a single golf club
STRUCT CLUB_STRUCT
eCLUB_TYPE kClubType
#IF NOT COMPILE_LOOKUPS
FLOAT fClubHeadLoft // Angle
FLOAT fClubRange
FLOAT fClubAccuracyModifier
FLOAT fClubPowerModifier
FLOAT fClubSpinMagModifier
MODEL_NAMES oClubProp
TEXT_LABEL_7 txtName
#ENDIF
ENDSTRUCT
/// PURPOSE: Struct for a golf bag. Currently there is a single global golf bag defined for all players. This will need to be moved into the player structs if we decide to allow the player to customize or upgrade clubs
STRUCT GOLF_BAG
CLUB_STRUCT clubs[14]
INT iNumClubs
ENDSTRUCT
//*
#IF NOT COMPILE_LOOKUPS
VECTOR vClubAttachOffsetWood = <<0,0,0>>
VECTOR vClubAttachRotWood = <<0,0,0>>
VECTOR vClubAttachOffsetIron = <<0,0,0>>
VECTOR vClubAttachRotIron = <<0,0,0>>
VECTOR vClubAttachOffsetPutter = <<0,0,0.03>>
VECTOR vClubAttachRotPutter = <<0,0,0>>
VECTOR vAddressOffsetWood = <<0.11,-1.08,0>>
VECTOR vAddressOffsetIron = <<0.11,-0.81,0>>
VECTOR vAddressOffsetPutter = <<0.10,-0.55,0>>
VECTOR vAddressOffsetWedge = <<0.03, -0.75, 0>>
#ENDIF
//*/
/// PURPOSE:
/// Accessor for club type
FUNC eCLUB_TYPE GET_GOLF_CLUB_TYPE(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN eCLUB_WOOD_1
ENDIF
RETURN golfBag.clubs[clubIndex].kClubType
ENDFUNC
/// PURPOSE:
/// Accessor for club loft
FUNC FLOAT GET_GOLF_CLUB_LOFT(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN 0.0
ENDIF
#IF NOT COMPILE_LOOKUPS
RETURN golfBag.clubs[clubIndex].fClubHeadLoft
#ENDIF
#IF COMPILE_LOOKUPS
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1 // Driver // 7
RETURN 13.5
BREAK
CASE eCLUB_WOOD_2 // Brassie // 12
RETURN 13.75
BREAK
CASE eCLUB_WOOD_3 // 15
RETURN 16.0
BREAK
CASE eCLUB_WOOD_4 // 18
RETURN 18.0
BREAK
CASE eCLUB_WOOD_5 // Baffing Spoon ?? // 21
RETURN 21.0
BREAK
CASE eCLUB_IRON_2 // Cleek // 17
RETURN 17.0
BREAK
CASE eCLUB_IRON_3 // Mid Mashie // 20
RETURN 20.0
BREAK
CASE eCLUB_IRON_4 // Mashie Iron // 23
RETURN 23.0
BREAK
CASE eCLUB_IRON_5 // Mashie // 26
RETURN 26.0
BREAK
CASE eCLUB_IRON_6 // Spade Mashie // 29
RETURN 29.0
BREAK
CASE eCLUB_IRON_7 // Mashie Niblick // 30
RETURN 30.0
BREAK
CASE eCLUB_IRON_8 // Pitching Niblick // 37
RETURN 37.0
BREAK
CASE eCLUB_IRON_9 // Niblick // 41
RETURN 41.0
BREAK
CASE eCLUB_WEDGE_PITCH // 45
RETURN 45.0
BREAK
CASE eCLUB_WEDGE_APPROACH // 50
RETURN 50.0
BREAK
CASE eCLUB_WEDGE_SAND // 55
RETURN 55.0
BREAK
CASE eCLUB_WEDGE_LOB // 60
RETURN 60.0
BREAK
CASE eCLUB_WEDGE_LOB_ULTRA // 64
RETURN 64.0
BREAK
CASE eCLUB_PUTTER
RETURN 5.0
BREAK
ENDSWITCH
RETURN 0.0
#ENDIF
ENDFUNC
/// PURPOSE:
/// Accessor for club range
FUNC FLOAT GET_GOLF_CLUB_RANGE(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN 0.0
ENDIF
#IF NOT COMPILE_LOOKUPS
RETURN golfBag.clubs[clubIndex].fClubRange
#ENDIF
#IF COMPILE_LOOKUPS
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1 // Driver // 7
RETURN 220 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WOOD_2 // Brassie // 12
RETURN 210 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WOOD_3 // 15
RETURN 200 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WOOD_4 // 18
RETURN 190 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WOOD_5 // Baffing Spoon ?? // 21
RETURN 180 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_2 // Cleek // 17
RETURN 180 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_3 // Mid Mashie // 20
RETURN 170 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_4 // Mashie Iron // 23
RETURN 160 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_5 // Mashie // 26
RETURN 150 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_6 // Spade Mashie // 29
RETURN 140 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_7 // Mashie Niblick // 30
RETURN 130 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_8 // Pitching Niblick // 37
RETURN 120 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_IRON_9 // Niblick // 41
RETURN 110 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WEDGE_PITCH // 45
RETURN 100 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WEDGE_APPROACH // 50
RETURN 85 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WEDGE_SAND // 55
RETURN 75 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WEDGE_LOB // 60
RETURN 65 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_WEDGE_LOB_ULTRA // 64
RETURN 40 / MAGIC_DISTANCE_CONVERSION
BREAK
CASE eCLUB_PUTTER
RETURN 30 / MAGIC_DISTANCE_CONVERSION
BREAK
ENDSWITCH
RETURN 0.0
#ENDIF
ENDFUNC
/// PURPOSE:
/// Accessor for club accuracy modifier
FUNC FLOAT GET_GOLF_CLUB_ACCURACY(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN 0.0
ENDIF
#IF NOT COMPILE_LOOKUPS
RETURN golfBag.clubs[clubIndex].fClubAccuracyModifier
#ENDIF
#IF COMPILE_LOOKUPS
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1 // Driver // 7
RETURN 0.75
BREAK
CASE eCLUB_WOOD_2 // Brassie // 12
RETURN 0.75
BREAK
CASE eCLUB_WOOD_3 // 15
RETURN 0.75
BREAK
CASE eCLUB_WOOD_4 // 18
RETURN 0.75
BREAK
CASE eCLUB_WOOD_5 // Baffing Spoon ?? // 21
RETURN 0.75
BREAK
CASE eCLUB_IRON_2 // Cleek // 17
RETURN 0.875
BREAK
CASE eCLUB_IRON_3 // Mid Mashie // 20
RETURN 0.875
BREAK
CASE eCLUB_IRON_4 // Mashie Iron // 23
RETURN 0.875
BREAK
CASE eCLUB_IRON_5 // Mashie // 26
RETURN 0.875
BREAK
CASE eCLUB_IRON_6 // Spade Mashie // 29
RETURN 0.875
BREAK
CASE eCLUB_IRON_7 // Mashie Niblick // 30
RETURN 0.875
BREAK
CASE eCLUB_IRON_8 // Pitching Niblick // 37
RETURN 0.875
BREAK
CASE eCLUB_IRON_9 // Niblick // 41
RETURN 0.875
BREAK
CASE eCLUB_WEDGE_PITCH // 45
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_APPROACH // 50
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_SAND // 55
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_LOB // 60
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_LOB_ULTRA // 64
RETURN 1.0
BREAK
CASE eCLUB_PUTTER
RETURN 1.0
BREAK
ENDSWITCH
RETURN 0.0
#ENDIF
ENDFUNC
/// PURPOSE:
/// Accessor for club spin modifier
FUNC FLOAT GET_GOLF_CLUB_SPIN(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN 0.0
ENDIF
#IF NOT COMPILE_LOOKUPS
RETURN golfBag.clubs[clubIndex].fClubSpinMagModifier
#ENDIF
#IF COMPILE_LOOKUPS
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1 // Driver // 7
RETURN 0.25
BREAK
CASE eCLUB_WOOD_2 // Brassie // 12
RETURN 0.25
BREAK
CASE eCLUB_WOOD_3 // 15
RETURN 0.25
BREAK
CASE eCLUB_WOOD_4 // 18
RETURN 0.25
BREAK
CASE eCLUB_WOOD_5 // Baffing Spoon ?? // 21
RETURN 0.25
BREAK
CASE eCLUB_IRON_2 // Cleek // 17
RETURN 0.5
BREAK
CASE eCLUB_IRON_3 // Mid Mashie // 20
RETURN 0.5
BREAK
CASE eCLUB_IRON_4 // Mashie Iron // 23
RETURN 0.5
BREAK
CASE eCLUB_IRON_5 // Mashie // 26
RETURN 0.6
BREAK
CASE eCLUB_IRON_6 // Spade Mashie // 29
RETURN 0.6
BREAK
CASE eCLUB_IRON_7 // Mashie Niblick // 30
RETURN 0.7
BREAK
CASE eCLUB_IRON_8 // Pitching Niblick // 37
RETURN 0.7
BREAK
CASE eCLUB_IRON_9 // Niblick // 41
RETURN 0.8
BREAK
CASE eCLUB_WEDGE_PITCH // 45
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_APPROACH // 50
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_SAND // 55
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_LOB // 60
RETURN 1.0
BREAK
CASE eCLUB_WEDGE_LOB_ULTRA // 64
RETURN 1.0
BREAK
CASE eCLUB_PUTTER
RETURN 0.1
BREAK
ENDSWITCH
RETURN 0.0
#ENDIF
ENDFUNC
/// PURPOSE:
/// Accessor for club model name
FUNC MODEL_NAMES GET_GOLF_CLUB_MODEL(GOLF_BAG &golfBag, INT clubIndex)
IF clubIndex < 0 OR clubIndex >= golfBag.iNumClubs
RETURN PROP_GOLF_DRIVER
ENDIF
#IF NOT COMPILE_LOOKUPS
RETURN golfBag.clubs[clubIndex].oClubProp
#ENDIF
#IF COMPILE_LOOKUPS
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1 // Driver // 7
RETURN PROP_GOLF_WOOD_01
BREAK
CASE eCLUB_WOOD_2 // Brassie // 12
RETURN PROP_GOLF_WOOD_01
BREAK
CASE eCLUB_WOOD_3 // 15
RETURN PROP_GOLF_WOOD_01
BREAK
CASE eCLUB_WOOD_4 // 18
RETURN PROP_GOLF_WOOD_01
BREAK
CASE eCLUB_WOOD_5 // Baffing Spoon ?? // 21
RETURN PROP_GOLF_WOOD_01
BREAK
CASE eCLUB_IRON_2 // Cleek // 17
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_3 // Mid Mashie // 20
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_4 // Mashie Iron // 23
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_5 // Mashie // 26
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_6 // Spade Mashie // 29
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_7 // Mashie Niblick // 30
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_8 // Pitching Niblick // 37
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_IRON_9 // Niblick // 41
RETURN PROP_GOLF_IRON_01
BREAK
CASE eCLUB_WEDGE_PITCH // 45
RETURN Prop_Golf_Pitcher_01
BREAK
CASE eCLUB_WEDGE_APPROACH // 50
RETURN Prop_Golf_Pitcher_01
BREAK
CASE eCLUB_WEDGE_SAND // 55
RETURN Prop_Golf_Pitcher_01
BREAK
CASE eCLUB_WEDGE_LOB // 60
RETURN Prop_Golf_Pitcher_01
BREAK
CASE eCLUB_WEDGE_LOB_ULTRA // 64
RETURN Prop_Golf_Pitcher_01
BREAK
CASE eCLUB_PUTTER
RETURN PROP_GOLF_PUTTER_01
BREAK
ENDSWITCH
RETURN PROP_GOLF_DRIVER
#ENDIF
ENDFUNC
FUNC FLOAT GET_APPROACH_SHOT_PREDICTION_MODFIER()
RETURN 0.935
ENDFUNC
FUNC FLOAT GET_GOLF_CLUB_PREDITED_CLUB_RANGE(GOLF_BAG &golfBag, INT clubIndex)
SWITCH golfBag.clubs[clubIndex].kClubType
CASE eCLUB_WOOD_1
RETURN 105.8 //predictWood1
BREAK
CASE eCLUB_WOOD_3
RETURN 100.5 //predictWood3
BREAK
CASE eCLUB_WOOD_5
RETURN 97.3 //predictWood5
BREAK
CASE eCLUB_IRON_3
RETURN 90.2 //predictIron3
BREAK
CASE eCLUB_IRON_4
RETURN 87.0 //predictIron4
BREAK
CASE eCLUB_IRON_5
RETURN 83.0 //predictIron5
BREAK
CASE eCLUB_IRON_6
RETURN 79.9 //predictIron6
BREAK
CASE eCLUB_IRON_7
RETURN 73.5 //predictIron7
BREAK
CASE eCLUB_IRON_8
RETURN 68.0 // predictIron8
BREAK
CASE eCLUB_IRON_9
RETURN 59.1 //predictIron9
BREAK
CASE eCLUB_WEDGE_PITCH
RETURN 52.5 //predictPitch
BREAK
CASE eCLUB_WEDGE_SAND
RETURN 30.9 //predictSand
BREAK
CASE eCLUB_WEDGE_LOB
RETURN 21.8 //predictLob
BREAK
DEFAULT
PRINTLN("Club type ", golfBag.clubs[clubIndex].kClubType, " not valid club when looking for predicted club range")
SCRIPT_ASSERT("Club type not valid club when looking for predicted club range")
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
FUNC TEXT_LABEL_23 GET_CLUB_STRING_FROM_ENUM(eCLUB_TYPE eClub)
TEXT_LABEL_23 txtClub = "CLUB_"
txtClub += ENUM_TO_INT(eClub)
RETURN txtClub
ENDFUNC
/// PURPOSE:
/// Finds the index of a given club type within a given golf bag
/// PARAMS:
/// golfBag - Bag to search
/// clubType - Club type to find
/// RETURNS:
/// Index within the bag for the given club type
FUNC INT GOLF_FIND_SPECIFIC_CLUB_IN_BAG(GOLF_BAG &golfBag, eCLUB_TYPE clubType)
INT clubIndex
REPEAT golfBag.iNumClubs clubIndex
IF golfBag.clubs[clubIndex].kClubType = clubType
RETURN clubIndex
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC VECTOR GET_GOLF_CLUB_PLACEMENT_OFFSET(eCLUB_TYPE clubType)
#IF GOLF_IS_MP
//Shiity mp offsets to avoid clipping
IF clubType <= eCLUB_WOOD_5
RETURN <<0.15,-1.08,0>>
ELIF clubType <= eCLUB_IRON_9
RETURN <<0.16,-0.81,0>>
ELIF clubType !=eCLUB_PUTTER
RETURN <<0.03, -0.75, 0>>
ELSE
RETURN <<0.10,-0.55,0>>
ENDIF
#ENDIF
#IF NOT GOLF_IS_MP
//these numbers are fucking perfect. But we can't use them in mp because it is too close to the ball,
//and the remote peds clubs will clip into it.
IF clubType <= eCLUB_WOOD_5
RETURN <<0.11,-1.08,0>>
ELIF clubType <= eCLUB_IRON_9
RETURN <<0.11,-0.81,0>>
ELIF clubType !=eCLUB_PUTTER
RETURN <<0.03, -0.75, 0>>
ELSE
RETURN <<0.10,-0.55,0>>
ENDIF
#ENDIF
ENDFUNC
FUNC VECTOR GET_GOLF_CLUB_ATTACH_OFFSET(PED_INDEX pedIndex, eCLUB_TYPE clubType)
UNUSED_PARAMETER(pedIndex)
UNUSED_PARAMETER(clubType)
#IF COMPILE_LOOKUPS
RETURN <<0,0,0>>
#ENDIF
#IF NOT COMPILE_LOOKUPS
IF clubType <= eCLUB_WOOD_5
RETURN vClubAttachOffsetWood
ELIF clubType !=eCLUB_PUTTER
RETURN vClubAttachOffsetIron
ELSE
RETURN vClubAttachOffsetPutter
ENDIF
pedIndex = pedIndex
RETURN vClubAttachOffsetWood
#ENDIF
ENDFUNC
FUNC VECTOR GET_GOLF_CLUB_ATTACH_ROTATION(PED_INDEX pedIndex, eCLUB_TYPE clubType)
pedIndex = pedIndex
clubType = clubType
#IF COMPILE_LOOKUPS
RETURN <<0,0,0>>
#ENDIF
#IF NOT COMPILE_LOOKUPS
IF clubType <= eCLUB_WOOD_5
RETURN vClubAttachRotWood
ELIF clubType !=eCLUB_PUTTER
RETURN vClubAttachRotIron
ELSE
RETURN vClubAttachRotPutter
ENDIF
RETURN vClubAttachRotWood
#ENDIF
ENDFUNC