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

391 lines
11 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : postRC_Barry1and2.sc
// AUTHOR : Aaron Gandaa
// DESCRIPTION : Clean up For Barry 1 and 2
//
// *****************************************************************************************
// *****************************************************************************************
//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 "rgeneral_include.sch"
USING "RC_Helper_Functions.sch"
//----------------------
// VARIABLES
//----------------------
OBJECT_INDEX chairObject
OBJECT_INDEX deskObject
OBJECT_INDEX signObject
PED_INDEX barryPed
STRING sBarryAnimDict = "RCMBarryLeadInOut"
STRING sBarryAnimLoop = "idle"
INT iBarryDialogueTimer = 0
INT iNumber = 0
INT iDisableControlTimer
VECTOR vPos = <<189.5964, -956.0344, 29.5771>>
VECTOR vBarryPos = <<190.2424, -956.3790, 28.63>>
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID mDebugWidget
BOOL bMissionFlagTest = FALSE
#ENDIF
//----------------------
// FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
PROC CREATE_DEBUG_WIDGETS()
mDebugWidget = START_WIDGET_GROUP("PostRC_Barry1And2")
ADD_WIDGET_BOOL("Mission Flag Test", bMissionFlagTest)
STOP_WIDGET_GROUP()
ENDPROC
PROC UPDATE_DEBUG_WIDGETS()
IF (bMissionFlagTest)
SET_MISSION_FLAG(TRUE)
bMissionFlagTest = FALSE
ENDIF
ENDPROC
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(mDebugWidget)
DELETE_WIDGET_GROUP(mDebugWidget)
ENDIF
ENDPROC
#ENDIF
PROC SCRIPT_CLEANUP(BOOL bDelete=FALSE)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - SCRIPT_CLEANUP")
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
/*
IF IS_ENTITY_ALIVE(barryPed)
STOP_PED_SPEAKING(barryPed, TRUE)
ENDIF
*/
IF bDelete
SAFE_DELETE_PED(barryPed)
ELSE
SAFE_RELEASE_PED(barryPed, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(deskObject)
FREEZE_ENTITY_POSITION(deskObject, FALSE)
ENDIF
IF IS_ENTITY_ALIVE(chairObject)
FREEZE_ENTITY_POSITION(chairObject, FALSE)
ENDIF
IF bDelete
SAFE_DELETE_OBJECT(chairObject)
SAFE_DELETE_OBJECT(deskObject)
SAFE_DELETE_OBJECT(signObject)
ELSE
SAFE_RELEASE_OBJECT(chairObject)
SAFE_RELEASE_OBJECT(deskObject)
SAFE_RELEASE_OBJECT(signObject)
ENDIF
REMOVE_ANIM_DICT(sBarryAnimDict)
CLEAR_ADDITIONAL_TEXT(AMBIENT_DIALOGUE_TEXT_SLOT, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
PROC SETUP_BARRY()
IF IS_ENTITY_ALIVE(barryPed)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - SETUP BARRY!")
IF NOT IS_ENTITY_A_MISSION_ENTITY(barryPed)
SET_ENTITY_AS_MISSION_ENTITY(barryPed)
ENDIF
SET_PED_PROP_INDEX(barryPed, ANCHOR_EYES, 0) //Glasses prop.
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(barryPed, TRUE)
SET_PED_MONEY(barryPed, 0)
SET_PED_CAN_BE_TARGETTED(barryPed, FALSE)
SET_PED_NAME_DEBUG(barryPed, "POSTBARRY")
SET_PED_RELATIONSHIP_GROUP_HASH(barryPed, RELGROUPHASH_PLAYER)
SET_ENTITY_COLLISION(barryPed, FALSE)
FREEZE_ENTITY_POSITION(barryPed, TRUE)
SET_ENTITY_COORDS(barryPed, vBarryPos, TRUE)
SET_ENTITY_HEADING(barryPed, RAD_TO_DEG(1.12))
FREEZE_ENTITY_POSITION(barryPed, TRUE)
TASK_PLAY_ANIM(barryPed, sBarryAnimDict, sBarryAnimLoop, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
TASK_LOOK_AT_ENTITY(barryPed, PLAYER_PED_ID(), -1)
ENDIF
ENDPROC
// mothballing - we'll just create him
//FUNC BOOL GET_BARRY_PED()
// INT cnt
// INT i
// PED_INDEX tmpArray[32]
//
// cnt = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), tmpArray)
//
// REPEAT cnt i
// IF IS_ENTITY_ALIVE(tmpArray[i])
// CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - PED FOUND!")
// IF (GET_ENTITY_MODEL(tmpArray[i]) = GET_NPC_PED_MODEL(CHAR_BARRY))
//
// CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - BARRY GET!")
// barryPed = tmpArray[i]
//
// RETURN TRUE
// ENDIF
// ENDIF
// ENDREPEAT
//
// RETURN FALSE
//ENDFUNC
PROC SETUP_PROPS()
// get desk (should be left over from outro cutscene)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<190.56, -956.40, 28.63>>, 20.0, PROP_PROTEST_TABLE_01)
deskObject = GET_CLOSEST_OBJECT_OF_TYPE(<<190.56, -956.40, 28.63>>, 20.0, PROP_PROTEST_TABLE_01, FALSE)
IF IS_ENTITY_OK(deskObject)
IF NOT IS_ENTITY_A_MISSION_ENTITY(deskObject)
SET_ENTITY_AS_MISSION_ENTITY(deskObject)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - DESK GET!")
ENDIF
vPos = <<189.5964, -956.0344, 29.540>>
SET_ENTITY_COORDS(deskObject, vPos)
SET_ENTITY_HEADING(deskObject, RAD_TO_DEG(-2.01))
FREEZE_ENTITY_POSITION(deskObject, TRUE)
ENDIF
ENDIF
// get chair (should be left over from outro cutscene)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<190.56, -956.40, 28.63>>, 20.0, PROP_CHAIR_08)
chairObject = GET_CLOSEST_OBJECT_OF_TYPE(<<190.56, -956.40, 28.63>>, 20.0, PROP_CHAIR_08, FALSE)
IF IS_ENTITY_OK(chairObject)
IF NOT IS_ENTITY_A_MISSION_ENTITY(chairObject)
SET_ENTITY_AS_MISSION_ENTITY(chairObject)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - CHAIR GET!")
ENDIF
vPos = <<190.2574, -956.3513, 29.621>>
SET_ENTITY_COORDS(chairObject, vPos)
SET_ENTITY_HEADING(chairObject, RAD_TO_DEG(-1.68))
FREEZE_ENTITY_POSITION(chairObject, TRUE)
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - CREATING CHAIR!")
vPos = <<190.2574, -956.3513, 29.621>>
CREATE_SCENE_PROP(chairObject, PROP_CHAIR_08, vPos, RAD_TO_DEG(-1.68))
SET_ENTITY_COORDS(chairObject, vPos)
SET_ENTITY_HEADING(chairObject, RAD_TO_DEG(-1.68))
FREEZE_ENTITY_POSITION(chairObject, TRUE)
ENDIF
// get standing sign
vPos = <<192.4462, -953.5946, 29.0919>>
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vPos, 25.0, Prop_Protest_Sign_01)
signObject = GET_CLOSEST_OBJECT_OF_TYPE(vPos, 25.0, Prop_Protest_Sign_01, FALSE)
IF IS_ENTITY_OK(signObject)
IF NOT IS_ENTITY_A_MISSION_ENTITY(signObject)
SET_ENTITY_AS_MISSION_ENTITY(signObject)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - SIGN GET!")
ENDIF
// Correct height if moving existing object
vPos.z = 29.603
SET_ENTITY_COORDS(signObject, vPos)
SET_ENTITY_HEADING(signObject, 23.45)
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - CREATING SIGN!")
CREATE_SCENE_PROP(signObject, Prop_Protest_Sign_01, vPos, 23.45)
SET_ENTITY_COORDS(signObject, vPos)
SET_ENTITY_HEADING(signObject, 23.45)
ENDIF
ENDPROC
FUNC STRING GET_NEXT_BARRY_DIALOGUE()
STRING DialogueName
// Get dialogue label
SWITCH iNumber
CASE 0
DialogueName = "BARY1_RCMLI1"
BREAK
CASE 1
DialogueName = "BARY1_RCMLI2"
BREAK
CASE 2
DialogueName = "BARY1_RCMLI3"
BREAK
CASE 3
DialogueName = "BARY1_RCMLI4"
BREAK
CASE 4
DialogueName = "BARY1_RCMLI5"
BREAK
ENDSWITCH
// increase count for next time
iNumber ++
IF iNumber > 4
iNumber = 0
ENDIF
RETURN DialogueName
ENDFUNC
/// PURPOSE: Play ambient dialogue from the RC ped every so often
FUNC BOOL PLAY_POST_BARRY_AMBIENT_DIALOGUE()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(barryPed)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (GET_GAME_TIMER() > iBarryDialogueTimer)
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), barryPed) < 20.0
AND NOT GET_MISSION_FLAG()
structPedsForConversation s_conversation
ADD_PED_FOR_DIALOGUE(s_conversation, 0, barryPed, "BARRY")
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(s_conversation, "BARY1AU", GET_NEXT_BARRY_DIALOGUE(), CONV_PRIORITY_MEDIUM)
iBarryDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 18000)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// let barry and props get exploded
PROC HANDLE_EXPLOSIONS()
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vBarryPos, 5.0)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - Explosion detected!")
IF IS_ENTITY_ALIVE(barryPed)
FREEZE_ENTITY_POSITION(barryPed, FALSE)
APPLY_DAMAGE_TO_PED(barryPed, 1000, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(deskObject)
FREEZE_ENTITY_POSITION(deskObject, FALSE)
ENDIF
IF IS_ENTITY_ALIVE(chairObject)
FREEZE_ENTITY_POSITION(chairObject, FALSE)
ENDIF
ENDIF
ENDPROC
SCRIPT
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - INIT AMBIENT SCRIPT")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
IF IS_ENTITY_OK(PLAYER_PED_ID())
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) != 0
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - Resetting wanted level to zero")
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
ENDIF
ENDIF
// Default callbacks
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_REPEAT_PLAY)
SCRIPT_CLEANUP()
ENDIF
REQUEST_ANIM_DICT(sBarryAnimDict)
REQUEST_ADDITIONAL_TEXT("BARY1", AMBIENT_DIALOGUE_TEXT_SLOT)
WHILE NOT HAS_ANIM_DICT_LOADED(sBarryAnimDict)
OR NOT HAS_ADDITIONAL_TEXT_LOADED(AMBIENT_DIALOGUE_TEXT_SLOT)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - Waiting on loads...")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - disable look behind, post load")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
IS_ENTITY_OK(PLAYER_PED_ID())
// allow time for mission passed graphic
iBarryDialogueTimer = GET_GAME_TIMER() + 13000
// start on a random line
iNumber = GET_RANDOM_INT_IN_RANGE(0,5)
SETUP_PROPS()
#IF IS_DEBUG_BUILD
CREATE_DEBUG_WIDGETS()
#ENDIF
WHILE NOT CREATE_NPC_PED_ON_FOOT(barryPed, CHAR_BARRY, vBarryPos, RAD_TO_DEG(1.12), FALSE)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - CREATING BARRY!")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - disable look behind, post barry creation")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
SETUP_BARRY()
iDisableControlTimer = GET_GAME_TIMER() + 1000
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - disable look behind, post barry setup")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
// Main loop
WHILE (TRUE)
IS_ENTITY_OK(PLAYER_PED_ID())
IF GET_GAME_TIMER() < iDisableControlTimer
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - disable look behind, waiting for timer...")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
ENDIF
HANDLE_EXPLOSIONS()
IF NOT IS_ENTITY_OK(barryPed)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - BARRY IS PROBABLY DEAD - CLEANUP")
SCRIPT_CLEANUP()
ENDIF
IF PLAY_POST_BARRY_AMBIENT_DIALOGUE()
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2: Shhh... Barry is saying something important...")
ENDIF
IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vBarryPos) > 70.0)
CPRINTLN(DEBUG_AMBIENT, "POSTRC_BARRY1AND2 - BARRY IS FAR ENOUGH - QUIT SCRIPT")
SAFE_RELEASE_OBJECT(chairObject)
SAFE_RELEASE_OBJECT(deskObject)
SAFE_RELEASE_OBJECT(signObject)
SCRIPT_CLEANUP()
ENDIF
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_H)
SET_MISSION_FLAG(TRUE)
ENDIF
UPDATE_DEBUG_WIDGETS()
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT