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

152 lines
5.2 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : flip_off_public.sch //
// AUTHOR : Rob Bray //
// DESCRIPTION : Common functions for flipping buddy peds off //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "commands_misc.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_vehicle.sch"
USING "commands_object.sch"
USING "commands_graphics.sch"
USING "commands_physics.sch"
USING "commands_streaming.sch"
USING "commands_camera.sch"
USING "commands_audio.sch"
USING "script_player.sch"
ENUM FLIP_OFF_STATE_ENUM
FLIP_OFF_STATE_NOT_STARTED = 0,
FLIP_OFF_STATE_WAIT_FOR_REACT,
FLIP_OFF_STATE_REACTING,
FLIP_OFF_STATE_WAIT_FOR_CANCEL
ENDENUM
STRUCT FLIP_OFF_DATA
PED_INDEX ped
FLIP_OFF_STATE_ENUM state
INT iReactTime
ENDSTRUCT
PROC INIT_FLIP_OFF_PED(FLIP_OFF_DATA &flipOffData, PED_INDEX ped)
flipOffData.ped = ped
flipOffData.state = FLIP_OFF_STATE_NOT_STARTED
ENDPROC
// cancel flip off ped
PROC CANCEL_FLIP_OFF_PED(FLIP_OFF_DATA &flipOffData)
IF NOT IS_PED_INJURED(flipOffData.ped)
IF IS_PED_DOING_DRIVEBY(flipOffData.ped)
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(flipOffData.ped)
// temp
//TASK_DRIVE_BY(flipOffData.ped, PLAYER_PED_ID(), NULL, <<0,0,0>>, 1, 100, TRUE)
ENDIF
flipOffData.state = FLIP_OFF_STATE_NOT_STARTED
ENDIF
ENDPROC
// is player targetting ped with a flip off
FUNC BOOL IS_PLAYER_TARGETTING_PED_FOR_FLIP_OFF(PED_INDEX targetPed, BOOL bCheckTargetCanSeePlayer)
IF NOT IS_PED_INJURED(targetPed)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(targetPed)
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
IF weapon = WEAPONTYPE_UNARMED
VEHICLE_INDEX targetVehicle = GET_VEHICLE_PED_IS_USING(targetPed)
IF NOT IS_ENTITY_DEAD(targetVehicle)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), targetPed, <<25,25,2.5>>)
IF IS_PED_DOING_DRIVEBY(PLAYER_PED_ID())
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(targetPed, GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF vOffset.y > -12
OR NOT bCheckTargetCanSeePlayer
ENTITY_INDEX aimedEntity
IF GET_ENTITY_PLAYER_IS_FREE_AIMING_AT(PLAYER_ID(), aimedEntity)
IF aimedEntity = GET_ENTITY_FROM_PED_OR_VEHICLE(targetPed)
OR aimedEntity = GET_ENTITY_FROM_PED_OR_VEHICLE(targetVehicle)
RETURN TRUE
ENDIF
ENDIF
// temp while 918205 getting fixed
/*
FLOAT fXPos
FLOAT fYPos
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(targetPed), fXPos, fYPos)
IF fXPos > 0.3
AND fXPos < 0.7
AND fYPos > 0.3
AND fYPos < 0.7
RETURN TRUE
ENDIF
*/
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// handle flip off
PROC HANDLE_FLIP_OFF_PED(FLIP_OFF_DATA &flipOffData)
// flip off ped
IF NOT IS_PED_INJURED(flipOffData.ped)
SWITCH flipOffData.state
CASE FLIP_OFF_STATE_NOT_STARTED
IF IS_PLAYER_TARGETTING_PED_FOR_FLIP_OFF(flipOffData.ped, TRUE)
flipOffData.iReactTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
flipOffData.state = FLIP_OFF_STATE_WAIT_FOR_REACT
ENDIF
BREAK
CASE FLIP_OFF_STATE_WAIT_FOR_REACT
IF GET_GAME_TIMER() >= flipOffData.iReactTime
IF IS_PLAYER_TARGETTING_PED_FOR_FLIP_OFF(flipOffData.ped, FALSE)
SET_CURRENT_PED_WEAPON(flipOffData.ped, WEAPONTYPE_UNARMED, TRUE)
SET_CURRENT_PED_VEHICLE_WEAPON(flipOffData.ped, WEAPONTYPE_UNARMED)
TASK_DRIVE_BY(flipOffData.ped, PLAYER_PED_ID(), NULL, <<0,0,0>>, 30, 100, TRUE)
flipOffData.iReactTime = GET_GAME_TIMER()
flipOffData.state = FLIP_OFF_STATE_REACTING
ELSE
flipOffData.state = FLIP_OFF_STATE_NOT_STARTED
ENDIF
ENDIF
BREAK
CASE FLIP_OFF_STATE_REACTING
IF NOT IS_PED_DOING_DRIVEBY(flipOffData.ped)
AND GET_GAME_TIMER() >= flipOffData.iReactTime + 500
flipOffData.state = FLIP_OFF_STATE_NOT_STARTED
ELSE
IF NOT IS_PLAYER_TARGETTING_PED_FOR_FLIP_OFF(flipOffData.ped, FALSE)
AND GET_GAME_TIMER() >= flipOffData.iReactTime + 2000
flipOffData.iReactTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 3000)
flipOffData.state = FLIP_OFF_STATE_WAIT_FOR_CANCEL
ENDIF
ENDIF
BREAK
CASE FLIP_OFF_STATE_WAIT_FOR_CANCEL
IF IS_PLAYER_TARGETTING_PED_FOR_FLIP_OFF(flipOffData.ped, FALSE)
flipOffData.state = FLIP_OFF_STATE_REACTING
ELSE
IF GET_GAME_TIMER() >= flipOffData.iReactTime
CANCEL_FLIP_OFF_PED(flipOffData)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC