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

1325 lines
48 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//
// Author: David Roberts Date: 16/11/12
//
//
// Pickup Controller
//
// DESCRIPTION: A basic controller script used to create, manage and
// remove armour, health and weapon pickups found in the world.
//
//
// Includes
USING "rage_builtins.sch"
USING "globals.sch"
USING "flow_public_core.sch"
USING "pickups_armour.sch"
USING "pickups_gas.sch"
USING "pickups_health.sch"
USING "pickups_weapon.sch"
// Common pickups
PICKUP_INDEX piArmourPickup[NUMBER_OF_ARMOUR_PICKUPS]
PICKUP_INDEX piGasPickup[NUMBER_OF_GAS_PICKUPS]
PICKUP_INDEX piHealthPickup[NUMBER_OF_HEALTH_PICKUPS]
PICKUP_INDEX piWeaponPickup[NUMBER_OF_WEAPON_PICKUPS]
// Unlocked pickups
PICKUP_INDEX piExilePickup[NUMBER_OF_EXILE1_PICKUPS]
BOOL bUnlockedExilePickups = FALSE
BOOL bPickupsCreated = FALSE
// Rob B - add CGtoNG pickups 2070966, 2071227
PICKUP_INDEX piExileCGtoNGPickup[NUMBER_OF_EXILE1_CGTONG_PICKUPS]
BOOL bUnlockedExileCGtoNGPickups = FALSE
PICKUP_INDEX piTrevorCGtoNGPickup[NUMBER_OF_TREVOR1_CGTONG_PICKUPS]
BOOL bUnlockedTrevorCGtoNGPickups = FALSE
#IF IS_DEBUG_BUILD
// Basic widget struct
STRUCT sPickupWidget
WIDGET_GROUP_ID groupID
BOOL bToggle
BOOL bBlip
ENDSTRUCT
// Common
BLIP_INDEX armourBlips[NUMBER_OF_ARMOUR_PICKUPS]
BLIP_INDEX gasBlips[NUMBER_OF_GAS_PICKUPS]
BLIP_INDEX healthBlips[NUMBER_OF_HEALTH_PICKUPS]
BLIP_INDEX weaponBlips[NUMBER_OF_WEAPON_PICKUPS]
WIDGET_GROUP_ID mainWidget
sPickupWidget armourWidget
sPickupWidget gasWidget
sPickupWidget healthWidget
sPickupWidget weaponWidget
BOOL bWarpToArmour[NUMBER_OF_ARMOUR_PICKUPS]
BOOL bWarpToGas[NUMBER_OF_GAS_PICKUPS]
BOOL bWarpToHealth[NUMBER_OF_HEALTH_PICKUPS]
BOOL bWarpToWeapon[NUMBER_OF_WEAPON_PICKUPS]
// Unlocks
BLIP_INDEX exileBlips[NUMBER_OF_EXILE1_PICKUPS]
sPickupWidget exileWidget
BOOL bSetupExileIPL
BOOL bWarpToExile[NUMBER_OF_EXILE1_PICKUPS]
/// PURPOSE:
/// Create main widget for armour, health and weapons
PROC SETUP_MAIN_WIDGET()
mainWidget = START_WIDGET_GROUP("Pickup Controller")
ADD_WIDGET_BOOL("Enable Armour Debug", armourWidget.bToggle)
ADD_WIDGET_BOOL("Enable Exile Debug", exileWidget.bToggle)
ADD_WIDGET_BOOL("Enable Gas Debug", gasWidget.bToggle)
ADD_WIDGET_BOOL("Enable Health Debug", healthWidget.bToggle)
ADD_WIDGET_BOOL("Enable Weapon Debug", weaponWidget.bToggle)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Remove blips of specified pickups if there are any
/// RETURNS:
/// TRUE if blips needed removing, FALSE if blips did not exist (if the first blip does not exist, neither should the others)
FUNC BOOL REMOVE_BLIPS(INT max_pickups, BLIP_INDEX &blips[])
INT i
REPEAT max_pickups i
IF DOES_BLIP_EXIST(blips[i])
REMOVE_BLIP(blips[i])
ELSE
RETURN FALSE//do not have to remove blips
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Setup armour widget
PROC SETUP_ARMOUR_WIDGET()
INT i
TEXT_LABEL_63 tlTemp
SET_CURRENT_WIDGET_GROUP(mainWidget)
armourWidget.groupID = START_WIDGET_GROUP("Armour Pickups")
ADD_WIDGET_BOOL("Blip armour", armourWidget.bBlip)
ADD_WIDGET_STRING("WARP TO ARMOUR")
REPEAT COUNT_OF(piArmourPickup) i
tlTemp = GET_ARMOUR_LOCATION_NAME(i)
ADD_WIDGET_BOOL(tlTemp, bWarpToArmour[i])
ENDREPEAT
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(mainWidget)
ENDPROC
/// PURPOSE:
/// Setup Exile 1 weapon widget
PROC SETUP_EXILE1_WIDGET()
INT i
TEXT_LABEL_63 tlTemp
SET_CURRENT_WIDGET_GROUP(mainWidget)
exileWidget.groupID = START_WIDGET_GROUP("Exile 1 Pickups")
ADD_WIDGET_BOOL("Setup Crash IPL", bSetupExileIPL)
ADD_WIDGET_BOOL("Blip pickup", exileWidget.bBlip)
ADD_WIDGET_STRING("WARP TO EXILE PICKUP")
REPEAT COUNT_OF(piExilePickup) i
tlTemp = i + 1
tlTemp += ": "
tlTemp += GET_EXILE1_PICKUP_NAME(i)
ADD_WIDGET_BOOL(tlTemp, bWarpToExile[i])
ENDREPEAT
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(mainWidget)
ENDPROC
/// PURPOSE: Setup gas widget
PROC SETUP_GAS_WIDGET()
INT i
TEXT_LABEL_63 tlTemp
SET_CURRENT_WIDGET_GROUP(mainWidget)
gasWidget.groupID = START_WIDGET_GROUP("Gas Pickups")
ADD_WIDGET_BOOL("Blip gas", gasWidget.bBlip)
ADD_WIDGET_STRING("WARP TO GAS")
REPEAT COUNT_OF(piGasPickup) i
tlTemp = GET_GAS_LOCATION_NAME(i)
ADD_WIDGET_BOOL(tlTemp, bWarpToGas[i])
ENDREPEAT
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(mainWidget)
ENDPROC
/// PURPOSE: Setup health widget
PROC SETUP_HEALTH_WIDGET()
INT i
TEXT_LABEL_63 tlTemp
SET_CURRENT_WIDGET_GROUP(mainWidget)
healthWidget.groupID = START_WIDGET_GROUP("Health Pickups")
ADD_WIDGET_BOOL("Blip health", healthWidget.bBlip)
ADD_WIDGET_STRING("WARP TO HEALTH")
REPEAT COUNT_OF(piHealthPickup) i
tlTemp = GET_HEALTH_LOCATION_NAME(i)
ADD_WIDGET_BOOL(tlTemp, bWarpToHealth[i])
ENDREPEAT
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(mainWidget)
ENDPROC
/// PURPOSE: Setup weapon widget
PROC SETUP_WEAPON_WIDGET()
INT i
TEXT_LABEL_63 tlTemp
SET_CURRENT_WIDGET_GROUP(mainWidget)
weaponWidget.groupID = START_WIDGET_GROUP("Weapon Pickups")
ADD_WIDGET_BOOL("Blip weapon", weaponWidget.bBlip)
ADD_WIDGET_STRING("WARP TO WEAPON")
REPEAT COUNT_OF(piWeaponPickup) i
tlTemp = GET_WEAPON_LOCATION_NAME(i)
ADD_WIDGET_BOOL(tlTemp, bWarpToWeapon[i])
ENDREPEAT
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(mainWidget)
ENDPROC
/// PURPOSE:
// Loads any interior around the coord specified
/// PARAMS:
/// VECTOR coords = the coord of the pickup or scrap
/// RETURNS:
/// N/A
PROC LOAD_INTERIOR_AROUND_COORDS(VECTOR coords)
INTERIOR_INSTANCE_INDEX intIndex = GET_INTERIOR_AT_COORDS(coords)
IF IS_VALID_INTERIOR(intIndex)
PIN_INTERIOR_IN_MEMORY(intIndex)
WHILE NOT IS_INTERIOR_READY(intIndex)
WAIT(0)
ENDWHILE
WAIT(0)
UNPIN_INTERIOR(intIndex)
ENDIF
ENDPROC
/// PURPOSE: Warp player to specified pickup coords
PROC WARP_TO_PICKUP(VECTOR vPickupPos)
IF NOT IS_VECTOR_ZERO(vPickupPos)
LOAD_INTERIOR_AROUND_COORDS(vPickupPos)
LOAD_SCENE(vPickupPos)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPickupPos + <<0.0, -1.5, 0.0>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Unable to warp to zero vector")
ENDIF
ENDPROC
/// PURPOSE: Check for allowing player to warp to pickups, and blip pickups
PROC UPDATE_WIDGETS()
INT i
// Armour pickups
IF armourWidget.bToggle
IF NOT DOES_WIDGET_GROUP_EXIST(armourWidget.groupID)
SETUP_ARMOUR_WIDGET()
ELSE
REPEAT COUNT_OF(piArmourPickup) i
IF (bWarpToArmour[i])
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Warping to armour pickup ", i)
WARP_TO_PICKUP(GET_ARMOUR_PICKUP_COORDS(i))
IF (i = 28) //to stop player faling to their death on a thin bridge
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), << 446.8033, -986.9347, 29.6895 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 167.3769)
ENDIF
ELIF (i = 26)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<1843.2908, 3696.4006, 33.2672>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 129.40)
ENDIF
ELIF (i = 36)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<1389.7263, 3618.4751, 37.9259>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 230.5053)
ENDIF
ELIF (i = 40)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<156.9659, -1192.8693, 28.3474>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 282.9118)
ENDIF
ENDIF
bWarpToArmour[i] = FALSE
ENDIF
ENDREPEAT
i=0
IF armourWidget.bBlip
REPEAT COUNT_OF(piArmourPickup) i
IF NOT DOES_BLIP_EXIST(armourBlips[i])
armourBlips[i] = ADD_BLIP_FOR_COORD(GET_ARMOUR_PICKUP_COORDS(i))
ENDIF
ENDREPEAT
armourWidget.bBlip = FALSE
ENDIF
ENDIF
ELSE
IF DOES_WIDGET_GROUP_EXIST(armourWidget.groupID)
REMOVE_BLIPS(COUNT_OF(piArmourPickup), armourBlips)
DELETE_WIDGET_GROUP(armourWidget.groupID)
ENDIF
ENDIF
// Exile pickups
IF exileWidget.bToggle
IF NOT DOES_WIDGET_GROUP_EXIST(exileWidget.groupID)
SETUP_EXILE1_WIDGET()
ELSE
IF bSetupExileIPL
REQUEST_IPL("crashed_cargoplane")
bSetupExileIPL = FALSE
ENDIF
REPEAT COUNT_OF(piExilePickup) i
IF (bWarpToExile[i])
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Warping to Exile pickup ", i)
WARP_TO_PICKUP(GET_EXILE1_PICKUP_COORDS(i))
bWarpToExile[i] = FALSE
ENDIF
ENDREPEAT
i=0
IF exileWidget.bBlip
REPEAT COUNT_OF(piExilePickup) i
IF NOT DOES_BLIP_EXIST(exileBlips[i])
exileBlips[i] = ADD_BLIP_FOR_COORD(GET_EXILE1_PICKUP_COORDS(i))
ENDIF
ENDREPEAT
exileWidget.bBlip = FALSE
ENDIF
ENDIF
ELSE
IF DOES_WIDGET_GROUP_EXIST(exileWidget.groupID)
REMOVE_BLIPS(COUNT_OF(piExilePickup), exileBlips)
DELETE_WIDGET_GROUP(exileWidget.groupID)
ENDIF
ENDIF
// Gas pickups
IF gasWidget.bToggle
IF NOT DOES_WIDGET_GROUP_EXIST(gasWidget.groupID)
SETUP_GAS_WIDGET()
ELSE
REPEAT COUNT_OF(piGasPickup) i
IF (bWarpToGas[i])
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Warping to gas pickup ", i)
WARP_TO_PICKUP(GET_GAS_PICKUP_COORDS(i))
bWarpToGas[i] = FALSE
ENDIF
ENDREPEAT
i=0
IF gasWidget.bBlip
REPEAT COUNT_OF(piGasPickup) i
IF NOT DOES_BLIP_EXIST(gasBlips[i])
gasBlips[i] = ADD_BLIP_FOR_COORD(GET_GAS_PICKUP_COORDS(i))
ENDIF
ENDREPEAT
gasWidget.bBlip = FALSE
ENDIF
ENDIF
ELSE
IF DOES_WIDGET_GROUP_EXIST(gasWidget.groupID)
REMOVE_BLIPS(COUNT_OF(piGasPickup), gasBlips)
DELETE_WIDGET_GROUP(gasWidget.groupID)
ENDIF
ENDIF
// Health pickups
IF healthWidget.bToggle
IF NOT DOES_WIDGET_GROUP_EXIST(healthWidget.groupID)
SETUP_HEALTH_WIDGET()
ELSE
REPEAT COUNT_OF(piHealthPickup) i
IF (bWarpToHealth[i])
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Warping to health pickup ", i)
IF (i = 3)
WARP_TO_PICKUP(<<-246.1343, 6331.7368, 31.4262>>)
ELIF (i = 4)
WARP_TO_PICKUP(<<-139.6319, -2497.1509, 38.6612>>)
ELIF (i = 16)
WARP_TO_PICKUP(<<1644.2069, 4868.0811, 41.0292>>)
ELIF(i = 24)
WARP_TO_PICKUP(<<1737.8108, 3322.5554, 40.2235>>)
ELIF (i = 33)
WARP_TO_PICKUP(<<-1505.8, 862.3, 181.6>>)
ELIF (i = 39) // Tent village
WARP_TO_PICKUP(<<1442.7953, 6334.1733, 22.9003>>)
ELIF (i = 60)
WARP_TO_PICKUP(<<-552.6899, 5348.7275, 73.7478>>)
ELIF (i = 63)
WARP_TO_PICKUP(<<154.2276, -744.3879, 257.1519>>)
ELIF (i = 65)
WARP_TO_PICKUP(<<25.9113, -627.0163, 13.9622>>)
ELSE
WARP_TO_PICKUP(GET_HEALTH_PICKUP_COORDS(i))
ENDIF
bWarpToHealth[i] = FALSE
ENDIF
ENDREPEAT
i=0
IF healthWidget.bBlip
REPEAT COUNT_OF(piHealthPickup) i
IF NOT DOES_BLIP_EXIST(healthBlips[i])
healthBlips[i] = ADD_BLIP_FOR_COORD(GET_HEALTH_PICKUP_COORDS(i))
ENDIF
ENDREPEAT
healthWidget.bBlip = FALSE
ENDIF
ENDIF
ELSE
IF DOES_WIDGET_GROUP_EXIST(healthWidget.groupID)
REMOVE_BLIPS(COUNT_OF(piHealthPickup), healthBlips)
DELETE_WIDGET_GROUP(healthWidget.groupID)
ENDIF
ENDIF
// Weapon pickups
IF weaponWidget.bToggle
IF NOT DOES_WIDGET_GROUP_EXIST(weaponWidget.groupID)
SETUP_WEAPON_WIDGET()
ELSE
REPEAT COUNT_OF(piWeaponPickup) i
IF (bWarpToWeapon[i])
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Warping to weapon pickup ", i)
// Handle special case warps
VECTOR vPos = <<0,0,0>>
IF (i = 12)
vPos = << 557.5304, -837.8345, 55.1235 >>
ELIF (i = 50)
vPos = << -1086.5460, -2430.1213, 12.9449 >>
ELIF (i = 100)
vPos = <<-106.8103, -968.0106, 295.2905>>
ELSE
vPos = GET_WEAPON_PICKUP_COORDS(i)
ENDIF
WARP_TO_PICKUP(vPos)
bWarpToWeapon[i] = FALSE
ENDIF
ENDREPEAT
i=0
IF weaponWidget.bBlip
REPEAT COUNT_OF(piWeaponPickup) i
IF NOT DOES_BLIP_EXIST(weaponBlips[i])
weaponBlips[i] = ADD_BLIP_FOR_COORD(GET_WEAPON_PICKUP_COORDS(i))
ENDIF
ENDREPEAT
weaponWidget.bBlip = FALSE
ENDIF
ENDIF
ELSE
IF DOES_WIDGET_GROUP_EXIST(weaponWidget.groupID)
REMOVE_BLIPS(COUNT_OF(piWeaponPickup), weaponBlips)
DELETE_WIDGET_GROUP(weaponWidget.groupID)
ENDIF
ENDIF
ENDPROC
#ENDIF
//**********************************************************************************
// ARMOUR PICKUPS
//**********************************************************************************
/// PURPOSE:
/// Create armour pickup instance
PROC CREATE_ARMOUR_PICKUP(INT iIndex, VECTOR vRot, BOOL bSnapToGround=TRUE, BOOL bIsInInterior=FALSE, BOOL bSpawnUpright=FALSE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF bSpawnUpright
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
ENDIF
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piArmourPickup[iIndex] = CREATE_PICKUP_ROTATE(PICKUP_ARMOUR_STANDARD, GET_ARMOUR_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piArmourPickup[iIndex], 600000)
//if its in an interior, place it correctly
IF bIsInInterior
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piArmourPickup[iIndex], GET_ARMOUR_PICKUP_ROOM_NAME(iIndex))
ENDIF
ENDPROC
/// PURPOSE:
/// Setup armour pickup spawners
PROC SETUP_WORLD_ARMOUR_PICKUPS()
// DEFINE PICKUPS
CREATE_ARMOUR_PICKUP(0, << 0,0,6 >>)
CREATE_ARMOUR_PICKUP(1, << 0,0,78 >>)
CREATE_ARMOUR_PICKUP(2, << 90,0,2 >>)
CREATE_ARMOUR_PICKUP(3, << 0,0,330 >>)
CREATE_ARMOUR_PICKUP(4, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(5, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(6, << 0,0,6 >>)
CREATE_ARMOUR_PICKUP(7, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(8, << 90,0,0 >>, FALSE)
CREATE_ARMOUR_PICKUP(9, << 0,0,46 >>)
CREATE_ARMOUR_PICKUP(10, << 90,0,9 >>)
CREATE_ARMOUR_PICKUP(11, << -83.56,0,0 >>, FALSE)
CREATE_ARMOUR_PICKUP(12, << -102.96,0,0 >>, FALSE) // Under rock face
CREATE_ARMOUR_PICKUP(13, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(14, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(15, << 0,0,78 >>)
CREATE_ARMOUR_PICKUP(16, << -90,0,145.4 >>, FALSE)
CREATE_ARMOUR_PICKUP(17, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(18, << 0,0,42 >>)
CREATE_ARMOUR_PICKUP(19, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(20, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(21, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(22, << 0,0,3 >>)
CREATE_ARMOUR_PICKUP(23, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(24, << 0,0,0 >>)
//police stations
CREATE_ARMOUR_PICKUP(25, << 5,0,-146 >>) // Paleto Bay
CREATE_ARMOUR_PICKUP(26, << 0,0,108 >>) // Sandy Shores
CREATE_ARMOUR_PICKUP(27, << 0,0,130 >>)
CREATE_ARMOUR_PICKUP(28, << -90,0,-180 >>, FALSE, TRUE)
CREATE_ARMOUR_PICKUP(29, << 0,0,14 >>)
CREATE_ARMOUR_PICKUP(30, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(31, << 0,0,0 >>)
CREATE_ARMOUR_PICKUP(32, << 0,0,5 >>)
CREATE_ARMOUR_PICKUP(33, << 0,0,72 >>)
CREATE_ARMOUR_PICKUP(34, << 0,0,27 >>)
CREATE_ARMOUR_PICKUP(35, << 0,0,7 >>)
CREATE_ARMOUR_PICKUP(36, << 0,0,7 >>)
CREATE_ARMOUR_PICKUP(37, << 0,0,7 >>)
CREATE_ARMOUR_PICKUP(38, << 0,0,7 >>)
CREATE_ARMOUR_PICKUP(39, << -90,0,-20 >>, FALSE, TRUE)
CREATE_ARMOUR_PICKUP(40, << -90,0,0 >>, FALSE)
CREATE_ARMOUR_PICKUP(41, << 0,0,7 >>, TRUE, TRUE)
CREATE_ARMOUR_PICKUP(42, << 0,0,7 >>)
CREATE_ARMOUR_PICKUP(43, << -92,0,-18 >>, FALSE)
CREATE_ARMOUR_PICKUP(44, << 90,0,-108 >>, FALSE) // Altruist cache
ENDPROC
/// PURPOSE:
/// Remove all armour pickup spawners
PROC REMOVE_WORLD_ARMOUR_PICKUPS()
INT i
REPEAT NUMBER_OF_ARMOUR_PICKUPS i
IF DOES_PICKUP_EXIST(piArmourPickup[i])
REMOVE_PICKUP(piArmourPickup[i])
ENDIF
ENDREPEAT
ENDPROC
//**********************************************************************************
// EXILE PICKUPS
//**********************************************************************************
/// PURPOSE:
/// Setup weapon or armour pickup instance
/// PARAMS:
/// iIndex - array position
/// eType - Weapon type, or armour
/// vPos - location coords
/// vRot - YXZ ordered angles - use the pickup placement helper, not script debug tools!
/// bSnapToGround - snap to terrain surface. Can make items drop through props that haven't streamed in in time.
/// bOrient - Orient to ground. Armour always does.
PROC CREATE_EXILE1_UNLOCK_PICKUP(INT iIndex, PICKUP_TYPE eType, VECTOR vRot, BOOL bSnapToGround=TRUE, BOOL bOrient=TRUE)
INT iPlacementFlags = 0
IF eType = PICKUP_ARMOUR_STANDARD
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
// SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
ELSE
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF bOrient
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
ENDIF
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
ENDIF
// Create pickup
piExilePickup[iIndex] = CREATE_PICKUP_ROTATE(eType, GET_EXILE1_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piExilePickup[iIndex], 600000)
ENDPROC
/// PURPOSE:
/// Setup weapon or armour pickup instance
/// PARAMS:
/// iIndex - array position
/// eType - Weapon type, or armour
/// vPos - location coords
/// vRot - YXZ ordered angles - use the pickup placement helper, not script debug tools!
/// bSnapToGround - snap to terrain surface. Can make items drop through props that haven't streamed in in time.
/// bOrient - Orient to ground. Armour always does.
PROC CREATE_EXILE1_CGTONG_UNLOCK_PICKUP(INT iIndex, PICKUP_TYPE eType, VECTOR vRot, BOOL bSnapToGround=TRUE, BOOL bOrient=TRUE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF bOrient
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
ENDIF
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piExileCGtoNGPickup[iIndex] = CREATE_PICKUP_ROTATE(eType, GET_EXILE1_CGTONG_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piExileCGtoNGPickup[iIndex], 600000)
ENDPROC
/// PURPOSE:
/// Setup weapon or armour pickup instance
/// PARAMS:
/// iIndex - array position
/// eType - Weapon type, or armour
/// vPos - location coords
/// vRot - YXZ ordered angles - use the pickup placement helper, not script debug tools!
/// bSnapToGround - snap to terrain surface. Can make items drop through props that haven't streamed in in time.
/// bOrient - Orient to ground. Armour always does.
PROC CREATE_TREVOR1_CGTONG_UNLOCK_PICKUP(INT iIndex, PICKUP_TYPE eType, VECTOR vRot, BOOL bSnapToGround=TRUE, BOOL bOrient=TRUE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF bOrient
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
ENDIF
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piTrevorCGtoNGPickup[iIndex] = CREATE_PICKUP_ROTATE(eType, GET_TREVOR1_CGTONG_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piTrevorCGtoNGPickup[iIndex], 600000)
ENDPROC
/// PURPOSE:
/// Setup Mission pickup spawners
PROC SETUP_EXILE1_UNLOCK_PICKUPS()
// DEFINE PICKUPS
CREATE_EXILE1_UNLOCK_PICKUP(0, PICKUP_WEAPON_GRENADELAUNCHER, << 156.24, 0, 25.2 >>)
CREATE_EXILE1_UNLOCK_PICKUP(1, PICKUP_WEAPON_RPG, << -92.68, 62.64, -264.24 >>)
CREATE_EXILE1_UNLOCK_PICKUP(2, PICKUP_WEAPON_COMBATMG, << -70, 0, -40 >>)
CREATE_EXILE1_UNLOCK_PICKUP(3, PICKUP_ARMOUR_STANDARD, << -71, 0, 168.48 >>)
CREATE_EXILE1_UNLOCK_PICKUP(4, PICKUP_WEAPON_APPISTOL, << -100.8, 92.8, 0 >>)
CREATE_EXILE1_UNLOCK_PICKUP(5, PICKUP_WEAPON_PUMPSHOTGUN, << 77.76, 10.08, -17.28 >>)
CREATE_EXILE1_UNLOCK_PICKUP(6, PICKUP_WEAPON_SNIPERRIFLE, << 97.92, 0, 100.8 >>)
CREATE_EXILE1_UNLOCK_PICKUP(7, PICKUP_WEAPON_STICKYBOMB, << 0, 0, 0 >>) //<< -7, 15, 0 >>
CREATE_EXILE1_UNLOCK_PICKUP(8, PICKUP_WEAPON_STICKYBOMB, << 0, 0, 0 >>) //<< -9.0, -2.0, 0 >>
ENDPROC
/// PURPOSE:
/// Setup Exile CGtoNG pickup spawners
PROC SETUP_EXILE1_CGTONG_UNLOCK_PICKUPS()
IF IS_LAST_GEN_PLAYER()
// DEFINE PICKUPS
CREATE_EXILE1_CGTONG_UNLOCK_PICKUP(0, PICKUP_WEAPON_DLC_RAILGUN, << 156.24, 0, 166.2 >>)
ENDIF
ENDPROC
/// PURPOSE:
/// Setup Trevor CGtoNG pickup spawners
PROC SETUP_TREVOR1_CGTONG_UNLOCK_PICKUPS()
IF IS_LAST_GEN_PLAYER()
// DEFINE PICKUPS
CREATE_TREVOR1_CGTONG_UNLOCK_PICKUP(0, PICKUP_WEAPON_DLC_HATCHET, << 156.24, 0, 71.2 >>)
ENDIF
ENDPROC
/// PURPOSE:
/// Remove all Exile pickup spawners
PROC REMOVE_EXILE1_UNLOCK_PICKUPS()
INT i
REPEAT NUMBER_OF_EXILE1_PICKUPS i
IF DOES_PICKUP_EXIST(piExilePickup[i])
REMOVE_PICKUP(piExilePickup[i])
ENDIF
ENDREPEAT
bUnlockedExilePickups = FALSE
ENDPROC
/// PURPOSE:
/// Remove all Exile CGtoNG pickup spawners
PROC REMOVE_EXILE1_CGTONG_UNLOCK_PICKUPS()
INT i
REPEAT NUMBER_OF_EXILE1_CGTONG_PICKUPS i
IF DOES_PICKUP_EXIST(piExileCGtoNGPickup[i])
REMOVE_PICKUP(piExileCGtoNGPickup[i])
ENDIF
ENDREPEAT
bUnlockedExileCGtoNGPickups = FALSE
ENDPROC
/// PURPOSE:
/// Remove all Trevot CGtoNG pickup spawners
PROC REMOVE_TREVOR1_CGTONG_UNLOCK_PICKUPS()
INT i
REPEAT NUMBER_OF_TREVOR1_CGTONG_PICKUPS i
IF DOES_PICKUP_EXIST(piTrevorCGtoNGPickup[i])
REMOVE_PICKUP(piTrevorCGtoNGPickup[i])
ENDIF
ENDREPEAT
bUnlockedTrevorCGtoNGPickups = FALSE
ENDPROC
//**********************************************************************************
// GAS PICKUPS
//**********************************************************************************
/// PURPOSE:
/// Create jerry can pickup instance
PROC CREATE_GAS_PICKUP(INT iIndex, VECTOR vRot, BOOL bSnapToGround=TRUE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piGasPickup[iIndex] = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PETROLCAN, GET_GAS_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piGasPickup[iIndex], 600000)
ENDPROC
/// PURPOSE:
/// Setup armour pickup spawners
PROC SETUP_WORLD_GAS_PICKUPS()
// DEFINE PICKUPS
CREATE_GAS_PICKUP(0, << 0,0,0 >>)
CREATE_GAS_PICKUP(1, << 0,0,0 >>)
CREATE_GAS_PICKUP(2, << 0,0,0 >>)
CREATE_GAS_PICKUP(3, << 0,0,0 >>)
CREATE_GAS_PICKUP(4, << 0,0,0 >>)
CREATE_GAS_PICKUP(5, << 0,0,0 >>)
CREATE_GAS_PICKUP(6, << 0,0,0 >>)
CREATE_GAS_PICKUP(7, << 0,0,0 >>)
CREATE_GAS_PICKUP(8, << 0,0,0 >>)
CREATE_GAS_PICKUP(9, << 0,0,0 >>)
CREATE_GAS_PICKUP(10, << 0,0,0 >>)
CREATE_GAS_PICKUP(11, << 0,0,0 >>)
CREATE_GAS_PICKUP(12, << 0,0,0 >>)
CREATE_GAS_PICKUP(13, << 0,0,0 >>)
CREATE_GAS_PICKUP(14, << 0,0,0 >>)
CREATE_GAS_PICKUP(15, << 0,0,0 >>)
CREATE_GAS_PICKUP(16, << 0,0,0 >>)
CREATE_GAS_PICKUP(17, << 0,0,0 >>)
CREATE_GAS_PICKUP(18, << 0,0,0 >>)
ENDPROC
/// PURPOSE:
/// Remove all gas pickup spawners
PROC REMOVE_WORLD_GAS_PICKUPS()
INT i
REPEAT NUMBER_OF_GAS_PICKUPS i
IF DOES_PICKUP_EXIST(piGasPickup[i])
REMOVE_PICKUP(piGasPickup[i])
ENDIF
ENDREPEAT
ENDPROC
//**********************************************************************************
// HEALTH PICKUPS
//**********************************************************************************
/// PURPOSE:
/// Create health pickup instance
/// PARAMS:
/// iIndex - Array position
/// vRot - Rotation Euler angles
/// bDontSnapToGround - Set to TRUE to disable snap to ground
/// bIsInInterior - Set to TRUE if in an interior and add the interior in GET_PICKUP_ROOM_NAME
PROC CREATE_HEALTH_PICKUP(INT iIndex, VECTOR vRot, BOOL bDontSnapToGround=FALSE, BOOL bIsInInterior=FALSE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
IF NOT bDontSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piHealthPickup[iIndex] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, GET_HEALTH_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piHealthPickup[iIndex], 600000)
//if its in an interior, place it correctly
IF bIsInInterior
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piHealthPickup[iIndex], GET_PICKUP_ROOM_NAME(iIndex))
ENDIF
ENDPROC
/// PURPOSE:
/// Setup health pickup data
PROC SETUP_WORLD_HEALTH_PICKUPS()
// DEFINE PICKUPS
CREATE_HEALTH_PICKUP(0, << 0,0,0 >>) // Adventure Trail
CREATE_HEALTH_PICKUP(1, << 0,0,24 >>) // Altruist Camp Guard Tower
CREATE_HEALTH_PICKUP(2, << 0,0,60 >>, TRUE, TRUE) // Army Control Tower (corner top floor)
CREATE_HEALTH_PICKUP(3, << 0,0,45 >>) // Paleto Bay Care Centre
CREATE_HEALTH_PICKUP(4, << 0,0,55 >>, TRUE) // Bridge Service Access
CREATE_HEALTH_PICKUP(5, << 0,0,0 >>) // Chumash Tennis Courts
CREATE_HEALTH_PICKUP(6, << 0,0,0 >>) // Church Rear Exit in Little Seoul
CREATE_HEALTH_PICKUP(7, << 0,0,0 >>) // Courtyard of IAA and FIB
CREATE_HEALTH_PICKUP(8, << 0,0,90 >>, TRUE, TRUE) // East LS Fire Station
CREATE_HEALTH_PICKUP(9, << 0,0,0 >>) // Farm House Garden
CREATE_HEALTH_PICKUP(10, << 0,0,-112 >>) // Fishing Shack at Alamo Sea
CREATE_HEALTH_PICKUP(11, << 0,0,0 >>) // Fruit market
CREATE_HEALTH_PICKUP(12, << 0,0,0 >>) // Harmony Motel
CREATE_HEALTH_PICKUP(13, << 0,0,0 >>) // Hotel Courtyard
CREATE_HEALTH_PICKUP(14, << 0,0,0 >>) // House Foundations
CREATE_HEALTH_PICKUP(15, << 0,0,35 >>) // Inside Dam
CREATE_HEALTH_PICKUP(16, << 0,0,13 >>) // Alley near closed Fleeca Bank in Grapeseed
CREATE_HEALTH_PICKUP(17, << 0,0,0 >>, FALSE, TRUE) // Inside Los Santos Customs
CREATE_HEALTH_PICKUP(18, << 0,0,-64 >>, TRUE) // Inside Movie Trailer at Movie Studio // Repositioned - B*1401263
CREATE_HEALTH_PICKUP(19, << 0,0,0 >>) // Lombank
CREATE_HEALTH_PICKUP(20, << 0,0,-62.4 >>, TRUE) // Lost MC Clubhouse exterior
CREATE_HEALTH_PICKUP(21, << 0,0,0 >>) // Mirror Park Wash Station
CREATE_HEALTH_PICKUP(22, << 0,0,0 >>) // Bell Building at Kortz Center
CREATE_HEALTH_PICKUP(23, << 0,0,0 >>) // Mission Route - Lost Trailer park Burned out house
CREATE_HEALTH_PICKUP(24, << 0,0,95 >>) // Senora Airfield Hangar
CREATE_HEALTH_PICKUP(25, << 0,0,0 >>) // Mount Chilead Viewing Platform
CREATE_HEALTH_PICKUP(26, << 0,0,-15 >>, TRUE) // Observatory
CREATE_HEALTH_PICKUP(27, << 0,0,0 >>) // Outside Barn in Grapeseed
CREATE_HEALTH_PICKUP(28, << 0,0,-5 >>) // Outside Yellow House on Coast
CREATE_HEALTH_PICKUP(29, << 5,0,-45>>) // Behind Paleto Police Station
CREATE_HEALTH_PICKUP(30, << 0,0,0 >>) // Pumpkin Patch Garden
CREATE_HEALTH_PICKUP(31, << 6,0,51 >>) // LS Central Medical Center rear // Repositioned - B*1339106
CREATE_HEALTH_PICKUP(32, << 0,0,-28 >>) // Rear of Pill Pharm Clinic // Repositioned - B*1336955
CREATE_HEALTH_PICKUP(33, << 0,0,33 >>) // Rehab Center in Vinewood // Repositioned - B*1355129
CREATE_HEALTH_PICKUP(34, << 0,0,0 >>) // Rock Arch
CREATE_HEALTH_PICKUP(35, << 0,0,0 >>) // Round the back of Odea's pharmacy
CREATE_HEALTH_PICKUP(36, << 5,0,30.2 >>, TRUE) // Sandy Shores Medical Center
CREATE_HEALTH_PICKUP(37, << 0,0,0 >>, TRUE) // Security Booth at Bollingbroke Peniteniary
CREATE_HEALTH_PICKUP(38, << 0,0,70.5 >>, TRUE, TRUE) // Service area inside Simeon's Dealership
CREATE_HEALTH_PICKUP(39, << 0,0,70 >>, TRUE) // Tent Village
CREATE_HEALTH_PICKUP(40, << 0,0,45 >>) // Upstairs at marina yacht Club
CREATE_HEALTH_PICKUP(41, << 0,0,-7 >>, TRUE) // Vagos Ganghouse
CREATE_HEALTH_PICKUP(42, << 0,0,-13 >>, TRUE) // Vespucci Beach Toilets
CREATE_HEALTH_PICKUP(43, << 0,0,44.4 >>, TRUE) // Vinewood Hills Construction site
CREATE_HEALTH_PICKUP(44, << 0,0,35 >>) // Vinewood Organic Health Center
CREATE_HEALTH_PICKUP(45, << 0,0,89.8 >>, TRUE) // Vinewood Sign Power Station
CREATE_HEALTH_PICKUP(46, << 0,0,-166 >>) // Vinewood trash pile
CREATE_HEALTH_PICKUP(47, << 0,0,0 >>) // Vineyard House Rear Garden
CREATE_HEALTH_PICKUP(48, << 0,0,0 >>, FALSE, TRUE) // Warehouse at Docks
CREATE_HEALTH_PICKUP(49, << 0,2,90 >>, TRUE) // Workman's Shack Under Freeway
CREATE_HEALTH_PICKUP(50, << 0,0,34 >>) // Lifeguard Hut 1
CREATE_HEALTH_PICKUP(51, << 0,0,59 >>, TRUE, TRUE) // Interior
CREATE_HEALTH_PICKUP(52, << 0,0,5 >>) // Lifeguard Hut 2
CREATE_HEALTH_PICKUP(53, << 0,0,70 >>) // Lifeguard Hut 3
CREATE_HEALTH_PICKUP(54, << 0,0,104 >>) // Lifeguard Hut 4
CREATE_HEALTH_PICKUP(55, << 0,0,-85 >>) // Val-De-Grace roof
CREATE_HEALTH_PICKUP(56, << 0,0,32 >>) // Vinewood Hills - Garden Bushes
CREATE_HEALTH_PICKUP(57, << 0,0,38 >>, TRUE) // O'Neill's farm stables
CREATE_HEALTH_PICKUP(58, << 0,0,100 >>, FALSE, TRUE) // cash register
CREATE_HEALTH_PICKUP(59, << 0,0,70 >>, TRUE) // power box
CREATE_HEALTH_PICKUP(60, << 0,0,69.7 >>, TRUE) // alarms
CREATE_HEALTH_PICKUP(61, << 0,0,100 >>) // dumpsters
CREATE_HEALTH_PICKUP(62, << 0,20.1,52.5 >>, TRUE) // outdoor toilet
CREATE_HEALTH_PICKUP(63, << 0,0,339 >>, TRUE, TRUE) // back of office
CREATE_HEALTH_PICKUP(64, << 0,0,61 >>) // hobo shack
CREATE_HEALTH_PICKUP(65, << 0,0,284 >>, TRUE, TRUE) // work station container
CREATE_HEALTH_PICKUP(66, << 0,0,-20 >>, TRUE) // fire hose
CREATE_HEALTH_PICKUP(67, << 6,0,0 >>, TRUE) // St. Fiacre rear garages - B*1339106
CREATE_HEALTH_PICKUP(68, << 6,0,-215 >>, TRUE) // St. Fiacre front door - B*1339106
CREATE_HEALTH_PICKUP(69, << -6,0,-40 >>, TRUE) // LS Central Medical Center Emergency - B*1339106
CREATE_HEALTH_PICKUP(70, << 6,0,140 >>, TRUE) // LS Central Medical Center main entrance - B*1339106
CREATE_HEALTH_PICKUP(71, << 6,0,-110 >>, TRUE) // Pillbox Hill Medical Center upper entrance - B*1339106
CREATE_HEALTH_PICKUP(72, << -6,0,-110 >>, TRUE) // Pillbox Hill Medical Center lower entrance - B*1339106
CREATE_HEALTH_PICKUP(73, << 6,0,-7 >>, TRUE) // Mount Zonah Medical Center Emergency - B*1339106
CREATE_HEALTH_PICKUP(74, << 6,0,173 >>, TRUE) // Mount Zonah Medical Center Emergency - B*1339106
CREATE_HEALTH_PICKUP(75, << 0,0,23.3 >>, TRUE) // Kortz Center on pillar - B*1526799
ENDPROC
/// PURPOSE: Remove all health pickup spawners
PROC REMOVE_WORLD_HEALTH_PICKUPS()
INT i
REPEAT NUMBER_OF_HEALTH_PICKUPS i
IF DOES_PICKUP_EXIST(piHealthPickup[i])
REMOVE_PICKUP(piHealthPickup[i])
ENDIF
ENDREPEAT
ENDPROC
//**********************************************************************************
// WEAPON PICKUPS
//**********************************************************************************
/// PURPOSE:
/// Setup weapon pickup instance
/// PARAMS:
/// bSnapToGround - Snaps to ground (this can cause it to drop through props)
/// bIsInInterior - MUST be true for interiors
/// bOrient - Orient to ground
PROC CREATE_WEAPON_PICKUP(INT iIndex, PICKUP_TYPE eType, VECTOR vRot, BOOL bSnapToGround=TRUE, BOOL bIsInInterior=FALSE, BOOL bOrient=TRUE)
INT iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_REGENERATES))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF bOrient
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
ENDIF
IF bSnapToGround
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
ENDIF
// Create pickup
piWeaponPickup[iIndex] = CREATE_PICKUP_ROTATE(eType, GET_WEAPON_PICKUP_COORDS(iIndex), vRot, iPlacementFlags)
SET_PICKUP_REGENERATION_TIME(piWeaponPickup[iIndex], 600000)
// Add pickup to interior if required
IF bIsInInterior
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piWeaponPickup[iIndex], GET_WEAPON_PICKUP_ROOM_NAME(iIndex))
ENDIF
ENDPROC
/// PURPOSE:
/// Setup armour pickup spawners
PROC SETUP_WORLD_WEAPON_PICKUPS()
// DEFINE PICKUPS
CREATE_WEAPON_PICKUP(0, PICKUP_WEAPON_ASSAULTRIFLE, << 90,0,70 >>, FALSE)
CREATE_WEAPON_PICKUP(1, PICKUP_WEAPON_ASSAULTRIFLE, << 90,0,0 >>, FALSE)
CREATE_WEAPON_PICKUP(2, PICKUP_WEAPON_ASSAULTRIFLE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(3, PICKUP_WEAPON_ASSAULTRIFLE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(4, PICKUP_WEAPON_ASSAULTRIFLE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(5, PICKUP_WEAPON_ASSAULTRIFLE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(6, PICKUP_WEAPON_GRENADE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(7, PICKUP_WEAPON_GRENADE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(8, PICKUP_WEAPON_GRENADE, << 95,0,0 >>, FALSE)
CREATE_WEAPON_PICKUP(9, PICKUP_WEAPON_GRENADE, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(10, PICKUP_WEAPON_GRENADELAUNCHER, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(11, PICKUP_WEAPON_GRENADELAUNCHER, << 118,0,92 >>, FALSE, FALSE, FALSE)
CREATE_WEAPON_PICKUP(12, PICKUP_WEAPON_GRENADELAUNCHER, << 82,-60,0 >>, FALSE, FALSE, FALSE)
CREATE_WEAPON_PICKUP(13, PICKUP_WEAPON_MINIGUN, << 0,0,0 >>, TRUE, TRUE)
CREATE_WEAPON_PICKUP(14, PICKUP_WEAPON_MG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(15, PICKUP_WEAPON_MG, << 97.92,60.48,0 >>, FALSE)
CREATE_WEAPON_PICKUP(16, PICKUP_WEAPON_MG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(17, PICKUP_WEAPON_MG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(18, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(19, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(20, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(21, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(22, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(23, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(24, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(25, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(26, PICKUP_WEAPON_PISTOL, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(27, PICKUP_WEAPON_PISTOL, << 0,0,36 >>)
CREATE_WEAPON_PICKUP(28, PICKUP_WEAPON_RPG, << 86,0,0 >>)
CREATE_WEAPON_PICKUP(29, PICKUP_WEAPON_RPG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(30, PICKUP_WEAPON_RPG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(31, PICKUP_WEAPON_SAWNOFFSHOTGUN, << -82,0,0 >>, FALSE)
CREATE_WEAPON_PICKUP(32, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 0,0,24 >>)
CREATE_WEAPON_PICKUP(33, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 0,0,12 >>)
CREATE_WEAPON_PICKUP(34, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 0,0,98 >>)
CREATE_WEAPON_PICKUP(35, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 90,0,140 >>)
CREATE_WEAPON_PICKUP(36, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 90,0,120 >>, FALSE)
CREATE_WEAPON_PICKUP(37, PICKUP_WEAPON_SMG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(38, PICKUP_WEAPON_SMG, << 85.68,-92.88,0 >>, FALSE)
CREATE_WEAPON_PICKUP(39, PICKUP_WEAPON_SMG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(40, PICKUP_WEAPON_SMG, << 0,0,20 >>)
CREATE_WEAPON_PICKUP(41, PICKUP_WEAPON_SMG, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(42, PICKUP_WEAPON_SMG, << 0,0,0 >>, TRUE, TRUE)
CREATE_WEAPON_PICKUP(43, PICKUP_WEAPON_SNIPERRIFLE, << 0,0,42 >>)
CREATE_WEAPON_PICKUP(44, PICKUP_WEAPON_SNIPERRIFLE, << 0,0,52 >>)
CREATE_WEAPON_PICKUP(45, PICKUP_WEAPON_SNIPERRIFLE, << 90,0,87 >>)
CREATE_WEAPON_PICKUP(46, PICKUP_WEAPON_SNIPERRIFLE, << 0,0,98 >>)
CREATE_WEAPON_PICKUP(47, PICKUP_WEAPON_SNIPERRIFLE, << 0,0,20 >>)
CREATE_WEAPON_PICKUP(48, PICKUP_WEAPON_STICKYBOMB, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(49, PICKUP_WEAPON_STICKYBOMB, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(50, PICKUP_WEAPON_RPG, << 63,0,0 >>, FALSE)
CREATE_WEAPON_PICKUP(51, PICKUP_WEAPON_PISTOL, << 0,0,4 >>)
CREATE_WEAPON_PICKUP(52, PICKUP_WEAPON_PISTOL, << 90,90,90 >>, FALSE, FALSE, FALSE)
CREATE_WEAPON_PICKUP(53, PICKUP_WEAPON_SNIPERRIFLE, << 0,0,2 >>)
CREATE_WEAPON_PICKUP(54, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(55, PICKUP_WEAPON_BAT, << 90,0,4 >>)
CREATE_WEAPON_PICKUP(56, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(57, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(58, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(59, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(60, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(61, PICKUP_WEAPON_BAT, << 0,0,0 >>, TRUE, TRUE)
CREATE_WEAPON_PICKUP(62, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(63, PICKUP_WEAPON_BAT, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(64, PICKUP_WEAPON_BAT, << 0,0,0 >>, TRUE, TRUE)
CREATE_WEAPON_PICKUP(65, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(66, PICKUP_WEAPON_CROWBAR, << 90,0,45 >>, FALSE) // Parking lot booth
CREATE_WEAPON_PICKUP(67, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(68, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(69, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(70, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(71, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(72, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(73, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(74, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(75, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(76, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(77, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(78, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(79, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(80, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(81, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(82, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(83, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(84, PICKUP_WEAPON_MOLOTOV, << 0,0,0 >>)
CREATE_WEAPON_PICKUP(85, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(86, PICKUP_WEAPON_BAT, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(87, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(88, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(89, PICKUP_WEAPON_BAT, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(90, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(91, PICKUP_WEAPON_BAT, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(92, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(93, PICKUP_WEAPON_BAT, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(94, PICKUP_WEAPON_CROWBAR, << 0,0,0 >>) // Was hammer, removed as DLC
CREATE_WEAPON_PICKUP(95, PICKUP_WEAPON_CARBINERIFLE, << 0,0,87 >>)
CREATE_WEAPON_PICKUP(96, PICKUP_WEAPON_ASSAULTSHOTGUN, << 0,0,0 >>, TRUE, TRUE)
CREATE_WEAPON_PICKUP(97, PICKUP_WEAPON_ASSAULTSHOTGUN, << 85.7,0,136 >>, FALSE, FALSE, FALSE)
CREATE_WEAPON_PICKUP(98, PICKUP_PARACHUTE, << 10,0,-90 >>, FALSE, FALSE, FALSE) // Parachute
CREATE_WEAPON_PICKUP(99, PICKUP_WEAPON_PUMPSHOTGUN, << -88,0,0>>, FALSE, FALSE, FALSE)
CREATE_WEAPON_PICKUP(100, PICKUP_PARACHUTE, << 11,0,28.16 >>, FALSE, FALSE, FALSE) // Parachute
CREATE_WEAPON_PICKUP(101, PICKUP_WEAPON_SAWNOFFSHOTGUN, << 92.8,0,50.4 >>, FALSE, FALSE, FALSE)
ENDPROC
/// PURPOSE:
/// Remove all weapon pickup spawners
PROC REMOVE_WORLD_WEAPON_PICKUPS()
INT i
REPEAT NUMBER_OF_WEAPON_PICKUPS i
IF DOES_PICKUP_EXIST(piWeaponPickup[i])
REMOVE_PICKUP(piWeaponPickup[i])
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Create armour, health and weapon pickups
PROC CREATE_PICKUPS()
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Creating all pickups")
SETUP_WORLD_ARMOUR_PICKUPS()
SETUP_WORLD_GAS_PICKUPS()
SETUP_WORLD_HEALTH_PICKUPS()
SETUP_WORLD_WEAPON_PICKUPS()
bPickupsCreated = TRUE
ENDPROC
PROC DESTROY_PICKUPS()
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing all world pickups...")
REMOVE_WORLD_ARMOUR_PICKUPS()
REMOVE_WORLD_GAS_PICKUPS()
REMOVE_WORLD_HEALTH_PICKUPS()
REMOVE_WORLD_WEAPON_PICKUPS()
// Remove all mission unlock pickups
IF bUnlockedExilePickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Exile 1 unlock pickups...")
REMOVE_EXILE1_UNLOCK_PICKUPS()
ENDIF
IF bUnlockedExileCGtoNGPickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Exile 1 CGtoNG unlock pickups...")
REMOVE_EXILE1_CGTONG_UNLOCK_PICKUPS()
ENDIF
IF bUnlockedTrevorCGtoNGPickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Trevor 1 CGtoNG unlock pickups...")
REMOVE_TREVOR1_CGTONG_UNLOCK_PICKUPS()
ENDIF
bPickupsCreated = FALSE
ENDPROC
/// PURPOSE:
/// Listens for requests from other scripts to see if a pickup has been collected
PROC CHECK_QUERY_REQUESTS()
SWITCH g_ePickupQuery
CASE PC_QUERY_INACTIVE
// Waiting on request...
// Need to call INIT_PICKUP_QUERY_REQUEST()
BREAK
CASE PC_QUERY_REQUEST
SWITCH g_eQueryType
CASE PC_QUERY_TYPE_ARMOUR
IF DOES_PICKUP_EXIST(piArmourPickup[g_iPickupIndex])
AND DOES_PICKUP_OBJECT_EXIST(piArmourPickup[g_iPickupIndex])
g_bPickupCollected = FALSE
ELSE
g_bPickupCollected = TRUE
ENDIF
BREAK
CASE PC_QUERY_TYPE_HEALTH
IF DOES_PICKUP_EXIST(piHealthPickup[g_iPickupIndex])
AND DOES_PICKUP_OBJECT_EXIST(piHealthPickup[g_iPickupIndex])
g_bPickupCollected = FALSE
ELSE
g_bPickupCollected = TRUE
ENDIF
BREAK
CASE PC_QUERY_TYPE_WEAPON
IF DOES_PICKUP_EXIST(piWeaponPickup[g_iPickupIndex])
AND DOES_PICKUP_OBJECT_EXIST(piWeaponPickup[g_iPickupIndex])
g_bPickupCollected = FALSE
ELSE
g_bPickupCollected = TRUE
ENDIF
BREAK
CASE PC_QUERY_TYPE_INVALID
g_ePickupQuery = PC_QUERY_RESET
BREAK
ENDSWITCH
g_ePickupQuery = PC_QUERY_RESULT
BREAK
CASE PC_QUERY_RESULT
// Waiting on ambient script to confirm they have received the required
// information - need to call END_PICKUP_QUERY_REQUEST()
BREAK
CASE PC_QUERY_RESET
g_iPickupIndex = 0
g_bPickupCollected = FALSE
g_ePickupQuery = PC_QUERY_INACTIVE
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Check for completed missions unlocking new pickups
PROC CHECK_FOR_MISSION_UNLOCK_PICKUPS()
IF NOT bUnlockedExilePickups
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_EXILE1_PICKUPS_UNLOCKED)
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Unlocked pickups for Exile 1")
SETUP_EXILE1_UNLOCK_PICKUPS()
bUnlockedExilePickups = TRUE
ENDIF
ENDIF
IF NOT bUnlockedExileCGtoNGPickups
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_EXILE1_PICKUPS_UNLOCKED)
IF IS_LAST_GEN_PLAYER()
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Unlocked CGtoNG pickups for Exile 1")
SETUP_EXILE1_CGTONG_UNLOCK_PICKUPS()
bUnlockedExileCGtoNGPickups = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bUnlockedTrevorCGtoNGPickups
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_1)
IF IS_LAST_GEN_PLAYER()
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Unlocked CGtoNG pickups for Trevor 1")
SETUP_TREVOR1_CGTONG_UNLOCK_PICKUPS()
bUnlockedTrevorCGtoNGPickups = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Remove pickups and terminate thread
PROC CLEANUP_SCRIPT()
#IF IS_DEBUG_BUILD
// Cleanup widgets
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Deleting debug widgets...")
IF DOES_WIDGET_GROUP_EXIST(mainWidget)
DELETE_WIDGET_GROUP(mainWidget)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing any pickup blips")
REMOVE_BLIPS(COUNT_OF(piArmourPickup), armourBlips)
REMOVE_BLIPS(COUNT_OF(piGasPickup), gasBlips)
REMOVE_BLIPS(COUNT_OF(piHealthPickup), healthBlips)
REMOVE_BLIPS(COUNT_OF(piWeaponPickup), weaponBlips)
#ENDIF
// Remove all pickup instances
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing all world pickups...")
REMOVE_WORLD_ARMOUR_PICKUPS()
REMOVE_WORLD_GAS_PICKUPS()
REMOVE_WORLD_HEALTH_PICKUPS()
REMOVE_WORLD_WEAPON_PICKUPS()
// Remove all mission unlock pickups
IF bUnlockedExilePickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Exile 1 unlock pickups...")
REMOVE_EXILE1_UNLOCK_PICKUPS()
ENDIF
IF bUnlockedExileCGtoNGPickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Exile 1 CGtoNG unlock pickups...")
REMOVE_EXILE1_CGTONG_UNLOCK_PICKUPS()
ENDIF
IF bUnlockedTrevorCGtoNGPickups
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Removing Trevor 1 CGtoNG unlock pickups...")
REMOVE_TREVOR1_CGTONG_UNLOCK_PICKUPS()
ENDIF
// End script
TERMINATE_THIS_THREAD()
ENDPROC
SCRIPT
// This script needs to cleanup only when the game moves from SP to MP
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_MAGDEMO))
CPRINTLN(DEBUG_AMBIENT, "Pickup Controller: Forced to cleanup (SP to MP)")
CLEANUP_SCRIPT()
ENDIF
// Setup all pickup locates in the world
CREATE_PICKUPS()
// Setup basic debug widget - user needs to enable warp options
// to keep processing low when running normally
#IF IS_DEBUG_BUILD
SETUP_MAIN_WIDGET()
#ENDIF
// Main loop
WHILE TRUE
// #2007591 - Destroy ambient pickups while in animal form.
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
IF bPickupsCreated
CPRINTLN(DEBUG_AMBIENT, "Destroying pickups due to being on mission as an animal/director.")
DESTROY_PICKUPS()
ENDIF
ELSE
IF NOT bPickupsCreated
CPRINTLN(DEBUG_AMBIENT, "Coming of mission as an animal/director. Re-creating pickups.")
CREATE_PICKUPS()
ENDIF
ENDIF
// Check for pickup collected requests
// This will typically be the Chop ambient script
CHECK_QUERY_REQUESTS()
// Check for pickups unlocked after completing flow missions
CHECK_FOR_MISSION_UNLOCK_PICKUPS()
// Check for warping to pickups
#IF IS_DEBUG_BUILD
UPDATE_WIDGETS()
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT