Files
gtav-src/script/dev_ng/singleplayer/include/public/route_manager_public.sch
T
2025-09-29 00:52:08 +02:00

2468 lines
85 KiB
Scheme
Executable File

USING "RC_helper_functions.sch"
USING "RC_threat_public.sch"
//USING "commands_task.sch"
ENUM DELIVER_PED_TYPE
DRIVER = 0,
PASSENGER,
MAX_DELIVERY_PEDS
ENDENUM
ENUM DELIVER_PED_CONTROL_STATES
DPCS_DELIVERING,
DPCS_REACTING
ENDENUM
ENUM DELIVER_PED_DELIVERY_STATES
DPDS_NULL,
DPDS_WALKING_TO_VAN_DOOR,
DPDS_ENTER_VAN,
DPDS_WAITING_IN_VAN,
DPDS_DRIVE_TO_DELIVERY_POINT,
DPDS_BREAKING,
DPDS_PULLINGOVER,
DPDS_WAIT_PASSENGER_DELIVER,
DPDS_EXIT_VAN_DELIVER,
DPDS_MAKE_DELIVERY,
DPDS_WANDERING
ENDENUM
ENUM SUB_DELIVERY_STATES
SDS_NULL = 0,
SDS_WALKING_TO_BAG,
SDS_PICK_UP_BIN_BAG,
SDS_WALK_TO_BACK_OF_TRUCK,
SDS_THROW_BAG_IN_TO_TRUCK,
SDS_DROP_BAG
ENDENUM
ENUM DELIVER_PED_REACTION_STATES
DPRS_NULL,
DPRS_EXIT_VAN_FLEE,
DPRS_BEING_JACKED,
DPRS_WAIT_RING_COPS,
DPRS_RING_COPS,
DPRS_WAIT_REACT_TO_PLAYER_FLEE,
DPRS_REACT_TO_PLAYER_INITAL_FLEE,
DPRS_REACT_TO_PLAYER_FLEE,
DPRS_FLEE_AFTER_RINGING_COPS,
DPRS_REACT_TO_PLAYER_ANGER,
DPRS_WAIT_REACT_TO_PLAYER_COWER,
DPRS_WAIT_REACT_SEARCH,
DPRS_REACT_TO_PLAYER_COWER,
DPRS_REACT_TO_PLAYER_BLOCKING_DOOR,
DPRS_REACT_TO_PLAYER_BLOCKING_BINS,
DPRS_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK,
DPRS_REACT_TO_PLAYER_BLOCKING_FRONT_OF_TRUCK,
DPRS_REACT_TO_PLAYER_BUMP,
DPRS_WAIT_FLIM_BLOCKING,
DPRS_WAIT_FLIM_DEAD,
DPRS_REACT_FLIM,
DPRS_WAIT_REACT_BRAWL,
DPRS_REACT_BRAWL,
DPRS_REACT_SEARCH
ENDENUM
REL_GROUP_HASH HASH_ENEMIES //Relationship hash for all ranchers
//PASSENGER_PED_STATES ePrevPassengerPed = PPS_NULL
//PERCEPTION CONSTANTS
CONST_FLOAT MAX_VISION_RANGE 20.0 //The distance a ped can identify that the player is a threat
CONST_FLOAT MAX_VISION_ARC_RANGE 170.0 //the vision arc that the player needs to be in before they are spotted
//DEILIVERY PED
CONST_INT MAX_DELIVERIES 21
INT iNumDeliveries = MAX_DELIVERIES
STRUCT PED_STRUCT
PED_INDEX id
INT iReactionTimer
INT iReactionDelay
INT iQuickReactionDelay
BLIP_INDEX blip
DELIVER_PED_CONTROL_STATES eControlState = DPCS_DELIVERING
DELIVER_PED_REACTION_STATES eReactionState = DPRS_NULL
DELIVER_PED_DELIVERY_STATES eDeliverState = DPDS_NULL
DELIVER_PED_DELIVERY_STATES ePrevDeliverState = DPDS_NULL
SUB_DELIVERY_STATES eDeliverSubState = SDS_NULL
DELIVER_PED_TYPE eDeliverPedType
ENDSTRUCT
STRUCT VEHICLE_STRUCT
VEHICLE_INDEX id
BLIP_INDEX blip
ENDSTRUCT
STRUCT DELIVERY_POINT
VECTOR vDriveTo
VECTOR vParkingVec
FLOAT fDriveToTargetDist
FLOAT fDriveToStraightDist
FLOAT fParkHeading
BOOL bDoActionAtDeliveryPoint = TRUE
PARK_TYPE eParkType = PARK_TYPE_PULL_OVER
VECTOR vBlockingAreaCentre
VECTOR vBlockingAreaSize
OBJECT_INDEX oiObject
BOOL bDelivered = FALSE
VECTOR vPedSpawn
FLOAT fPedHeading
MODEL_NAMES pedModel
BOOL bSpawned = FALSE
ENDSTRUCT
STRUCT SHAPE_TEST_STRUCT
SHAPETEST_INDEX ShapeTest
SHAPETEST_TYPE eShapeTestType
//Input
VECTOR vStartPos
VECTOR vEndPos
VECTOR vSize //For box
VECTOR vEulerRot //For box
EULER_ROT_ORDER eEulerOrder = EULER_XYZ //For box
FLOAT fRadius
BOOL bRequested
ENTITY_INDEX EntityIndex //For bounding box test
ENTITY_INDEX HitEntity //For who we hit
//Results
BOOL bResultIsNew
VECTOR vHitPos
VECTOR vHitNormal
BOOL bIsHit
ENDSTRUCT
SHAPE_TEST_STRUCT mGotoBlockingShape
PROC RESET_SHAPE_TEST()
mGotoBlockingShape.ShapeTest = NULL
mGotoBlockingShape.bIsHit = FALSE
mGotoBlockingShape.HitEntity = NULL
ENDPROC
VEHICLE_STRUCT mRoutedVehicle
PED_STRUCT mPed[MAX_DELIVERY_PEDS]
DELIVERY_POINT mDeliveryPoint[MAX_DELIVERIES]
FLOAT fTruckBootOpenRatio = -1.0
INT iDeliveryIndex
BOOL bIsLooped = FALSE
BOOL bIsSetRoute = FALSE
BOOL bPassengerDoDeliveries = FALSE
BOOL bCheckSeenPedDie = FALSE
BOOL bWantedLevelSet = FALSE
VECTOR vSearchPos = <<0,0,0>>
INT iPlayerBlockingTruckTimer = -1
///
///
/// DEBUG ONLY MISSION STUFF ------------------------------------------------------------
///
///
#IF IS_DEBUG_BUILD
// BLIP_INDEX DebugBlip
BOOL bShowDeliveryDebugText = TRUE
WIDGET_GROUP_ID DeliverswidgetGroup
/// PURPOSE:
/// Prints a string to a TTY Channel
/// PARAMS:
/// s - The string to print
/// ddc - The debug channel to print to
PROC SK_PRINT(String s, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDeliveryDebugText
CPRINTLN(ddc, s)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// PURPOSE:
/// Prints a string and an int to a TTY Channel
/// PARAMS:
/// s - The string to print
/// i - the int to print
/// ddc - the debug channel to print to
PROC SK_PRINT_INT(String s, INT i, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDeliveryDebugText
CPRINTLN(ddc, s,i)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// PURPOSE:
/// Prints a string and a Float to a TTY Channel
/// PARAMS:
/// s - the string to print
/// f - the float to print
/// ddc - the debug channel
PROC SK_PRINT_FLOAT(String s, FLOAT f, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDeliveryDebugText
CPRINTLN(ddc, s,f)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// PURPOSE:
/// Sets up a widget for this mission
PROC SETUP_DELIVERY_RAGE_WIDGETS()
DeliverswidgetGroup = START_WIDGET_GROUP("Delivery Header file")
START_WIDGET_GROUP("Debug")
ADD_WIDGET_BOOL("Toggle Debug spew", bShowDeliveryDebugText)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Deletes the mission widget
PROC CLEANUP_DELIVERY_OBJECT_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(DeliverswidgetGroup)
DELETE_WIDGET_GROUP(DeliverswidgetGroup)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks for any updates needed for the widgets
PROC UPDATE_DELIVERY_RAG_WIDGETS()
ENDPROC
#ENDIF
/// PURPOSE:
/// Requests a model and waits for it to load
/// PARAMS:
/// _modname - The name of the model to load
/// _debugstring - used to debug
/// i - used to debug
/// RETURNS:
/// TRUE when the model is loaded
FUNC BOOL REQUEST_AND_CHECK_MODEL(MODEL_NAMES _modname, STRING _debugstring, INT i = 0)
REQUEST_MODEL(_modname)
IF NOT Is_String_Null_Or_Empty(_debugstring)
AND i <> -1
#IF IS_DEBUG_BUILD
SK_PRINT_INT(_debugstring, i)
#ENDIF
ENDIF
IF HAS_MODEL_LOADED(_modname)
#IF IS_DEBUG_BUILD
SK_PRINT("MODEL LOADED")
#ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Unloads a model - Sets it as no longer needed
/// PARAMS:
/// _modname - The model to unload
PROC UNLOAD_MODEL(MODEL_NAMES _modname, BOOL bCheckLoaded = TRUE)
IF bCheckLoaded
IF HAS_MODEL_LOADED(_modname)
SET_MODEL_AS_NO_LONGER_NEEDED(_modname)
ENDIF
ELSE
SET_MODEL_AS_NO_LONGER_NEEDED(_modname)
ENDIF
ENDPROC
/// PURPOSE:
/// Spawns a ped and returns true if it was succesful. Requests the model and unloads it
/// PARAMS:
/// pedindex - The PED_INDEX to write the newly create ped to
/// model - The model to load and use to create the ped
/// pos - The position the ped should be created
/// dir - The heading the ped should have when created
/// bUnloadAfterSpawn - If true we unload the model after spawning the ped
/// bFreeze - if true we freeze the ped after spawning
/// bTempEvents - if true we block temp events
/// bTargetable - if false we set the ped to not be targetted
/// RETURNS:
/// TRUE if the ped was created
FUNC BOOL SPAWN_PED(PED_INDEX &pedindex, MODEL_NAMES model, VECTOR pos, FLOAT dir, BOOL bUnloadAfterSpawn = TRUE, BOOL bFreeze = FALSE, BOOL bTempEvents = TRUE, BOOL bTargetable = TRUE)
IF NOT DOES_ENTITY_EXIST(pedindex)
IF REQUEST_AND_CHECK_MODEL(model,"Loading")
pedindex = CREATE_PED(PEDTYPE_MISSION, model, pos, dir)
//SET_PED_DEFAULT_COMPONENT_VARIATION(pedindex)
IF IS_PED_UNINJURED(pedindex)
#IF IS_DEBUG_BUILD SK_PRINT("PED CREATED !") #ENDIF
IF bFreeze
FREEZE_ENTITY_POSITION(pedindex, TRUE)
ENDIF
IF bTempEvents
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedindex, bTempEvents)
ENDIF
IF NOT bTargetable
SET_PED_CAN_BE_TARGETTED(pedindex, bTargetable)
ENDIF
IF bUnloadAfterSpawn
UNLOAD_MODEL(model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_PED_UNINJURED(pedindex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Spawns an object. And activates its physics
/// PARAMS:
/// objectindex - The OBJECT_INDEX to write the newly create object to
/// model - The model to load and use to create the object
/// pos - The position the object should be created
/// dir - The heading the object should have when created
/// RETURNS:
/// TRUE if the object was created
FUNC BOOL SPAWN_OBJECT(OBJECT_INDEX &objectindex, MODEL_NAMES model, VECTOR pos, FLOAT dir = 0.0, BOOL bUnloadAfterSpawn = TRUE)
IF NOT DOES_ENTITY_EXIST(objectindex)
IF REQUEST_AND_CHECK_MODEL(model,"Loading")
objectindex = CREATE_OBJECT(model, pos)
IF DOES_ENTITY_EXIST(objectindex)
SET_ENTITY_HEADING(objectindex, dir)
ACTIVATE_PHYSICS(objectindex)
IF bUnloadAfterSpawn
UNLOAD_MODEL(model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_ENTITY_ALIVE(objectindex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Spawns a vehicle and returns true if it was succesful - why does the is mission entity check return true
/// no matter what the out come of said check?
/// PARAMS:
/// vehicleindex - The VEHICLE_INDEX to write the newly create vehicle to
/// model - The model to load and use to create the vehicle
/// pos - The position the vehicle should be created
/// dir - The heading the vehicle should have when created
/// RETURNS:
/// TRUE if the vehicle was created
FUNC BOOL SPAWN_VEHICLE(VEHICLE_INDEX &vehicleindex, MODEL_NAMES model, VECTOR pos, FLOAT dir, BOOL bUnloadAfterSpawn = TRUE)
IF NOT DOES_ENTITY_EXIST(vehicleindex)
IF REQUEST_AND_CHECK_MODEL(model,"Loading")
vehicleindex = CREATE_VEHICLE(model, pos, dir)
IF DOES_ENTITY_EXIST(vehicleindex)
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex)
SET_ENTITY_AS_MISSION_ENTITY(vehicleindex)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vehicleindex)
IF bUnloadAfterSpawn
UNLOAD_MODEL(model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_VEHICLE_OK(vehicleindex)
SET_ENTITY_COORDS(vehicleindex, pos)
SET_ENTITY_HEADING(vehicleindex, dir)
ENDIF
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex)
SET_ENTITY_AS_MISSION_ENTITY(vehicleindex)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Spawns a ped inside a vehicle
/// PARAMS:
/// pedindex - The index to write the newly created ped back to (ref)
/// Car - The vehicle to create the ped in
/// modelName - The model of the ped to create
/// seat - the seat to create the ped in
/// bUnloadAfterSpawn - should we unload the ped model after creation
/// RETURNS:
/// TRUE if the ped was spawned correctly
FUNC BOOL SPAWN_PED_IN_VEHICLE(PED_INDEX &pedindex, VEHICLE_INDEX Car, MODEL_NAMES modelName, VEHICLE_SEAT seat = VS_DRIVER, BOOL bUnloadAfterSpawn = TRUE)
IF IS_VEHICLE_OK(Car)
IF NOT DOES_ENTITY_EXIST(pedindex)
IF REQUEST_AND_CHECK_MODEL(modelName,"Loading")
pedindex = CREATE_PED_INSIDE_VEHICLE(Car, PEDTYPE_MISSION, modelName, seat)
IF DOES_ENTITY_EXIST(pedindex)
IF bUnloadAfterSpawn
UNLOAD_MODEL(modelName)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Gets the heading between to vectors
/// PARAMS:
/// V1 - First vector
/// V2 - Second vector
/// RETURNS:
/// FLOAT - the heading between the two
FUNC FLOAT GET_HEADING_BETWEEN_VECTORS(VECTOR V1, VECTOR V2)
RETURN GET_HEADING_FROM_VECTOR_2D(V2.x-V1.x,V2.y-V1.y)
ENDFUNC
/// PURPOSE:
/// Picks a new delivery point at random
/// RETURNS:
/// returns the index of the new delivery point
FUNC INT PICK_RANDOM_DELIVERY_POINT()
INT i = GET_RANDOM_INT_IN_RANGE(0, iNumDeliveries-1)
WHILE mDeliveryPoint[i].bDelivered
i = GET_RANDOM_INT_IN_RANGE(0, iNumDeliveries-1)
ENDWHILE
RETURN i
ENDFUNC
PROC CHOOSE_NEXT_DELIVERY_POINT()
INT i = 0
IF bIsSetRoute
//Find an index that hasnt had a delivery
WHILE mDeliveryPoint[iDeliveryIndex].bDelivered
AND i <> -1
iDeliveryIndex++
IF iDeliveryIndex >= iNumDeliveries-1
i = -1
iDeliveryIndex = iNumDeliveries-1
ENDIF
ENDWHILE
IF iDeliveryIndex = iNumDeliveries-1
IF bIsLooped
iDeliveryIndex = 0
FOR i=0 TO (iNumDeliveries-1)
mDeliveryPoint[i].bDelivered = FALSE
ENDFOR
ELSE
iDeliveryIndex = iNumDeliveries-1
EXIT
ENDIF
ENDIF
ELSE
INT iCount
iCount = 0
FOR i=0 TO (iNumDeliveries-1)
IF mDeliveryPoint[i].bDelivered
iCount++
ENDIF
ENDFOR
IF iCount = iNumDeliveries-1
iDeliveryIndex = iNumDeliveries-1
ELIF iCount = iNumDeliveries
IF bIsLooped
FOR i=0 TO (iNumDeliveries-1)
mDeliveryPoint[i].bDelivered = FALSE
ENDFOR
iDeliveryIndex = PICK_RANDOM_DELIVERY_POINT()
ELSE
iDeliveryIndex = -1
EXIT
ENDIF
ELSE
iDeliveryIndex = PICK_RANDOM_DELIVERY_POINT()
ENDIF
ENDIF
ENDPROC
FUNC INT GET_CLOSEST_DELIVERY_POINT()
INT iClosestID
VECTOR vCurrentPos
INT i
#IF USE_TU_CHANGES
INT iTestID
#ENDIF
FLOAT fDistances[MAX_DELIVERIES]
IF IS_VEHICLE_OK(mRoutedVehicle.id)
vCurrentPos = GET_ENTITY_COORDS(mRoutedVehicle.id)
FOR i=0 TO (iNumDeliveries-1)
FLOAT fDist = GET_DISTANCE_BETWEEN_COORDS(vCurrentPos, mDeliveryPoint[i].vDriveTo)
IF NOT IS_VECTOR_ZERO(mDeliveryPoint[i].vDriveTo)
AND fDist > 25
fDistances[i] = fDist
ELSE
fDistances[i] = -1.0
ENDIF
ENDFOR
FLOAT lowestFloat = fDistances[0]
FOR i = 0 TO (iNumDeliveries-1)
IF fDistances[i] != -1.0
IF fDistances[i] < lowestFloat
lowestFloat = fDistances[i]
iClosestID = i
ENDIF
ENDIF
ENDFOR
FLOAT dot = DOT_PRODUCT((mDeliveryPoint[iClosestID].vDriveTo- vCurrentPos), GET_ENTITY_FORWARD_VECTOR(mRoutedVehicle.id))
#IF NOT USE_TU_CHANGES
#IF IS_DEBUG_BUILD SK_PRINT_FLOAT("dot FROM CURRENT TO CLOSEST ========== ", dot) #ENDIF
//Check the point isnt behind us
INT p = GET_GAME_TIMER()
WHILE dot < 0
AND (GET_GAME_TIMER() - p) < 100
iClosestID++
IF iClosestID >= MAX_DELIVERIES
iClosestID = 0
ENDIF
vCurrentPos = GET_ENTITY_COORDS(mRoutedVehicle.id)
dot = DOT_PRODUCT((mDeliveryPoint[iClosestID].vDriveTo- vCurrentPos), GET_ENTITY_FORWARD_VECTOR(mRoutedVehicle.id))
p = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD SK_PRINT_FLOAT("FROM WHILE dot FROM CURRENT TO CLOSEST ========== ", dot)#ENDIF
ENDWHILE
#ENDIF
#IF USE_TU_CHANGES
iTestID = iClosestID
INT p = 0
WHILE dot < 0
AND p < 40
iTestID++
IF iTestID >= MAX_DELIVERIES
iTestID = 0
ENDIF
vCurrentPos = GET_ENTITY_COORDS(mRoutedVehicle.id)
dot = DOT_PRODUCT((mDeliveryPoint[iTestID].vDriveTo- vCurrentPos), GET_ENTITY_FORWARD_VECTOR(mRoutedVehicle.id))
p++
#IF IS_DEBUG_BUILD SK_PRINT_FLOAT("FROM WHILE dot FROM CURRENT TO CLOSEST ========== ", dot)#ENDIF
#IF IS_DEBUG_BUILD SK_PRINT_INT("Current test ID ========== ", iTestID)#ENDIF
#IF IS_DEBUG_BUILD SK_PRINT_INT("TIME ========== ", p)#ENDIF
ENDWHILE
IF p >= 40
#IF IS_DEBUG_BUILD SK_PRINT_INT("Current test ID ========== ", iTestID)#ENDIF
#IF IS_DEBUG_BUILD SK_PRINT_INT("Current test ID ========== ", p)
SCRIPT_ASSERT("COULDN't FIND DELIVERY ID.")#ENDIF
iTestID = iNumDeliveries-1
ENDIF
#ENDIF
ENDIF
#IF USE_TU_CHANGES
iClosestID = iTestID
#ENDIF
RETURN iClosestID
ENDFUNC
/// PURPOSE:
/// Removes a previous car gen blocking area
/// picks a new delivery point at randomm unless we are on the last point
/// sets up a new car gen blocking area at the new delivery point
PROC DO_DELIVERY_POINT_SETUP(BOOL FirstTimeActivate = FALSE)
IF iDeliveryIndex != -1
IF NOT IS_VECTOR_ZERO(mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre)
AND NOT IS_VECTOR_ZERO(mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize)
// Remove previous car gen blocking
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(
mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre - mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize,
mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre + mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize,
TRUE)
ENDIF
ENDIF
IF NOT FirstTimeActivate
CHOOSE_NEXT_DELIVERY_POINT()
ELSE
iDeliveryIndex = GET_CLOSEST_DELIVERY_POINT()
ENDIF
IF iDeliveryIndex != -1
#IF IS_DEBUG_BUILD SK_PRINT_INT("iDeliveryIndex ==== ", iDeliveryIndex) #ENDIF
IF NOT IS_VECTOR_ZERO(mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre)
AND NOT IS_VECTOR_ZERO(mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize)
// Add vehicle gen blocking
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(
mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre - mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize,
mDeliveryPoint[iDeliveryIndex].vBlockingAreaCentre + mDeliveryPoint[iDeliveryIndex].vBlockingAreaSize,
FALSE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Tells the ped to drive to a delivery point and park if mDeliveryPoint[iDeliveryIndex].bDoActionAtDeliveryPoint
/// is set
/// If all delivery points have been visited the ped is told to wander in the vehicle
/// can add so specific behaviour to this point
PROC TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT(BOOL FirstTimeActivate = FALSE)
IF NOT IS_VEHICLE_SEAT_FREE(mRoutedVehicle.id, VS_FRONT_RIGHT)
DO_DELIVERY_POINT_SETUP(FirstTimeActivate)
IF iDeliveryIndex <> iNumDeliveries-1
IF iDeliveryIndex = 4
TASK_VEHICLE_GOTO_NAVMESH(mPed[DRIVER].id, mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vDriveTo, 15, DRIVINGMODE_STOPFORCARS|DF_UseSwitchedOffNodes, mDeliveryPoint[iDeliveryIndex].fDriveToTargetDist)
// TASK_VEHICLE_DRIVE_TO_COORD(mPed[DRIVER].id, mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vDriveTo, 15, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS|DF_UseSwitchedOffNodes, mDeliveryPoint[iDeliveryIndex].fDriveToTargetDist, mDeliveryPoint[iDeliveryIndex].fDriveToStraightDist)//B*1397821
ELSE
TASK_VEHICLE_DRIVE_TO_COORD(mPed[DRIVER].id, mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vDriveTo, 15, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_STOPFORCARS|DF_UseSwitchedOffNodes, mDeliveryPoint[iDeliveryIndex].fDriveToTargetDist, mDeliveryPoint[iDeliveryIndex].fDriveToStraightDist)
ENDIF
#IF IS_DEBUG_BUILD SK_PRINT("TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT - eDeliveryPed = DPS_DRIVE_TO_DELIVERY_POINT") #ENDIF
mPed[DRIVER].ePrevDeliverState = mPed[DRIVER].eDeliverState
mPed[DRIVER].eDeliverState = DPDS_DRIVE_TO_DELIVERY_POINT
ELSE
TASK_VEHICLE_DRIVE_WANDER(mPed[DRIVER].id, mRoutedVehicle.id, 15, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS)
mPed[DRIVER].ePrevDeliverState = mPed[DRIVER].eDeliverState
mPed[DRIVER].eDeliverState = DPDS_WANDERING
ENDIF
ELSE
mPed[DRIVER].ePrevDeliverState = mPed[DRIVER].eDeliverState
mPed[DRIVER].eDeliverState = DPDS_WAIT_PASSENGER_DELIVER
ENDIF
ENDPROC
PROC TELL_PED_TO_MAKE_DELIVERY(PED_STRUCT &ped)
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PUT_PED_DIRECTLY_INTO_MELEE)
IF mDeliveryPoint[iDeliveryIndex].pedModel <> DUMMY_MODEL_FOR_SCRIPT
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
TASK_GOTO_ENTITY_OFFSET( ped.id, mDeliveryPoint[iDeliveryIndex].oiObject, DEFAULT_TIME_NEVER_WARP, 0.0, 180.0, PEDMOVEBLENDRATIO_WALK)
// TASK_GO_TO_ENTITY(ped.id, mDeliveryPoint[iDeliveryIndex].oiObject, DEFAULT_TIME_NEVER_WARP, 0.1, PEDMOVEBLENDRATIO_WALK, 1)
// TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, mDeliveryPoint[iDeliveryIndex].vPedSpawn, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 2, ENAV_DEFAULT)
ENDIF
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, mDeliveryPoint[iDeliveryIndex].vPedSpawn, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, -1, ENAV_DEFAULT, GET_HEADING_FROM_COORDS_TO_COORDS(mDeliveryPoint[iDeliveryIndex].vPedSpawn, GET_ENTITY_COORDS(ped.id)))
ENDIF
IF IS_VEHICLE_OK(mRoutedVehicle.id)
SET_VEHICLE_DOOR_OPEN(mRoutedVehicle.id, SC_DOOR_BOOT)
ENDIF
ped.ePrevDeliverState = ped.eDeliverState
ped.eDeliverState = DPDS_MAKE_DELIVERY
ped.eDeliverSubState = SDS_WALKING_TO_BAG
ENDIF
ENDPROC
/// PURPOSE:
/// Finds a road node 100m in front and 5m to the right of a vehicle
/// and then looks for a point by the side of the road from that road node
/// also makes sure there isnt already a vehicle or an object in a 2m radius from the point
/// PARAMS:
/// vh - the vehicle to find the point from
/// RETURNS:
/// A position at the side of the road about 100m in front of the vehicle
/// Will return vSafeVec if any of the checks failed
FUNC VECTOR FIND_PARKING_SPOT()
// #IF IS_DEBUG_BUILD SAFE_REMOVE_BLIP(DebugBlip) #ENDIF
VECTOR vTestParkPos = <<0,0,0>>
// IF GET_CLOSEST_VEHICLE_NODE(vTestPos, vTestParkPos)
IF GET_POSITION_BY_SIDE_OF_ROAD(mDeliveryPoint[iDeliveryIndex].vDriveTo, 0, vTestParkPos)
IF NOT IS_ANY_VEHICLE_NEAR_POINT(vTestParkPos, 2)
AND NOT IS_ANY_OBJECT_NEAR_POINT(vTestParkPos, 2)
// #IF IS_DEBUG_BUILD DebugBlip = CREATE_BLIP_FOR_COORD(vTestParkPos) #ENDIF
RETURN vTestParkPos
ENDIF
ENDIF
// ENDIF
RETURN <<0,0,0>>
ENDFUNC
PROC TELL_DRIVER_PED_PULLOVER(PED_STRUCT &ped)
IF IS_VEHICLE_OK(mRoutedVehicle.id)
// VECTOR vTempParkingPos = FIND_PARKING_SPOT()
//
// IF ARE_VECTORS_EQUAL(vTempParkingPos, <<0,0,0>>)
// vTempParkingPos = GET_ENTITY_COORDS(ped.id)
// ENDIF //GET_ENTITY_HEADING(mRoutedVehicle.id)
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vParkingVec, 8, DRIVINGSTYLE_ACCURATE,TRASH, DRIVINGMODE_AVOIDCARS, 10, 15)
TASK_VEHICLE_PARK(NULL, mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vParkingVec, mDeliveryPoint[iDeliveryIndex].fParkHeading, mDeliveryPoint[iDeliveryIndex].eParkType, 5, TRUE)
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
#IF IS_DEBUG_BUILD SK_PRINT("ped.ePrevDeliverState ===== DPDS_DRIVE_TO_DELIVERY_POINT") #ENDIF
ped.eDeliverState = DPDS_PULLINGOVER
ENDIF
ENDPROC
/// PURPOSE:
///
PROC ROUTE_POINT_MANAGER()
INT i
FOR i=0 TO(iNumDeliveries-1)
IF mDeliveryPoint[i].pedModel <> DUMMY_MODEL_FOR_SCRIPT
IF mDeliveryPoint[i].bSpawned
//Manage the ped here
IF i != iDeliveryIndex
AND IS_ENTITY_ALIVE(mDeliveryPoint[i].oiObject)
AND GET_DISTANCE_BETWEEN_ENTITIES(mDeliveryPoint[i].oiObject, PLAYER_PED_ID()) > 200
DELETE_OBJECT(mDeliveryPoint[i].oiObject)
mDeliveryPoint[i].bSpawned = FALSE
ENDIF
ELSE
IF mDeliveryPoint[i].pedModel <> DUMMY_MODEL_FOR_SCRIPT
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), mDeliveryPoint[i].vDriveTo, 100)
OR IS_ENTITY_IN_RANGE_COORDS(mPed[DRIVER].id, mDeliveryPoint[i].vDriveTo, 120)
mDeliveryPoint[i].bSpawned = SPAWN_OBJECT(mDeliveryPoint[i].oiObject, mDeliveryPoint[i].pedModel, mDeliveryPoint[i].vPedSpawn, mDeliveryPoint[i].fPedHeading)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
FUNC VECTOR GET_ENTRYPOINT_AREA_OFFSET(BOOL bDriver = FALSE)
VECTOR vPos
INT i
IF NOT bDriver
i = GET_ENTITY_BONE_INDEX_BY_NAME(mRoutedVehicle.id, "wheel_rf")
ELSE
i = GET_ENTITY_BONE_INDEX_BY_NAME(mRoutedVehicle.id, "wheel_lf")
ENDIF
vPos = GET_WORLD_POSITION_OF_ENTITY_BONE(mRoutedVehicle.id, i)
vPos = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(mRoutedVehicle.id, vPos)
IF NOT bDriver
vPos += <<1, 0, 0.5>>
ELSE
vPos += <<-1, 0, 0.5>>
ENDIF
RETURN vPos
ENDFUNC
/// PURPOSE:
/// Tells the driver ped to enter the route vehicle
PROC ACTIVATE_DRIVER_PED()
IF NOT IS_PED_IN_VEHICLE(mPed[DRIVER].id, mRoutedVehicle.id)
TASK_FOLLOW_NAV_MESH_TO_COORD(mPed[DRIVER].id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(TRUE)), 1, -1)
mPed[DRIVER].eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ELSE
TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT(TRUE)
ENDIF
ENDPROC
PROC REACTIVATE_PED(PED_STRUCT &ped)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, HASH_ENEMIES, RELGROUPHASH_PLAYER)
SWITCH ped.ePrevDeliverState
CASE DPDS_DRIVE_TO_DELIVERY_POINT
#IF IS_DEBUG_BUILD SK_PRINT("REACTIVATE_PED ped.ePrevDeliverState ===== DPDS_DRIVE_TO_DELIVERY_POINT") #ENDIF
BREAK
CASE DPDS_WANDERING
#IF IS_DEBUG_BUILD SK_PRINT(" REACTIVATE_PED ped.ePrevDeliverState ===== DPDS_WANDERING") #ENDIF
BREAK
CASE DPDS_EXIT_VAN_DELIVER
#IF IS_DEBUG_BUILD SK_PRINT("REACTIVATE_PED ped.ePrevDeliverState ===== DPDS_EXIT_VAN_DELIVER") #ENDIF
ACTIVATE_DRIVER_PED()
BREAK
CASE DPDS_WAITING_IN_VAN
#IF IS_DEBUG_BUILD SK_PRINT("REACTIVATE_PED ped.ePrevDeliverState ===== DPDS_WAITING_IN_VAN") #ENDIF
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PERFORM_SEQUENCE)
IF iDeliveryIndex <= MAX_DELIVERIES-1
AND iDeliveryIndex != -1
mDeliveryPoint[iDeliveryIndex].bDelivered = TRUE
ENDIF
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
#IF IS_DEBUG_BUILD SK_PRINT(" REACTIVATE_PED Tasking ped to walk vehicle") #ENDIF
IF ped.eDeliverPedType = DRIVER
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(TRUE)), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET()), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ENDIF
ENDIF
ENDIF
BREAK
CASE DPDS_ENTER_VAN
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
IF ped.eDeliverPedType = DRIVER
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(TRUE)), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET()), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ENDIF
ENDIF
#IF IS_DEBUG_BUILD SK_PRINT(" REACTIVATE_PED ped.ePrevDeliverState ===== DPDS_ENTER_VAN") #ENDIF
BREAK
CASE DPDS_MAKE_DELIVERY
IF NOT mDeliveryPoint[iDeliveryIndex].bDelivered
IF ped.eDeliverSubState = SDS_WALKING_TO_BAG
TELL_PED_TO_MAKE_DELIVERY(ped)
ELSE
IF ped.eDeliverPedType = DRIVER
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(TRUE)), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET()), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ENDIF
ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
IF ped.eDeliverPedType = DRIVER
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(TRUE)), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET()), 1, -1)
ped.eDeliverState = DPDS_WALKING_TO_VAN_DOOR
ENDIF
ENDIF
ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD SK_PRINT_INT("REACTIVATE_PED ped.ePrevDeliverState ===== DEFAULT ", ENUM_TO_INT(ped.ePrevDeliverState)) #ENDIF
ped.iReactionTimer = GET_GAME_TIMER()
ped.eControlState = DPCS_DELIVERING
ENDPROC
/// PURPOSE:
/// Checks to see if the mRoutedVehicle car has burst tyres
/// RETURNS:
/// TRUE if the mRoutedVehicle car has burst tyres.
FUNC BOOL HAS_PLAYER_BURST_ROUTECAR_TYRES()
INT i
INT iDamagedTyres = 0
FOR i = (ENUM_TO_INT(SC_WHEEL_CAR_FRONT_LEFT)) TO (ENUM_TO_INT(SC_WHEEL_CAR_REAR_RIGHT))
IF IS_VEHICLE_TYRE_BURST(mRoutedVehicle.id, INT_TO_ENUM(SC_WHEEL_LIST, i))
iDamagedTyres++
ENDIF
ENDFOR
IF iDamagedTyres >= 3
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Monitors the hunters car for damage and plays hunter dialogue if appropriate.
FUNC BOOL MONITER_PLAYER_DAMAGING_ROUTE_CAR()
IF IS_VEHICLE_OK(mRoutedVehicle.id)
AND IS_PED_UNINJURED(PLAYER_PED_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mRoutedVehicle.id, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mRoutedVehicle.id)
IF HAS_PLAYER_BURST_ROUTECAR_TYRES()
OR GET_ENTITY_HEALTH(mRoutedVehicle.id) < 851
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC TELL_PED_DROP_BIN_BAG(PED_STRUCT &ped)
IF ped.eDeliverState = DPDS_MAKE_DELIVERY
IF ped.eDeliverSubState >= SDS_PICK_UP_BIN_BAG
IF NOT IS_PED_INJURED(ped.id)
#IF IS_DEBUG_BUILD SK_PRINT("Playing break out bag drop anim") #ENDIF
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
TASK_PLAY_ANIM(ped.id, "missfbi4prepp1", "_bag_drop_garbage_man", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE|AF_SECONDARY|AF_UPPERBODY)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TELL_PED_RING_COPS(PED_STRUCT &ped)
IF ped.eReactionState != DPRS_WAIT_RING_COPS
AND ped.eReactionState != DPRS_RING_COPS
TELL_PED_DROP_BIN_BAG(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_WAIT_RING_COPS
ped.eControlState = DPCS_REACTING
#IF IS_DEBUG_BUILD SK_PRINT("TELL_PED_RING_COPS()") #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Driver is told to head over to either the spawned ped or
/// the point the ped would of been spawned at if DUMMY_MODEL_FOR_SCRIPT
/// was set as the peds model
PROC TELL_PASSENGER_PED_TO_MAKE_DELIVERY()
TELL_PED_TO_MAKE_DELIVERY(mPed[PASSENGER])
//EPREVPASSENGERPED = ePassengerPed
#IF IS_DEBUG_BUILD SK_PRINT("TELL_PASSENGER_PED_TO_MAKE_DELIVERY - ePassengerPed = PPS_MAKE_DELIVERY") #ENDIF
ENDPROC
FUNC DELIVER_PED_TYPE GET_THE_OTHER_GUY(DELIVER_PED_TYPE type)
IF type = DRIVER
RETURN PASSENGER
ENDIF
RETURN DRIVER
ENDFUNC
PROC PICK_FLEE_REACTION(PED_STRUCT &ped, BOOL bForceFlee = FALSE)
TELL_PED_DROP_BIN_BAG(ped)
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
OR bForceFlee
OR ped.eReactionState = DPRS_REACT_SEARCH
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), ped.id, 10)
#IF IS_DEBUG_BUILD SK_PRINT("PICK_FLEE_REACTION = TGS_FLEE") #ENDIF
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_SMART_FLEE_PED)
ped.eReactionState = DPRS_WAIT_REACT_TO_PLAYER_FLEE
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ELSE
ped.eReactionState = DPRS_WAIT_REACT_TO_PLAYER_COWER
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF ped.eControlState <> DPCS_REACTING
#IF IS_DEBUG_BUILD SK_PRINT("PICK_FLEE_REACTION = TGS_ATTACK") #ENDIF
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_COMBAT)
AND NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PUT_PED_DIRECTLY_INTO_MELEE)
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_BRAWL
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_BEHIND_UNARMED_STEALTH(PED_STRUCT &ped)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ped.id, <<0,-2,0>>), <<2,3,2>>)
AND NOT IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
AND GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_BUMPED_PED(PED_INDEX ped)
IF IS_ENTITY_IN_RANGE_ENTITY(ped, PLAYER_PED_ID(), 6)
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
IF IS_ENTITY_TOUCHING_ENTITY(ped, PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC START_SHAPETEST (SHAPE_TEST_STRUCT &lShapeTest, ENTITY_INDEX ExcludeEntityIndex)
SWITCH lShapeTest.eShapeTestType
CASE SHAPETEST_INVALID
BREAK
CASE SHAPETEST_LOSPROBE
lShapeTest.ShapeTest = START_SHAPE_TEST_LOS_PROBE(lShapeTest.vStartPos, lShapeTest.vEndPos, SCRIPT_INCLUDE_ALL, ExcludeEntityIndex)
BREAK
// Since nobody was using async sphere tests we disabled them
//CASE SHAPETEST_SPHERE
//lShapeTest.ShapeTest = START_SHAPE_TEST_SPHERE(lShapeTest.vStartPos, lShapeTest.fRadius, SCRIPT_INCLUDE_ALL)
//BREAK
CASE SHAPETEST_BOUND
lShapeTest.ShapeTest = START_SHAPE_TEST_BOUND(lShapeTest.EntityIndex, SCRIPT_INCLUDE_ALL)
BREAK
CASE SHAPETEST_BOUNDINGBOX
lShapeTest.ShapeTest = START_SHAPE_TEST_BOUNDING_BOX(lShapeTest.EntityIndex, SCRIPT_INCLUDE_ALL)
BREAK
CASE SHAPETEST_BOX
lShapeTest.ShapeTest = START_SHAPE_TEST_BOX(lShapeTest.vStartPos, lShapeTest.vSize, lShapeTest.vEulerRot, lShapeTest.eEulerOrder, SCRIPT_INCLUDE_VEHICLE|SCRIPT_INCLUDE_PED, ExcludeEntityIndex)
BREAK
CASE SHAPETEST_CAPSULE
lShapeTest.ShapeTest = START_SHAPE_TEST_CAPSULE(lShapeTest.vStartPos, lShapeTest.vEndPos, lShapeTest.fRadius, SCRIPT_INCLUDE_ALL, ExcludeEntityIndex)
BREAK
ENDSWITCH
lShapeTest.bRequested = (lShapeTest.ShapeTest <> NULL)
ENDPROC
//Keep renewing the shape test (call this every frame)
PROC UPDATE_PERSISTENT_SHAPETEST (SHAPE_TEST_STRUCT &lShapeTest, ENTITY_INDEX ExcludeEntityIndex)
INT iHit // int as bool
SHAPETEST_STATUS Status = GET_SHAPE_TEST_RESULT(lShapeTest.ShapeTest, iHit, lShapeTest.vHitPos, lShapeTest.vHitNormal, lShapeTest.HitEntity)
lShapeTest.bResultIsNew = (SHAPETEST_STATUS_RESULTS_READY = Status)
//Convert the int as bool to a bool
IF lShapeTest.bResultIsNew
IF 0 = iHit
lShapeTest.bIsHit = FALSE
ELSE
lShapeTest.bIsHit = TRUE
ENDIF
ENDIF
//Try to keep all shape tests requested at all times
IF Status <> SHAPETEST_STATUS_RESULTS_NOTREADY //Result was just returned or request was nonexistent
START_SHAPETEST (lShapeTest, ExcludeEntityIndex)
ENDIF
ENDPROC
PROC INIT_GOTO_BLOCKING_SHAPE_TEST(VECTOR vSize, VECTOR vEulerRot)
mGotoBlockingShape.vSize = vSize
mGotoBlockingShape.vEulerRot = vEulerRot
mGotoBlockingShape.eShapeTestType = SHAPETEST_BOX
ENDPROC
FUNC BOOL IS_GOTO_BLOCKED(VECTOR vPos, ENTITY_INDEX ent, VECTOR vSize)
mGotoBlockingShape.vStartPos = vPos
mGotoBlockingShape.vSize = vSize
UPDATE_PERSISTENT_SHAPETEST(mGotoBlockingShape, ent)
#IF IS_DEBUG_BUILD
// DRAW_DEBUG_SPHERE(vPos, vSize.x, 0, 0, 255, 150)
#ENDIF
IF mGotoBlockingShape.bIsHit
// CPRINTLN(DEBUG_MISSION, "Shape test hit something")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_A_VEHICLE(mGotoBlockingShape.HitEntity)
IF IS_ENTITY_ALIVE(mGotoBlockingShape.HitEntity)
IF GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(mGotoBlockingShape.HitEntity) = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
CPRINTLN(DEBUG_MISSION, "Player in vehicle blocking go to")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ENTITY_A_PED(mGotoBlockingShape.HitEntity)
IF IS_ENTITY_ALIVE(mGotoBlockingShape.HitEntity)
IF GET_PED_INDEX_FROM_ENTITY_INDEX(mGotoBlockingShape.HitEntity) = PLAYER_PED_ID()
CPRINTLN(DEBUG_MISSION, "Player on foot blocking go to")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_BLOCKING_TRUCK_PROGRESSION(PED_STRUCT &ped)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0, 10, -2>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0,3,2>>), 5)
AND IS_PED_STOPPED(ped.id)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Has the player pointed a gun at the ped or has the player fired near the ped
PROC MONITER_PLAYER_THREATEN(PED_STRUCT &ped, DELIVER_PED_TYPE type, BOOL bForceMonitor = FALSE)
IF ped.eControlState <> DPCS_REACTING
OR bForceMonitor
IF NOT IS_PED_UNINJURED(mPed[GET_THE_OTHER_GUY(type)].id)
IF NOT bCheckSeenPedDie
IF DOES_ENTITY_EXIST(mPed[GET_THE_OTHER_GUY(type)].id)
IF IS_PED_IN_PED_VIEW_CONE(ped.id, mPed[GET_THE_OTHER_GUY(type)].id, 140)
OR IS_ENTITY_IN_RANGE_ENTITY(mPed[GET_THE_OTHER_GUY(type)].id, ped.id, 3)
PICK_FLEE_REACTION(ped)
bCheckSeenPedDie = TRUE
CPRINTLN(DEBUG_MISSION, "Seen other guy is dead react = ", type)
EXIT
ELSE
vSearchPos = GET_ENTITY_COORDS(mPed[GET_THE_OTHER_GUY(type)].id)
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_SEARCH
CPRINTLN(DEBUG_MISSION, "entering search = ", type)
ENDIF
ELSE
PICK_FLEE_REACTION(ped)
ENDIF
ENDIF
ELSE
IF mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_REACT_BRAWL
IF IS_PED_IN_PED_VIEW_CONE(ped.id, mPed[GET_THE_OTHER_GUY(type)].id, 140)
AND IS_ENTITY_IN_RANGE_ENTITY(mPed[GET_THE_OTHER_GUY(type)].id, PLAYER_PED_ID(), 15)
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_BRAWL
CPRINTLN(DEBUG_MISSION, "ped can see other ped brawling with player = ", type)
ENDIF
ELIF mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_WAIT_REACT_TO_PLAYER_FLEE
OR mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_REACT_TO_PLAYER_FLEE
IF IS_ENTITY_IN_RANGE_ENTITY(mPed[GET_THE_OTHER_GUY(type)].id, ped.id, 10)
PICK_FLEE_REACTION(ped)
ENDIF
ENDIF
ENDIF
IF HAS_PLAYER_BUMPED_PED(ped.id)
TELL_PED_DROP_BIN_BAG(ped)
CPRINTLN(DEBUG_MISSION, "React brawl ", type)
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_BRAWL
ENDIF
IF ped.eDeliverPedType = DRIVER
AND ped.eDeliverState = DPDS_DRIVE_TO_DELIVERY_POINT
IF IS_PLAYER_BLOCKING_TRUCK_PROGRESSION(ped)
IF IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
TASK_DRIVE_BY(ped.id, PLAYER_PED_ID(), NULL, <<0,0,0>>, 10, 100, TRUE, FIRING_PATTERN_FULL_AUTO)
SET_HORN_PERMANENTLY_ON_TIME(mRoutedVehicle.id, 2000)
iPlayerBlockingTruckTimer = GET_GAME_TIMER()
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState= DPRS_REACT_TO_PLAYER_BLOCKING_FRONT_OF_TRUCK
ped.eControlState = DPCS_REACTING
ENDIF
ENDIF
ENDIF
IF HAS_PLAYER_THREATENED_PED(ped.id, TRUE, 70, 170, FALSE, TRUE)
AND NOT IS_PLAYER_BEHIND_UNARMED_STEALTH(ped)
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_PROJECTILE|WF_INCLUDE_GUN)
IF IS_VEHICLE_OK(mRoutedVehicle.id)
IF IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
IF GET_ENTITY_SPEED(mRoutedVehicle.id) > 5
IF type = DRIVER
#IF IS_DEBUG_BUILD SK_PRINT("FLEE 1") #ENDIF
TASK_VEHICLE_MISSION_PED_TARGET(ped.id, mRoutedVehicle.id, PLAYER_PED_ID(), MISSION_FLEE, 30, DRIVINGMODE_AVOIDCARS, 300, 2)
ped.eReactionState = DPRS_REACT_TO_PLAYER_FLEE
TASK_COWER(mPed[GET_THE_OTHER_GUY(type)].id)
mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_WAIT_REACT_TO_PLAYER_COWER
mPed[GET_THE_OTHER_GUY(type)].eControlState = DPCS_REACTING
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
mPed[GET_THE_OTHER_GUY(type)].iReactionTimer = GET_GAME_TIMER()
ELSE
#IF IS_DEBUG_BUILD SK_PRINT("FLEE 2") #ENDIF
TASK_COWER(ped.id)
ped.eReactionState = DPRS_REACT_TO_PLAYER_COWER
TASK_VEHICLE_MISSION_PED_TARGET(mPed[GET_THE_OTHER_GUY(type)].id, mRoutedVehicle.id, PLAYER_PED_ID(), MISSION_FLEE, 30, DRIVINGMODE_AVOIDCARS, 300, 2)
mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_WAIT_REACT_TO_PLAYER_FLEE
mPed[GET_THE_OTHER_GUY(type)].eControlState = DPCS_REACTING
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
mPed[GET_THE_OTHER_GUY(type)].iReactionTimer = GET_GAME_TIMER()
ENDIF
ELSE
PICK_FLEE_REACTION(ped)
IF DOES_ENTITY_EXIST(mPed[GET_THE_OTHER_GUY(type)].id)
IF IS_PED_IN_PED_VIEW_CONE(mPed[GET_THE_OTHER_GUY(type)].id, PLAYER_PED_ID())
PICK_FLEE_REACTION(mPed[GET_THE_OTHER_GUY(type)])
CPRINTLN(DEBUG_MISSION, "other guy can see the player threaten the = ", type)
ENDIF
ENDIF
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(ped.id)
ELSE
PICK_FLEE_REACTION(ped)
IF DOES_ENTITY_EXIST(mPed[GET_THE_OTHER_GUY(type)].id)
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(type)].id, ped.id)
PICK_FLEE_REACTION(mPed[GET_THE_OTHER_GUY(type)])
CPRINTLN(DEBUG_MISSION, "other ped can see the player threatening and not in a car = ", type)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_BRAWL
CPRINTLN(DEBUG_MISSION, "ped threatened by player without gun = ", type)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(ped.id)
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(type)].id, ped.id)
mPed[GET_THE_OTHER_GUY(type)].iReactionTimer = GET_GAME_TIMER()
mPed[GET_THE_OTHER_GUY(type)].ePrevDeliverState = ped.eDeliverState
mPed[GET_THE_OTHER_GUY(type)].eControlState = DPCS_REACTING
mPed[GET_THE_OTHER_GUY(type)].eReactionState = DPRS_WAIT_REACT_BRAWL
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mPed[GET_THE_OTHER_GUY(type)].id)
CPRINTLN(DEBUG_MISSION, "ped can see other ped being threatened without gun = ", type)
ENDIF
ENDIF
ped.eControlState = DPCS_REACTING
ELIF IS_PED_BEING_JACKED(ped.id)
TELL_PED_DROP_BIN_BAG(ped)
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 500, -1, FALSE, TRUE)
ped.eReactionState = DPRS_BEING_JACKED
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
CPRINTLN(DEBUG_MISSION, "Ped is being jacked = ", type)
ENDIF
IF IS_PED_RAGDOLL(ped.id)
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
IF IS_ENTITY_ATTACHED(mDeliveryPoint[iDeliveryIndex].oiObject)
DETACH_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, TRUE, FALSE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(mDeliveryPoint[iDeliveryIndex].oiObject, APPLY_TYPE_IMPULSE, GET_ENTITY_FORWARD_VECTOR(ped.id),0, TRUE, TRUE)
CPRINTLN(DEBUG_MISSION, "Detaching the bin bag = ", type)
ENDIF
ENDIF
ENDIF
ENDIF
IF ped.eControlState <> DPCS_REACTING
IF IS_PED_UNINJURED(mPed[GET_THE_OTHER_GUY(type)].id)
IF IS_PED_BEING_JACKED(mPed[GET_THE_OTHER_GUY(type)].id)
TELL_PED_DROP_BIN_BAG(ped)
CPRINTLN(DEBUG_MISSION, "other guy is being jacked = ", type)
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 120, -1)
// TASK_LEAVE_ANY_VEHICLE(ped.id, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_REACT_TO_PLAYER_FLEE
ped.eControlState = DPCS_REACTING
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if the player is in the
/// truck while the other ped isn't in (normally the driver)
/// and if they start to drive off
PROC MONITOR_PLAYER_DRIVING_OFF_IN_VAN(PED_STRUCT &ped)
IF IS_VEHICLE_OK(mRoutedVehicle.id)
AND (IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id)
AND NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id))
IF GET_ENTITY_SPEED(mRoutedVehicle.id) > 0
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_WAIT_REACT_BRAWL
CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_DRIVING_OFF_IN_VAN(), DPRS_WAIT_REACT_BRAWL")
ELSE
CPRINTLN(DEBUG_MISSION, "GET_ENTITY_SPEED(mRoutedVehicle.id)", GET_ENTITY_SPEED(mRoutedVehicle.id))
ENDIF
ELSE
#IF IS_DEBUG_BUILD
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id)
CPRINTLN(DEBUG_MISSION, "IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id)")
ENDIF
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
CPRINTLN(DEBUG_MISSION, "NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)")
ENDIF
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if the play damages the delivery van
/// If they do the ped gets out and turns to the player and plays an angry gesture
/// if the damage is done while the player is armed and shooting then the ped flees
/// [TODO] Need to check for bullet/explosion damage
PROC MONITER_PLAYER_BUMPING_VAN(PED_STRUCT &ped)
IF ped.eControlState <> DPCS_REACTING
IF IS_VEHICLE_OK(mRoutedVehicle.id)
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_DRIVE_BY)
AND IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRoutedVehicle.id, 10)
IF IS_ENTITY_TOUCHING_ENTITY(mRoutedVehicle.id, PLAYER_PED_ID())
// #IF IS_DEBUG_BUILD SK_PRINT("MONITER_PLAYER_BUMPING_VAN - eDeliveryPed = DPS_REACT_TO_PLAYER_ANGER") #ENDIF
TASK_DRIVE_BY(ped.id, PLAYER_PED_ID(), NULL, <<0,0,0>>, 10, 100, TRUE, FIRING_PATTERN_FULL_AUTO)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState= DPRS_REACT_TO_PLAYER_ANGER
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TELL_PED_REACT_PLAYER_BLOCKING_DOOR(PED_STRUCT &ped)
#IF IS_DEBUG_BUILD SK_PRINT("ped.eReactionState ===== DPRS_REACT_TO_PLAYER_BLOCKING_DOOR") #ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_ENEMIES, RELGROUPHASH_PLAYER)
TELL_PED_DROP_BIN_BAG(ped)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(ped.id)
TASK_PUT_PED_DIRECTLY_INTO_MELEE(ped.id, PLAYER_PED_ID(), NORMAL_BLEND_IN, -1, 10)
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
RESET_SHAPE_TEST()
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_TO_PLAYER_BLOCKING_DOOR
ENDPROC
PROC TELL_PED_REACT_TO_PLAYER_BLOCKING_BINS(PED_STRUCT &ped)
#IF IS_DEBUG_BUILD SK_PRINT("ped.eReactionState ===== DPRS_REACT_TO_PLAYER_BLOCKING_BINS") #ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_ENEMIES, RELGROUPHASH_PLAYER)
TELL_PED_DROP_BIN_BAG(ped)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(ped.id)
TASK_PUT_PED_DIRECTLY_INTO_MELEE(ped.id, PLAYER_PED_ID(), NORMAL_BLEND_IN, -1, 10)
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
RESET_SHAPE_TEST()
IF NOT DOES_BLIP_EXIST(ped.blip)
ped.blip = CREATE_BLIP_FOR_PED(ped.id, TRUE)
ENDIF
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_TO_PLAYER_BLOCKING_BINS
ENDPROC
PROC TELL_PED_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK(PED_STRUCT &ped)
#IF IS_DEBUG_BUILD SK_PRINT("ped.eReactionState ===== DPRS_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK") #ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_ENEMIES, RELGROUPHASH_PLAYER)
TELL_PED_DROP_BIN_BAG(ped)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(ped.id)
TASK_PUT_PED_DIRECTLY_INTO_MELEE(ped.id, PLAYER_PED_ID(), NORMAL_BLEND_IN, -1, 10)
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
RESET_SHAPE_TEST()
IF NOT DOES_BLIP_EXIST(ped.blip)
ped.blip = CREATE_BLIP_FOR_PED(ped.id, TRUE)
ENDIF
ped.iReactionTimer = GET_GAME_TIMER()
ped.ePrevDeliverState = ped.eDeliverState
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK
ENDPROC
PROC OPEN_TRUCK_BOOT()
IF fTruckBootOpenRatio != 1.0
IF IS_VEHICLE_OK(mRoutedVehicle.id)
SET_VEHICLE_DOOR_CONTROL(mRoutedVehicle.id, SC_DOOR_BOOT, DT_DOOR_INTACT, fTruckBootOpenRatio)
fTruckBootOpenRatio = fTruckBootOpenRatio +@ 0.1
// #IF IS_DEBUG_BUILD
// SK_PRINT_FLOAT("OPEN_TRUCK_BOOT = ", fTruckBootOpenRatio)
// #ENDIF
IF fTruckBootOpenRatio >= 1.0
SET_VEHICLE_DOOR_OPEN(mRoutedVehicle.id, SC_DOOR_BOOT)
fTruckBootOpenRatio = 1.0
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLOSE_TRUCK_BOOT()
IF fTruckBootOpenRatio != 0.0
SET_VEHICLE_DOOR_CONTROL(mRoutedVehicle.id, SC_DOOR_BOOT, DT_DOOR_INTACT, fTruckBootOpenRatio)
fTruckBootOpenRatio = fTruckBootOpenRatio -@ 0.1
// #IF IS_DEBUG_BUILD
//// SK_PRINT_FLOAT("CLOSE_TRUCK_BOOT = ", fTruckBootOpenRatio)
// #ENDIF
IF fTruckBootOpenRatio <= 0.0
SET_VEHICLE_DOOR_SHUT(mRoutedVehicle.id, SC_DOOR_BOOT, FALSE)
fTruckBootOpenRatio = 0.0
ENDIF
ENDIF
ENDPROC
PROC DELIVERY_SUBSTATES(PED_STRUCT &ped)
IF ped.eDeliverSubState >= SDS_WALKING_TO_BAG
AND ped.eDeliverSubState != SDS_NULL
// OPEN_TRUCK_BOOT()
ENDIF
SWITCH ped.eDeliverSubState
CASE SDS_WALKING_TO_BAG
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_GOTO_ENTITY_OFFSET)
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
IF GET_HEADING_BETWEEN_VECTORS(GET_ENTITY_COORDS(ped.id), mDeliveryPoint[iDeliveryIndex].vPedSpawn) > 1.5
TASK_TURN_PED_TO_FACE_COORD(NULL, mDeliveryPoint[iDeliveryIndex].vPedSpawn)
ENDIF
TASK_PLAY_ANIM(NULL, "missfbi4prepp1", "_bag_pickup_garbage_man", NORMAL_BLEND_IN, FAST_BLEND_OUT, -1, AF_USE_MOVER_EXTRACTION|AF_EXTRACT_INITIAL_OFFSET)
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
#IF IS_DEBUG_BUILD SK_PRINT("Finished getting out of vehicle picking up bin bag") #ENDIF
ped.eDeliverSubState = SDS_PICK_UP_BIN_BAG
ELSE
IF IS_GOTO_BLOCKED(mDeliveryPoint[iDeliveryIndex].vPedSpawn, ped.id, <<1,1,8>>)
TELL_PED_REACT_TO_PLAYER_BLOCKING_BINS(ped)
EXIT
ENDIF
ENDIF
SET_PED_CAPSULE(ped.id, 0.2)
BREAK
CASE SDS_PICK_UP_BIN_BAG
IF IsPedPerformingTask(ped.id, SCRIPT_TASK_PERFORM_SEQUENCE)
IF IS_ENTITY_PLAYING_ANIM(ped.id, "missfbi4prepp1", "_bag_pickup_garbage_man")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.id, "missfbi4prepp1", "_bag_pickup_garbage_man") >= 0.333
SET_PED_MOVEMENT_CLIPSET(ped.id, "missfbi4prepp1_garbageman", INSTANT_BLEND_DURATION)
SET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id, "missfbi4prepp1_garbageman")
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
AND NOT IS_ENTITY_ATTACHED(mDeliveryPoint[iDeliveryIndex].oiObject)
#IF IS_DEBUG_BUILD SK_PRINT("Attaching bin bag to Right hand") #ENDIF
ATTACH_ENTITY_TO_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, ped.id, GET_PED_BONE_INDEX(ped.id, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
IF IS_GOTO_BLOCKED(mDeliveryPoint[iDeliveryIndex].vPedSpawn, ped.id, <<1,1,8>>)
TELL_PED_REACT_TO_PLAYER_BLOCKING_BINS(ped)
EXIT
ENDIF
ELSE
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
#IF IS_DEBUG_BUILD SK_PRINT("bag picked up changing substate to walk to back of truck") #ENDIF
IF IS_VEHICLE_OK(mRoutedVehicle.id)
// TASK_PLAY_ANIM(ped.id, "missfbi4prepp1", "_bag_walk_garbage_man", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY|AF_SECONDARY|AF_LOOPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0,-4.8,0>>), PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, GET_ENTITY_HEADING(mRoutedVehicle.id))
ENDIF
ped.eDeliverSubState = SDS_WALK_TO_BACK_OF_TRUCK
ENDIF
ENDIF
SET_PED_CAPSULE(ped.id, 0.2)
BREAK
CASE SDS_WALK_TO_BACK_OF_TRUCK
IF IS_VEHICLE_OK(mRoutedVehicle.id)
IF NOT IS_GOTO_BLOCKED(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0, -5.5, 0>>), mRoutedVehicle.id, <<1.9,1.9,8>>)
IF IS_ENTITY_AT_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0, -5.5, 0>>), <<0.9,0.9,2>>)
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
#IF IS_DEBUG_BUILD SK_PRINT("Reached back of truck start throw bag seq") #ENDIF
// CLEAR_PED_SECONDARY_TASK(ped.id)
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
IF GET_HEADING_BETWEEN_VECTORS(GET_ENTITY_COORDS(ped.id), GET_ENTITY_COORDS(mRoutedVehicle.id)) > 3.0
TASK_ACHIEVE_HEADING(NULL, GET_ENTITY_HEADING(mRoutedVehicle.id))
ENDIF
TASK_PLAY_ANIM(NULL, "missfbi4prepp1", "_bag_throw_garbage_man")
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
#IF IS_DEBUG_BUILD SK_PRINT("Clearing alt walk anim override") #ENDIF
ped.eDeliverSubState = SDS_THROW_BAG_IN_TO_TRUCK
ENDIF
ELSE
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0,-4.8,0>>), PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, GET_ENTITY_HEADING(mRoutedVehicle.id))
ENDIF
ENDIF
ELSE
TELL_PED_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK(ped)
ENDIF
ENDIF
BREAK
CASE SDS_THROW_BAG_IN_TO_TRUCK
IF NOT IS_GOTO_BLOCKED(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<0, -5.5, 0>>), ped.id, <<1.9,1.9,8>>)
IF IsPedPerformingTask(ped.id, SCRIPT_TASK_PERFORM_SEQUENCE)
IF IS_ENTITY_PLAYING_ANIM(ped.id, "missfbi4prepp1", "_bag_throw_garbage_man")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.id, "missfbi4prepp1", "_bag_throw_garbage_man") >= 0.391
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
IF IS_ENTITY_ATTACHED(mDeliveryPoint[iDeliveryIndex].oiObject)
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
#IF IS_DEBUG_BUILD SK_PRINT("Detaching bin bag") #ENDIF
DETACH_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(mDeliveryPoint[iDeliveryIndex].oiObject, 2, -1, <<-1,-1,-1>>, <<-1,-1,-1>>)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(mDeliveryPoint[iDeliveryIndex].oiObject, APPLY_TYPE_IMPULSE, GET_ENTITY_FORWARD_VECTOR(ped.id),0, TRUE, TRUE)
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, mRoutedVehicle.id)
SAFE_DELETE_OBJECT(mDeliveryPoint[iDeliveryIndex].oiObject)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD SK_PRINT("Reactivating ped") #ENDIF
ped.eDeliverSubState = SDS_NULL
IF IS_VEHICLE_OK(mRoutedVehicle.id)
SET_VEHICLE_DOOR_SHUT(mRoutedVehicle.id, SC_DOOR_BOOT, FALSE)
SAFE_DELETE_OBJECT(mDeliveryPoint[iDeliveryIndex].oiObject)
ENDIF
REACTIVATE_PED(ped)
ENDIF
ELSE
TELL_PED_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK(ped)
ENDIF
BREAK
CASE SDS_DROP_BAG
BREAK
ENDSWITCH
ENDPROC
PROC MONITOR_DRIVER_DOOR_BLOCKED(PED_STRUCT &ped)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX Veh
Veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(Veh)
IF NOT IS_ENTRY_POINT_FOR_SEAT_CLEAR(ped.id, Veh, VS_DRIVER)
ped.eReactionState = DPRS_WAIT_FLIM_BLOCKING
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
PROC WAIT_PED_AT_VAN_DOOR(PED_STRUCT &ped, BOOL bDriver = FALSE)
IF IS_GOTO_BLOCKED(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(bDriver)), mRoutedVehicle.id, <<1.9,1.9,8>>)
IF IS_ENTITY_IN_ANGLED_AREA(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<5, 0, -2>>), (GET_ENTITY_COORDS(mRoutedVehicle.id)+ <<0,0,2>>), 9)
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<5, 0, -2>>), (GET_ENTITY_COORDS(mRoutedVehicle.id)+ <<0,0,2>>), 9)
TELL_PED_REACT_PLAYER_BLOCKING_DOOR(ped)
ELSE
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_GO_TO_ENTITY)
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<5, 0, -2>>), (GET_ENTITY_COORDS(mRoutedVehicle.id)+ <<0,0,2>>), 9)
CLEAR_PED_TASKS(ped.id)
TASK_GO_TO_ENTITY(ped.id, PLAYER_PED_ID(), DEFAULT_TIME_NEVER_WARP, 4, PEDMOVEBLENDRATIO_WALK)
ENDIF
ENDIF
ELSE
IF IS_ENTITY_IN_RANGE_COORDS(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, GET_ENTRYPOINT_AREA_OFFSET(bDriver)), 5)
#IF IS_DEBUG_BUILD SK_PRINT(" WAIT_PED_AT_VAN_DOOR Tasking ped to enter vehicle") #ENDIF
VEHICLE_SEAT v = VS_DRIVER
IF NOT bDriver
v = VS_FRONT_RIGHT
ENDIF
TASK_ENTER_VEHICLE(ped.id, mRoutedVehicle.id, -1, v, PEDMOVEBLENDRATIO_WALK, ECF_DONT_JACK_ANYONE|ECF_RESUME_IF_INTERRUPTED)
//EPREVPASSENGERPED = ePassengerPed
ped.eDeliverState = DPDS_ENTER_VAN
ENDIF
ENDIF
ENDPROC
PROC DO_DELIVERIES(PED_STRUCT &ped)
IF ped.eDeliverSubState = SDS_NULL
AND ped.eDeliverPedType = PASSENGER
// CLOSE_TRUCK_BOOT()
ENDIF
SWITCH ped.eDeliverState
CASE DPDS_WALKING_TO_VAN_DOOR
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id, TRUE)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("Player is in vehicle Picked flee reaction") #ENDIF
EXIT
ENDIF
IF ped.eDeliverPedType = DRIVER
WAIT_PED_AT_VAN_DOOR(ped, TRUE)
ELSE
WAIT_PED_AT_VAN_DOOR(ped, FALSE)
ENDIF
BREAK
CASE DPDS_ENTER_VAN
IF IS_PED_SITTING_IN_VEHICLE(ped.id, mRoutedVehicle.id)
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_ENTER_VEHICLE)
IF ped.eDeliverPedType = DRIVER
TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT()
ELSE
ped.eDeliverState = DPDS_WAITING_IN_VAN
ENDIF
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id, TRUE)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("Player is in vehicle Picked flee reaction") #ENDIF
EXIT
ENDIF
ENDIF
BREAK
CASE DPDS_WAITING_IN_VAN
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mRoutedVehicle.id, TRUE)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("Player is in vehicle Picked flee reaction") #ENDIF
EXIT
ENDIF
IF bPassengerDoDeliveries
IF iDeliveryIndex <= MAX_DELIVERIES-1
AND iDeliveryIndex != -1
IF NOT mDeliveryPoint[iDeliveryIndex].bDelivered
IF IS_ENTITY_IN_RANGE_COORDS(ped.id, mDeliveryPoint[iDeliveryIndex].vDriveTo, 20)
#IF IS_DEBUG_BUILD SK_PRINT("ped.ePrevDeliverState ===== DPDS_WAITING_IN_VAN") #ENDIF
IF mDeliveryPoint[iDeliveryIndex].bDoActionAtDeliveryPoint
AND IS_VEHICLE_STOPPED(mRoutedVehicle.id)
TELL_PASSENGER_PED_TO_MAKE_DELIVERY()
ENDIF
ENDIF
ENDIF
ELSE
ped.eDeliverState = DPDS_WANDERING
ENDIF
ENDIF
BREAK
CASE DPDS_DRIVE_TO_DELIVERY_POINT
#IF IS_DEBUG_BUILD
IF bShowDeliveryDebugText
// DRAW_DEBUG_SPHERE(mDeliveryPoint[iDeliveryIndex].vDriveTo, 25, 0, 255, 0, 100)
ENDIF
#ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(ped.id, mDeliveryPoint[iDeliveryIndex].vDriveTo, 25)
#IF IS_DEBUG_BUILD SK_PRINT("ped.ePrevDeliverState ===== DPDS_DRIVE_TO_DELIVERY_POINT") #ENDIF
IF mDeliveryPoint[iDeliveryIndex].bDoActionAtDeliveryPoint
TELL_DRIVER_PED_PULLOVER(ped)
// ped.eDeliverState = DPDS_BREAKING
ELSE
mDeliveryPoint[iDeliveryIndex].bDelivered = TRUE
TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT()
ENDIF
ENDIF
BREAK
CASE DPDS_BREAKING
IF IS_VEHICLE_OK(mRoutedVehicle.id)
BRING_VEHICLE_TO_HALT(mRoutedVehicle.id, 25, 10)
FLOAT fSpeed
fSpeed = GET_ENTITY_SPEED(mRoutedVehicle.id)
#IF IS_DEBUG_BUILD SK_PRINT_FLOAT("fSpeed = = = = = ", fSpeed) #ENDIF
IF fSpeed < 8
#IF IS_DEBUG_BUILD SK_PRINT_FLOAT("fSpeed < 8 --- fSpeed = = = = = ", fSpeed) #ENDIF
TELL_DRIVER_PED_PULLOVER(ped)
ENDIF
ENDIF
BREAK
CASE DPDS_PULLINGOVER
#IF IS_DEBUG_BUILD
IF bShowDeliveryDebugText
// DRAW_DEBUG_SPHERE(mDeliveryPoint[iDeliveryIndex].vParkingVec, 5, 255, 0, 0, 100)
ENDIF
#ENDIF
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PERFORM_SEQUENCE)
AND IS_VEHICLE_STOPPED(mRoutedVehicle.id)
// AND IS_ENTITY_IN_RANGE_COORDS(mRoutedVehicle.id, mDeliveryPoint[iDeliveryIndex].vParkingVec, 5)
// #IF IS_DEBUG_BUILD SAFE_REMOVE_BLIP(DebugBlip) #ENDIF
#IF IS_DEBUG_BUILD SK_PRINT("ped.ePrevDeliverState ===== DPDS_PULLINGOVER") #ENDIF
IF bPassengerDoDeliveries
ped.ePrevDeliverState = ped.eDeliverState
ped.eDeliverState = DPDS_WAIT_PASSENGER_DELIVER
ELSE
TASK_LEAVE_ANY_VEHICLE(ped.id)
ped.ePrevDeliverState = ped.eDeliverState
ped.eDeliverState = DPDS_EXIT_VAN_DELIVER
ENDIF
ENDIF
BREAK
CASE DPDS_WAIT_PASSENGER_DELIVER
IF IS_PED_UNINJURED(mPed[PASSENGER].id)
IF IS_PED_IN_VEHICLE(mPed[PASSENGER].id, mRoutedVehicle.id)
AND mPed[PASSENGER].eDeliverState = DPDS_WAITING_IN_VAN
#IF IS_DEBUG_BUILD SK_PRINT("ped.ePrevDeliverState ===== DPDS_EXIT_VAN_DELIVER") #ENDIF
TELL_DRIVER_PED_DRIVE_TO_DELIVERY_POINT()
ENDIF
ENDIF
BREAK
CASE DPDS_EXIT_VAN_DELIVER
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
TELL_PED_TO_MAKE_DELIVERY(ped)
ENDIF
BREAK
CASE DPDS_MAKE_DELIVERY
DELIVERY_SUBSTATES(ped)
// IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PERFORM_SEQUENCE)
//// mDeliveryPoint[iDeliveryIndex].bDelivered = TRUE
//// REACTIVATE_PED(ped)
// ELSE
// IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iReactionDelay
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), mDeliveryPoint[iDeliveryIndex].vPedSpawn, <<2,2,2>>)
// TELL_PED_REACT_TO_PLAYER_BLOCKING_BINS(ped)
// ENDIF
// ENDIF
// ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DO_REACTIONS(PED_STRUCT &ped)
SWITCH ped.eReactionState
CASE DPRS_WAIT_REACT_TO_PLAYER_FLEE
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iQuickReactionDelay
IF IsPedPerformingTask(ped.id, SCRIPT_TASK_COMBAT)
CLEAR_PED_TASKS(ped.id)
ENDIF
#IF IS_DEBUG_BUILD SK_PRINT("Setting state to initial flee state") #ENDIF
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 30, -1, FALSE)
ped.eReactionState = DPRS_REACT_TO_PLAYER_INITAL_FLEE
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE DPRS_WAIT_REACT_BRAWL
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
IF CAN_PED_SEE_PED(ped.id, PLAYER_PED_ID())
PICK_FLEE_REACTION(ped, TRUE)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 1") #ENDIF
EXIT
ENDIF
ENDIF
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iQuickReactionDelay
IF NOT IS_PED_IN_ANY_VEHICLE(ped.id)
TASK_PUT_PED_DIRECTLY_INTO_MELEE(ped.id, PLAYER_PED_ID(), NORMAL_BLEND_IN, -1, 10)
ELSE
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ENDIF
IF NOT DOES_BLIP_EXIST(ped.blip)
ped.blip = CREATE_BLIP_FOR_PED(ped.id, TRUE)
ENDIF
#IF IS_DEBUG_BUILD SK_PRINT("setting combat task") #ENDIF
ped.eReactionState = DPRS_REACT_BRAWL
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE DPRS_WAIT_REACT_TO_PLAYER_COWER
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iQuickReactionDelay
IF IS_PED_IN_ANY_VEHICLE(ped.id)
SET_PED_RESET_FLAG(ped.id, PRF_PanicInVehicle, TRUE)
ped.eReactionState = DPRS_REACT_TO_PLAYER_COWER
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
#IF IS_DEBUG_BUILD SK_PRINT("PICK_FLEE_REACTION = TGS_COWER") #ENDIF
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_COWER)
IF IsPedPerformingTask(ped.id, SCRIPT_TASK_COMBAT)
CLEAR_PED_TASKS(ped.id)
ENDIF
TASK_COWER(ped.id)
ped.eReactionState = DPRS_REACT_TO_PLAYER_COWER
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_WAIT_RING_COPS
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iQuickReactionDelay
TASK_USE_MOBILE_PHONE(ped.id, TRUE)
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 500, -1, FALSE, TRUE)
CPRINTLN(DEBUG_MISSION, "ped Will now ring cops = ", ped.eDeliverPedType)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_RING_COPS
ped.eControlState = DPCS_REACTING
ENDIF
BREAK
CASE DPRS_WAIT_REACT_SEARCH
MONITOR_PLAYER_DRIVING_OFF_IN_VAN(ped)
IF (GET_GAME_TIMER() - ped.iReactionTimer) > 5000
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
IF DOES_ENTITY_EXIST(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id)
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.id, vSearchPos, PEDMOVEBLENDRATIO_WALK,DEFAULT_TIME_NEVER_WARP, 2)
ENDIF
ENDIF
CPRINTLN(DEBUG_MISSION, "ped Will search for friend = ", ped.eDeliverPedType)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_REACT_SEARCH
ped.eControlState = DPCS_REACTING
ENDIF
BREAK
CASE DPRS_WAIT_FLIM_BLOCKING
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PLAY_ANIM)
CPRINTLN(DEBUG_MISSION, "ped Will now film player = ", ped.eDeliverPedType)
SEQUENCE_INDEX Seq
OPEN_SEQUENCE_TASK(Seq)
IF GET_HEADING_BETWEEN_VECTORS(GET_ENTITY_COORDS(ped.id), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 1.5
TASK_TURN_PED_TO_FACE_COORD(NULL, GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
TASK_START_SCENARIO_IN_PLACE( NULL, "WORLD_HUMAN_MOBILE_FILM_SHOCKING", 6000, TRUE )
CLOSE_SEQUENCE_TASK(Seq)
TASK_PERFORM_SEQUENCE(ped.id, Seq)
CLEAR_SEQUENCE_TASK(Seq)
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_FLIM
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE DPRS_WAIT_FLIM_DEAD
MONITOR_PLAYER_DRIVING_OFF_IN_VAN(ped)
IF NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_PLAY_ANIM)
CPRINTLN(DEBUG_MISSION, "ped Will now film dead ped = ", ped.eDeliverPedType)
TASK_START_SCENARIO_IN_PLACE( ped.id, "WORLD_HUMAN_MOBILE_FILM_SHOCKING", 6000, TRUE )
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_FLIM
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE DPRS_EXIT_VAN_FLEE
IF NOT IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id)
TELL_PED_RING_COPS(ped)
ENDIF
BREAK
CASE DPRS_BEING_JACKED
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(ped.id)
AND (GET_GAME_TIMER() - ped.iReactionTimer) > 3000
// AND NOT GET_IS_TASK_ACTIVE(mPed[DRIVER].id, CODE_TASK_EXIT_VEHICLE)
TELL_PED_RING_COPS(ped)
ENDIF
BREAK
CASE DPRS_RING_COPS
IF (GET_GAME_TIMER() - ped.iReactionTimer) > 8000
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 500, -1)
IF NOT bWantedLevelSet
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
bWantedLevelSet = TRUE
CPRINTLN(DEBUG_MISSION, "Giving player 2 star wanted script = ", GET_THIS_SCRIPT_NAME())
ENDIF
ENDIF
TASK_USE_MOBILE_PHONE(ped.id, FALSE)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_FLEE_AFTER_RINGING_COPS
ELSE
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 1
TASK_USE_MOBILE_PHONE(ped.id, FALSE)
ped.iReactionTimer = GET_GAME_TIMER()
ped.eReactionState = DPRS_FLEE_AFTER_RINGING_COPS
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_INITAL_FLEE
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iReactionDelay
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
#IF IS_DEBUG_BUILD SK_PRINT("ped out of range set to normal flee state") #ENDIF
SAFE_REMOVE_BLIP(ped.blip)
ped.eReactionState = DPRS_REACT_TO_PLAYER_FLEE
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_FLEE
IF IS_PED_IN_VEHICLE(ped.id, mRoutedVehicle.id, TRUE)
IF ped.eReactionState <> DPRS_RING_COPS
AND ped.eReactionState <> DPRS_EXIT_VAN_FLEE
IF MONITER_PLAYER_DAMAGING_ROUTE_CAR()
IF IS_PED_UNINJURED(ped.id)
CLEAR_PED_TASKS(ped.id)
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 500, -1, FALSE, TRUE)
ped.eReactionState = DPRS_EXIT_VAN_FLEE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 120)
CPRINTLN(DEBUG_MISSION, "Released one of the delivery peds = ", ped.eDeliverPedType)
SAFE_RELEASE_PED(ped.id)
ENDIF
ELSE
TELL_PED_RING_COPS(ped)
ENDIF
BREAK
CASE DPRS_FLEE_AFTER_RINGING_COPS
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 120)
CPRINTLN(DEBUG_MISSION, "Released one of the delivery peds = ", ped.eDeliverPedType)
SAFE_RELEASE_PED(ped.id)
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_ANGER
IF IS_PED_BEING_JACKED(ped.id)
PICK_FLEE_REACTION(ped, TRUE)
EXIT
ENDIF
IF (GET_GAME_TIMER() - ped.iReactionTimer) > ped.iReactionDelay
OR NOT IsPedPerformingTask(ped.id, SCRIPT_TASK_DRIVE_BY)
REACTIVATE_PED(ped)
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_COWER
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
TASK_SMART_FLEE_PED(ped.id, PLAYER_PED_ID(), 500, -1, FALSE, TRUE)
ped.eReactionState = DPRS_WAIT_REACT_TO_PLAYER_FLEE
ELSE
SET_PED_RESET_FLAG(ped.id, PRF_PanicInVehicle, TRUE)
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_BLOCKING_DOOR
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
//Line
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id, ped.id)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 2") #ENDIF
ELSE
MONITOR_DRIVER_DOOR_BLOCKED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_BLOCKING_BAC_OF_TRUCK
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
//Line
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id, ped.id)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 5") #ENDIF
ELSE
MONITOR_DRIVER_DOOR_BLOCKED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_BLOCKING_FRONT_OF_TRUCK
IF IS_PED_BEING_JACKED(ped.id)
PICK_FLEE_REACTION(ped, TRUE)
EXIT
ENDIF
IF (GET_GAME_TIMER() - iPlayerBlockingTruckTimer) >= 9000
//Line
IF NOT IS_PLAYER_BLOCKING_TRUCK_PROGRESSION(ped)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
ped.iReactionTimer = GET_GAME_TIMER()
ped.eControlState = DPCS_REACTING
ped.eReactionState = DPRS_REACT_TO_PLAYER_BLOCKING_FRONT_OF_TRUCK
ENDIF
ELIF (GET_GAME_TIMER() - iPlayerBlockingTruckTimer) >= 5000
AND (GET_GAME_TIMER() - iPlayerBlockingTruckTimer) <= 5500
IF IS_PED_IN_ANY_VEHICLE(ped.id)
IF IS_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(ped.id)
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(ped.id)
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_BLOCKING_BINS
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id, ped.id)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 4") #ENDIF
ELSE
MONITOR_DRIVER_DOOR_BLOCKED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_TO_PLAYER_BUMP
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ELSE
IF CAN_PED_SEE_PED(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id, ped.id)
PICK_FLEE_REACTION(ped)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 5") #ENDIF
ELSE
MONITOR_DRIVER_DOOR_BLOCKED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_FLIM
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF CAN_PED_SEE_PED(ped.id, PLAYER_PED_ID())
PICK_FLEE_REACTION(ped, TRUE)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 6") #ENDIF
EXIT
ENDIF
ENDIF
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= 6000
IF NOT IS_ENTITY_IN_ANGLED_AREA(ped.id, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mRoutedVehicle.id, <<5, 0, -2>>), (GET_ENTITY_COORDS(mRoutedVehicle.id)+ <<0,0,2>>), 9)
REACTIVATE_PED(ped)
ELSE
TELL_PED_RING_COPS(ped)
TELL_PED_RING_COPS(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)])
ENDIF
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
MONITOR_PLAYER_DRIVING_OFF_IN_VAN(ped)
BREAK
CASE DPRS_REACT_BRAWL
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
IF CAN_PED_SEE_PED(ped.id, PLAYER_PED_ID())
PICK_FLEE_REACTION(ped, TRUE)
#IF IS_DEBUG_BUILD SK_PRINT("player is armed flee 7") #ENDIF
EXIT
ENDIF
ENDIF
// SET_PED_MIN_MOVE_BLEND_RATIO(ped.id, PEDMOVEBLENDRATIO_RUN)
IF (GET_GAME_TIMER() - ped.iReactionTimer) >= ped.iReactionDelay
IF NOT IS_ENTITY_IN_RANGE_ENTITY(ped.id, PLAYER_PED_ID(), 15)
//Line
REACTIVATE_PED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
EXIT
ELSE
MONITOR_DRIVER_DOOR_BLOCKED(ped)
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
BREAK
CASE DPRS_REACT_SEARCH
MONITER_PLAYER_THREATEN(ped, ped.eDeliverPedType, TRUE)
MONITOR_PLAYER_DRIVING_OFF_IN_VAN(ped)
// IF DOES_ENTITY_EXIST(mPed[GET_THE_OTHER_GUY(ped.eDeliverPedType)].id)
IF IS_ENTITY_IN_RANGE_COORDS(ped.id, vSearchPos, 2)
IF IS_POSITION_IN_PED_VIEW_CONE(ped.id, vSearchPos)
CLEAR_PED_TASKS(ped.id)
ped.eReactionState = DPRS_WAIT_FLIM_DEAD
ped.eControlState = DPCS_REACTING
ped.iReactionTimer = GET_GAME_TIMER()
ENDIF
ENDIF
// ELSE
// TASK_VEHICLE_DRIVE_WANDER(ped.id, mRoutedVehicle.id, 20, DRIVINGMODE_STOPFORCARS_STRICT)
// ped.iReactionTimer = GET_GAME_TIMER()
// ped.eControlState = DPCS_DELIVERING
// ped.eDeliverState = DPDS_WANDERING
// ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DELIVERY_PED_STATE(PED_STRUCT &ped, DELIVER_PED_TYPE type)
IF IS_PED_UNINJURED(ped.id)
MONITER_PLAYER_THREATEN(ped, type)
IF IS_ENTITY_PLAYING_ANIM(ped.id, "missfbi4prepp1", "_bag_drop_garbage_man")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.id, "missfbi4prepp1", "_bag_drop_garbage_man") >= 0.172
// CPRINTLN(DEBUG_MISSION, "ped is playing drop garbage = ", type)
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
AND IS_ENTITY_ATTACHED(mDeliveryPoint[iDeliveryIndex].oiObject)
RESET_PED_MOVEMENT_CLIPSET(ped.id)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(ped.id)
IF iDeliveryIndex <= MAX_DELIVERIES-1
AND iDeliveryIndex != -1
mDeliveryPoint[iDeliveryIndex].bDelivered = TRUE
ped.eDeliverSubState = SDS_NULL
ENDIF
CPRINTLN(DEBUG_MISSION, "Detaching bin bag = ", type)
DETACH_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, TRUE, FALSE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(mDeliveryPoint[iDeliveryIndex].oiObject, APPLY_TYPE_IMPULSE, GET_ENTITY_FORWARD_VECTOR(ped.id),0, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
SWITCH ped.eControlState
CASE DPCS_DELIVERING
IF type = DRIVER
ROUTE_POINT_MANAGER()
MONITER_PLAYER_BUMPING_VAN(ped)
ENDIF
DO_DELIVERIES(ped)
BREAK
CASE DPCS_REACTING
DO_REACTIONS(ped)
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_ALIVE(mDeliveryPoint[iDeliveryIndex].oiObject)
IF IS_ENTITY_ATTACHED(mDeliveryPoint[iDeliveryIndex].oiObject)
DETACH_ENTITY(mDeliveryPoint[iDeliveryIndex].oiObject, TRUE, FALSE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(mDeliveryPoint[iDeliveryIndex].oiObject, APPLY_TYPE_IMPULSE, GET_ENTITY_FORWARD_VECTOR(ped.id),0, TRUE, TRUE)
CPRINTLN(DEBUG_MISSION, "ped dead detach bag")
ENDIF
ENDIF
SAFE_REMOVE_BLIP(ped.blip)
IF DOES_ENTITY_EXIST(ped.id)
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), ped.id, 150)
AND NOT bCheckSeenPedDie
CPRINTLN(DEBUG_MISSION, "Released one of the dead delivery peds = ", ped.eDeliverPedType)
SAFE_RELEASE_PED(ped.id)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_ROUTE_MANAGER()
INT i
FOR i= ENUM_TO_INT(DRIVER) TO (ENUM_TO_INT(MAX_DELIVERY_PEDS)-1)
DELIVERY_PED_STATE(mPed[i], INT_TO_ENUM(DELIVER_PED_TYPE, i))
ENDFOR
ENDPROC
/// PURPOSE:
/// Fills a new delivery point with a position and info for spawning a ped that the Driver ped will walk over to
/// If the Model is set to DUMMY_MODEL_FOR_SCRIPT then no ped will be spawned but the Driver ped will still get out of the vehicle and
/// head to the point the ped would of been
/// PARAMS:
/// vpos - The position of the point to drive to
/// vPedPos - the position the ped should be spawned at or where the driver will walk to
/// fPedDir - the direction the ped should face when spawned
/// mod - the model that should be used to spawn the ped
/// RETURNS:
/// A new instance of a DELIVERY_POINT
FUNC DELIVERY_POINT FILL_DELIVERY_POINT_DEST_PED(VECTOR vpos, VECTOR vPedPos, FLOAT fPedDir, MODEL_NAMES mod)
DELIVERY_POINT mTemp
mTemp.vDriveTo = vpos
mTemp.vPedSpawn = vPedPos
mTemp.fPedHeading = fPedDir
mTemp.pedModel = mod
RETURN mTemp
ENDFUNC
/// PURPOSE:
/// Fills in a delivery point with all the needed data for the Vehicle to
/// park when reaching the delivery point
/// PARAMS:
/// DelPoint - The Delivery point to populate
/// UseParkTask - Should we use the park task or just coast to a stop (peds apply breaks when they dont have a task in a car
/// DriveToTargetDist - The distance at which the vehicle has reached its destination
/// DriveToStraightDist - The disatance before the vehicle will use straight line pathing
/// ParkHeading - If the vehicle's heading isn't within this amount of the Direction param, the vehicle will back up and try to straighten itself out
/// ParkType - The type of parking TO perform
/// BlockingAreaCentre - The point we should block veh gens
/// BlockingAreaSize - the size of the area we should block
PROC FILL_DELIVERY_POINT_PARKING(DELIVERY_POINT &DelPoint, VECTOR parkingpos, BOOL UseParkTask, FLOAT DriveToTargetDist, FLOAT DriveToStraightDist, FLOAT ParkHeading, PARK_TYPE ParkType, VECTOR BlockingAreaCentre, VECTOR BlockingAreaSize)
DelPoint.vParkingVec = parkingpos
DelPoint.fDriveToTargetDist = DriveToTargetDist
DelPoint.fDriveToStraightDist = DriveToStraightDist
DelPoint.fParkHeading = ParkHeading
DelPoint.bDoActionAtDeliveryPoint = UseParkTask
DelPoint.eParkType = ParkType
DelPoint.vBlockingAreaCentre = BlockingAreaCentre
DelPoint.vBlockingAreaSize = BlockingAreaSize
ENDPROC
PROC REGISTER_PED_AS_DRIVER(PED_INDEX ped)
IF IS_PED_UNINJURED(ped)
mPed[DRIVER].id = ped
ELSE
SCRIPT_ASSERT("Ped was invaild when trying to register as a delivery driver")
ENDIF
ENDPROC
PROC REGISTER_PED_AS_PASSENGER(PED_INDEX ped)
IF IS_PED_UNINJURED(ped)
mPed[PASSENGER].id = ped
ELSE
SCRIPT_ASSERT("Ped was invaild when trying to register as a passenger")
ENDIF
ENDPROC
/// PURPOSE:
/// Sets a Vehicle as the Route Vehicle
/// PARAMS:
/// vhe -
PROC REGISTER_VEHICLE(VEHICLE_INDEX vhe)
IF IS_VEHICLE_OK(vhe)
mRoutedVehicle.id = vhe
ELSE
SCRIPT_ASSERT("Ped was invaild when trying to register as a delivery vehicle")
ENDIF
ENDPROC
/// PURPOSE:
/// Releases the ped and the vehicle
PROC RELEASE_DELIVERY_ENTITIES()
SAFE_REMOVE_BLIP(mPed[DRIVER].blip)
SAFE_REMOVE_BLIP(mPed[PASSENGER].blip)
SAFE_RELEASE_VEHICLE(mRoutedVehicle.id)
SAFE_RELEASE_PED(mPed[DRIVER].id)
SAFE_RELEASE_PED(mPed[PASSENGER].id)
SAFE_RELEASE_OBJECT(mDeliveryPoint[iDeliveryIndex].oiObject)
REMOVE_RELATIONSHIP_GROUP(HASH_ENEMIES)
REMOVE_ANIM_DICT("missfbi4prepp1")
REMOVE_ANIM_SET("missfbi4prepp1_garbageman")
ENDPROC
/// PURPOSE:
/// Starts the Delivery peds state machine
/// PARAMS:
/// NumDeliveries -
/// IsSetRoute -
/// IsLooped -
/// DoActionAtDeliveryPoint -
PROC ACTIVATE_DELIVERY_MANAGER(INT NumDeliveries = MAX_DELIVERIES, BOOL IsSetRoute = FALSE, BOOL IsLooped = FALSE, BOOL PassengerDoDeliveries = FALSE)
iNumDeliveries = NumDeliveries
bIsSetRoute = IsSetRoute
bIsLooped = IsLooped
bPassengerDoDeliveries = PassengerDoDeliveries
mPed[DRIVER].iReactionTimer = 0
mPed[PASSENGER].iReactionTimer = 0
INT i
FOR i=0 TO (iNumDeliveries-1)
mDeliveryPoint[i].bDelivered = FALSE
ENDFOR
fTruckBootOpenRatio = 0
ACTIVATE_DRIVER_PED()
mPed[PASSENGER].eDeliverState = DPDS_WAITING_IN_VAN
mPed[PASSENGER].eControlState = DPCS_DELIVERING
mPed[PASSENGER].eDeliverPedType = PASSENGER
mPed[PASSENGER].iReactionDelay = 1500
mPed[PASSENGER].iQuickReactionDelay = 500
mPed[DRIVER].eControlState = DPCS_DELIVERING
mPed[DRIVER].eDeliverPedType = DRIVER
mPed[DRIVER].iReactionDelay = 1000
mPed[DRIVER].iQuickReactionDelay = 100
ADD_RELATIONSHIP_GROUP("Enemies", HASH_ENEMIES)
SET_PED_RELATIONSHIP_GROUP_HASH(mPed[DRIVER].id, HASH_ENEMIES)
SET_PED_RELATIONSHIP_GROUP_HASH(mPed[PASSENGER].id, HASH_ENEMIES)
SET_ENTITY_IS_TARGET_PRIORITY(mPed[DRIVER].id, TRUE)
SET_ENTITY_IS_TARGET_PRIORITY(mPed[PASSENGER].id, TRUE)
INIT_GOTO_BLOCKING_SHAPE_TEST(<<1.9,1.9,8>>, <<0,0,0>>)
ENDPROC
/// PURPOSE:
/// Loads Anims required for ped reactions or behaviours
///
/// PARAMS:
/// bWait - If TRUE we wait in a while loop (holting the script) till the
/// anims are loaded
/// RETURNS:
/// TRUE when all anims are loaded
FUNC BOOL LOAD_DELIVERY_ANIMS(BOOL bWait = FALSE)
REQUEST_ANIM_DICT("missfbi4prepp1")
REQUEST_ANIM_SET("missfbi4prepp1_garbageman")
IF bWait
WHILE NOT HAS_ANIM_DICT_LOADED("missfbi4prepp1")
AND NOT HAS_ANIM_SET_LOADED("missfbi4prepp1_garbageman")
WAIT(0)
ENDWHILE
RETURN TRUE
ELSE
IF HAS_ANIM_DICT_LOADED("missfbi4prepp1")
AND HAS_ANIM_SET_LOADED("missfbi4prepp1_garbageman")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC