Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Epsilon/PostRC_Epsilon4.sc
T
2025-09-29 00:52:08 +02:00

199 lines
6.1 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.
// Includes
USING "rage_builtins.sch"
USING "globals.sch"
USING "player_ped_public.sch"
USING "dialogue_public.sch"
USING "RC_helper_functions.sch"
//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : postRC_Epsilon4.sc //
// AUTHOR : //
// DESCRIPTION : Handles Marnie and Jimmy's conversations as they //
// walk to their car after completing Eps 4 //
// //
//////////////////////////////////////////////////////////////////////////////////////////
ENUM MISSION_STAGE
MS_INIT,
MS_RUNNING,
MS_CLEANUP
ENDENUM
MISSION_STAGE mStage = MS_INIT
structPedsForConversation convStruct
INT iConvTimer
PED_INDEX pedMarnie
PED_INDEX pedJimmy
/// PURPOSE:
/// Initialises variables etc
PROC INIT()
CPRINTLN(DEBUG_MISSION, "Post Eps 4: Trying to grab peds now...")
INT cnt
INT i
PED_INDEX tmpArray[32]
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
cnt = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), tmpArray)
ENDIF
REPEAT cnt i
IF IS_ENTITY_ALIVE(tmpArray[i])
IF (GET_ENTITY_MODEL(tmpArray[i]) = GET_NPC_PED_MODEL(CHAR_JIMMY_BOSTON))
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Post Eps 4: - Jimmy get!")
#ENDIF
pedJimmy = tmpArray[i]
IF NOT IS_ENTITY_A_MISSION_ENTITY(pedJimmy)
SET_ENTITY_AS_MISSION_ENTITY(pedJimmy)
ENDIF
SET_PED_MONEY(pedJimmy, 0)
SET_PED_CAN_BE_TARGETTED(pedJimmy, FALSE)
SET_PED_NAME_DEBUG(pedJimmy, "POSTJIMMY")
SET_PED_RELATIONSHIP_GROUP_HASH(pedJimmy, RELGROUPHASH_PLAYER)
ADD_PED_FOR_DIALOGUE(ConvStruct, 5, pedJimmy, "JIMMYBOSTON", TRUE)
ENDIF
IF (GET_ENTITY_MODEL(tmpArray[i]) = GET_NPC_PED_MODEL(CHAR_MARNIE))
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Post Eps 4: - Marnie get!")
#ENDIF
pedMarnie = tmpArray[i]
IF NOT IS_ENTITY_A_MISSION_ENTITY(pedMarnie)
SET_ENTITY_AS_MISSION_ENTITY(pedMarnie)
ENDIF
SET_PED_MONEY(pedMarnie, 0)
SET_PED_CAN_BE_TARGETTED(pedMarnie, FALSE)
SET_PED_NAME_DEBUG(pedMarnie, "POSTMARNIE")
SET_PED_RELATIONSHIP_GROUP_HASH(pedMarnie, RELGROUPHASH_PLAYER)
ADD_PED_FOR_DIALOGUE(ConvStruct, 4, pedMarnie, "MARNIE", TRUE)
ENDIF
ENDIF
ENDREPEAT
mStage = MS_RUNNING
ENDPROC
PROC CHECK_PEDS_FOR_CONVERSATION()
IF IS_ENTITY_ALIVE(pedJimmy)
// If the player is <=3m from Jimmy, play one of his ambient lines, with an 8sec delay between them
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_PED_FLEEING(pedJimmy)
AND NOT IS_PED_RAGDOLL(pedJimmy)
AND NOT IS_PED_PRONE(pedJimmy)
AND NOT IS_PED_INJURED(pedJimmy)
AND NOT IS_PED_IN_ANY_VEHICLE(pedJimmy)
IF GET_DISTANCE_BETWEEN_ENTITIES(pedJimmy, PLAYER_PED_ID()) <= 2.3
IF (GET_GAME_TIMER() - iConvTimer) > 8000
IF CREATE_CONVERSATION(ConvStruct, "EPS4AUD", "EPS4_FOLLJ", CONV_PRIORITY_MEDIUM)
iConvTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(pedJimmy, PLAYER_PED_ID()) > 150.0
SAFE_DELETE_PED(pedJimmy) // Jimmy won't be alive after this, it'll set the bool to false the frame after
ENDIF
ELSE
SAFE_RELEASE_PED(pedJimmy) // In case he still exists but is dead - no point holding onto the ped index anymore
ENDIF
IF IS_ENTITY_ALIVE(pedMarnie)
// If the player is <=3m from Marnie, play one of his ambient lines, with an 8sec delay between them
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_PED_FLEEING(pedMarnie)
AND NOT IS_PED_RAGDOLL(pedMarnie)
AND NOT IS_PED_PRONE(pedMarnie)
AND NOT IS_PED_INJURED(pedMarnie)
AND NOT IS_PED_IN_ANY_VEHICLE(pedMarnie)
IF GET_DISTANCE_BETWEEN_ENTITIES(pedMarnie, PLAYER_PED_ID()) <= 2.7
IF (GET_GAME_TIMER() - iConvTimer) > 8000
IF CREATE_CONVERSATION(ConvStruct, "EPS4AUD", "EPS4_FOLLM", CONV_PRIORITY_MEDIUM)
iConvTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(pedMarnie, PLAYER_PED_ID()) > 150.0
SAFE_DELETE_PED(pedMarnie) // Marnie won't be alive after this, it'll set the bool to false the frame after
ENDIF
ELSE
SAFE_RELEASE_PED(pedMarnie) // In case he still exists but is dead - no point holding onto the ped index anymore
ENDIF
IF NOT IS_ENTITY_ALIVE(pedMarnie)
AND NOT IS_ENTITY_ALIVE(pedJimmy)
mStage = MS_CLEANUP
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Terminates ambient script after performing cleanup functions
PROC SCRIPT_CLEANUP()
CPRINTLN(DEBUG_MISSION, "POSTRC_EPS4.SC - SCRIPT CLEANUP")
REMOVE_PED_FOR_DIALOGUE(convStruct, 4) // "MARNIE"
REMOVE_PED_FOR_DIALOGUE(convStruct, 5) // "JIMMY"
CPRINTLN(DEBUG_MISSION, "POSTRC_EPS4.SC - TERMINATING AMBIENT SCRIPT")
TERMINATE_THIS_THREAD()
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT
CPRINTLN(DEBUG_MISSION, "POSTRC_EPS4.SC - INIT AMBIENT SCRIPT")
// Default callbacks
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU)
CPRINTLN(DEBUG_MISSION, "POSTRC_EPS4.SC - DEFAULT CLEANUP")
SCRIPT_CLEANUP()
ENDIF
// Main loop
WHILE (TRUE)
WAIT(0)
// Terminate if we are not Michael
IF SHOULD_POST_RC_SCRIPT_TERMINATE(CHAR_MICHAEL)
SCRIPT_CLEANUP()
ELSE
SWITCH mStage
CASE MS_INIT
INIT()
BREAK
CASE MS_RUNNING
CHECK_PEDS_FOR_CONVERSATION()
BREAK
CASE MS_CLEANUP
SCRIPT_CLEANUP()
BREAK
ENDSWITCH
ENDIF
ENDWHILE
ENDSCRIPT