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

247 lines
8.0 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Aggro Checks //
// AUTHOR : Brenda Carey //
// DESCRIPTION : Ambient used aggro checks //
// //
//////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///
///
USING "globals.sch"
//USING "rage_builtins.sch"
//USING "commands_player.sch"
//USING "commands_brains.sch"
//USING "commands_script.sch"
//USING "commands_streaming.sch"
//USING "ambience_run_checks.sch"
USING "commands_misc.sch"
//USING "brains.sch"
USING "script_player.sch"
//USING "commands_pad.sch"
//USING "commands_object.sch"
//USING "commands_path.sch"
USING "Commands_audio.sch"
USING "shared_debug_text.sch"
ENUM EAggro
EAggro_Danger = 0,
EAggro_ShotNear = 1,
EAggro_HostileOrEnemy = 2,
EAggro_Attacked = 3,
EAggro_HeardShot = 4,
EAggro_Shoved = 5
ENDENUM
PROC PLAY_TAUNT(PED_INDEX myPed)
// SAY_SINGLE_LINE_CONTEXT(myPed,SPEECH_Major_Shock, gPlayer, TRUE, FALSE, AUD_AMBIENT_SPEECH_VOLUME_SHOUTED)
PLAY_PED_AMBIENT_SPEECH(myPed, "")
ENDPROC
PROC SET_PED_AGGROED(PED_INDEX myPed)
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(myPed)
// AI_SPEECH_SET_ALLOW_FOR_ACTOR(MyActor, TRUE)
// DISABLE_NONCOMBAT_SPEECH_INDIVIDUAL(MyActor, FALSE)
//PLAY_TAUNT(myPed)
//Might need a way to make the ped neutral to the player
// SET_PED_RELATIONSHIP(myPed, ACQUAINTANCE_TYPE_PED_IGNORE ,RELGROUP_PLAYER)
//TASK_CLEAR_LOOK_AT(myPed)
ENDPROC
FUNC BOOL HAS_PLAYER_DAMAGED_PED(PED_INDEX myPed, INT CarDamageSensitivity = 0)
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(myPed, PLAYER_PED_ID())
RETURN TRUE
ENDIF
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(myPed, PLAYER_PED_ID())
IF GET_PED_MAX_HEALTH(myPed) - GET_ENTITY_HEALTH(myPed) > CarDamageSensitivity
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
INT iTimeLastNotLockedOn
/// PURPOSE:
/// Checks if the player has aggroed the ped
/// PARAMS:
/// myPed - The ped you want to check the player has aggroed
/// aggroReason - The reason returned which aggro condition has been flagged
/// lockOnTimer - The time the player has locked on aim to the ped
/// iBitFieldDontCheck - The dont check bit int
/// bHasAggroed - the check if the ped is already aggroed
/// projectileHearRange - The projectile hearing range
/// RETURNS:
/// returns a bool if the ped has just been aggroed
FUNC BOOL HAS_PLAYER_AGGROED_PED(PED_INDEX myPed, EAggro& aggroReason, INT& lockOnTimer, INT iBitFieldDontCheck = 0, BOOL bHasAggroed = FALSE, FLOAT projectileHearRange = 3.0, INT CarDamageSensitivity = 0)
FLOAT lockonDistance
FLOAT LocalProjectileHearRange
BOOL isLockedOn = FALSE
IF NOT IS_ENTITY_DEAD(myPed) AND NOT bHasAggroed
IF IS_PED_ON_FOOT(myPed)
LocalProjectileHearRange = projectileHearRange
ELSE
LocalProjectileHearRange = projectileHearRange+3.0
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(myPed) AND NOT bHasAggroed
VECTOR PlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR PedCoords = GET_ENTITY_COORDS(myPed)
FLOAT Distance = VDIST(PlayerCoords, PedCoords)
IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_Attacked))
// IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(myPed, PLAYER_PED_ID())
IF HAS_PLAYER_DAMAGED_PED(myPed, CarDamageSensitivity)
printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
printDebugString(" aggroReason = EAggro_Attacked\n")
aggroReason = EAggro_Attacked
SET_PED_AGGROED(myPed)
RETURN TRUE
ENDIF
ENDIF
IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_ShotNear))
IF LocalProjectileHearRange < 20
ENDIF
IF IS_BULLET_IN_AREA(PedCoords, projectileHearRange, TRUE)
printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
printDebugString(" aggroReason = EAggro_ShotNear\n")
aggroReason = EAggro_ShotNear
SET_PED_AGGROED(myPed)
RETURN TRUE
ENDIF
IF IS_PROJECTILE_IN_AREA((PedCoords-<<projectileHearRange/2, projectileHearRange/2, projectileHearRange/2>>), (PedCoords+<<projectileHearRange/2, projectileHearRange/2, projectileHearRange/2>>))
printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
printDebugString(" aggroReason = EAggro_ShotNear\n")
aggroReason = EAggro_ShotNear
SET_PED_AGGROED(myPed)
RETURN TRUE
ENDIF
ENDIF
IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_HostileOrEnemy))
lockonDistance = GET_LOCKON_DISTANCE_OF_CURRENT_PED_WEAPON(PLAYER_PED_ID())
IF lockonDistance < 0
lockonDistance = 25
ELIF lockonDistance > 25
lockonDistance = 25
ENDIF
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), myPed)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), myPed)
IF (Distance < lockonDistance)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(myPed,PLAYER_PED_ID())
// IF HAS_PED_CLEAR_LOS_TO_ENTITY_IN_FRONT(myPed,PLAYER_PED_ID()) //And is the ped aware of ped
printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
printDebugString(" aggro Ped knows player is pointing gun\n")
printDebugStringAndInt(" lockOnTimer = ", lockOnTimer)
printDebugString("\n")
printDebugStringAndInt(" time since not LockedOn = ", (GET_GAME_TIMER()-iTimeLastNotLockedOn))
printDebugString("\n")
isLockedOn = TRUE
IF GET_GAME_TIMER() > (iTimeLastNotLockedOn + lockOnTimer)
printDebugString(" aggroReason = EAggro_HostileOrEnemy\n")
aggroReason = EAggro_HostileOrEnemy
SET_PED_AGGROED(myPed)
RETURN TRUE
ENDIF
ENDIF
ELSE
isLockedOn = FALSE
ENDIF
ELSE
isLockedOn = FALSE
ENDIF
ENDIF
ENDIF
IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_Danger))
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
printDebugString(" aggroReason = EAggro_Danger\n")
aggroReason = EAggro_Danger
SET_PED_AGGROED(myPed)
RETURN TRUE
ENDIF
ENDIF
// IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_HeardShot))
// IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), myPed, <<18,18,18>>)
// IF IS_PED_SHOOTING(PLAYER_PED_ID()) // Will need to account for silenced weapons
// printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
// printDebugString(" aggroReason = EAggro_HeardShot\n")
// aggroReason = EAggro_HeardShot
// SET_PED_AGGROED(myPed)
// RETURN TRUE
// ENDIF
// ENDIF
// ENDIF
// IF NOT IS_BIT_SET(iBitFieldDontCheck, ENUM_TO_INT(EAggro_Shoved))
// IF IS_PED_RAGDOLL(myPed)
// IF IS_ENTITY_AT_ENTITY(myPed, PLAYER_PED_ID(), <<1.0, 1.0, 1.0>>)
// //IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), myPed)
// printDebugString("FUNC BOOL HAS_PLAYER_AGGROED_PED\n")
// printDebugString(" aggroReason = EAggro_Shoved\n")
// aggroReason = EAggro_Shoved
// SET_PED_AGGROED(myPed)
// RETURN TRUE
// ENDIF
// ENDIF
// ENDIF
ENDIF
ENDIF
IF NOT isLockedOn
iTimeLastNotLockedOn = GET_GAME_TIMER()
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_AGGROED_PEDS(PED_INDEX& MyPeds[], INT& agrroedIDX, EAggro& aggroReason, INT& lockOnTimer, INT iBitFieldDontCheck = 0, BOOL bHasAggroed = FALSE, FLOAT projectileHearRange = 2.5, INT CarDamageSensitivity = 0)
INT idx
projectileHearRange = projectileHearRange
IF NOT bHasAggroed
REPEAT COUNT_OF(MyPeds) idx
IF HAS_PLAYER_AGGROED_PED(MyPeds[idx], aggroReason, lockOnTimer, iBitFieldDontCheck, bHasAggroed, projectileHearRange, CarDamageSensitivity)
agrroedIDX = idx
RETURN TRUE
ENDIF
ENDREPEAT
ENDIF
RETURN FALSE
ENDFUNC