///private header for family task control scripts /// alwyn.roberts@rockstarnorth.com /// USING "timer_public.sch" USING "script_ped.sch" USING "help_at_location.sch" USING "context_control_public.sch" USING "familyAnim_Private.sch" USING "familyTask_animArray.sch" USING "familyTask_animDialogue.sch" // ******************************************************************************************* // FAMILY TASKS PRIVATE FUNCTIONS // ******************************************************************************************* FUNC BOOL PRIVATE_Update_Family_Anim(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent) TEXT_LABEL_63 tFamilyAnimDict TEXT_LABEL_63 tFamilyAnimClip ANIMATION_FLAGS eFamilyAnimFlag enumFamilyAnimProgress eFamilyAnimProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimDict, tFamilyAnimClip, eFamilyAnimFlag, eFamilyAnimProgress) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS animHudColour = HUD_COLOUR_PINK #ENDIF REQUEST_ANIM_DICT(tFamilyAnimDict) IF NOT HAS_ANIM_DICT_LOADED(tFamilyAnimDict) REQUEST_ANIM_DICT(tFamilyAnimDict) #IF IS_DEBUG_BUILD str = ("request: ") str += ("\"") str += (tFamilyAnimDict) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, animHudColour) #ENDIF RETURN FALSE ELSE IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimClip) TASK_PLAY_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, eFamilyAnimFlag) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) #IF IS_DEBUG_BUILD str = ("TASK_PLAY_ANIM \"") // str += (tFamilyAnimDict) // str += ("\", \"") str += (tFamilyAnimClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, animHudColour) #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD str = ("anim \"") // str += (tFamilyAnimDict) // str += ("\", \"") str += (tFamilyAnimClip) str += ("\" ") str += GET_STRING_FROM_FLOAT(GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimClip)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, animHudColour) #ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_AnimAdvanced(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, FLOAT blendInDelta = NORMAL_BLEND_IN, FLOAT blendOutDelta = NORMAL_BLEND_OUT) TEXT_LABEL_63 tFamilyAnimAdvancedDict TEXT_LABEL_63 tFamilyAnimAdvancedClip ANIMATION_FLAGS eFamilyAnimAdvancedFlag enumFamilyAnimProgress eFamilyAnimAdvancedProgress VECTOR vAnimAdvancedOffset FLOAT fAnimAdvancedHead IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimAdvancedDict, tFamilyAnimAdvancedClip, eFamilyAnimAdvancedFlag, eFamilyAnimAdvancedProgress) AND PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vAnimAdvancedOffset, fAnimAdvancedHead) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS AnimAdvancedHudColour = HUD_COLOUR_PINK #ENDIF REQUEST_ANIM_DICT(tFamilyAnimAdvancedDict) IF NOT HAS_ANIM_DICT_LOADED(tFamilyAnimAdvancedDict) REQUEST_ANIM_DICT(tFamilyAnimAdvancedDict) #IF IS_DEBUG_BUILD str = ("request: ") str += ("\"") str += (tFamilyAnimAdvancedDict) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, AnimAdvancedHudColour) #ENDIF RETURN FALSE ELSE IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimAdvancedDict, tFamilyAnimAdvancedClip) IK_CONTROL_FLAGS ikFlags PRIVATE_Get_FamilyMember_Anim_Ik_Control_Flags(eFamilyMember, eFamilyEvent, ikFlags) IF IS_BITMASK_ENUM_AS_ENUM_SET(eFamilyAnimAdvancedFlag, AF_USE_KINEMATIC_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF TASK_PLAY_ANIM_ADVANCED(PedIndex, tFamilyAnimAdvancedDict, tFamilyAnimAdvancedClip, vFamilyScenePos+vAnimAdvancedOffset, <<0,0,fFamilySceneHead+fAnimAdvancedHead>>, blendInDelta, blendOutDelta, -1, eFamilyAnimAdvancedFlag, 0, DEFAULT, ikFlags) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) #IF IS_DEBUG_BUILD str = ("TASK_PLAY_AnimAdvanced \"") str += (tFamilyAnimAdvancedClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, AnimAdvancedHudColour) #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD str = ("AnimAdvanced \"") str += (tFamilyAnimAdvancedClip) str += ("\" ") str += GET_STRING_FROM_FLOAT(GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimAdvancedDict, tFamilyAnimAdvancedClip)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, AnimAdvancedHudColour) #ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_SynchScene(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, INT &iScene, bool loop, bool holdLastFrame, TEXT_LABEL_63 &tAnimDict, TEXT_LABEL_63 &tAnimClip, FLOAT blendInDelta = NORMAL_BLEND_IN, FLOAT blendOutDelta = NORMAL_BLEND_OUT) TEXT_LABEL_63 tFamilySynchSceneDict TEXT_LABEL_63 tFamilySynchSceneClip ANIMATION_FLAGS eFamilySynchSceneFlag enumFamilyAnimProgress eFamilySynchSceneProgress VECTOR vSynchSceneOffset FLOAT fSynchSceneHead IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilySynchSceneDict, tFamilySynchSceneClip, eFamilySynchSceneFlag, eFamilySynchSceneProgress) AND PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS SynchSceneHudColour = HUD_COLOUR_PINK #ENDIF REQUEST_ANIM_DICT(tFamilySynchSceneDict) IF NOT HAS_ANIM_DICT_LOADED(tFamilySynchSceneDict) REQUEST_ANIM_DICT(tFamilySynchSceneDict) #IF IS_DEBUG_BUILD str = ("request: ") str += ("\"") INT iFamilySynchSceneDictLength iFamilySynchSceneDictLength = GET_LENGTH_OF_LITERAL_STRING(tFamilySynchSceneDict) IF iFamilySynchSceneDictLength >= 10 str += GET_STRING_FROM_STRING(tFamilySynchSceneDict, iFamilySynchSceneDictLength - 10, iFamilySynchSceneDictLength) ELSE str += tFamilySynchSceneDict ENDIF str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF tAnimDict = "" tAnimClip = "" RETURN FALSE ELSE SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT RAGDOLL_BLOCKING_FLAGS ragdollFlags = RBF_PLAYER_IMPACT FLOAT moverBlendInDelta = INSTANT_BLEND_IN IK_CONTROL_FLAGS ikFlags = AIK_NONE PRIVATE_Get_FamilyMember_Anim_Ik_Control_Flags(eFamilyMember, eFamilyEvent, ikFlags) IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) iScene = CREATE_SYNCHRONIZED_SCENE(vFamilyScenePos+vSynchSceneOffset, <<0,0,fFamilySceneHead+fSynchSceneHead>>) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, loop) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, holdLastFrame) SET_SYNCHRONIZED_SCENE_RATE(iScene, 1.0) IF IS_BITMASK_ENUM_AS_ENUM_SET(ragdollFlags, SYNCED_SCENE_USE_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tFamilySynchSceneDict, tFamilySynchSceneClip, blendInDelta, blendOutDelta, flags, ragdollFlags, moverBlendInDelta, ikFlags) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) #IF IS_DEBUG_BUILD str = ("creating SynchScene \"") INT iFamilySynchSceneDictLength iFamilySynchSceneDictLength = GET_LENGTH_OF_LITERAL_STRING(tFamilySynchSceneClip) IF iFamilySynchSceneDictLength >= 10 str += GET_STRING_FROM_STRING(tFamilySynchSceneClip, iFamilySynchSceneDictLength - 10, iFamilySynchSceneDictLength) ELSE str += tFamilySynchSceneClip ENDIF str += ("\" ") str += (iScene) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF tAnimDict = tFamilySynchSceneDict tAnimClip = tFamilySynchSceneClip RETURN FALSE ENDIF IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilySynchSceneDict, tFamilySynchSceneClip, ANIM_SYNCED_SCENE) IF IS_BITMASK_ENUM_AS_ENUM_SET(ragdollFlags, SYNCED_SCENE_USE_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tFamilySynchSceneDict, tFamilySynchSceneClip, blendInDelta, blendOutDelta, flags, ragdollFlags, moverBlendInDelta, ikFlags) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, loop) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, holdLastFrame) #IF IS_DEBUG_BUILD str = ("tasking SynchScene \"") INT iTaunterAnimOutLength iTaunterAnimOutLength = GET_LENGTH_OF_LITERAL_STRING(tFamilySynchSceneDict) IF iTaunterAnimOutLength >= 10 str += GET_STRING_FROM_STRING(tFamilySynchSceneDict, iTaunterAnimOutLength - 10, iTaunterAnimOutLength) ELSE str += tFamilySynchSceneDict ENDIF str += ("/") iTaunterAnimOutLength = GET_LENGTH_OF_LITERAL_STRING(tFamilySynchSceneClip) IF iTaunterAnimOutLength >= 15 str += GET_STRING_FROM_STRING(tFamilySynchSceneClip, iTaunterAnimOutLength - 15, iTaunterAnimOutLength) ELSE str += tFamilySynchSceneClip ENDIF str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF tAnimDict = tFamilySynchSceneDict tAnimClip = tFamilySynchSceneClip RETURN FALSE ENDIF #IF IS_DEBUG_BUILD str = ("SynchScene \"") str += (tFamilySynchSceneDict) str += ("\" id:") str += iScene DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) str = (tFamilySynchSceneClip) str += (":") str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, SynchSceneHudColour) #ENDIF RETURN TRUE ENDIF ENDIF tAnimDict = "" tAnimClip = "" RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_SynchSceneMatch(PED_INDEX PedIndex, //enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, // VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, INT &iScene, TEXT_LABEL_63 tAnimDict, TEXT_LABEL_63 tAnimClip, STRING sAnimTail, STRING sMatchTail) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS SynchSceneHudColour = HUD_COLOUR_PINK #ENDIF REQUEST_ANIM_DICT(tAnimDict) IF NOT HAS_ANIM_DICT_LOADED(tAnimDict) REQUEST_ANIM_DICT(tAnimDict) #IF IS_DEBUG_BUILD str = ("request: ") str += ("\"") str += (tAnimDict) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF RETURN FALSE ELSE FLOAT blendInDelta = NORMAL_BLEND_IN FLOAT blendOutDelta = NORMAL_BLEND_OUT SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_USE_PHYSICS RAGDOLL_BLOCKING_FLAGS ragdollFlags = RBF_PLAYER_IMPACT FLOAT moverBlendInDelta = INSTANT_BLEND_IN IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) #IF IS_DEBUG_BUILD str = ("synch scene not running...") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF RETURN FALSE ENDIF IF IS_STRING_NULL_OR_EMPTY(sAnimTail) #IF IS_DEBUG_BUILD str = ("sAnimTail is null or empty") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF RETURN FALSE ENDIF INT iMatchClip_length = GET_LENGTH_OF_LITERAL_STRING(tAnimClip) INT iMatchTail_length = GET_LENGTH_OF_LITERAL_STRING(sAnimTail) INT iMatchBody_length = iMatchClip_length - iMatchTail_length TEXT_LABEL_63 tMatchBody = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(tAnimClip, 0, iMatchBody_length) TEXT_LABEL_63 tMatchClip = tMatchBody tMatchClip += sMatchTail IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tAnimDict, tMatchClip, ANIM_SYNCED_SCENE) OR GET_SYNCHRONIZED_SCENE_PHASE(iScene) <= 0.001 IF IS_BITMASK_ENUM_AS_ENUM_SET(ragdollFlags, SYNCED_SCENE_USE_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tAnimDict, tMatchClip, blendInDelta, blendOutDelta, flags, ragdollFlags, moverBlendInDelta) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) #IF IS_DEBUG_BUILD str = ("tasking SynchSceneMatch \"") str += (tMatchClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) #ENDIF CPRINTLN(DEBUG_FAMILY, "matchup synch scene: \"", tAnimDict, "/", tAnimClip, "\", \"", sAnimTail, "\" - \"", tMatchBody, "\" + \"", sMatchTail, "\" = \"", tMatchClip, "\"") RETURN FALSE ENDIF #IF IS_DEBUG_BUILD str = ("SynchScene \"") str += (tAnimDict) str += ("\" id:") str += iScene DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, SynchSceneHudColour) str = (tMatchClip) str += (":") str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, SynchSceneHudColour) #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Scenario(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, INT &iScenarioCount) TEXT_LABEL_63 tFamilyScenarioDictNULL TEXT_LABEL_63 tFamilyScenarioClip ANIMATION_FLAGS eFamilyScenarioFlag enumFamilyAnimProgress eFamilyScenarioProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyScenarioDictNULL, tFamilyScenarioClip, eFamilyScenarioFlag, eFamilyScenarioProgress) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS scenarioHudColour = HUD_COLOUR_PINK #ENDIF IF NOT IS_SCENARIO_TYPE_ENABLED(tFamilyScenarioClip) SET_SCENARIO_TYPE_ENABLED(tFamilyScenarioClip, TRUE) #IF IS_DEBUG_BUILD str = ("enable: ") str += ("\"") str += (tFamilyScenarioClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, scenarioHudColour) #ENDIF RETURN FALSE ELSE IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_START_SCENARIO_IN_PLACE) <> PERFORMING_TASK) IF (iScenarioCount > 0) iScenarioCount = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_wander_family_event) RETURN FALSE ENDIF TASK_START_SCENARIO_IN_PLACE(PedIndex, tFamilyScenarioClip) iScenarioCount++ IF IS_BITMASK_ENUM_AS_ENUM_SET(eFamilyScenarioFlag, AF_USE_KINEMATIC_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF #IF IS_DEBUG_BUILD str = ("TASK_START_SCENARIO_IN_PLACE \"") // str += (tFamilyScenarioDict) // str += ("\", \"") str += (tFamilyScenarioClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, scenarioHudColour) #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD str = ("scenario \"") // str += (tFamilyScenarioDict) // str += ("\", \"") str += (tFamilyScenarioClip) str += ("\" count:") str += (iScenarioCount) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, scenarioHudColour) #ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_ON_PHONE(PED_INDEX PedIndex) //, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent) // TEXT_LABEL_63 tFamilyON_PHONEDictNULL // TEXT_LABEL_63 tFamilyON_PHONEClip // // ANIMATION_FLAGS eFamilyON_PHONEFlag // enumFamilyAnimProgress eFamilyON_PHONEProgress // // IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, // tFamilyON_PHONEDictNULL, tFamilyON_PHONEClip, eFamilyON_PHONEFlag, eFamilyON_PHONEProgress) // #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS ON_PHONEHudColour = HUD_COLOUR_PINK #ENDIF // // IF NOT IS_ON_PHONE_TYPE_ENABLED(tFamilyON_PHONEClip) // SET_ON_PHONE_TYPE_ENABLED(tFamilyON_PHONEClip, TRUE) // // #IF IS_DEBUG_BUILD // str = ("enable: ") // str += ("\"") // str += (tFamilyON_PHONEClip) // str += ("\"") // // DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, ON_PHONEHudColour) // #ENDIF // // RETURN FALSE // ELSE IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_USE_MOBILE_PHONE) <> PERFORMING_TASK) TASK_USE_MOBILE_PHONE(PedIndex, TRUE) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CONFIG_FLAG(PedIndex, PCF_UseKinematicModeWhenStationary, TRUE) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) #IF IS_DEBUG_BUILD str = ("TASK_USE_MOBILE_PHONE \"") // str += (tFamilyON_PHONEDict) // str += ("\", \"") // str += (tFamilyON_PHONEClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, ON_PHONEHudColour) #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD str = ("ON_PHONE \"") // str += (tFamilyON_PHONEDict) // str += ("\", \"") // str += (tFamilyON_PHONEClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, ON_PHONEHudColour) #ENDIF RETURN TRUE // ENDIF // ENDIF // // RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Is_Family_Member_Ready_For_Driving(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VEHICLE_INDEX vehicleIndex, AUTOMATIC_DOOR_ENUM eDoor, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, VEHICLE_SEAT seat = VS_DRIVER) IF NOT IS_BIT_SET(g_sAutoDoorData[eDoor].settingsBitset, BIT_AUTODOOR_ALWAYS_OPEN) FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(eDoor, TRUE) CLEAR_BIT(g_sAutoDoorData[ENUM_TO_INT(eDoor)].settingsBitset, BIT_AUTODOOR_OPEN_ON_WANTED) RETURN FALSE ELSE ENDIF //entering vehicle, must be ready for driving! IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) = PERFORMING_TASK) RETURN TRUE ENDIF IF NOT IS_VEHICLE_SEAT_FREE(vehicleIndex, seat) IF (GET_PED_IN_VEHICLE_SEAT(vehicleIndex, seat) <> PedIndex) RETURN FALSE ENDIF ENDIF IF (eFamilyMember = FM_MICHAEL_WIFE) VECTOR vInitOffset FLOAT fInitHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vInitOffset, fInitHead) VECTOR VecCentre = vFamilyScenePos+vInitOffset VECTOR VecOffset = <<0,0,0>> VECTOR VecBounds = <<12,12,2>> FLOAT fAngle = fFamilySceneHead+fInitHead FLOAT fOffset = 9.0 IF eFamilyEvent = FE_M_WIFE_leaving_in_car VecOffset = <<-0.4,-2.7,0.5>> VecBounds = <<3.0,5.0,2.0>>+<<0.5,0.5,0>> fOffset = 80.000 ENDIF // START_WIDGET_GROUP("PRIVATE_Is_Family_Member_Ready_For_Driving") // ADD_WIDGET_VECTOR_SLIDER("VecCentre", VecCentre, -4000.0, 4000.0, 0.0) // ADD_WIDGET_VECTOR_SLIDER("VecOffset", VecOffset, -10.0, 10.0, 0.1) // ADD_WIDGET_VECTOR_SLIDER("VecBounds", VecBounds, 0.0, 20.0, 0.5) // ADD_WIDGET_FLOAT_SLIDER("fAngle", fAngle, 0.0, 360.0, 0.0) // ADD_WIDGET_FLOAT_SLIDER("fOffset", fOffset, 0.0, 360.0, 1.0) // STOP_WIDGET_GROUP() // // WHILE TRUE // IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), // VecCentre+VecOffset, VecBounds, fAngle+fOffset) // // IF IS_KEYBOARD_KEY_JUST_RELEASED(KEY_C) // // SAVE_NEWLINE_TO_DEBUG_FILE() // SAVE_STRING_TO_DEBUG_FILE(" IF eFamilyEvent = FE_X_")SAVE_STRING_TO_DEBUG_FILE(Get_String_From_FamilyEvent(eFamilyEvent))SAVE_NEWLINE_TO_DEBUG_FILE() // SAVE_STRING_TO_DEBUG_FILE(" VecOffset = ")SAVE_VECTOR_TO_DEBUG_FILE(VecOffset)SAVE_NEWLINE_TO_DEBUG_FILE() // SAVE_STRING_TO_DEBUG_FILE(" VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() // SAVE_STRING_TO_DEBUG_FILE(" fOffset = ")SAVE_FLOAT_TO_DEBUG_FILE(fOffset)SAVE_NEWLINE_TO_DEBUG_FILE() // SAVE_NEWLINE_TO_DEBUG_FILE() // // ENDIF // // WAIT(0) // ENDWHILE // IF NOT IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), VecCentre+VecOffset, VecBounds, fAngle+fOffset) RETURN FALSE ENDIF ENDIF RETURN TRUE ELIF ((eFamilyMember = FM_FRANKLIN_LAMAR) OR (eFamilyMember = FM_FRANKLIN_STRETCH)) RETURN TRUE ELSE IF eFamilyEvent = FE_M7_SON_coming_back_from_a_bike_ride VECTOR vInitOffset FLOAT fInitHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vInitOffset, fInitHead) VECTOR VecCentre = vFamilyScenePos+vInitOffset VECTOR VecOffset1 = <<30.0, 25.0, 6.9>>, VecOffset2 = <<5.0, 0.0, 0.0>> VECTOR VecBounds1 = <<24.0, 30.0, 10.0>>, VecBounds2 = <<45.0,36.0,0.0>> FLOAT fAngle = fFamilySceneHead+fInitHead FLOAT fOffset = 6.0000 /* START_WIDGET_GROUP("PRIVATE_Is_Family_Member_Ready_For_Driving") ADD_WIDGET_VECTOR_SLIDER("VecCentre", VecCentre, -4000.0, 4000.0, 0.0) ADD_WIDGET_STRING("Locate 1") ADD_WIDGET_VECTOR_SLIDER("VecOffset1", VecOffset1, -100.0, 100.0, 0.1) ADD_WIDGET_VECTOR_SLIDER("VecBounds1", VecBounds1, 0.0, 50.0, 0.5) ADD_WIDGET_STRING("Locate 2") ADD_WIDGET_VECTOR_SLIDER("VecOffset2", VecOffset2, -100.0, 100.0, 0.1) ADD_WIDGET_VECTOR_SLIDER("VecBounds2", VecBounds2, 0.0, 50.0, 0.5) ADD_WIDGET_STRING("Angle") ADD_WIDGET_FLOAT_SLIDER("fAngle", fAngle, 0.0, 360.0, 0.0) ADD_WIDGET_FLOAT_SLIDER("fOffset", fOffset, 0.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), VecCentre+VecOffset1, VecBounds1, fAngle+fOffset) IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), VecCentre+VecOffset2, VecBounds2, fAngle+fOffset) IF IS_KEYBOARD_KEY_JUST_RELEASED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" IF eFamilyEvent = FE_X_")SAVE_STRING_TO_DEBUG_FILE(Get_String_From_FamilyEvent(eFamilyEvent))SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" VecOffset1 = ")SAVE_VECTOR_TO_DEBUG_FILE(VecOffset1)SAVE_STRING_TO_DEBUG_FILE(", VecOffset2 = ")SAVE_VECTOR_TO_DEBUG_FILE(VecOffset2)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" VecBounds1 = ")SAVE_VECTOR_TO_DEBUG_FILE(VecBounds1)SAVE_STRING_TO_DEBUG_FILE(", VecBounds2 = ")SAVE_VECTOR_TO_DEBUG_FILE(VecBounds2)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" fOffset = ")SAVE_FLOAT_TO_DEBUG_FILE(fOffset)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() ENDIF WAIT(0) ENDWHILE*/ // IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), VecCentre+VecOffset1, VecBounds1, fAngle+fOffset) OR IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), VecCentre+VecOffset2, VecBounds2, fAngle+fOffset) RETURN TRUE ENDIF ENDIF ELSE IF NOT IS_ENTITY_ON_SCREEN(PedIndex) RETURN FALSE ENDIF ENDIF // FLOAT fDistFromPlayer = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) IF fDistFromPlayer > (15.0*15.0) RETURN FALSE ENDIF RETURN TRUE ENDIF ENDFUNC FUNC BOOL PRIVATE_Is_Family_Member_Ready_For_DriveWander(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, VECTOR VehCoors, VECTOR ExitCoors, TEXT_LABEL_31 &tRecordingName) //already wandering, must be ready for a wander! IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) = PERFORMING_TASK) RETURN TRUE ENDIF CONST_FLOAT fReachedExitRadius 2.0 FLOAT fExitMag, fExitRad SWITCH eFamilyMember CASE FM_MICHAEL_WIFE fExitMag = VMAG(ExitCoors-VehCoors) fExitRad = fExitMag-fReachedExitRadius #IF IS_DEBUG_BUILD DrawDebugFamilySphere(VehCoors, fExitRad, HUD_COLOUR_BLUELIGHT, 0.25) DrawDebugFamilySphere(ExitCoors, fReachedExitRadius, HUD_COLOUR_RED, 1.0) #ENDIF IF VDIST2(VehCoors, GET_ENTITY_COORDS(PedIndex)) > ((fExitRad)*(fExitRad)) RETURN TRUE ENDIF tRecordingName = "family_m_wife_drive" RETURN FALSE BREAK CASE FM_MICHAEL_DAUGHTER fExitMag = VMAG(ExitCoors-VehCoors) fExitRad = fExitMag-fReachedExitRadius #IF IS_DEBUG_BUILD DrawDebugFamilySphere(VehCoors, fExitRad, HUD_COLOUR_BLUELIGHT, 0.25) DrawDebugFamilySphere(ExitCoors, fReachedExitRadius, HUD_COLOUR_RED, 1.0) #ENDIF IF VDIST2(VehCoors, GET_ENTITY_COORDS(PedIndex)) > ((fExitRad)*(fExitRad)) RETURN TRUE ENDIF tRecordingName = "family_m_daughter_drive" RETURN FALSE BREAK ENDSWITCH RETURN TRUE ENDFUNC FUNC BOOL PRIVATE_Update_Family_DrivingAway(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, VEHICLE_INDEX &vehicleIndex, enumFamilyMember eFamilyMembersVeh, enumFamilyEvents eFamilyEvent, INT &iEnterVehStage, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, INT &iScene, AUTOMATIC_DOOR_ENUM eDoor, STRING strTextBlock, STRING strBase, STRING strExit, TEXT_LABEL &tCreatedConvLabels[], FLOAT fExitSpeechPhase, structPedsForConversation &inSpeechStruct, structTimer &speechTimer, STRING sDismissContext, #IF USE_TU_CHANGES INTERIOR_INSTANCE_INDEX &iInteriorForThisPlayer, #ENDIF PED_INDEX PassengerPedIndex = NULL) enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH #IF IS_DEBUG_BUILD CONST_INT iFamTextOffset 2 #ENDIF IF NOT DOES_ENTITY_EXIST(vehicleIndex) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str str = ("cant find ") str += (Get_String_From_FamilyMember(eFamilyMembersVeh)) str += ("'s vehicle") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_PURE_WHITE) #ENDIF iEnterVehStage = 0 ELSE // #IF IS_DEBUG_BUILD DrawDebugFamilyLine(GET_ENTITY_COORDS(PedIndex, FALSE), GET_ENTITY_COORDS(vehicleIndex, FALSE), HUD_COLOUR_RED) TEXT_LABEL_63 str str = (Get_String_From_FamilyMember(eFamilyMember)) str += (", driving ") str += (Get_String_From_FamilyMember(eFamilyMembersVeh)) str += ("'s vehicle") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset, HUD_COLOUR_RED) #ENDIF IF IS_VEHICLE_DRIVEABLE(vehicleIndex) IF NOT IS_PED_SITTING_IN_VEHICLE(PedIndex, vehicleIndex) VEHICLE_SEAT eSeat = VS_DRIVER FLOAT MoveSpeed = PEDMOVEBLENDRATIO_WALK ENTER_EXIT_VEHICLE_FLAGS eFlags = ECF_RESUME_IF_INTERRUPTED INT iTime = DEFAULT_TIME_NEVER_WARP //DEFAULT_TIME_BEFORE_WARP TEXT_LABEL_63 tFamilyAnimDict = "" TEXT_LABEL_63 tFamilyAnimLoopClip = "", tFamilyAnimExitClip = "" ANIMATION_FLAGS eFamilyAnimFlag enumFamilyAnimProgress eFamilyAnimProgress CONST_INT iDRIVING_0_waitToEnter 0 // CONST_INT iDRIVING_1_exitAnim 1 CONST_INT iDRIVING_2_exitSynch 2 CONST_INT iDRIVING_4_exitDialogue 4 CONST_INT iDRIVING_5_exitAnim 5 CONST_INT iDRIVING_6_exitDialogue 6 CONST_INT iDRIVING_3_enterVeh 3 CONST_INT iDRIVING_33_enterVehDismiss 33 SWITCH iEnterVehStage CASE iDRIVING_0_waitToEnter //idle anim while waiting for the player to approach #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("0. wait to enter, idle anim", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT PRIVATE_Is_Family_Member_Ready_For_Driving(PedIndex, eFamilyMember, eFamilyEvent, vehicleIndex, eDoor, vFamilyScenePos, fFamilySceneHead, eSeat) // IF (eFamilyEvent = FE_M_WIFE_leaving_in_car) TEXT_LABEL_63 tAnimDict, tAnimClip IF PRIVATE_Update_Family_SynchScene(PedIndex, eFamilyMember, eFamilyEvent, vFamilyScenePos, fFamilySceneHead, iScene, TRUE, FALSE, tAnimDict, tAnimClip) ENDIF ELSE IF PRIVATE_Update_Family_ON_PHONE(PedIndex) ENDIF ENDIF ELSE // CLEAR_PED_TASKS(PedIndex) FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(eDoor, TRUE) CLEAR_BIT(g_sAutoDoorData[ENUM_TO_INT(eDoor)].settingsBitset, BIT_AUTODOOR_OPEN_ON_WANTED) IF (eFamilyEvent = FE_M_WIFE_leaving_in_car) iEnterVehStage = iDRIVING_2_exitSynch ELSE IF NOT IS_STRING_NULL_OR_EMPTY(strBase) IF Is_Ped_Playing_Family_Speech(strTextBlock, strBase, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) REQUEST_VEHICLE_ASSET(GET_ENTITY_MODEL(vehicleIndex)) iEnterVehStage = iDRIVING_3_enterVeh ENDIF ELSE REQUEST_VEHICLE_ASSET(GET_ENTITY_MODEL(vehicleIndex)) iEnterVehStage = iDRIVING_3_enterVeh ENDIF ENDIF ENDIF BREAK CASE iDRIVING_2_exitSynch // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("2. start playing exit synch", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimDict, tFamilyAnimLoopClip, eFamilyAnimFlag, eFamilyAnimProgress) REQUEST_ANIM_DICT(tFamilyAnimDict) IF HAS_ANIM_DICT_LOADED(tFamilyAnimDict) //play "base" dialogue IF Is_Ped_Playing_Family_Speech(strTextBlock, strBase, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) IF (eFamilyEvent <> FE_M_WIFE_leaving_in_car) tFamilyAnimExitClip = "exit" ELSE tFamilyAnimExitClip = "exit_demo" ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) VECTOR vSynchSceneOffset FLOAT fSynchSceneHead vSynchSceneOffset = <<0,0,0>> fSynchSceneHead = 0 IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) iScene = CREATE_SYNCHRONIZED_SCENE(vFamilyScenePos+vSynchSceneOffset, <<0,0,fFamilySceneHead+fSynchSceneHead>>) ENDIF ENDIF SET_SYNCHRONIZED_SCENE_PHASE(iScene, 0.0) TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tFamilyAnimDict, tFamilyAnimExitClip, NORMAL_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_TAG_SYNC_OUT) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) RESTART_TIMER_NOW(speechTimer) iEnterVehStage = iDRIVING_4_exitDialogue ENDIF ENDIF ENDIF BREAK CASE iDRIVING_4_exitDialogue // #IF IS_DEBUG_BUILD str = "4. exiting, starting dialogue \"" str += strExit str += "\" " str += GET_STRING_FROM_FLOAT(fExitSpeechPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF IS_STRING_NULL_OR_EMPTY(strExit) iEnterVehStage = iDRIVING_5_exitAnim RETURN TRUE ENDIF IF (fExitSpeechPhase <= 0.0) iEnterVehStage = iDRIVING_5_exitAnim RETURN TRUE ENDIF IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimDict, tFamilyAnimLoopClip, eFamilyAnimFlag, eFamilyAnimProgress) IF (eFamilyEvent <> FE_M_WIFE_leaving_in_car) tFamilyAnimExitClip = "exit" ELSE tFamilyAnimExitClip = "exit_demo" ENDIF IF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) //play "exit" dialogue IF Is_Ped_Playing_Family_Speech(strTextBlock, strExit, inSpeechStruct, enSpeechPriority, tCreatedConvLabels, "face") iEnterVehStage = iDRIVING_6_exitDialogue ENDIF ENDIF ENDIF BREAK CASE iDRIVING_6_exitDialogue // #IF IS_DEBUG_BUILD str = "6. exiting, wait for dialogue \"" str += strExit str += "\" " str += GET_STRING_FROM_FLOAT(fExitSpeechPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF IS_STRING_NULL_OR_EMPTY(strExit) iEnterVehStage = iDRIVING_5_exitAnim RETURN TRUE ENDIF IF (fExitSpeechPhase <= 0.0) iEnterVehStage = iDRIVING_5_exitAnim RETURN TRUE ENDIF IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimDict, tFamilyAnimLoopClip, eFamilyAnimFlag, eFamilyAnimProgress) IF (eFamilyEvent <> FE_M_WIFE_leaving_in_car) tFamilyAnimExitClip = "exit" ELSE tFamilyAnimExitClip = "exit_demo" ENDIF FLOAT fAnimClipCurrentTime fAnimClipCurrentTime = -1 IF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip, ANIM_SCRIPT) fAnimClipCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) ELIF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip, ANIM_SYNCED_SCENE) fAnimClipCurrentTime = GET_SYNCHRONIZED_SCENE_PHASE(iScene) ELIF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) fAnimClipCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) ENDIF #IF IS_DEBUG_BUILD str = "\"" str += tFamilyAnimExitClip str += "\": " str += GET_STRING_FROM_FLOAT(fAnimClipCurrentTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) #ENDIF IF (fAnimClipCurrentTime >= 0) IF fAnimClipCurrentTime >= fExitSpeechPhase //unpause "exit" dialogue PAUSE_FACE_TO_FACE_CONVERSATION(FALSE) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "TASK_PLAY_ANIM(\"", tFamilyAnimDict, "\", \"", "face", "\", AF_SECONDARY)") #ENDIF RESTART_TIMER_NOW(speechTimer) iEnterVehStage = iDRIVING_5_exitAnim ENDIF ENDIF ENDIF BREAK CASE iDRIVING_5_exitAnim // CONST_FLOAT fANIM_CLIP_MAX_TIME 0.88 #IF IS_DEBUG_BUILD str = "5. playing exit anim \"" str += strExit str += "\" " str += GET_STRING_FROM_FLOAT(fANIM_CLIP_MAX_TIME) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_GREENLIGHT) #ENDIF IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyAnimDict, tFamilyAnimLoopClip, eFamilyAnimFlag, eFamilyAnimProgress) IF (eFamilyEvent <> FE_M_WIFE_leaving_in_car) tFamilyAnimExitClip = "exit" ELSE tFamilyAnimExitClip = "exit_demo" ENDIF FLOAT fAnimClipCurrentTime fAnimClipCurrentTime = -1 IF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip, ANIM_SCRIPT) fAnimClipCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) ELIF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip, ANIM_SYNCED_SCENE) fAnimClipCurrentTime = GET_SYNCHRONIZED_SCENE_PHASE(iScene) ELIF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) fAnimClipCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimExitClip) ENDIF #IF IS_DEBUG_BUILD str = "\"" str += tFamilyAnimExitClip str += "\": " str += GET_STRING_FROM_FLOAT(fAnimClipCurrentTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREENLIGHT) #ENDIF IF (fAnimClipCurrentTime >= 0) IF fAnimClipCurrentTime >= fANIM_CLIP_MAX_TIME FORCE_PED_MOTION_STATE(PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) CLEAR_PED_TASKS(PedIndex) TASK_ENTER_VEHICLE(PedIndex, vehicleIndex, iTime, eSeat, MoveSpeed, eFlags) FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(eDoor, TRUE) CLEAR_BIT(g_sAutoDoorData[ENUM_TO_INT(eDoor)].settingsBitset, BIT_AUTODOOR_OPEN_ON_WANTED) REQUEST_VEHICLE_ASSET(GET_ENTITY_MODEL(vehicleIndex)) iEnterVehStage = iDRIVING_3_enterVeh RETURN TRUE ENDIF ELSE FORCE_PED_MOTION_STATE(PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) CLEAR_PED_TASKS(PedIndex) IF IS_VEHICLE_SEAT_FREE(vehicleIndex, eSeat) TASK_ENTER_VEHICLE(PedIndex, vehicleIndex, iTime, eSeat, MoveSpeed, eFlags) ELSE // ENDIF FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(eDoor, TRUE) CLEAR_BIT(g_sAutoDoorData[ENUM_TO_INT(eDoor)].settingsBitset, BIT_AUTODOOR_OPEN_ON_WANTED) REQUEST_VEHICLE_ASSET(GET_ENTITY_MODEL(vehicleIndex)) iEnterVehStage = iDRIVING_3_enterVeh RETURN TRUE ENDIF ENDIF BREAK CASE iDRIVING_3_enterVeh //tasked to enter the vehicle CASE iDRIVING_33_enterVehDismiss IF NOT PRIVATE_Is_Family_Member_Ready_For_Driving(PedIndex, eFamilyMember, eFamilyEvent, vehicleIndex, eDoor, vFamilyScenePos, fFamilySceneHead, eSeat) // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("3. trying to enter vehicle!", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_GREEN) #ENDIF IF NOT IS_VEHICLE_SEAT_FREE(vehicleIndex, eSeat) #IF IS_DEBUG_BUILD IF iEnterVehStage = iDRIVING_3_enterVeh DrawDebugFamilyTextWithOffset("3. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ELIF iEnterVehStage = iDRIVING_33_enterVehDismiss DrawDebugFamilyTextWithOffset("33. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ELSE DrawDebugFamilyTextWithOffset("XX. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ENDIF #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) <> PERFORMING_TASK) AND (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK) // TASK_WANDER_IN_AREA(PedIndex, GET_ENTITY_COORDS(vehicleIndex), VDIST(GET_ENTITY_COORDS(vehicleIndex), vFamilyScenePos)) TASK_WANDER_STANDARD(PedIndex) ENDIF IF (iEnterVehStage = iDRIVING_3_enterVeh) IF NOT IS_STRING_NULL_OR_EMPTY(sDismissContext) IF (VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), GET_ENTITY_COORDS(PedIndex, FALSE)) < 5) AND NOT (IS_ANY_SPEECH_PLAYING(PLAYER_PED_ID()) OR IS_ANY_SPEECH_PLAYING(PedIndex) OR IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR IS_CALLING_ANY_CONTACT()) STRING VoiceName SWITCH eFamilyMember CASE FM_MICHAEL_WIFE VoiceName = "AMANDA_NORMAL" BREAK CASE FM_MICHAEL_SON VoiceName = "JIMMY_NORMAL" BREAK CASE FM_MICHAEL_DAUGHTER VoiceName = "TRACY_NORMAL" BREAK ENDSWITCH PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PedIndex, sDismissContext, VoiceName) iEnterVehStage = iDRIVING_33_enterVehDismiss #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("sDismissContext - two")SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDIF ELSE IF NOT IS_VEHICLE_SEAT_FREE(vehicleIndex, eSeat) #IF IS_DEBUG_BUILD IF iEnterVehStage = iDRIVING_3_enterVeh DrawDebugFamilyTextWithOffset("3. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ELIF iEnterVehStage = iDRIVING_33_enterVehDismiss DrawDebugFamilyTextWithOffset("33. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ELSE DrawDebugFamilyTextWithOffset("33. entering vehicle (seat not free)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) ENDIF #ENDIF IF GET_PED_IN_VEHICLE_SEAT(vehicleIndex, eSeat) != PedIndex IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) <> PERFORMING_TASK) AND (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK) // TASK_WANDER_IN_AREA(PedIndex, GET_ENTITY_COORDS(vehicleIndex), VDIST(GET_ENTITY_COORDS(vehicleIndex), vFamilyScenePos)) TASK_WANDER_STANDARD(PedIndex) ENDIF ENDIF IF (iEnterVehStage = iDRIVING_3_enterVeh) IF NOT IS_STRING_NULL_OR_EMPTY(sDismissContext) IF (VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), GET_ENTITY_COORDS(PedIndex, FALSE)) < 5) AND NOT (IS_ANY_SPEECH_PLAYING(PLAYER_PED_ID()) OR IS_ANY_SPEECH_PLAYING(PedIndex) OR IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR IS_CALLING_ANY_CONTACT()) STRING VoiceName SWITCH eFamilyMember CASE FM_MICHAEL_WIFE VoiceName = "AMANDA_NORMAL" BREAK CASE FM_MICHAEL_SON VoiceName = "JIMMY_NORMAL" BREAK CASE FM_MICHAEL_DAUGHTER VoiceName = "TRACY_NORMAL" BREAK ENDSWITCH PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PedIndex, sDismissContext, VoiceName) iEnterVehStage = iDRIVING_33_enterVehDismiss #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("sDismissContext - two")SAVE_NEWLINE_TO_DEBUG_FILE() CPRINTLN(DEBUG_FAMILY, "sDismissContext - two") #ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDIF IF VDIST2(GET_ENTITY_COORDS(vehicleIndex), GET_ENTITY_COORDS(PedIndex)) > (50*50) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("3. entering vehicle (too far, navmesh)", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_GREEN) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, GET_ENTITY_COORDS(vehicleIndex), PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) ENDIF RETURN FALSE ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK) IF NOT HAS_VEHICLE_ASSET_LOADED(GET_ENTITY_MODEL(vehicleIndex)) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] enter assets havent loaded... ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ELSE TASK_ENTER_VEHICLE(PedIndex, vehicleIndex, iTime, eSeat, MoveSpeed, eFlags) #IF IS_DEBUG_BUILD CDEBUG3LN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] entering ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("3. entering vehicle", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF GET_PED_CONFIG_FLAG(pedIndex, PCF_OpenDoorArmIK) SET_PED_RESET_FLAG(pedIndex, PRF_SearchForClosestDoor, TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(PassengerPedIndex) IF NOT IS_PED_SITTING_IN_VEHICLE(PassengerPedIndex, vehicleIndex) IF (GET_SCRIPT_TASK_STATUS(PassengerPedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK) TASK_ENTER_VEHICLE(PassengerPedIndex, vehicleIndex, iTime, VS_ANY_PASSENGER, MoveSpeed, eFlags) ENDIF ENDIF ENDIF ENDIF BREAK DEFAULT #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid iEnterVehStage ", iEnterVehStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_DrivingAway(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid iEnterVehStage ", iEnterVehStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_DrivingAway(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF BREAK ENDSWITCH ELSE iEnterVehStage = 0 FLOAT CruiseSpeed = 20 DRIVINGMODE Mode = DRIVINGMODE_STOPFORCARS VECTOR VehCoors = << -825.7757, 177.2016, 71.9871 >> VECTOR VecExitCoors = << -844.4757, 156.9072, 67.0048 >> //<< -849.4479, 158.3810, 65.6464 >> TEXT_LABEL_31 tRecordingName IF NOT PRIVATE_Is_Family_Member_Ready_For_DriveWander(PedIndex, eFamilyMembersVeh, VehCoors, VecExitCoors, tRecordingName) #IF USE_TU_CHANGES IF IS_VALID_INTERIOR(iInteriorForThisPlayer) AND IS_INTERIOR_READY(iInteriorForThisPlayer) IF NOT IS_ENTITY_ON_SCREEN(vehicleIndex) SET_ENTITY_COORDS(vehicleIndex, VehCoors) SET_ENTITY_HEADING(vehicleIndex, GET_HEADING_FROM_VECTOR_2D(VecExitCoors.x-VehCoors.x, VecExitCoors.y-VehCoors.y)) CWARNINGLN(DEBUG_FAMILY, "bug #1766708 - move driver because the player is inside and cant see them") ENDIF ENDIF #ENDIF IF IS_STRING_NULL_OR_EMPTY(tRecordingName) IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) <> PERFORMING_TASK) DRIVINGSTYLE Style = DRIVINGSTYLE_ACCURATE FLOAT TargetRadius = 3.0 FLOAT StraightLineDist = -1.0 TASK_VEHICLE_DRIVE_TO_COORD(PedIndex, vehicleIndex, VecExitCoors, CruiseSpeed * 0.5, Style, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, TargetRadius, StraightLineDist) IF (eDoor <> AUTODOOR_MAX) IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) ENDIF ENDIF #IF IS_DEBUG_BUILD CDEBUG3LN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] is in ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle, task to drive to coord) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("in vehicle... drive to coord", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF ENDIF ELSE IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) <> PERFORMING_TASK) REQUEST_WAYPOINT_RECORDING(tRecordingName) IF GET_IS_WAYPOINT_RECORDING_LOADED(tRecordingName) CPRINTLN(DEBUG_FAMILY, "DOOR_SYSTEM_GET_OPEN_RATIO(g_sAutoDoorData[ENUM_TO_INT(eDoor)].doorID): ", DOOR_SYSTEM_GET_OPEN_RATIO(g_sAutoDoorData[ENUM_TO_INT(eDoor)].doorID)) IF (eDoor <> AUTODOOR_MAX) FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(eDoor, TRUE) CLEAR_BIT(g_sAutoDoorData[ENUM_TO_INT(eDoor)].settingsBitset, BIT_AUTODOOR_OPEN_ON_WANTED) IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) ENDIF IF DOOR_SYSTEM_GET_OPEN_RATIO(g_sAutoDoorData[ENUM_TO_INT(eDoor)].doorID) > -1.0 RETURN TRUE ENDIF ENDIF INT iStartingProgress iStartingProgress = 0 IF VDIST(GET_ENTITY_COORDS(PedIndex), <<-827.1387, 176.3679, 69.9464>>) > 2.5 iStartingProgress = 8 ENDIF #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("dist: ") SAVE_FLOAT_TO_DEBUG_FILE(VDIST(GET_ENTITY_COORDS(PedIndex), <<-827.1387, 176.3679, 69.9464>>)) SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PedIndex, vehicleIndex, tRecordingName, Mode, iStartingProgress, // EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN) //EWAYPOINT_FOLLOW_FLAGS iFlags = EWAYPOINT_DEFAULT) #IF IS_DEBUG_BUILD CDEBUG3LN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] is in ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle, task to waypoint) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("in vehicle... follow waypoint", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF ENDIF ENDIF ELSE BOOL bPassengerNotInVeh bPassengerNotInVeh = FALSE IF NOT IS_PED_INJURED(PassengerPedIndex) IF NOT IS_PED_SITTING_IN_VEHICLE(PassengerPedIndex, vehicleIndex) bPassengerNotInVeh = TRUE IF (GET_SCRIPT_TASK_STATUS(PassengerPedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK) TASK_ENTER_VEHICLE(PassengerPedIndex, vehicleIndex, DEFAULT_TIME_NEVER_WARP, VS_ANY_PASSENGER, PEDMOVEBLENDRATIO_WALK, ECF_RESUME_IF_INTERRUPTED) ENDIF ENDIF ENDIF IF IS_PED_IN_VEHICLE(PedIndex, vehicleIndex, FALSE) IF bPassengerNotInVeh IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_TEMP_ACTION) <> PERFORMING_TASK) TASK_VEHICLE_TEMP_ACTION(PedIndex, vehicleIndex, TEMPACT_BRAKE, 500) // IF (eDoor <> AUTODOOR_MAX) // IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) // REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) // ENDIF // ENDIF #IF IS_DEBUG_BUILD CDEBUG3LN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] is in ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle, task to break) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("in vehicle... drive break", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF ENDIF ELSE IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) <> PERFORMING_TASK) TASK_VEHICLE_DRIVE_WANDER(PedIndex, vehicleIndex, CruiseSpeed, Mode) IF (eDoor <> AUTODOOR_MAX) IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) ENDIF ENDIF #IF IS_DEBUG_BUILD CDEBUG3LN(DEBUG_FAMILY, "PRIVATE_Update_Family_DrivingAway(family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] is in ", Get_String_From_FamilyMember(eFamilyMembersVeh), "'s vehicle, task to WANDER) ", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("in vehicle... drive wander", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("vehicle NOT DRIVABLE", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sDismissContext) STRING VoiceName SWITCH eFamilyMember CASE FM_MICHAEL_WIFE VoiceName = "AMANDA_NORMAL" BREAK CASE FM_MICHAEL_SON VoiceName = "JIMMY_NORMAL" BREAK CASE FM_MICHAEL_DAUGHTER VoiceName = "TRACY_NORMAL" BREAK ENDSWITCH PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PedIndex, sDismissContext, VoiceName) #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("sDismissContext - two")SAVE_NEWLINE_TO_DEBUG_FILE() CPRINTLN(DEBUG_FAMILY, "sDismissContext - two") #ENDIF ENDIF iEnterVehStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_wander_family_event) RETURN FALSE ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_DrivingHome(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, VEHICLE_INDEX &vehicleIndex, enumFamilyMember eFamilyMembersVeh, enumFamilyEvents eFamilyEvent, INT &iEnterVehStage, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, VECTOR VecExitCoors, AUTOMATIC_DOOR_ENUM eDoor, enumFamilyEvents eDesiredFamilyEvent, STRING strTextBlock, STRING strBase, TEXT_LABEL &tCreatedConvLabels[], structPedsForConversation &inSpeechStruct, structTimer &speechTimer) enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH #IF IS_DEBUG_BUILD CONST_INT iFamTextOffset 2 #ENDIF IF NOT DOES_ENTITY_EXIST(vehicleIndex) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str str = ("cant find ") str += (Get_String_From_FamilyMember(eFamilyMembersVeh)) str += ("'s vehicle") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_PURE_WHITE) #ENDIF eFamilyMembersVeh = eFamilyMembersVeh iEnterVehStage = 0 ELSE // #IF IS_DEBUG_BUILD DrawDebugFamilyLine(GET_ENTITY_COORDS(PedIndex, FALSE), GET_ENTITY_COORDS(vehicleIndex, FALSE), HUD_COLOUR_RED) TEXT_LABEL_63 str str = (Get_String_From_FamilyMember(eFamilyMember)) str += (", driving ") str += (Get_String_From_FamilyMember(eFamilyMembersVeh)) str += ("'s vehicle") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset, HUD_COLOUR_RED) #ENDIF IF IS_VEHICLE_DRIVEABLE(vehicleIndex) VEHICLE_SEAT eSeat = VS_DRIVER FLOAT MoveSpeed = PEDMOVEBLENDRATIO_WALK ENTER_EXIT_VEHICLE_FLAGS eFlags = ECF_RESUME_IF_INTERRUPTED INT iTime = DEFAULT_TIME_NEVER_WARP //DEFAULT_TIME_BEFORE_WARP CONST_INT iDRIVING_0_waitToEnter 0 CONST_INT iDRIVING_1_waitToEnter 1 SWITCH iEnterVehStage CASE iDRIVING_0_waitToEnter #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("0. waitToEnter", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT PRIVATE_Is_Family_Member_Ready_For_Driving(PedIndex, eFamilyMember, eFamilyEvent, vehicleIndex, eDoor, vFamilyScenePos, fFamilySceneHead, VS_DRIVER) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("NOT PRIVATE_Is_Family_Member_Ready_For_Driving", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) #ENDIF RETURN FALSE ENDIF FLOAT fExitCoorsDist2 fExitCoorsDist2 = VDIST2(GET_ENTITY_COORDS(PedIndex, FALSE), VecExitCoors) IF NOT IS_PED_SITTING_IN_VEHICLE(PedIndex, vehicleIndex) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("NOT IS_PED_SITTING_IN_VEHICLE", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) #ENDIF IF NOT IS_ENTITY_ON_SCREEN(PedIndex) SET_PED_INTO_VEHICLE(PedIndex, vehicleIndex, eSeat) RETURN FALSE ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK) TASK_ENTER_VEHICLE(PedIndex, vehicleIndex, iTime, eSeat, MoveSpeed, eFlags) ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("IS_PED_SITTING_IN_VEHICLE", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) str =("dist: ") str +=GET_STRING_FROM_FLOAT(SQRT(fExitCoorsDist2)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+3, HUD_COLOUR_RED) #ENDIF IF (eDoor <> AUTODOOR_MAX) IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(eDoor, PedIndex) ENDIF ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) <> PERFORMING_TASK) FLOAT CruiseSpeed DRIVINGMODE Mode CruiseSpeed = 7.5 Mode = DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS DRIVINGSTYLE Style FLOAT TargetRadius, StraightLineDist Style = DRIVINGSTYLE_ACCURATE TargetRadius = 3.0 StraightLineDist = -1.0 TASK_VEHICLE_DRIVE_TO_COORD(PedIndex, vehicleIndex, VecExitCoors, CruiseSpeed, Style, DUMMY_MODEL_FOR_SCRIPT, Mode, TargetRadius, StraightLineDist) ENDIF ENDIF IF fExitCoorsDist2 <= (5*5) TASK_LEAVE_VEHICLE(PedIndex, vehicleIndex) iEnterVehStage = iDRIVING_1_waitToEnter ENDIF BREAK CASE iDRIVING_1_waitToEnter #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("1. waitToEnter", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, strBase, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN TRUE ENDIF BREAK DEFAULT #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid iEnterVehStage ", iEnterVehStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_DrivingAway(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid iEnterVehStage ", iEnterVehStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_DrivingAway(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF BREAK ENDSWITCH ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("vehicle NOT DRIVABLE", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) <> PERFORMING_TASK) AND (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK) // TASK_WANDER_IN_AREA(PedIndex, GET_ENTITY_COORDS(vehicleIndex), VDIST(GET_ENTITY_COORDS(vehicleIndex), vFamilyScenePos)) TASK_WANDER_STANDARD(PedIndex) ENDIF RETURN FALSE ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Get_Family_Walking_Offsets(enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR &vWalkOffsets[], FLOAT &fWalkOffsets[]) vWalkOffsets[0] = <<0,0,0>> SWITCH eFamilyEvent CASE FE_M_DAUGHTER_walks_to_room_music SWITCH eFamilyMember CASE FM_MICHAEL_DAUGHTER fWalkOffsets[0] = 0.0 vWalkOffsets[1] = <<-4.5000, 9.6000, -1.2000>> fWalkOffsets[1] = 0.0 vWalkOffsets[2] = <<-6.3000, 7.8000, -4.5000>> fWalkOffsets[2] = 0.0 vWalkOffsets[3] = <<-0.5000, 0.2000, -3.8000>> fWalkOffsets[3] = 0.0 vWalkOffsets[4] = <<-0.9000, 12.9000, -4.1000>> fWalkOffsets[4] = 0.0 RETURN TRUE BREAK ENDSWITCH BREAK CASE FE_M2_MEXMAID_cleans_booze_pot_other CASE FE_M7_MEXMAID_cleans_booze_pot_other vWalkOffsets[0] = <<-6.3800, -3.7100, 1.0000>> fWalkOffsets[0] = 82.5000 vWalkOffsets[1] = <<-1.8580, -4.6230, 1.1920>> fWalkOffsets[1] = 162.0000 vWalkOffsets[2] = <<-8.3066, -15.8344, 1.1816>> fWalkOffsets[2] = 162.0000 vWalkOffsets[3] = <<-15.2080, -4.1770, 0.5000>> fWalkOffsets[3] = 71.3000 vWalkOffsets[4] = <<-7.4216, -9.6486, 5.1000>> fWalkOffsets[4] = -110.7000 RETURN TRUE BREAK ENDSWITCH #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Get_Family_Walking_Offsets(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Get_Family_Walking_Offsets(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Get_Family_Walking_AnimSet(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, INT iWalkingStage, TEXT_LABEL_63 &tCleaningEnter_animDict, TEXT_LABEL_63 &tCleaningEnter_animClip, TEXT_LABEL_63 &tCleaningBase_animDict, TEXT_LABEL_63 &tCleaningBase_animClip, TEXT_LABEL_63 &tCleaningExit_animDict, TEXT_LABEL_63 &tCleaningExit_animClip, ANIMATION_FLAGS &eCleaning_animFlag) IF NOT DOES_ENTITY_EXIST(PedIndex) RETURN FALSE ENDIF SWITCH eFamilyEvent CASE FE_M2_MEXMAID_cleans_booze_pot_other CASE FE_M7_MEXMAID_cleans_booze_pot_other SWITCH iWalkingStage CASE 0 tCleaningEnter_animDict = "TIMETABLE@MAID@CLEANING_SURFACE_1@" tCleaningEnter_animClip = "IG_9_ENTER" tCleaningBase_animDict = "TIMETABLE@MAID@CLEANING_SURFACE_1@" tCleaningBase_animClip = "IG_9_BASE" tCleaningExit_animDict = "TIMETABLE@MAID@CLEANING_SURFACE_1@" tCleaningExit_animClip = "IG_9_EXIT" // tCleaningEnter_animDict = "TIMETABLE@MAID@CLEANING_SURFACE_1@" tCleaningEnter_animClip = "IG_9_IDLE_A" // tCleaningEnter_animDict = "TIMETABLE@MAID@CLEANING_SURFACE_1@" tCleaningEnter_animClip = "IG_9_IDLE_B" #IF IS_DEBUG_BUILD Draw_Family_Member_Cleaning_Debug_Surface_Plane(PedIndex, 0.8, 0.15-0.02, HUD_COLOUR_BLUELIGHT) #ENDIF RETURN TRUE BREAK CASE 1 CASE 2 CASE 3 CASE 4 TEXT_LABEL_63 tCleaning_animDict, tCleaning_animClip enumFamilyAnimProgress eFamilyAnimProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tCleaning_animDict, tCleaning_animClip, eCleaning_animFlag, eFamilyAnimProgress) tCleaningEnter_animDict = tCleaning_animDict tCleaningEnter_animDict += "ENTER" tCleaningEnter_animClip = tCleaning_animClip tCleaningEnter_animClip += "enter" tCleaningBase_animDict = tCleaning_animDict tCleaningBase_animDict += "BASE" tCleaningBase_animClip = tCleaning_animClip tCleaningBase_animClip += "base" tCleaningExit_animDict = tCleaning_animDict tCleaningExit_animDict += "EXIT" tCleaningExit_animClip = tCleaning_animClip tCleaningExit_animClip += "exit" #IF IS_DEBUG_BUILD Draw_Family_Member_Cleaning_Debug_Window_Plane(PedIndex, 0.8, fDebugWindowPlaneOffset, fDebugWindowPlaneDiff, HUD_COLOUR_BLUELIGHT) #ENDIF RETURN TRUE ENDIF BREAK ENDSWITCH BREAK ENDSWITCH #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Get_Family_Walking_Offsets(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Get_Family_Walking_Offsets(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Walking(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead, INT &iWalkingStage) VECTOR vWalkOffset FLOAT fWalkHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vWalkOffset, fWalkHead) VECTOR vWalk_offsets[5] FLOAT fWalk_offsets[5] IF PRIVATE_Get_Family_Walking_Offsets(eFamilyMember, eFamilyEvent, vWalk_offsets, fWalk_offsets) VECTOR vWalk_Pos_x = vSequencePos+vWalkOffset #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS eColour = HUD_COLOUR_PURE_WHITE FLOAT fAlphaMult = 1.0 INT iWalk REPEAT COUNT_OF(vWalk_offsets) iWalk INT iNextWalk = iWalk+1 IF iNextWalk >= COUNT_OF(vWalk_offsets) iNextWalk = 0 ENDIF str =("vWalk_offsets[") str +=(iWalk) str +=("]") DrawDebugFamilyTextWithOffset(str, vWalk_Pos_x+vWalk_offsets[iWalk], 0, eColour, fAlphaMult) DrawDebugFamilyLine(vWalk_Pos_x+vWalk_offsets[iWalk], vWalk_Pos_x+vWalk_offsets[iNextWalk], eColour, fAlphaMult) ENDREPEAT str =("iWalkingStage: ") str +=(iWalkingStage) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, eColour) str =("dist: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vWalk_Pos_x+vWalk_offsets[iWalkingStage])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PedIndex),vWalk_Pos_x+vWalk_offsets[iWalkingStage]) >= (1.0*1.0) #IF IS_DEBUG_BUILD DrawDebugFamilySphere(vWalk_Pos_x+vWalk_offsets[iWalkingStage], 1.0, eColour, 0.15) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vWalk_Pos_x+vWalk_offsets[iWalkingStage], PEDMOVE_WALK) ENDIF ELSE CLEAR_PED_TASKS(PedIndex) iWalkingStage++ IF iWalkingStage >= COUNT_OF(vWalk_offsets) iWalkingStage = 0 ENDIF ENDIF RETURN TRUE ENDIF ENDIF fSequenceHead = fSequenceHead RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_GoToCoordCleaning(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead, INT &iScene, OBJECT_INDEX &cleaning_prop, MODEL_NAMES eCleaningPropModel, MODEL_NAMES &eStoredCleaningPropModel, PED_BONETAG eCleaningPropAttachBonetag, INT &iCleaningStage, INT &iCleaningCount, BOOL bMovePeds) VECTOR vCleanOffset FLOAT fCleanHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vCleanOffset, fCleanHead) VECTOR vClean_offsets[5] FLOAT fClean_offsets[5] IF PRIVATE_Get_Family_Walking_Offsets(eFamilyMember, eFamilyEvent, vClean_offsets, fClean_offsets) INT Time = DEFAULT_TIME_BEFORE_WARP //DEFAULT_TIME_NEVER_WARP // FLOAT Radius = 0.01 //0.15 //DEFAULT_NAVMESH_RADIUS ENAV_SCRIPT_FLAGS NavFlags = ENAV_DONT_ADJUST_TARGET_POSITION VECTOR vClean_Pos_x = vSequencePos+vCleanOffset FLOAT fClean_Head_x = fSequenceHead+fCleanHead #IF IS_DEBUG_BUILD IF bMovePeds TEXT_LABEL_63 tCleaningEnter_animDict, tCleaningEnter_animClip TEXT_LABEL_63 tCleaningBase_animDict, tCleaningBase_animClip TEXT_LABEL_63 tCleaningExit_animDict, tCleaningExit_animClip ANIMATION_FLAGS eCleaning_animFlag FLOAT fCleaningPhase = 0.0 INT iWidget TEXT_LABEL_63 tWidget START_WIDGET_GROUP("PRIVATE_Update_Family_GoToCoordCleaning") ADD_WIDGET_BOOL("bMovePeds", bMovePeds) ADD_WIDGET_INT_SLIDER("iCleaningCount", iCleaningCount, 0, COUNT_OF(vClean_offsets)-1, 1) ADD_WIDGET_FLOAT_SLIDER("fCleaningPhase", fCleaningPhase, 0, 1, 0.001) REPEAT COUNT_OF(vClean_offsets) iWidget IF PRIVATE_Get_Family_Walking_AnimSet(PedIndex, eFamilyMember, eFamilyEvent, iWidget, tCleaningEnter_animDict, tCleaningEnter_animClip, tCleaningBase_animDict, tCleaningBase_animClip, tCleaningExit_animDict, tCleaningExit_animClip, eCleaning_animFlag) ENDIF tWidget ="[" tWidget += iWidget tWidget +="] \"" tWidget += GET_STRING_FROM_STRING(tCleaningBase_animDict, GET_LENGTH_OF_LITERAL_STRING("TIMETABLE@"), GET_LENGTH_OF_LITERAL_STRING(tCleaningBase_animDict)) tWidget +="\"" START_WIDGET_GROUP(tWidget) ADD_WIDGET_FLOAT_SLIDER("vClean_offsets x", vClean_offsets[iWidget].x, vClean_offsets[iWidget].x-5.0, vClean_offsets[iWidget].x+5.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("vClean_offsets y", vClean_offsets[iWidget].y, vClean_offsets[iWidget].y-5.0, vClean_offsets[iWidget].y+5.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("vClean_offsets z", vClean_offsets[iWidget].z, vClean_offsets[iWidget].z-2.0, vClean_offsets[iWidget].z+2.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("fClean_offsets", fClean_offsets[iWidget], -180, 180, 0.1) STOP_WIDGET_GROUP() ENDREPEAT STOP_WIDGET_GROUP() WHILE bMovePeds IF IS_PED_INJURED(PedIndex) bMovePeds = FALSE RETURN FALSE ENDIF SET_ENTITY_COORDS(PedIndex, vClean_Pos_x+vClean_offsets[iCleaningCount]+<<0,0,-1>>) SET_ENTITY_HEADING(PedIndex, fClean_Head_x+fClean_offsets[iCleaningCount]) IF PRIVATE_Get_Family_Walking_AnimSet(PedIndex, eFamilyMember, eFamilyEvent, iCleaningCount, tCleaningEnter_animDict, tCleaningEnter_animClip, tCleaningBase_animDict, tCleaningBase_animClip, tCleaningExit_animDict, tCleaningExit_animClip, eCleaning_animFlag) REQUEST_ANIM_DICT(tCleaningEnter_animDict) IF HAS_ANIM_DICT_LOADED(tCleaningEnter_animDict) IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tCleaningEnter_animDict, tCleaningEnter_animClip) IF ARE_STRINGS_EQUAL( "TIMETABLE@MAID@CLEANING_SURFACE_1@", tCleaningEnter_animDict) TASK_PLAY_ANIM_ADVANCED(PedIndex, tCleaningEnter_animDict, tCleaningEnter_animClip, vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, eCleaning_animFlag, 0.0, EULER_YXZ, AIK_NONE) ELSE IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) iScene = CREATE_SYNCHRONIZED_SCENE(vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>) ENDIF TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tCleaningEnter_animDict, tCleaningEnter_animClip, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_TAG_SYNC_OUT) ENDIF ENDIF ENDIF ENDIF VECTOR vFaceOffset vFaceOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClean_Pos_x+vClean_offsets[iCleaningCount], fClean_Head_x+fClean_offsets[iCleaningCount], <<0,1,0>>) DrawDebugFamilyLine(vClean_Pos_x+vClean_offsets[iCleaningCount], vFaceOffset, HUD_COLOUR_RED, 1.0) DrawDebugFamilySphere(vFaceOffset, 0.05, HUD_COLOUR_RED, 1.0) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PedIndex, <<0,-1.5,-1>>)) IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) iScene = CREATE_SYNCHRONIZED_SCENE(vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>) ELSE SET_SYNCHRONIZED_SCENE_ORIGIN(iScene, vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>) SET_SYNCHRONIZED_SCENE_PHASE(iScene, fCleaningPhase) ENDIF WAIT(0) ENDWHILE REPEAT COUNT_OF(vClean_offsets) iWidget SAVE_STRING_TO_DEBUG_FILE(" vWalkOffsets[") SAVE_INT_TO_DEBUG_FILE(iWidget) SAVE_STRING_TO_DEBUG_FILE("] = ") SAVE_VECTOR_TO_DEBUG_FILE(vClean_offsets[iWidget]) SAVE_STRING_TO_DEBUG_FILE(" fWalkOffsets[") SAVE_INT_TO_DEBUG_FILE(iWidget) SAVE_STRING_TO_DEBUG_FILE("] = ") SAVE_FLOAT_TO_DEBUG_FILE(fClean_offsets[iWidget]) SAVE_NEWLINE_TO_DEBUG_FILE() ENDREPEAT SAVE_NEWLINE_TO_DEBUG_FILE() iCleaningStage = 0 RETURN FALSE ENDIF #ENDIF #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS eColour = HUD_COLOUR_PURE_WHITE FLOAT fAlphaMult = 1.0 INT iClean REPEAT COUNT_OF(vClean_offsets) iClean INT iNextClean = iClean+1 IF iNextClean >= COUNT_OF(vClean_offsets) iNextClean = 0 ENDIF IF (iClean = iCleaningCount) eColour = HUD_COLOUR_RED ENDIF str =("vClean_offsets[") str +=(iClean) str +=("]") DrawDebugFamilyTextWithOffset(str, vClean_Pos_x+vClean_offsets[iClean], 0, eColour, fAlphaMult) FLOAT fPlayerCoord_groundZ = 0.0 FLOAT fAnimPos_heightDiff str = " height: " IF GET_GROUND_Z_FOR_3D_COORD(vClean_Pos_x+vClean_offsets[iClean] ,fPlayerCoord_groundZ) fAnimPos_heightDiff = ((vClean_Pos_x.z+vClean_offsets[iClean].z) - 1.0) - fPlayerCoord_groundZ str += GET_STRING_FROM_FLOAT(fAnimPos_heightDiff) DrawDebugFamilyTextWithOffset(str, vClean_Pos_x+vClean_offsets[iClean], 1, eColour, fAlphaMult) ELSE fAnimPos_heightDiff = ((vClean_Pos_x.z+vClean_offsets[iClean].z) - 1.0) - fPlayerCoord_groundZ str += GET_STRING_FROM_FLOAT(fAnimPos_heightDiff) DrawDebugFamilyTextWithOffset(str, vClean_Pos_x+vClean_offsets[iClean], 1, eColour, fAlphaMult) ENDIF IF (iClean = iCleaningCount) VECTOR vFaceOffset vFaceOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClean_Pos_x+vClean_offsets[iClean], fClean_Head_x+fClean_offsets[iClean], <<0,1,0>>) DrawDebugFamilyLine(vClean_Pos_x+vClean_offsets[iClean], vFaceOffset, eColour, fAlphaMult) DrawDebugFamilySphere(vFaceOffset, 0.05, eColour, fAlphaMult) ENDIF eColour = HUD_COLOUR_PURE_WHITE DrawDebugFamilyLine(vClean_Pos_x+vClean_offsets[iClean], vClean_Pos_x+vClean_offsets[iNextClean], eColour, fAlphaMult) ENDREPEAT str =("iCleaningStage: ") str +=(iCleaningStage) str +=(", Count: ") str +=(iCleaningCount) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, eColour) #ENDIF TEXT_LABEL_63 tCleaningEnter_animDict, tCleaningEnter_animClip TEXT_LABEL_63 tCleaningBase_animDict, tCleaningBase_animClip TEXT_LABEL_63 tCleaningExit_animDict, tCleaningExit_animClip ANIMATION_FLAGS eCleaning_animFlag IF PRIVATE_Get_Family_Walking_AnimSet(PedIndex, eFamilyMember, eFamilyEvent, iCleaningCount, tCleaningEnter_animDict, tCleaningEnter_animClip, tCleaningBase_animDict, tCleaningBase_animClip, tCleaningExit_animDict, tCleaningExit_animClip, eCleaning_animFlag) IF IS_BITMASK_ENUM_AS_ENUM_SET(eCleaning_animFlag, AF_LOOPING) CLEAR_BITMASK_ENUM_AS_ENUM(eCleaning_animFlag, AF_LOOPING) ELSE // ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(eCleaning_animFlag, AF_USE_KINEMATIC_PHYSICS) ELSE SET_BITMASK_ENUM_AS_ENUM(eCleaning_animFlag, AF_USE_KINEMATIC_PHYSICS) ENDIF CONST_INT iCLEANING_0_start 0 CONST_INT iCLEANING_1_wait 1 CONST_INT iCLEANING_2_find 2 CONST_INT iCLEANING_3_enter 3 CONST_INT iCLEANING_4_base 4 CONST_INT iCLEANING_5_exit 5 SWITCH iCleaningStage CASE iCLEANING_0_start #IF IS_DEBUG_BUILD str =("dist_0_start: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF IF DOES_ENTITY_EXIST(cleaning_prop) DELETE_OBJECT(cleaning_prop) eStoredCleaningPropModel = DUMMY_MODEL_FOR_SCRIPT ENDIF IF VDIST2(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount]) >= (1.0*1.0) #IF IS_DEBUG_BUILD DrawDebugFamilySphere(vClean_Pos_x+vClean_offsets[iCleaningCount], 1.0, eColour, 0.15) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK) IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK) NAVDATA sNavdata sNavdata.m_fSlideToCoordHeading = fClean_Head_x+fClean_offsets[iCleaningCount] SEQUENCE_INDEX siseq OPEN_SEQUENCE_TASK(siseq) TASK_FOLLOW_NAV_MESH_TO_COORD_ADVANCED(NULL, vClean_Pos_x+vClean_offsets[iCleaningCount], PEDMOVE_WALK, Time, Radius, NavFlags, sNavdata, fClean_Head_x+fClean_offsets[iCleaningCount]) CLOSE_SEQUENCE_TASK(siseq) TASK_PERFORM_SEQUENCE(PedIndex, siseq) CLEAR_SEQUENCE_TASK(siseq) ENDIF ENDIF ELSE REQUEST_MODEL(eCleaningPropModel) REQUEST_ANIM_DICT(tCleaningEnter_animDict) REQUEST_ANIM_DICT(tCleaningBase_animDict) REQUEST_ANIM_DICT(tCleaningExit_animDict) iCleaningStage = iCLEANING_1_wait ENDIF BREAK CASE iCLEANING_1_wait #IF IS_DEBUG_BUILD str =("dist_1_wait: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) INT iWaitForRequest iWaitForRequest = 0 IF NOT HAS_MODEL_LOADED(eCleaningPropModel) str =("request \"") str +=GET_MODEL_NAME_FOR_DEBUG(eCleaningPropModel) str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4+TO_FLOAT(iWaitForRequest), eColour) iWaitForRequest++ ENDIF IF NOT HAS_ANIM_DICT_LOADED(tCleaningEnter_animDict) str =("request \"") str +=tCleaningEnter_animDict str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4+TO_FLOAT(iWaitForRequest), eColour) iWaitForRequest++ ENDIF IF NOT HAS_ANIM_DICT_LOADED(tCleaningBase_animDict) str =("request \"") str +=tCleaningBase_animDict str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4+TO_FLOAT(iWaitForRequest), eColour) iWaitForRequest++ ENDIF IF NOT HAS_ANIM_DICT_LOADED(tCleaningExit_animDict) str =("request \"") str +=tCleaningExit_animDict str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4+TO_FLOAT(iWaitForRequest), eColour) iWaitForRequest++ ENDIF IF iWaitForRequest = 0 str =("request \"") str +="none" str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4+TO_FLOAT(iWaitForRequest), eColour) ENDIF #ENDIF IF HAS_MODEL_LOADED(eCleaningPropModel) AND HAS_ANIM_DICT_LOADED(tCleaningEnter_animDict) AND HAS_ANIM_DICT_LOADED(tCleaningBase_animDict) AND HAS_ANIM_DICT_LOADED(tCleaningExit_animDict) IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK) NAVDATA sNavdata sNavdata.m_fSlideToCoordHeading = fClean_Head_x+fClean_offsets[iCleaningCount] SEQUENCE_INDEX siseq OPEN_SEQUENCE_TASK(siseq) TASK_FOLLOW_NAV_MESH_TO_COORD_ADVANCED(NULL, vClean_Pos_x+vClean_offsets[iCleaningCount], PEDMOVE_WALK, Time, Radius, NavFlags, sNavdata, fClean_Head_x+fClean_offsets[iCleaningCount]) CLOSE_SEQUENCE_TASK(siseq) TASK_PERFORM_SEQUENCE(PedIndex, siseq) CLEAR_SEQUENCE_TASK(siseq) ENDIF iCleaningStage = iCLEANING_2_find ENDIF BREAK CASE iCLEANING_2_find #IF IS_DEBUG_BUILD str =("dist_2_find: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK) IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex, FALSE), vClean_Pos_x+vClean_offsets[iCleaningCount]) <= 0.5 SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) IF HAS_ANIM_DICT_LOADED(tCleaningEnter_animDict) IF ARE_STRINGS_EQUAL(tCleaningEnter_animDict, "TIMETABLE@MAID@CLEANING_SURFACE_1@") TASK_PLAY_ANIM(PedIndex, tCleaningEnter_animDict, tCleaningEnter_animClip, // vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, WALK_BLEND_IN, INSTANT_BLEND_OUT, -1, eCleaning_animFlag | AF_HOLD_LAST_FRAME, 0.0, DEFAULT, AIK_NONE) ELSE iScene = CREATE_SYNCHRONIZED_SCENE(vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>) TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tCleaningEnter_animDict, tCleaningEnter_animClip, WALK_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, default, WALK_BLEND_IN) ENDIF ELSE CASSERTLN(DEBUG_FAMILY, "missing enter anim dict?") ENDIF iCleaningStage = iCLEANING_3_enter ENDIF ENDIF BREAK CASE iCLEANING_3_enter #IF IS_DEBUG_BUILD str =("dist_3_enter: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF BOOL bFinishedEnterAnim bFinishedEnterAnim = FALSE IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) FLOAT fEnterAnimPhaseTime fEnterAnimPhaseTime = GET_SYNCHRONIZED_SCENE_PHASE(iScene) #IF IS_DEBUG_BUILD str =("enterSync: ") str +=GET_STRING_FROM_FLOAT(fEnterAnimPhaseTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, eColour) #ENDIF IF fEnterAnimPhaseTime >= 0.3 IF NOT DOES_ENTITY_EXIST(cleaning_prop) eStoredCleaningPropModel = eCleaningPropModel cleaning_prop = CREATE_OBJECT(eCleaningPropModel, GET_PED_BONE_COORDS(pedIndex, eCleaningPropAttachBonetag, <<0,0,0>>)) ATTACH_ENTITY_TO_ENTITY(cleaning_prop, pedIndex, GET_PED_BONE_INDEX(pedIndex, eCleaningPropAttachBonetag), <<0,0,0>>, <<0,0,0>>, TRUE, DEFAULT, TRUE) ENDIF ENDIF IF fEnterAnimPhaseTime >= 0.99 bFinishedEnterAnim = TRUE ENDIF ELIF IS_ENTITY_PLAYING_ANIM(PedIndex, tCleaningEnter_animDict, tCleaningEnter_animClip) FLOAT fEnterAnimPhaseTime fEnterAnimPhaseTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tCleaningEnter_animDict, tCleaningEnter_animClip) #IF IS_DEBUG_BUILD str =("enterAnim: ") str +=GET_STRING_FROM_FLOAT(fEnterAnimPhaseTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, eColour) #ENDIF IF fEnterAnimPhaseTime >= 0.3 IF NOT DOES_ENTITY_EXIST(cleaning_prop) eStoredCleaningPropModel = eCleaningPropModel cleaning_prop = CREATE_OBJECT(eCleaningPropModel, GET_PED_BONE_COORDS(pedIndex, eCleaningPropAttachBonetag, <<0,0,0>>)) ATTACH_ENTITY_TO_ENTITY(cleaning_prop, pedIndex, GET_PED_BONE_INDEX(pedIndex, eCleaningPropAttachBonetag), <<0,0,0>>, <<0,0,0>>, TRUE, DEFAULT, TRUE) ENDIF ENDIF IF fEnterAnimPhaseTime >= 0.99 bFinishedEnterAnim = TRUE ENDIF ELSE bFinishedEnterAnim = TRUE ENDIF IF bFinishedEnterAnim IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) ENDIF iScene = -1 IF HAS_ANIM_DICT_LOADED(tCleaningBase_animDict) // TASK_PLAY_ANIM_ADVANCED(PedIndex, tCleaningBase_animDict, tCleaningBase_animClip, // vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, // INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eCleaning_animFlag | AF_HOLD_LAST_FRAME, // 0.0, EULER_YXZ, AIK_NONE) TASK_PLAY_ANIM(PedIndex, tCleaningBase_animDict, tCleaningBase_animClip, // vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eCleaning_animFlag | AF_HOLD_LAST_FRAME, 0.0, DEFAULT, AIK_NONE) ELSE CASSERTLN(DEBUG_FAMILY, "missing base anim dict?") ENDIF iCleaningStage = iCLEANING_4_base ENDIF BREAK CASE iCLEANING_4_base #IF IS_DEBUG_BUILD str =("dist_4_base: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF BOOL bFinishedBaseAnim bFinishedBaseAnim = FALSE IF IS_ENTITY_PLAYING_ANIM(PedIndex, tCleaningBase_animDict, tCleaningBase_animClip) FLOAT fBaseAnimPhaseTime fBaseAnimPhaseTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tCleaningBase_animDict, tCleaningBase_animClip) #IF IS_DEBUG_BUILD str =("baseAnim: ") str +=GET_STRING_FROM_FLOAT(fBaseAnimPhaseTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, eColour) #ENDIF IF fBaseAnimPhaseTime >= 0.99 bFinishedBaseAnim = TRUE ENDIF ELSE bFinishedBaseAnim = TRUE ENDIF IF bFinishedBaseAnim IF HAS_ANIM_DICT_LOADED(tCleaningExit_animDict) // TASK_PLAY_ANIM_ADVANCED(PedIndex, tCleaningExit_animDict, tCleaningExit_animClip, // vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, // INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, eCleaning_animFlag | AF_HOLD_LAST_FRAME, // 0.0, EULER_YXZ, AIK_NONE) TASK_PLAY_ANIM(PedIndex, tCleaningExit_animDict, tCleaningExit_animClip, // vClean_Pos_x+vClean_offsets[iCleaningCount], <<0,0,fClean_Head_x+fClean_offsets[iCleaningCount]>>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, eCleaning_animFlag, 0.0, DEFAULT, AIK_NONE) ELSE CASSERTLN(DEBUG_FAMILY, "missing exit anim dict?") ENDIF iCleaningStage = iCLEANING_5_exit ENDIF BREAK CASE iCLEANING_5_exit #IF IS_DEBUG_BUILD str =("dist_5_exit: ") str +=GET_STRING_FROM_FLOAT(VDIST(GET_ENTITY_COORDS(PedIndex),vClean_Pos_x+vClean_offsets[iCleaningCount])) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, eColour) #ENDIF BOOL bFinishedExitAnim bFinishedExitAnim = FALSE IF IS_ENTITY_PLAYING_ANIM(PedIndex, tCleaningExit_animDict, tCleaningExit_animClip) FLOAT fExitAnimPhaseTime fExitAnimPhaseTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tCleaningExit_animDict, tCleaningExit_animClip) #IF IS_DEBUG_BUILD str =("exitAnim: ") str +=GET_STRING_FROM_FLOAT(fExitAnimPhaseTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, eColour) #ENDIF IF fExitAnimPhaseTime >= 0.7 IF DOES_ENTITY_EXIST(cleaning_prop) DELETE_OBJECT(cleaning_prop) eStoredCleaningPropModel = DUMMY_MODEL_FOR_SCRIPT ENDIF ENDIF ELSE bFinishedExitAnim = TRUE ENDIF IF bFinishedExitAnim SET_MODEL_AS_NO_LONGER_NEEDED(eCleaningPropModel) REMOVE_ANIM_DICT(tCleaningEnter_animDict) REMOVE_ANIM_DICT(tCleaningBase_animDict) REMOVE_ANIM_DICT(tCleaningExit_animDict) iCleaningCount++ IF iCleaningCount >= COUNT_OF(vClean_offsets) iCleaningCount = 0 ENDIF CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) iCleaningStage = iCLEANING_0_start ENDIF BREAK ENDSWITCH RETURN TRUE ENDIF ENDIF ENDIF bMovePeds = bMovePeds RETURN FALSE ENDFUNC //#IF IS_DEBUG_BUILD //structTimer sDebugTimerForUpdatingFamilyEvents //#ENDIF FUNC BOOL PRIVATE_Update_Family_Event_For_Anim(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eUpdatedFamilyEvent) IF (g_eCurrentFamilyEvent[eFamilyMember] <> eUpdatedFamilyEvent) TEXT_LABEL_63 tFamilyAnimDict, tFamilyAnimClip ANIMATION_FLAGS eFamilyAnimFlag enumFamilyAnimProgress eFamilyAnimProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, g_eCurrentFamilyEvent[eFamilyMember], tFamilyAnimDict, tFamilyAnimClip, eFamilyAnimFlag, eFamilyAnimProgress) IF IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilyAnimDict, tFamilyAnimClip) FLOAT fFamilyAnimClip fFamilyAnimClip = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilyAnimDict, tFamilyAnimClip) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, " * family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] playing anim \"", tFamilyAnimDict, "\", \"", tFamilyAnimClip, "\" ", fFamilyAnimClip) #ENDIF IF fFamilyAnimClip >= 0.95 g_eCurrentFamilyEvent[eFamilyMember] = eUpdatedFamilyEvent RETURN TRUE ENDIF ELSE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, " * family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] NOT playing anim \"", tFamilyAnimDict, "\", \"", tFamilyAnimClip, "\"") #ENDIF ENDIF RETURN FALSE ENDIF #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, " * family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] has no anim") #ENDIF RETURN FALSE ELSE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, " * family_ped[", Get_String_From_FamilyMember(eFamilyMember), "] current event = ", Get_String_From_FamilyEvent(eUpdatedFamilyEvent)) #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Wander(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead) VECTOR vWanderOffset FLOAT fWanderHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vWanderOffset, fWanderHead) //TASK_WANDER_STANDARD(PedIndex) IF NOT (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) = PERFORMING_TASK) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_Wander") TASK_WANDER_IN_AREA(PedIndex, vSequencePos+vWanderOffset, 25.0) ELSE #IF IS_DEBUG_BUILD DrawDebugFamilySphere(vSequencePos+vWanderOffset, 25.0, HUD_COLOUR_GREEN, 0.5) #ENDIF ENDIF fSequenceHead = fSequenceHead RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Facial(PED_INDEX PedIndex, TEXT_LABEL_63 tFamilySleepingDict, TEXT_LABEL_63 tFamilySleepingClip, ANIMATION_FLAGS AF_extraFacial = AF_DEFAULT) IF IS_STRING_NULL_OR_EMPTY(tFamilySleepingDict) RETURN FALSE ENDIF #IF IS_DEBUG_BUILD TEXT_LABEL_63 str HUD_COLOURS animHudColour = HUD_COLOUR_PINK #ENDIF REQUEST_ANIM_DICT(tFamilySleepingDict) IF NOT HAS_ANIM_DICT_LOADED(tFamilySleepingDict) REQUEST_ANIM_DICT(tFamilySleepingDict) #IF IS_DEBUG_BUILD str = ("request: ") str += ("\"") str += (tFamilySleepingDict) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, animHudColour) #ENDIF RETURN FALSE ELSE IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tFamilySleepingDict, tFamilySleepingClip) TASK_PLAY_ANIM(PedIndex, tFamilySleepingDict, tFamilySleepingClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY | AF_extraFacial) #IF IS_DEBUG_BUILD str = ("TASK_PLAY_ANIM \"") // str += (tFamilySleepingDict) // str += ("\", \"") str += (tFamilySleepingClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, animHudColour) #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD str = ("anim \"") // str += (tFamilySleepingDict) // str += ("\", \"") str += (tFamilySleepingClip) str += ("\" ") str += GET_STRING_FROM_FLOAT(GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tFamilySleepingDict, tFamilySleepingClip)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, animHudColour) #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Sleeping(PED_INDEX PedIndex) /* Added to DICTIONARY: - facials@generic ANIM: - mood_Sleeping NOTE: This will be moved to a new dictionary structure at some point in the next month or so. */ TEXT_LABEL_63 tFamilySleepingDict = "facials@gen_male@base" //"facials@generic" IF NOT IS_PED_MALE(PedIndex) tFamilySleepingDict = "facials@gen_female@base" ENDIF TEXT_LABEL_63 tFamilySleepingClip = "mood_sleeping_1" //"mood_Sleeping" RETURN PRIVATE_Update_Family_Facial(PedIndex, tFamilySleepingDict, tFamilySleepingClip, AF_LOOPING) ENDFUNC FUNC BOOL PRIVATE_SetFamilyMemberPedCapsule(enumFamilyMember eFamilyMember, FLOAT &fCapsuleRadius) // SWITCH g_eCurrentFamilyEvent[eFamilyMember] CASE FE_M_SON_on_ecstasy_AND_friendly fCapsuleRadius = (0.4) RETURN TRUE BREAK CASE FE_M_SON_Fighting_with_sister_A fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M_SON_Fighting_with_sister_B fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M_SON_Fighting_with_sister_C fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M_SON_Fighting_with_sister_D fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M7_SON_jumping_jacks fCapsuleRadius = (0.5) RETURN TRUE BREAK CASE FE_M_DAUGHTER_screaming_at_dad fCapsuleRadius = (1.25) RETURN TRUE BREAK CASE FE_M_DAUGHTER_dancing_practice fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M2_MEXMAID_clean_window CASE FE_M7_MEXMAID_clean_window CASE FE_M_MEXMAID_MIC4_clean_window fCapsuleRadius = (0.5) RETURN TRUE BREAK CASE FE_M_MEXMAID_does_the_dishes fCapsuleRadius = (0.5) RETURN TRUE BREAK CASE FE_M2_WIFE_doing_yoga CASE FE_M7_WIFE_doing_yoga fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_M_GARDENER_mowing_lawn fCapsuleRadius = (1.0) RETURN TRUE BREAK // CASE FE_F_LAMAR_and_STRETCH_chill_outside // fCapsuleRadius = (0.50) RETURN TRUE // BREAK CASE FE_T0_MICHAEL_depressed_head_in_hands fCapsuleRadius = (0.50) RETURN TRUE BREAK CASE FE_T0_MICHAEL_sunbathing fCapsuleRadius = (0.80) RETURN TRUE BREAK CASE FE_T0_RONEX_doing_target_practice fCapsuleRadius = (0.75) RETURN TRUE BREAK CASE FE_T0_TREVOR_smoking_crystal fCapsuleRadius = (1.5) RETURN TRUE BREAK #IF NOT IS_JAPANESE_BUILD CASE FE_T0_TREVOR_doing_a_shit fCapsuleRadius = (1.25) RETURN TRUE BREAK #ENDIF CASE FE_T0_KIDNAPPED_WIFE_does_garden_work fCapsuleRadius = (0.8) RETURN TRUE BREAK CASE FE_T1_FLOYD_cleaning fCapsuleRadius = (0.50) RETURN TRUE BREAK CASE FE_ANY_find_family_event CASE FE_ANY_wander_family_event IF eFamilyMember = FM_TREVOR_1_FLOYD OR eFamilyMember = FM_TREVOR_1_FLOYD fCapsuleRadius = (0.30) RETURN TRUE ENDIF BREAK ENDSWITCH fCapsuleRadius = 0.0 RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Is_Family_Sleeping(enumFamilyEvents eFamilyEvent) SWITCH eFamilyEvent CASE FE_M_SON_sleeping CASE FE_M_DAUGHTER_sleeping CASE FE_M_DAUGHTER_couchsleep CASE FE_M2_WIFE_sleeping CASE FE_M7_WIFE_sleeping CASE FE_T1_FLOYD_is_sleeping RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_GotoCoord(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead, TEXT_LABEL_63 &tSynchDict, TEXT_LABEL_63 &tSynchClip, INT &iScene, OBJECT_INDEX leftObj, OBJECT_INDEX rightObj, BOOL bMovePeds) #IF IS_DEBUG_BUILD IF bMovePeds RETURN TRUE ENDIF #ENDIF VECTOR vWanderOffset FLOAT fWanderHead IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vWanderOffset, fWanderHead) CONST_FLOAT fFAMILY_GOTO_DIST_CHECK_RADIUS 4.0 //1.0 CONST_FLOAT fFAMILY_GOTO_NAVMESH_RADIUS DEFAULT_NAVMESH_RADIUS IF VDIST2(GET_ENTITY_COORDS(PedIndex),vSequencePos+vWanderOffset) > (fFAMILY_GOTO_DIST_CHECK_RADIUS*fFAMILY_GOTO_DIST_CHECK_RADIUS) IF NOT (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord") TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vSequencePos+vWanderOffset, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, fFAMILY_GOTO_NAVMESH_RADIUS, ENAV_DEFAULT, fSequenceHead+fWanderHead) IF NOT IS_STRING_NULL_OR_EMPTY(tSynchDict) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - dict \"", tSynchDict, "\" is nulled") tSynchDict = "" ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tSynchClip) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - clip \"", tSynchClip, "\" is nulled") tSynchClip = "" ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) ENDIF iScene = -1 ELSE #IF IS_DEBUG_BUILD DrawDebugFamilySphere(vSequencePos+vWanderOffset, fFAMILY_GOTO_DIST_CHECK_RADIUS, HUD_COLOUR_GREEN, 0.25) DrawDebugFamilyLine(vSequencePos+vWanderOffset, GET_ENTITY_COORDS(PedIndex), HUD_COLOUR_GREEN) DrawDebugFamilyTextWithOffset("go to coord", GET_ENTITY_COORDS(PedIndex), 4, HUD_COLOUR_GREEN) #ENDIF ENDIF ELSE IF NOT (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK) IF DOES_ENTITY_EXIST(leftObj) IF IS_ENTITY_ATTACHED_TO_ENTITY(leftObj, PedIndex) IF NOT IS_ENTITY_VISIBLE(leftObj) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - SET_ENTITY_VISIBLE(leftObj)") SET_ENTITY_VISIBLE(leftObj, TRUE) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(rightObj) IF IS_ENTITY_ATTACHED_TO_ENTITY(rightObj, PedIndex) IF NOT IS_ENTITY_VISIBLE(rightObj) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - SET_ENTITY_VISIBLE(rightObj)") SET_ENTITY_VISIBLE(rightObj, TRUE) ENDIF ENDIF ENDIF FLOAT fCapsuleRadius IF PRIVATE_SetFamilyMemberPedCapsule(eFamilyMember, fCapsuleRadius) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "<", GET_THIS_SCRIPT_NAME(), "> family member[", Get_String_From_FamilyMember(eFamilyMember), "] \"", Get_String_From_FamilyEvent(g_eCurrentFamilyEvent[eFamilyMember]), "\" SET_PED_CAPSULE ", fCapsuleRadius) #ENDIF SET_PED_CAPSULE(PedIndex, fCapsuleRadius) ENDIF RETURN TRUE ENDIF ENDIF IF DOES_ENTITY_EXIST(leftObj) IF IS_ENTITY_ATTACHED_TO_ENTITY(leftObj, PedIndex) IF IS_ENTITY_VISIBLE(leftObj) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - SET_ENTITY_INVISIBLE(leftObj)") SET_ENTITY_VISIBLE(leftObj, FALSE) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(rightObj) IF IS_ENTITY_ATTACHED_TO_ENTITY(rightObj, PedIndex) IF IS_ENTITY_VISIBLE(rightObj) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_GotoCoord - SET_ENTITY_INVISIBLE(rightObj)") SET_ENTITY_VISIBLE(rightObj, FALSE) ENDIF ENDIF ENDIF SET_PED_CAPSULE(PedIndex, 0.3) RETURN FALSE ENDIF bMovePeds = bMovePeds RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Hangup(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eUpdatedFamilyEvent, STRING strTextBlock, STRING strLabel, TEXT_LABEL &tCreatedConvLabels[], structPedsForConversation &inSpeechStruct, structTimer &speechTimer, enumFamilyEvents &ePrevFamilyEvent, enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "" CONST_FLOAT Offset_y 3.0 HUD_COLOURS animHudColour = HUD_COLOUR_GREEN #ENDIF IF (g_eCurrentFamilyEvent[eFamilyMember] <> eUpdatedFamilyEvent) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff str =("updated event <> ") str +=(Get_String_From_FamilyEvent(eUpdatedFamilyEvent)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y, animHudColour) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF g_bUpdatedFamilyEvents OR (IS_KEYBOARD_KEY_PRESSED(KEY_LEFT) OR IS_KEYBOARD_KEY_PRESSED(KEY_RIGHT)) str =(" ## restart timer reset at ") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) RETURN FALSE ENDIF #ENDIF // IF IS_ENTITY_OCCLUDED(PedIndex) // #IF IS_DEBUG_BUILD // IF g_bDrawDebug""FamilyStuff // str =("PRIVATE_Update_Family_Hangup.IS_ENTITY_OCCLUDED()") // DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) // ENDIF // #ENDIF // // RETURN FALSE // ENDIF IF NOT IS_ENTITY_ON_SCREEN(PedIndex) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff str =("PRIVATE_Update_Family_Hangup.IS_ENTITY_ON_SCREEN()") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) ENDIF #ENDIF RETURN FALSE ENDIF CONST_FLOAT fCONST_min_hangup_dist 7.0 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) > (fCONST_min_hangup_dist*fCONST_min_hangup_dist) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff str =("PRIVATE_Update_Family_Hangup.VDIST()") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex, FALSE), fCONST_min_hangup_dist, animHudColour, 0.1) ENDIF #ENDIF RETURN FALSE ENDIF IF IS_ANY_SPEECH_PLAYING(PedIndex) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff str =("PRIVATE_Update_Family_Hangup.IS_ANY_SPEECH_PLAYING()") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) ENDIF #ENDIF RETURN FALSE ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(strLabel) //play "hang up" dialogue INT iRandCount, iSpeechBit, iPlayerBitset Get_SpeechLabel_From_FamilyEvent(eUpdatedFamilyEvent, iRandCount, iSpeechBit, iPlayerBitset) IF NOT IS_BITMASK_SET(iPlayerBitset, GET_CURRENT_PLAYER_PED_BIT()) CPRINTLN(DEBUG_FAMILY, "hangup - invalid IS_BITMASK_SET") RETURN FALSE ENDIF //is the speech a single line or is it a random conv IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) IF NOT IS_STRING_NULL_OR_EMPTY(strLabel) IF Is_Ped_Playing_Family_Speech(strTextBlock, strLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) g_eCurrentFamilyEvent[eFamilyMember] = eUpdatedFamilyEvent RETURN TRUE ENDIF ELSE CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Hangup(", Get_String_From_FamilyMember(eFamilyMember), ", current:", Get_String_From_FamilyEvent(g_eCurrentFamilyEvent[eFamilyMember]), ", updated:", Get_String_From_FamilyEvent(eUpdatedFamilyEvent), ") - attempting to play an empty single random line??") ENDIF ELSE TEXT_LABEL returnedStrLabel = strLabel IF GetRandomConversationFromLabel(strTextBlock, returnedStrLabel, tCreatedConvLabels) IF NOT IS_STRING_NULL_OR_EMPTY(returnedStrLabel) IF Is_Ped_Playing_Family_Speech(strTextBlock, returnedStrLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) g_eCurrentFamilyEvent[eFamilyMember] = eUpdatedFamilyEvent RETURN TRUE ENDIF ELSE CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Hangup(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(g_eCurrentFamilyEvent[eFamilyMember]), ", updated:", Get_String_From_FamilyEvent(eUpdatedFamilyEvent), ") - attempting to play an empty multiple random line??") ENDIF ENDIF ENDIF RETURN FALSE ENDIF g_eCurrentFamilyEvent[eFamilyMember] = eUpdatedFamilyEvent ePrevFamilyEvent = g_eCurrentFamilyEvent[eFamilyMember] RETURN TRUE ELSE #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff str =(" * family_ped[") str +=(Get_String_From_FamilyMember(eFamilyMember)) str +=("] current event = ") str +=(Get_String_From_FamilyEvent(eUpdatedFamilyEvent)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y, animHudColour) ENDIF #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Hangup_And_Wander(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, TEXT_LABEL_63 &tAnimDict, TEXT_LABEL_63 &tAnimClip, INT &iHangupStage, OBJECT_INDEX &phoneProp, MODEL_NAMES &ePhonePropModel, BOOL bDeletePhoneProp) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "" CONST_FLOAT Offset_y 2.0 HUD_COLOURS animHudColour = HUD_COLOUR_GREEN #ENDIF SWITCH iHangupStage CASE 0 #IF IS_DEBUG_BUILD str =("play hangup anim...") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+0.0, animHudColour) #ENDIF tAnimDict = "" tAnimDict = "" TEXT_LABEL_63 sHangup_animDict, sHangup_animClip ANIMATION_FLAGS eHangup_animFlag enumFamilyAnimProgress eFamilyAnimProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, sHangup_animDict, sHangup_animClip, eHangup_animFlag, eFamilyAnimProgress) ENDIF IF (eFamilyAnimProgress <> FAP_2_dialogue) REQUEST_ANIM_DICT(sHangup_animDict) IF NOT HAS_ANIM_DICT_LOADED(sHangup_animDict) #IF IS_DEBUG_BUILD str =("requesting \"") str +=(sHangup_animDict) str +=("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) #ENDIF RETURN FALSE ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(eHangup_animFlag, AF_LOOPING) CLEAR_BITMASK_ENUM_AS_ENUM(eHangup_animFlag, AF_LOOPING) ELSE // ENDIF TASK_PLAY_ANIM(PedIndex, sHangup_animDict, sHangup_animClip, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, eHangup_animFlag) tAnimDict = sHangup_animDict tAnimClip = sHangup_animClip CPRINTLN(DEBUG_FAMILY, "PRIVATE_Get_FamilyMember_Anim(\"", tAnimDict, "\", \"", tAnimClip, "\")") iHangupStage = 1 ELSE IF PRIVATE_Update_Family_DialogueAnim(PedIndex, eFamilyMember, eFamilyEvent, tAnimDict, tAnimClip, vFamilyScenePos, fFamilySceneHead) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_DialogueAnim(\"", tAnimDict, "\", \"", tAnimClip, ") //", Get_String_From_FamilyEvent(eFamilyEvent)) #ENDIF iHangupStage = 1 ELSE #IF IS_DEBUG_BUILD str =("waiting on dialogue anim...") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) #ENDIF ENDIF ENDIF BREAK CASE 1 #IF IS_DEBUG_BUILD str =("playing hangup anim \"") str +=(tAnimClip) str +=("\" ") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+0.0, animHudColour) #ENDIF IF IS_ENTITY_PLAYING_ANIM(PedIndex, tAnimDict, tAnimClip) FLOAT fHangupAnimCurrentTime fHangupAnimCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(PedIndex, tAnimDict, tAnimClip) #IF IS_DEBUG_BUILD str =("anim time:") str += GET_STRING_FROM_FLOAT(fHangupAnimCurrentTime) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+1.0, animHudColour) #ENDIF IF fHangupAnimCurrentTime >= 1.0 CLEAR_PED_TASKS(PedIndex) ENDIF IF DOES_ENTITY_EXIST(phoneProp) STRING pEventName pEventName = "hangup" FLOAT ReturnStartPhase, ReturnEndPhase IF FIND_ANIM_EVENT_PHASE(tAnimDict, tAnimClip, pEventName, ReturnStartPhase, ReturnEndPhase) ELSE ReturnStartPhase = -1 IF ARE_STRINGS_EQUAL(tAnimDict, "TIMETABLE@MAID@IG_8@") IF ARE_STRINGS_EQUAL(tAnimClip, "IG_8_IDLE_A") ReturnStartPhase = 0.85 ENDIF ENDIF IF ReturnStartPhase < 0 #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_FAMILY, "\"", pEventName, "\" missing from \"", tAnimDict, "/", tAnimClip, "\"") #ENDIF ReturnStartPhase = 0.5 ENDIF ENDIF IF fHangupAnimCurrentTime < ReturnStartPhase #IF IS_DEBUG_BUILD IF bDeletePhoneProp str =("delete time:") ELSE str =("detach time:") ENDIF str += GET_STRING_FROM_FLOAT(ReturnStartPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+2.0, animHudColour) #ENDIF ELSE #IF IS_DEBUG_BUILD IF bDeletePhoneProp str =("deleting:") ELSE str =("detaching:") ENDIF str += GET_STRING_FROM_FLOAT(ReturnStartPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+2.0, animHudColour) #ENDIF IF IS_ENTITY_ATTACHED(phoneProp) DETACH_ENTITY(phoneProp) ENDIF IF bDeletePhoneProp ePhonePropModel = DUMMY_MODEL_FOR_SCRIPT DELETE_OBJECT(phoneProp) ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD IF bDeletePhoneProp str =("deleted (no prop)") ELSE str =("detached (no prop)") ENDIF DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+2.0, animHudColour) #ENDIF ENDIF ELSE IF DOES_ENTITY_EXIST(phoneProp) IF IS_ENTITY_ATTACHED(phoneProp) DETACH_ENTITY(phoneProp) ENDIF IF bDeletePhoneProp ePhonePropModel = DUMMY_MODEL_FOR_SCRIPT DELETE_OBJECT(phoneProp) ENDIF ENDIF tAnimDict = "" tAnimClip = "" iHangupStage = 2 ENDIF BREAK CASE 2 #IF IS_DEBUG_BUILD str =("..wander") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+0.0, animHudColour) #ENDIF IF bDeletePhoneProp IF DOES_ENTITY_EXIST(phoneProp) CASSERTLN(DEBUG_FAMILY, "phoneProp exists???") ENDIF ENDIF PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_wander_family_event) iHangupStage = 0 RETURN TRUE BREAK DEFAULT #IF IS_DEBUG_BUILD str =("DEFAULT ") str +=iHangupStage DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), Offset_y+0.0, animHudColour) CASSERTLN(DEBUG_FAMILY, str) #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Trigger_Family_Argue(PED_INDEX PedIndex, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead) #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_PRESSED(KEY_S) RETURN TRUE ENDIF HUD_COLOURS eHudColour = HUD_COLOUR_ORANGELIGHT #ENDIF CONST_FLOAT fDEFAULT_ArgueRad 4.0 SWITCH eFamilyEvent CASE FE_M2_SON_gaming_loop // CONST_FLOAT fSON_gaming_ArgueRad fDEFAULT_ArgueRad // // #IF IS_DEBUG_BUILD // DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fSON_gaming_ArgueRad, eHudColour, 0.25) // #ENDIF // // IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fSON_gaming_ArgueRad)*(fSON_gaming_ArgueRad)) // RETURN TRUE // ENDIF /* IF IS_THIS_TV_ON(TV_LOC_JIMMY_BEDROOM) IF NOT IS_THIS_TV_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM) CASSERTLN(DEBUG_FAMILY, "NOT IS_THIS_TV_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM)") RETURN TRUE ENDIF //#1445897 IF IS_TVSHOW_CURRENTLY_PLAYING(HASH("END_OF_MOVIE_MARKER")) CASSERTLN(DEBUG_FAMILY, "IS_TVSHOW_CURRENTLY_PLAYING") RETURN TRUE ENDIF ENDIF*/ RETURN FALSE BREAK CASE FE_M7_SON_gaming CONST_FLOAT fSON_gaming_ArgueRad fDEFAULT_ArgueRad /* #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fSON_gaming_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fSON_gaming_ArgueRad)*(fSON_gaming_ArgueRad)) RETURN TRUE ENDIF IF IS_THIS_TV_ON(TV_LOC_JIMMY_BEDROOM) IF NOT IS_THIS_TV_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM) CASSERTLN(DEBUG_FAMILY, "NOT IS_THIS_TV_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM)") RETURN TRUE ENDIF ENDIF */ RETURN FALSE BREAK CASE FE_M_SON_Fighting_with_sister_A FALLTHRU CASE FE_M_SON_Fighting_with_sister_B FALLTHRU CASE FE_M_SON_Fighting_with_sister_C FALLTHRU CASE FE_M_SON_Fighting_with_sister_D CONST_FLOAT fSON_Fighting_with_sister_ArgueRad 7.5 CONST_FLOAT fSON_Fighting_with_sister_ArgueRad_VEHICLE 15.0 #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fSON_Fighting_with_sister_ArgueRad, eHudColour, 0.25) #ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fSON_Fighting_with_sister_ArgueRad_VEHICLE)*(fSON_Fighting_with_sister_ArgueRad_VEHICLE)) RETURN TRUE ENDIF ELSE IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fSON_Fighting_with_sister_ArgueRad)*(fSON_Fighting_with_sister_ArgueRad)) RETURN TRUE ENDIF ENDIF RETURN FALSE BREAK CASE FE_M_DAUGHTER_screaming_at_dad FALLTHRU CONST_FLOAT fDAUGHTER_screaming_at_dad_ArgueRad 8.5 #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fDAUGHTER_screaming_at_dad_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fDAUGHTER_screaming_at_dad_ArgueRad)*(fDAUGHTER_screaming_at_dad_ArgueRad)) RETURN TRUE ENDIF RETURN FALSE BREAK // CASE FE_M_WIFE_screaming_at_son_P1 FALLTHRU CASE FE_M_WIFE_screaming_at_son_P2 FALLTHRU CASE FE_M_WIFE_screaming_at_son_P3 FALLTHRU CONST_FLOAT fWIFE_screaming_at_son_ArgueRad 5.0 #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fWIFE_screaming_at_son_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fWIFE_screaming_at_son_ArgueRad)*(fWIFE_screaming_at_son_ArgueRad)) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_M_WIFE_screaming_at_daughter CONST_FLOAT fWIFE_screaming_at_daughter_ArgueRad 5.0 #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fWIFE_screaming_at_daughter_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fWIFE_screaming_at_daughter_ArgueRad)*(fWIFE_screaming_at_daughter_ArgueRad)) RETURN TRUE ENDIF VECTOR WIFE_screaming_at_daughter_VecCentre, WIFE_screaming_at_daughter_VecBounds FLOAT WIFE_screaming_at_daughter_fAngle WIFE_screaming_at_daughter_VecCentre = <<-0.4200, 0.6800, 1.0000>> WIFE_screaming_at_daughter_VecBounds = <<4.5000, 2.7500, 1.0000>> WIFE_screaming_at_daughter_fAngle = -22.0000 /* START_WIDGET_GROUP("FE_M_WIFE_screaming_at_daughter") ADD_WIDGET_VECTOR_SLIDER("VecCentre", WIFE_screaming_at_daughter_VecCentre, -20.0, 20.0, 0.01) ADD_WIDGET_VECTOR_SLIDER("VecBounds", WIFE_screaming_at_daughter_VecBounds, 0.5, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("fAngle", WIFE_screaming_at_daughter_fAngle, -360.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_screaming_at_daughter_VecCentre, WIFE_screaming_at_daughter_VecBounds, fSequenceHead+WIFE_screaming_at_daughter_fAngle) ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screaming_at_daughter_VecCentre = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_screaming_at_daughter_VecCentre)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screaming_at_daughter_VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_screaming_at_daughter_VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screaming_at_daughter_fAngle = ")SAVE_FLOAT_TO_DEBUG_FILE(WIFE_screaming_at_daughter_fAngle)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN TRUE ENDIF WAIT(0) ENDWHILE */ IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_screaming_at_daughter_VecCentre, WIFE_screaming_at_daughter_VecBounds, fSequenceHead+WIFE_screaming_at_daughter_fAngle) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_M_WIFE_screams_at_mexmaid CONST_FLOAT fWIFE_screams_at_mexmaid_ArgueRad 3.0 #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fWIFE_screams_at_mexmaid_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fWIFE_screams_at_mexmaid_ArgueRad)*(fWIFE_screams_at_mexmaid_ArgueRad)) RETURN TRUE ENDIF VECTOR WIFE_screams_at_mexmaid_VecCentre, WIFE_screams_at_mexmaid_VecBounds FLOAT WIFE_screams_at_mexmaid_fAngle WIFE_screams_at_mexmaid_VecCentre = <<10.8751, 2.6168, 1.4700>> WIFE_screams_at_mexmaid_VecBounds = <<7.5000, 3.0000, 1.5000>> WIFE_screams_at_mexmaid_fAngle = -21.0000 /* START_WIDGET_GROUP("FE_M_WIFE_screams_at_mexmaid") ADD_WIDGET_VECTOR_SLIDER("VecCentre", WIFE_screams_at_mexmaid_VecCentre, -20.0, 20.0, 0.01) ADD_WIDGET_VECTOR_SLIDER("VecBounds", WIFE_screams_at_mexmaid_VecBounds, 0.5, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("fAngle", WIFE_screams_at_mexmaid_fAngle, -360.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_screams_at_mexmaid_VecCentre, WIFE_screams_at_mexmaid_VecBounds, fSequenceHead+WIFE_screams_at_mexmaid_fAngle) ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screams_at_mexmaid_VecCentre = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_screams_at_mexmaid_VecCentre)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screams_at_mexmaid_VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_screams_at_mexmaid_VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_screams_at_mexmaid_fAngle = ")SAVE_FLOAT_TO_DEBUG_FILE(WIFE_screams_at_mexmaid_fAngle)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN TRUE ENDIF WAIT(0) ENDWHILE */ IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_screams_at_mexmaid_VecCentre, WIFE_screams_at_mexmaid_VecBounds, fSequenceHead+WIFE_screams_at_mexmaid_fAngle) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_M2_WIFE_with_shopping_bags_enter FALLTHRU CASE FE_M7_WIFE_with_shopping_bags_enter FALLTHRU CASE FE_M7_WIFE_shopping_with_daughter //FALLTHRU // CASE FE_M7_WIFE_shopping_with_son DOOR_DATA_STRUCT sData_M_Mansion_F_L, sData_M_Mansion_F_R sData_M_Mansion_F_L = GET_DOOR_DATA(DOORNAME_M_MANSION_F_L) sData_M_Mansion_F_R = GET_DOOR_DATA(DOORNAME_M_MANSION_F_R) IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(sData_M_Mansion_F_L.doorHash) OR NOT IS_DOOR_REGISTERED_WITH_SYSTEM(sData_M_Mansion_F_R.doorHash) //ADD_DOOR_TO_SYSTEM(sData_M_Mansion_F_L.doorHash, ObjectModel, vecPos) #IF IS_DEBUG_BUILD IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(sData_M_Mansion_F_L.doorHash) DrawDebugFamilyTextWithOffset("sData_M_Mansion_F_L not in system", sData_M_Mansion_F_L.coords, 0, HUD_COLOUR_RED) ENDIF IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(sData_M_Mansion_F_R.doorHash) DrawDebugFamilyTextWithOffset("sData_M_Mansion_F_R not in system", sData_M_Mansion_F_R.coords, 0, HUD_COLOUR_RED) ENDIF #ENDIF RETURN FALSE ELSE // FLOAT fDoorLeftOpenRatio, fDoorRightOpenRatio fDoorLeftOpenRatio = ABSF(DOOR_SYSTEM_GET_OPEN_RATIO(sData_M_Mansion_F_L.doorHash)) fDoorRightOpenRatio = ABSF(DOOR_SYSTEM_GET_OPEN_RATIO(sData_M_Mansion_F_R.doorHash)) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str str = "Mansion_F_L open:" str += GET_STRING_FROM_FLOAT(fDoorLeftOpenRatio) DrawDebugFamilyTextWithOffset(str, sData_M_Mansion_F_L.coords, 0, HUD_COLOUR_RED) str = "Mansion_F_R open:" str += GET_STRING_FROM_FLOAT(fDoorRightOpenRatio) DrawDebugFamilyTextWithOffset(str, sData_M_Mansion_F_R.coords, 0, HUD_COLOUR_RED) #ENDIF IF fDoorLeftOpenRatio >= 0.1 OR fDoorRightOpenRatio >= 0.1 RETURN FALSE ENDIF ENDIF VECTOR WIFE_with_shopping_VecCentre, WIFE_with_shopping_VecBounds FLOAT WIFE_with_shopping_fAngle WIFE_with_shopping_VecCentre = <<-0.72, 0.52, 1.0>> WIFE_with_shopping_VecBounds = <<3.0, 3.0, 1.0>> WIFE_with_shopping_fAngle = -22.00 /* START_WIDGET_GROUP("FE_M_WIFE_with_shopping") ADD_WIDGET_VECTOR_SLIDER("VecCentre", WIFE_with_shopping_VecCentre, -20.0, 20.0, 0.01) ADD_WIDGET_VECTOR_SLIDER("VecBounds", WIFE_with_shopping_VecBounds, 0.5, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("fAngle", WIFE_with_shopping_fAngle, -360.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_with_shopping_VecCentre, WIFE_with_shopping_VecBounds, fSequenceHead+WIFE_with_shopping_fAngle) ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_with_shopping_VecCentre = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_with_shopping_VecCentre)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_with_shopping_VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(WIFE_with_shopping_VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("WIFE_with_shopping_fAngle = ")SAVE_FLOAT_TO_DEBUG_FILE(WIFE_with_shopping_fAngle)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN TRUE ENDIF WAIT(0) ENDWHILE */ IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+WIFE_with_shopping_VecCentre, WIFE_with_shopping_VecBounds, fSequenceHead+WIFE_with_shopping_fAngle) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_M7_WIFE_Making_juice CONST_FLOAT fWIFE_Making_juiceRad fDEFAULT_ArgueRad #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fWIFE_Making_juiceRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fWIFE_Making_juiceRad)*(fWIFE_Making_juiceRad)) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_T1_FLOYD_pineapple #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fDEFAULT_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fDEFAULT_ArgueRad)*(fDEFAULT_ArgueRad)) RETURN TRUE ENDIF RETURN FALSE BREAK #IF NOT IS_JAPANESE_BUILD CASE FE_M2_WIFE_using_vibrator FALLTHRU CASE FE_M7_WIFE_using_vibrator #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fDEFAULT_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fDEFAULT_ArgueRad)*(fDEFAULT_ArgueRad)) RETURN TRUE ENDIF MODEL_NAMES ObjectModel VECTOR vecPos DOOR_NAME_ENUM eDoorName DOOR_HASH_ENUM eDoorHash TEXT_LABEL_63 roomName BOOL bIgnoreInRoomCheck PRIVATE_Get_Family_Door_Attributes(FD_7_MICHAEL_BEDROOM, ObjectModel, vecPos, eDoorName, eDoorHash, roomName, bIgnoreInRoomCheck) IF (eDoorName <> DUMMY_DOORNAME) //do nothing... CPRINTLN(DEBUG_FAMILY, "do nothing...") ELSE IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(eDoorHash)) ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(eDoorHash), ObjectModel, vecPos) CPRINTLN(DEBUG_FAMILY, "ADD_DOOR_TO_SYSTEM()") ELSE // FLOAT fDoorOpenRatio fDoorOpenRatio = ABSF(DOOR_SYSTEM_GET_OPEN_RATIO(ENUM_TO_INT(eDoorHash))) CPRINTLN(DEBUG_FAMILY, "fDoorOpenRatio: ", fDoorOpenRatio) IF fDoorOpenRatio >= 0.5 RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE BREAK #ENDIF CASE FE_T0_RON_ranting_about_government_LAYING CASE FE_T0_RONEX_working_a_moonshine_sill #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fDEFAULT_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fDEFAULT_ArgueRad)*(fDEFAULT_ArgueRad)) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_a CASE FE_T1_FLOYD_hiding_from_Trevor_c #IF IS_DEBUG_BUILD DrawDebugFamilySphere(GET_ENTITY_COORDS(PedIndex), fDEFAULT_ArgueRad, eHudColour, 0.25) #ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PedIndex)) < ((fDEFAULT_ArgueRad)*(fDEFAULT_ArgueRad)) RETURN TRUE ENDIF RETURN FALSE BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_b VECTOR FLOYD_hiding_from_Trevor_VecCentre, FLOYD_hiding_from_Trevor_VecBounds FLOAT FLOYD_hiding_from_Trevor_fAngle FLOYD_hiding_from_Trevor_VecCentre = <<-0.0, 0.0, 1.0>> FLOYD_hiding_from_Trevor_VecBounds = <<2.0, 2.0, 1.0>> FLOYD_hiding_from_Trevor_fAngle = -0.00 /* START_WIDGET_GROUP("FE_M_FLOYD_hiding_from_Trevor") ADD_WIDGET_VECTOR_SLIDER("VecCentre", FLOYD_hiding_from_Trevor_VecCentre, -20.0, 20.0, 0.01) ADD_WIDGET_VECTOR_SLIDER("VecBounds", FLOYD_hiding_from_Trevor_VecBounds, 0.5, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("fAngle", FLOYD_hiding_from_Trevor_fAngle, -360.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+FLOYD_hiding_from_Trevor_VecCentre, FLOYD_hiding_from_Trevor_VecBounds, fSequenceHead+FLOYD_hiding_from_Trevor_fAngle) ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("FLOYD_hiding_from_Trevor_VecCentre = ")SAVE_VECTOR_TO_DEBUG_FILE(FLOYD_hiding_from_Trevor_VecCentre)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("FLOYD_hiding_from_Trevor_VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(FLOYD_hiding_from_Trevor_VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("FLOYD_hiding_from_Trevor_fAngle = ")SAVE_FLOAT_TO_DEBUG_FILE(FLOYD_hiding_from_Trevor_fAngle)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN TRUE ENDIF WAIT(0) ENDWHILE */ IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+FLOYD_hiding_from_Trevor_VecCentre, FLOYD_hiding_from_Trevor_VecBounds, fSequenceHead+FLOYD_hiding_from_Trevor_fAngle) RETURN TRUE ENDIF RETURN FALSE BREAK ENDSWITCH #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in PRIVATE_Trigger_Family_Argue()") CASSERTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in PRIVATE_Trigger_Family_Argue()") #ENDIF RETURN FALSE ENDFUNC FUNC STRING Get_Family_Argue_Exit_Clip(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent) SWITCH eFamilyEvent CASE FE_M2_SON_gaming_loop SWITCH eFamilyMember CASE FM_MICHAEL_SON RETURN "JIM_IG_2_P2_Lagging" BREAK ENDSWITCH BREAK CASE FE_M7_SON_gaming SWITCH eFamilyMember CASE FM_MICHAEL_SON RETURN "IG_2_Exit" BREAK ENDSWITCH BREAK CASE FE_M_SON_Fighting_with_sister_A CASE FE_M_SON_Fighting_with_sister_B CASE FE_M_SON_Fighting_with_sister_C CASE FE_M_SON_Fighting_with_sister_D SWITCH eFamilyMember CASE FM_MICHAEL_SON RETURN "EXIT_JIMMY" BREAK CASE FM_MICHAEL_DAUGHTER RETURN "EXIT_TRACY" BREAK ENDSWITCH BREAK // CASE FE_M_WIFE_screaming_at_son_P1 // SWITCH eFamilyMember // CASE FM_MICHAEL_WIFE // RETURN "IG_2_YouKnowWhat_AMANDA" // BREAK // CASE FM_MICHAEL_SON // RETURN "IG_2_YouKnowWhat_JIMMY" // BREAK // ENDSWITCH // BREAK CASE FE_M_WIFE_screaming_at_son_P2 SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG_2_P2_ItsNotWastingTime_AMANDA" BREAK CASE FM_MICHAEL_SON RETURN "IG_2_P2_ItsNotWastingTime_JIMMY" BREAK ENDSWITCH BREAK CASE FE_M_WIFE_screaming_at_son_P3 SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG2_P3_ItsNotABigDeal_AMANDA" BREAK CASE FM_MICHAEL_SON RETURN "IG2_P3_ItsNotABigDeal_JIMMY" BREAK ENDSWITCH BREAK CASE FE_M_WIFE_screaming_at_daughter SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG_3_WhenURPregnant_AMANDA" BREAK CASE FM_MICHAEL_DAUGHTER RETURN "IG_3_WhenURPregnant_TRACY" BREAK ENDSWITCH BREAK CASE FE_M_WIFE_screams_at_mexmaid SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG_9_IAmOnToYou_AMANDA" BREAK CASE FM_MICHAEL_MEXMAID RETURN "IG_9_IAmOnToYou_MAID" BREAK ENDSWITCH BREAK CASE FE_M2_WIFE_with_shopping_bags_enter CASE FE_M7_WIFE_with_shopping_bags_enter SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG_7_EXIT" BREAK ENDSWITCH BREAK CASE FE_M7_WIFE_Making_juice SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "Ugh_kale_Amanda" BREAK ENDSWITCH BREAK CASE FE_T1_FLOYD_pineapple SWITCH eFamilyMember CASE FM_TREVOR_1_FLOYD RETURN "Pineapple_EXIT_LOOP_FLOYD" BREAK ENDSWITCH BREAK #IF NOT IS_JAPANESE_BUILD CASE FE_M2_WIFE_using_vibrator CASE FE_M7_WIFE_using_vibrator SWITCH eFamilyMember CASE FM_MICHAEL_WIFE RETURN "IG_6_EXIT" BREAK ENDSWITCH BREAK #ENDIF CASE FE_M_DAUGHTER_screaming_at_dad IF (eFamilyEvent = FE_M_DAUGHTER_screaming_at_dad) MODEL_NAMES PedModel PedModel = GET_ENTITY_MODEL(PedIndex) IF (PedModel = GET_NPC_PED_MODEL(CHAR_TRACEY)) RETURN "EXIT_TRACY" ELIF (PedModel = A_M_Y_HIPSTER_01) RETURN "EXIT_BOY" ENDIF ENDIF BREAK CASE FE_T0_RON_ranting_about_government_LAYING SWITCH eFamilyMember CASE FM_TREVOR_0_RON RETURN "ENTER" BREAK ENDSWITCH BREAK CASE FE_T0_RONEX_working_a_moonshine_sill SWITCH eFamilyMember CASE FM_TREVOR_0_RON RETURN "IG_3_IDLE_A" BREAK ENDSWITCH BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_a CASE FE_T1_FLOYD_hiding_from_Trevor_b CASE FE_T1_FLOYD_hiding_from_Trevor_c SWITCH eFamilyMember CASE FM_TREVOR_1_FLOYD RETURN "base" BREAK ENDSWITCH BREAK DEFAULT // BREAK ENDSWITCH #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " for Get_Family_Argue_Exit_Clip(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid eFamilyMember ", Get_String_From_FamilyMember(eFamilyMember), " for Get_Family_Argue_Exit_Clip(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF eFamilyMember = eFamilyMember eFamilyEvent = eFamilyEvent RETURN "null" ENDFUNC FUNC BOOL PRIVATE_Update_Family_Argue(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead, INT &iArgueStage, INT &iScene, TEXT_LABEL_63 &tAnimDict, TEXT_LABEL_63 &tAnimClip, enumFamilyEvents eDesiredFamilyEvent, STRING strTextBlock, STRING strLoop, STRING strExit, TEXT_LABEL &tCreatedConvLabels[], structPedsForConversation &inSpeechStruct, structTimer &speechTimer, FLOAT fExitDialogueTime = 0.0, enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH) #IF IS_DEBUG_BUILD IF (eDesiredFamilyEvent = INT_TO_ENUM(enumFamilyEvents, 0)) eDesiredFamilyEvent = NO_FAMILY_EVENTS ENDIF CONST_INT iFamTextOffset 3 TEXT_LABEL_63 str #ENDIF CONST_INT iARGUE_0_argue 0 CONST_INT iARGUE_1_playExit 1 CONST_INT iARGUE_2_performingSynch 2 CONST_INT iARGUE_3_playExit 3 CONST_INT iARGUE_33_playExitWaitForSpeech 33 CONST_INT iARGUE_4_wanderArea 4 CONST_INT iARGUE_5_updateEvent 5 SWITCH iArgueStage CASE iARGUE_0_argue // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("0. wait for argue", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) IF PRIVATE_Trigger_Family_Argue(PedIndex, eFamilyEvent, vSequencePos, fSequenceHead) IF IS_STRING_NULL_OR_EMPTY(tAnimDict) CWARNINGLN(DEBUG_FAMILY, "PRIVATE_Update_Family_Argue(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(eFamilyEvent), ") tAnimDict has not been initialised") PRIVATE_Update_Family_SynchScene(PedIndex, eFamilyMember, eFamilyEvent, vSequencePos, fSequenceHead, iScene, TRUE, FALSE, tAnimDict, tAnimClip) RETURN FALSE ENDIF IF IS_STRING_NULL_OR_EMPTY(strTextBlock) AND IS_STRING_NULL_OR_EMPTY(strExit) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_1_playExit - ARGUE (silent)!") iArgueStage = iARGUE_1_playExit RETURN FALSE ENDIF INT iRandCount, iSpeechBit, iPlayerBitset Get_SpeechLabel_From_FamilyEvent(eFamilyEvent, iRandCount, iSpeechBit, iPlayerBitset) IF NOT IS_BITMASK_SET(iPlayerBitset, GET_CURRENT_PLAYER_PED_BIT()) CPRINTLN(DEBUG_FAMILY, "argue - invalid IS_BITMASK_SET: ", GET_CURRENT_PLAYER_PED_STRING()) ELSE //is the speech a single line or is it a random conv IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) BOOL bReadyForPlayExit bReadyForPlayExit = FALSE IF NOT IS_STRING_NULL_OR_EMPTY(strExit) IF Is_Ped_Playing_Family_Speech(strTextBlock, strExit, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) bReadyForPlayExit = TRUE ENDIF ELSE IF (eFamilyEvent = FE_T1_FLOYD_pineapple) CPRINTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Argue(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(eFamilyEvent), ") - attempting to play an empty single random line...") bReadyForPlayExit = TRUE ELSE CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Argue(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(eFamilyEvent), ") - attempting to play an empty single random line??") ENDIF ENDIF IF (fExitDialogueTime <> 0) bReadyForPlayExit = TRUE ENDIF IF bReadyForPlayExit SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_1_playExit - ARGUE (random)!") iArgueStage = iARGUE_1_playExit RETURN FALSE ENDIF ELSE TEXT_LABEL returnedStrLabel returnedStrLabel = strExit IF GetRandomConversationFromLabel(strTextBlock, returnedStrLabel, tCreatedConvLabels) IF NOT IS_STRING_NULL_OR_EMPTY(returnedStrLabel) IF Is_Ped_Playing_Family_Speech(strTextBlock, returnedStrLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_1_playExit - ARGUE (non-random)!") iArgueStage = iARGUE_1_playExit RETURN FALSE ENDIF ELSE CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Argue(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(eFamilyEvent), ") - attempting to play an empty multiple random line??") ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT IS_SYNCHRONIZED_SCENE_LOOPED(iScene) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_1_playExit - non-looped...") iArgueStage = iARGUE_1_playExit RETURN FALSE ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(strLoop) // CPRINTLN(DEBUG_FAMILY, "play \"", strLoop, "\"...") IF NOT IS_TIMER_STARTED(speechTimer) START_TIMER_NOW(speechTimer) ENDIF TEXT_LABEL returnedStrLabel returnedStrLabel = strLoop IF GetRandomConversationFromLabel(strTextBlock, returnedStrLabel, tCreatedConvLabels) INT iCurrentRandCount Play_This_Family_Speech(PedIndex, eFamilyEvent, inSpeechStruct, strTextBlock, tCreatedConvLabels, speechTimer, iCurrentRandCount, 10, returnedStrLabel) ENDIF ENDIF ENDIF FLOAT LoopblendInDelta, exitblendOutDelta LoopblendInDelta = NORMAL_BLEND_IN exitblendOutDelta = NORMAL_BLEND_OUT IF (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_a) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_b) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_c) LoopblendInDelta = NORMAL_BLEND_IN exitblendOutDelta = SLOW_BLEND_OUT ENDIF IF NOT PRIVATE_Update_Family_SynchScene(PedIndex, eFamilyMember, eFamilyEvent, vSequencePos, fSequenceHead, iScene, TRUE, FALSE, tAnimDict, tAnimClip, LoopblendInDelta, exitblendOutDelta) RETURN FALSE ENDIF BREAK CASE iARGUE_1_playExit #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("1. play exit, wait for speech", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF IS_STRING_NULL_OR_EMPTY(tAnimDict) TEXT_LABEL_63 tTempFamilyAnimClip ANIMATION_FLAGS eFamilyAnimFlag enumFamilyAnimProgress eFamilyAnimProgress PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tAnimDict, tTempFamilyAnimClip, eFamilyAnimFlag, eFamilyAnimProgress) REQUEST_ANIM_DICT(tAnimDict) IF NOT HAS_ANIM_DICT_LOADED(tAnimDict) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_1_playExit - waiting for \"", tAnimDict, "\"") RETURN FALSE ENDIF ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) VECTOR vSynchSceneOffset FLOAT fSynchSceneHead vSynchSceneOffset = <<0,0,0>> fSynchSceneHead = 0 IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) iScene = CREATE_SYNCHRONIZED_SCENE(vSequencePos+vSynchSceneOffset, <<0,0,fSequenceHead+fSynchSceneHead>>) ENDIF ENDIF STRING sFamilyArgueExitClip sFamilyArgueExitClip = Get_Family_Argue_Exit_Clip(PedIndex, eFamilyMember, eFamilyEvent) FLOAT blendInDelta, blendOutDelta SYNCED_SCENE_PLAYBACK_FLAGS flags RAGDOLL_BLOCKING_FLAGS ragdollFlags blendInDelta = NORMAL_BLEND_IN blendOutDelta = WALK_BLEND_OUT flags = SYNCED_SCENE_USE_PHYSICS ragdollFlags = RBF_PLAYER_IMPACT IF (eFamilyEvent = FE_M_WIFE_screams_at_mexmaid) blendInDelta = INSTANT_BLEND_IN ENDIF IF (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_a) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_b) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_c) blendInDelta = SLOW_BLEND_IN ENDIF IF (eDesiredFamilyEvent = NO_FAMILY_EVENTS) flags |= SYNCED_SCENE_TAG_SYNC_OUT ELIF (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_a) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_b) OR (eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_c) OR (eFamilyEvent = FE_M7_WIFE_Making_juice) //#1588065 OR (eFamilyEvent = FE_T0_RONEX_working_a_moonshine_sill) OR (eFamilyEvent = FE_T1_FLOYD_pineapple) //#1590017 blendOutDelta = WALK_BLEND_OUT ELSE blendOutDelta = INSTANT_BLEND_OUT ENDIF IF eFamilyEvent = FE_M_WIFE_screaming_at_son_P2 IF eFamilyMember = FM_MICHAEL_WIFE blendOutDelta = WALK_BLEND_OUT ENDIF ELIF eFamilyEvent = FE_M_WIFE_screaming_at_son_P3 IF eFamilyMember = FM_MICHAEL_WIFE blendOutDelta = WALK_BLEND_OUT ENDIF ELIF eFamilyEvent = FE_M_WIFE_screaming_at_daughter IF eFamilyMember = FM_MICHAEL_WIFE blendOutDelta = WALK_BLEND_OUT ENDIF // ELIF eFamilyEvent = FE_M_WIFE_screaming_at_son_P1 // IF eFamilyMember = FM_MICHAEL_WIFE // blendOutDelta = WALK_BLEND_OUT // ENDIF ENDIF TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tAnimDict, sFamilyArgueExitClip, blendInDelta, blendOutDelta, flags, ragdollFlags) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) SET_SYNCHRONIZED_SCENE_PHASE(iScene, 0.0) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) IF eFamilyEvent = FE_M7_WIFE_Making_juice SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, FALSE) ELSE SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) ENDIF tAnimClip = sFamilyArgueExitClip SET_PED_CONFIG_FLAG(PedIndex, PCF_UseKinematicModeWhenStationary, TRUE) CPRINTLN(DEBUG_FAMILY, "iArgueStage = iARGUE_2_performingSynch \"", tAnimDict, "/", sFamilyArgueExitClip, "\"") iArgueStage = iARGUE_2_performingSynch RETURN FALSE BREAK CASE iARGUE_2_performingSynch // #IF IS_DEBUG_BUILD IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) str = ("creating SynchScene") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_REDLIGHT) ELSE str = ("SynchScene phase: ") str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_BLUELIGHT) ENDIF DrawDebugFamilyTextWithOffset("2. wait to start playing argue", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE) = PERFORMING_TASK) iArgueStage = iARGUE_3_playExit IF (fExitDialogueTime <> 0) iArgueStage = iARGUE_33_playExitWaitForSpeech ENDIF ENDIF BREAK CASE iARGUE_3_playExit // CASE iARGUE_33_playExitWaitForSpeech TEXT_LABEL_63 tFamilyDebugAnimDict, tFamilyDebugAnimClip ANIMATION_FLAGS eFamilyDebugAnimFlag enumFamilyAnimProgress eFamilyDebugAnimProgress IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilyDebugAnimDict, tFamilyDebugAnimClip, eFamilyDebugAnimFlag, eFamilyDebugAnimProgress) tFamilyDebugAnimClip = Get_Family_Argue_Exit_Clip(PedIndex, eFamilyMember, eFamilyEvent) #IF IS_DEBUG_BUILD str = ("tExitClip: \"") str += (tFamilyDebugAnimClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_REDLIGHT) #ENDIF ELSE #IF IS_DEBUG_BUILD str = ("tExitClip: \"") str += (tFamilyDebugAnimClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_REDLIGHT) #ENDIF ENDIF #IF IS_DEBUG_BUILD str = ("3. playing argue, synch scene [") IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) str += "null" ELSE str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) ENDIF str += ("]") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF (fExitDialogueTime <> 0) AND (iArgueStage <> iARGUE_3_playExit) IF (IS_SYNCHRONIZED_SCENE_RUNNING(iScene) AND (GET_SYNCHRONIZED_SCENE_PHASE(iScene) >= fExitDialogueTime)) IF NOT IS_STRING_NULL_OR_EMPTY(strExit) IF Is_Ped_Playing_Family_Speech(strTextBlock, strExit, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) iArgueStage = iARGUE_3_playExit ENDIF ELSE CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": PRIVATE_Update_Family_Argue(", Get_String_From_FamilyMember(eFamilyMember), ", ", Get_String_From_FamilyEvent(eFamilyEvent), ") - attempting to play an empty exit line??") ENDIF ENDIF ENDIF FLOAT ReturnStartPhase, ReturnEndPhase IF FIND_ANIM_EVENT_PHASE(tFamilyDebugAnimDict, tFamilyDebugAnimClip, "WalkInterruptible", ReturnStartPhase, ReturnEndPhase) CASSERTLN(DEBUG_FAMILY, "walk interruptible in argue anim") ELSE ReturnStartPhase = 0.95 ReturnEndPhase = 1.0 IF eFamilyEvent = FE_M7_SON_gaming ReturnStartPhase = 0.44 ReturnEndPhase = 1.0 ENDIF IF eFamilyEvent = FE_M_WIFE_screaming_at_son_P2 IF eFamilyMember = FM_MICHAEL_WIFE ReturnStartPhase = 0.78 ReturnEndPhase = 1.00 //#1577498 & #1585993 ENDIF ELIF eFamilyEvent = FE_M_WIFE_screaming_at_son_P3 IF eFamilyMember = FM_MICHAEL_WIFE ReturnStartPhase = 0.73 ReturnEndPhase = 1.00 //#1577498 & #1585993 ENDIF ELIF eFamilyEvent = FE_M_WIFE_screaming_at_daughter IF eFamilyMember = FM_MICHAEL_WIFE ReturnStartPhase = 0.80 ReturnEndPhase = 1.00 //#1577498 & #1585993 ENDIF // ELIF eFamilyEvent = FE_M_WIFE_screaming_at_son_P1 // IF eFamilyMember = FM_MICHAEL_WIFE // ReturnStartPhase = 0.71 ReturnEndPhase = 1.00 //#1577498 & #1585993 // ENDIF ENDIF IF eFamilyEvent = FE_T0_RONEX_working_a_moonshine_sill ReturnStartPhase = 0.80 ReturnEndPhase = 1.00 ENDIF IF eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_a OR eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_b OR eFamilyEvent = FE_T1_FLOYD_hiding_from_Trevor_c ReturnStartPhase = 0.75 ReturnEndPhase = 1.00 ENDIF IF eFamilyEvent = FE_M7_WIFE_Making_juice ReturnStartPhase = 5.0 ReturnEndPhase = 1.00 ENDIF ENDIF #IF IS_DEBUG_BUILD str = (" WalkInterruptible phases: ") str += GET_STRING_FROM_FLOAT(ReturnStartPhase) str += (", ") str += GET_STRING_FROM_FLOAT(ReturnEndPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) #ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) OR (IS_SYNCHRONIZED_SCENE_RUNNING(iScene) AND (GET_SYNCHRONIZED_SCENE_PHASE(iScene) >= ReturnStartPhase)) RESTART_TIMER_NOW(speechTimer) IF (eDesiredFamilyEvent = NO_FAMILY_EVENTS) TASK_GO_STRAIGHT_TO_COORD(PedIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PedIndex, <<0,1.5,0>>), PEDMOVE_WALK) FORCE_PED_MOTION_STATE(PedIndex, MS_ON_FOOT_WALK, FALSE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PedIndex) iArgueStage = iARGUE_4_wanderArea // ELIF (eFamilyEvent = FE_M_WIFE_screaming_at_son_P2 AND eFamilyMember = FM_MICHAEL_WIFE) // OR (eFamilyEvent = FE_M_WIFE_screaming_at_son_P3 AND eFamilyMember = FM_MICHAEL_WIFE) // // TASK_GO_STRAIGHT_TO_COORD(PedIndex, // GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PedIndex, <<0,1.5,0>>), // PEDMOVE_WALK) // // FORCE_PED_MOTION_STATE(PedIndex, MS_ON_FOOT_WALK, FALSE) // FORCE_PED_AI_AND_ANIMATION_UPDATE(PedIndex) // // RESTART_TIMER_NOW(speechTimer) // iArgueStage = 0 // PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) // RETURN FALSE ELSE IF (eDesiredFamilyEvent = FE_ANY_find_family_event) OR (eDesiredFamilyEvent = FE_ANY_wander_family_event) IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) ENDIF iScene = -1 ENDIF RESTART_TIMER_NOW(speechTimer) iArgueStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN FALSE ENDIF ENDIF BREAK CASE iARGUE_4_wanderArea // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("4. finished argue - wander area", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF iArgueStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_wander_family_event) BREAK CASE iARGUE_5_updateEvent // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("5. finished argue - update event", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF (eDesiredFamilyEvent = FE_ANY_find_family_event) OR (eDesiredFamilyEvent = FE_ANY_wander_family_event) IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) ENDIF iScene = -1 ENDIF RESTART_TIMER_NOW(speechTimer) iArgueStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN FALSE BREAK DEFAULT #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid iArgueStage ", iArgueStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_Argue(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid iArgueStage ", iArgueStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_Argue(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC PRIVATE_Set_Entity_Visible_And_Collision(ENTITY_INDEX EntityIndex, BOOL VisibleFlag) IF NOT DOES_ENTITY_EXIST(EntityIndex) EXIT ENDIF IF NOT VisibleFlag IF IS_ENTITY_VISIBLE(EntityIndex) SET_ENTITY_VISIBLE(EntityIndex, FALSE) SET_ENTITY_COLLISION(EntityIndex, FALSE) ENDIF ELSE IF NOT IS_ENTITY_VISIBLE(EntityIndex) SET_ENTITY_VISIBLE(EntityIndex, TRUE) SET_ENTITY_COLLISION(EntityIndex, TRUE) ENDIF ENDIF ENDPROC FUNC BOOL PRIVATE_Update_Family_ComingHome(PED_INDEX &PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, VECTOR vSequencePos, FLOAT fSequenceHead, INT &iShoppingStage, OBJECT_INDEX oLeftBag, OBJECT_INDEX oRightBag, INT &iScene, TEXT_LABEL_63 &tAnimDict, TEXT_LABEL_63 &tAnimClip, enumFamilyEvents eDesiredFamilyEvent, INTERIOR_INSTANCE_INDEX InteriorInstanceIndex, STRING RoomKeyName, STRING strTextBlock, STRING strEnter, STRING strIdle, TEXT_LABEL &tCreatedConvLabels[], structPedsForConversation &inSpeechStruct, structTimer &speechTimer, INT &iCurrentRandCount, enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " PRIVATE_Update_Family_ComingHome.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE() ," max ", GET_ALLOCATED_STACK_SIZE(), ")") #IF IS_DEBUG_BUILD IF (eDesiredFamilyEvent = INT_TO_ENUM(enumFamilyEvents, 0)) eDesiredFamilyEvent = NO_FAMILY_EVENTS ENDIF CONST_INT iFamTextOffset 3 TEXT_LABEL_63 str #ENDIF CONST_INT iSHOPPING_0_shopping 0 CONST_INT iSHOPPING_1_waitForSpeech 1 CONST_INT iSHOPPING_2_performingSynch 2 CONST_INT iSHOPPING_3_playIdle 3 CONST_INT iSHOPPING_4_exitShop 4 CONST_INT iSHOPPING_5_updateEvent 5 SWITCH iShoppingStage CASE iSHOPPING_0_shopping // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("0. wait for shopping", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT PRIVATE_Trigger_Family_Argue(PedIndex, eFamilyEvent, vSequencePos, fSequenceHead) PRIVATE_Set_Entity_Visible_And_Collision(PedIndex, FALSE) PRIVATE_Set_Entity_Visible_And_Collision(oLeftBag, FALSE) PRIVATE_Set_Entity_Visible_And_Collision(oRightBag, FALSE) VECTOR Family_ComingHome_VecCentre, Family_ComingHome_VecBounds FLOAT Family_ComingHome_fAngle Family_ComingHome_VecCentre = <<-7.5000, -2.9500, 0.5700>> Family_ComingHome_VecBounds = <<3.0000, 3.0000, 1.5000>> Family_ComingHome_fAngle = -22.0000 /* START_WIDGET_GROUP("Family_ComingHome") ADD_WIDGET_VECTOR_SLIDER("VecCentre", Family_ComingHome_VecCentre, -20.0, 20.0, 0.01) ADD_WIDGET_VECTOR_SLIDER("VecBounds", Family_ComingHome_VecBounds, 0.5, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("fAngle", Family_ComingHome_fAngle, -360.0, 360.0, 1.0) STOP_WIDGET_GROUP() WHILE TRUE IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+Family_ComingHome_VecCentre, Family_ComingHome_VecBounds, fSequenceHead+Family_ComingHome_fAngle) ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("Family_ComingHome_VecCentre = ")SAVE_VECTOR_TO_DEBUG_FILE(Family_ComingHome_VecCentre)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("Family_ComingHome_VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(Family_ComingHome_VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("Family_ComingHome_fAngle = ")SAVE_FLOAT_TO_DEBUG_FILE(Family_ComingHome_fAngle)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN TRUE ENDIF WAIT(0) ENDWHILE */ IF IS_PED_AT_ANGLED_COORD(PLAYER_PED_ID(), vSequencePos+Family_ComingHome_VecCentre, Family_ComingHome_VecBounds, fSequenceHead+Family_ComingHome_fAngle) Set_Current_Event_For_FamilyMember(eFamilyMember, FAMILY_MEMBER_BUSY) DELETE_PED(PedIndex) RETURN FALSE ENDIF ELSE PRIVATE_Set_Entity_Visible_And_Collision(PedIndex, TRUE) PRIVATE_Set_Entity_Visible_And_Collision(oLeftBag, TRUE) PRIVATE_Set_Entity_Visible_And_Collision(oRightBag, TRUE) INT iRandCount, iSpeechBit, iPlayerBitset Get_SpeechLabel_From_FamilyEvent(eFamilyEvent, iRandCount, iSpeechBit, iPlayerBitset) IF NOT IS_BITMASK_SET(iPlayerBitset, GET_CURRENT_PLAYER_PED_BIT()) CASSERTLN(DEBUG_FAMILY, "coming home - invalid IS_BITMASK_SET") RETURN FALSE ENDIF //is the speech a single line or is it a random conv IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) IF Is_Ped_Playing_Family_Speech(strTextBlock, strEnter, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) IF ARE_STRINGS_EQUAL(strEnter, strIdle) iCurrentRandCount++ ENDIF CPRINTLN(DEBUG_FAMILY, "iShoppingStage = iSHOPPING_1_waitForSpeech - SHOPPING (random)!") IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) SET_SYNCHRONIZED_SCENE_RATE(iScene, 1.0) ENDIF iShoppingStage = iSHOPPING_1_waitForSpeech RETURN FALSE ENDIF ELSE TEXT_LABEL returnedStrLabel returnedStrLabel = strEnter IF GetRandomConversationFromLabel(strTextBlock, returnedStrLabel, tCreatedConvLabels) IF Is_Ped_Playing_Family_Speech(strTextBlock, returnedStrLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) IF ARE_STRINGS_EQUAL(strEnter, strIdle) iCurrentRandCount++ ENDIF CPRINTLN(DEBUG_FAMILY, "iShoppingStage = iSHOPPING_1_waitForSpeech - SHOPPING (non-random)!") IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) SET_SYNCHRONIZED_SCENE_RATE(iScene, 1.0) ENDIF iShoppingStage = iSHOPPING_1_waitForSpeech RETURN FALSE ENDIF ENDIF ENDIF ENDIF IF PRIVATE_Update_Family_SynchScene(PedIndex, eFamilyMember, eFamilyEvent, vSequencePos, fSequenceHead, iScene, FALSE, FALSE, tAnimDict, tAnimClip) IF IS_VALID_INTERIOR(InteriorInstanceIndex) AND IS_INTERIOR_READY(InteriorInstanceIndex) FORCE_ROOM_FOR_ENTITY(PedIndex, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) IF DOES_ENTITY_EXIST(oLeftBag) FORCE_ROOM_FOR_ENTITY(oLeftBag, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) ENDIF IF DOES_ENTITY_EXIST(oRightBag) FORCE_ROOM_FOR_ENTITY(oRightBag, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) SET_SYNCHRONIZED_SCENE_RATE(iScene, 0.0) ENDIF ENDIF BREAK CASE iSHOPPING_1_waitForSpeech #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("1. wait for speech", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF PRIVATE_Update_Family_SynchScene(PedIndex, eFamilyMember, eFamilyEvent, vSequencePos, fSequenceHead, iScene, FALSE, TRUE, tAnimDict, tAnimClip, NORMAL_BLEND_IN, INSTANT_BLEND_OUT) PRIVATE_Set_Entity_Visible_And_Collision(PedIndex, TRUE) PRIVATE_Set_Entity_Visible_And_Collision(oLeftBag, TRUE) PRIVATE_Set_Entity_Visible_And_Collision(oRightBag, TRUE) IF IS_VALID_INTERIOR(InteriorInstanceIndex) AND IS_INTERIOR_READY(InteriorInstanceIndex) FORCE_ROOM_FOR_ENTITY(PedIndex, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) IF DOES_ENTITY_EXIST(oLeftBag) FORCE_ROOM_FOR_ENTITY(oLeftBag, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) ENDIF IF DOES_ENTITY_EXIST(oRightBag) FORCE_ROOM_FOR_ENTITY(oRightBag, InteriorInstanceIndex, GET_HASH_KEY(RoomKeyName)) ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) SET_SYNCHRONIZED_SCENE_RATE(iScene, 1.0) ENDIF iShoppingStage = iSHOPPING_2_performingSynch RETURN FALSE ENDIF BREAK CASE iSHOPPING_2_performingSynch // #IF IS_DEBUG_BUILD IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) str = ("creating SynchScene") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_REDLIGHT) ELSE str = ("SynchScene phase: ") str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_BLUELIGHT) ENDIF DrawDebugFamilyTextWithOffset("2. play shoppingEnter", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) OR (GET_SYNCHRONIZED_SCENE_PHASE(iScene) >= 0.95) IF DOES_ENTITY_EXIST(oLeftBag) IF IS_ENTITY_ATTACHED(oLeftBag) DETACH_ENTITY(oLeftBag) CPRINTLN(DEBUG_FAMILY, "DETACH_ENTITY(oLeftBag)") ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) STOP_SYNCHRONIZED_ENTITY_ANIM(oLeftBag, INSTANT_BLEND_OUT, TRUE) CPRINTLN(DEBUG_FAMILY, "STOP_SYNCHRONIZED_ENTITY_ANIM(oLeftBag)") ENDIF ENDIF IF DOES_ENTITY_EXIST(oRightBag) IF IS_ENTITY_ATTACHED(oRightBag) DETACH_ENTITY(oRightBag) CPRINTLN(DEBUG_FAMILY, "DETACH_ENTITY(oRightBag)") ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) STOP_SYNCHRONIZED_ENTITY_ANIM(oRightBag, INSTANT_BLEND_OUT, TRUE) CPRINTLN(DEBUG_FAMILY, "STOP_SYNCHRONIZED_ENTITY_ANIM(oLeftBag)") ENDIF ENDIF IF (eFamilyMember = FM_MICHAEL_WIFE) iShoppingStage = iSHOPPING_3_playIdle ELSE iShoppingStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN FALSE ENDIF ENDIF BREAK CASE iSHOPPING_3_playIdle // INT iRandCount, iSpeechBit, iPlayerBitset Get_SpeechLabel_From_FamilyEvent(eFamilyEvent, iRandCount, iSpeechBit, iPlayerBitset) #IF IS_DEBUG_BUILD str = ("3. play shoppingIdle") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) str = ("iRandCount [") str += (iCurrentRandCount) str += (" >= ") str += (iRandCount) str += ("]") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+2, HUD_COLOUR_RED) #ENDIF PRIVATE_Update_Family_SynchSceneArray(PedIndex, eFamilyMember, eFamilyEvent, tAnimDict, tAnimClip, vSequencePos, fSequenceHead, iScene, TRUE, TRUE) IF Play_This_Family_Speech(PedIndex, eFamilyEvent, inSpeechStruct, strTextBlock, tCreatedConvLabels, speechTimer, iCurrentRandCount, 16, strIdle) ENDIF // IF iCurrentRandCount >= iRandCount // iShoppingStage = iSHOPPING_4_exitShop // ENDIF BREAK CASE iSHOPPING_4_exitShop // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("4. exit shop", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_RED) #ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) VECTOR vSynchSceneOffset FLOAT fSynchSceneHead vSynchSceneOffset = <<0,0,0>> fSynchSceneHead = 0 IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) iScene = CREATE_SYNCHRONIZED_SCENE(vSequencePos+vSynchSceneOffset, <<0,0,fSequenceHead+fSynchSceneHead>>) ENDIF ENDIF STRING sFamilyArgueExitClip sFamilyArgueExitClip = Get_Family_Argue_Exit_Clip(PedIndex, eFamilyMember, eFamilyEvent) TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tAnimDict, sFamilyArgueExitClip, NORMAL_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) SET_SYNCHRONIZED_SCENE_PHASE(iScene, 0.0) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, FALSE) tAnimClip = sFamilyArgueExitClip CPRINTLN(DEBUG_FAMILY, "iArgueStage = iSHOPPING_5_updateEvent \"", tAnimDict, "/", sFamilyArgueExitClip, "\"") iShoppingStage = iSHOPPING_5_updateEvent RETURN FALSE BREAK CASE iSHOPPING_5_updateEvent // #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("5. play shoppingExit", GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+0, HUD_COLOUR_RED) IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) str = ("creating SynchScene") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_REDLIGHT) ELSE str = ("SynchScene phase: ") str += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iScene)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), iFamTextOffset+1, HUD_COLOUR_BLUELIGHT) ENDIF #ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScene) iShoppingStage = 0 PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN FALSE ENDIF BREAK DEFAULT #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid iShoppingStage ", iShoppingStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_Shopping(", Get_String_From_FamilyEvent(eFamilyEvent), ")") CASSERTLN(DEBUG_FAMILY, "invalid iShoppingStage ", iShoppingStage, " for ", Get_String_From_FamilyMember(eFamilyMember), " in PRIVATE_Update_Family_Shopping(", Get_String_From_FamilyEvent(eFamilyEvent), ")") #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_AskForCash(enumCharacterList charSheetID, PED_INDEX PedIndex, enumFamilyMember eFamilyMember, enumFamilyEvents eFamilyEvent, INT iPlayerBitset, VECTOR vFamilyScenePos, FLOAT fFamilySceneHead, INT &iCompletedGivingCash, TEXT_LABEL_63 &tDialogueAnimDict, TEXT_LABEL_63 &tDialogueAnimClip, INT &cash_intention_index, STRING strTextBlock, STRING strTextRoot, TEXT_LABEL &tCreatedConvLabels[], INT &iScene, structPedsForConversation &inSpeechStruct, structTimer &speechTimer, enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_HIGH, MODEL_NAMES ePropModel = DUMMY_MODEL_FOR_SCRIPT) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str #ENDIF CONST_INT iCONST_0_requestAssets 0 CONST_INT iCONST_1_waitForLoad 1 CONST_INT iCONST_2_animStart 2 CONST_INT iCONST_3_animFinish 3 CONST_INT iCONST_2_synchStart 20 CONST_INT iCONST_3_synchFinishing 30 CONST_INT iCONST_4_synchFinished 40 CONST_INT iCONST_done -1 IF NOT IS_BITMASK_SET(iPlayerBitset, GET_PLAYER_PED_BIT(charSheetID)) #IF IS_DEBUG_BUILD str = ("ask for cash, player not iPlayerBitset") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, HUD_COLOUR_GREENDARK) #ENDIF RETURN FALSE ENDIF IF (iCompletedGivingCash = iCONST_done) #IF IS_DEBUG_BUILD str = ("ask for cash, giving cash is done") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, HUD_COLOUR_PURE_WHITE) #ENDIF RETURN FALSE ENDIF STRING strCASH = NULL INT iCashAskedFor = -1 VECTOR vPedCoord = GET_ENTITY_COORDS(PedIndex) VECTOR vLocateOffset VECTOR vScenePosOffset FLOAT fSceneRotOffset TEXT_LABEL_63 tAnimDict = "" TEXT_LABEL_63 tAnimPlayer = "", tAnimFamMember = "", tAnimFamProp = "", tAnimFamCam = "" INT iNextStage = -99 INT iRandomAnimSet = -1 SWITCH eFamilyEvent CASE FE_M_DAUGHTER_Coming_home_drunk strCASH = "PAY_M_DAUG" //Press ~INPUT_CONTEXT~ to give $~1~ to Tracey. iCashAskedFor = 50 vLocateOffset = <<0,0,-0.75>> tAnimDict = "TIMETABLE@TRACY@IG_14@" tAnimPlayer = "IG_14_IWishAll_A_PLAYER" tAnimFamMember = "IG_14_IWishAll_A_TRACY" tAnimFamProp = "IG_14_IWishAll_A_NOTE" tAnimFamCam = "IG_14_IWishAll_A_CAM" //tAnimPlayer = "IG_14_IWishAll_A_PLAYER" //tAnimFamMember = "IG_14_IWishAll_A_TRACY" //tAnimFamProp = "IG_14_IWishAll_A_NOTE" //tAnimFamCam = "IG_14_IWishAll_A_CAM" //tAnimPlayer = "IG_14_IWishAll_B_PLAYER" //tAnimFamMember = "IG_14_IWishAll_B_TRACY" //tAnimFamProp = "IG_14_IWishAll_B_NOTE" //tAnimFamCam = "IG_14_IWishAll_B_CAM" //tAnimPlayer = "IG_14_ParentingAtItsFinest_PLAYER" //tAnimFamMember = "IG_14_ParentingAtItsFinest_TRACY" //tAnimFamProp = "IG_14_ParentingAtItsFinest_NOTE" //tAnimFamCam = "IG_14_ParentingAtItsFinest_CAM" vScenePosOffset = <<0,0,0>> fSceneRotOffset = 0 iRandomAnimSet = 99 iNextStage = iCONST_2_synchStart BREAK CASE FE_M_SON_watching_porn strCASH = "PAY_M_SON" //Press ~INPUT_CONTEXT~ to check on Jimmy. iCashAskedFor = 0 vLocateOffset = <<0,6,0>> tAnimDict = "TIMETABLE@JIMMY@DOORKNOCK@" tAnimPlayer = "KNOCKDOOR_IDLE" tAnimFamMember = "" tAnimFamProp = "" tAnimFamCam = "KNOCKDOOR_IDLE_CAM" vScenePosOffset = <<0.5010, 6.6020, 0.0>> fSceneRotOffset = 242.1000 iRandomAnimSet = -1 iNextStage = iCONST_2_synchStart BREAK DEFAULT #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in PRIVATE_Update_Family_AskForCash()") CASSERTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in PRIVATE_Update_Family_AskForCash()") #ENDIF RETURN FALSE BREAK ENDSWITCH IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPedCoord+vLocateOffset, <<2,2,1>>, FALSE, TRUE, TM_ON_FOOT) AND NOT IS_PHONE_ONSCREEN() REQUEST_ANIM_DICT(tAnimDict) IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) REQUEST_MODEL(ePropModel) ENDIF IF (iCashAskedFor > 0) #IF IS_DEBUG_BUILD str = ("(GET_TOTAL_CASH(") str += (GET_PLAYER_PED_STRING(charSheetID)) str += ("):") str += (GET_TOTAL_CASH(charSheetID)) str += (" < ") str += (iCashAskedFor) str += (")") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -1, HUD_COLOUR_GREENDARK) #ENDIF IF (GET_TOTAL_CASH(charSheetID) < iCashAskedFor) IF cash_intention_index != NEW_CONTEXT_INTENTION RELEASE_CONTEXT_INTENTION(cash_intention_index) CLEAR_THIS_FLOATING_HELP_WITH_NUMBER(strCASH, iCashAskedFor) ENDIF RETURN FALSE ENDIF ENDIF BOOL eHasPropModelLoaded = TRUE IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) IF NOT HAS_MODEL_LOADED(ePropModel) eHasPropModelLoaded = FALSE ENDIF ENDIF IF NOT HAS_ANIM_DICT_LOADED(tAnimDict) OR NOT Is_Family_Speech_Loaded_And_Setup(strTextBlock) OR NOT eHasPropModelLoaded #IF IS_DEBUG_BUILD str = ("request assets: ") IF NOT HAS_ANIM_DICT_LOADED(tAnimDict) str += (GET_PLAYER_PED_STRING(charSheetID)) str += " " ENDIF IF NOT eHasPropModelLoaded str += (GET_MODEL_NAME_FOR_DEBUG(ePropModel)) str += " " ENDIF IF NOT Is_Family_Speech_Loaded_And_Setup(strTextBlock) str += (strTextBlock) ENDIF DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), -2, HUD_COLOUR_RED) #ENDIF RETURN FALSE ENDIF IF cash_intention_index = NEW_CONTEXT_INTENTION REGISTER_CONTEXT_INTENTION(cash_intention_index, CP_MEDIUM_PRIORITY, strCASH, TRUE) ELSE IF IS_CONTEXT_INTENTION_TOP(cash_intention_index) IF NOT IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(strCASH, iCashAskedFor) PRINT_HELP_FOREVER_WITH_NUMBER(strCASH, iCashAskedFor) ENDIF ENDIF ENDIF IF NOT HAS_CONTEXT_BUTTON_TRIGGERED(cash_intention_index) RETURN FALSE ELSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() iCompletedGivingCash = iCONST_0_requestAssets OBJECT_INDEX PropIndex CAMERA_INDEX CamIndex WHILE iCompletedGivingCash > iCONST_done AND IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PED_INJURED(PedIndex) #IF IS_DEBUG_BUILD str = ("iCompletedGivingCash:") str += iCompletedGivingCash DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENDARK) #ENDIF SWITCH iCompletedGivingCash CASE iCONST_0_requestAssets #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("requestAssets", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF IF cash_intention_index != NEW_CONTEXT_INTENTION RELEASE_CONTEXT_INTENTION(cash_intention_index) ENDIF IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(strCASH, iCashAskedFor) CLEAR_HELP() ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) ENDIF REQUEST_ANIM_DICT(tAnimDict) IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) REQUEST_MODEL(ePropModel) ENDIF KILL_ANY_CONVERSATION() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) DISPLAY_RADAR(FALSE) iCompletedGivingCash = iCONST_1_waitForLoad BREAK CASE iCONST_1_waitForLoad #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("waitForLoad", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF BOOL eFinishedWaitingForPropModelToLoad eFinishedWaitingForPropModelToLoad = TRUE IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) IF NOT HAS_MODEL_LOADED(ePropModel) eFinishedWaitingForPropModelToLoad = FALSE ENDIF ENDIF IF HAS_ANIM_DICT_LOADED(tAnimDict) AND eFinishedWaitingForPropModelToLoad iCompletedGivingCash = iNextStage ENDIF BREAK CASE iCONST_2_animStart #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("animStart", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, strTextRoot, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) TASK_PLAY_ANIM(PLAYER_PED_ID(), tAnimDict, tAnimPlayer) TASK_PLAY_ANIM(PedIndex, tAnimDict, tAnimFamMember) iCompletedGivingCash = iCONST_3_animFinish ENDIF BREAK CASE iCONST_3_animFinish #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("animFinish", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), tAnimDict, tAnimPlayer) AND NOT IS_ENTITY_PLAYING_ANIM(PedIndex, tAnimDict, tAnimFamMember) iCompletedGivingCash = iCONST_done ENDIF BREAK CASE iCONST_2_synchStart #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("synchStart", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF // IF (GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK) IF NOT Is_Ped_Playing_Family_Speech(strTextBlock, strTextRoot, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("wait for speech to start...", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_GREENDARK) #ENDIF ELSE VECTOR vSynchSceneOffset FLOAT fSynchSceneHead vSynchSceneOffset = <<0,0,0>> fSynchSceneHead = 0 IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) ENDIF iScene = -1 IF iRandomAnimSet = 99 TEXT_LABEL rootLabel INT iRootFilenameNum rootLabel = g_ConversationData.ConversationSegmentToGrab rootLabel += "A" iRootFilenameNum = GET_VARIATION_CHOSEN_FOR_SCRIPTED_LINE(rootLabel) #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("PRIVATE_GetTextLabelFromConv(\"") SAVE_STRING_TO_DEBUG_FILE(rootLabel) SAVE_STRING_TO_DEBUG_FILE("\", \"") SAVE_INT_TO_DEBUG_FILE(iRootFilenameNum) SAVE_STRING_TO_DEBUG_FILE("\")") SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF IF iRootFilenameNum < 0 iRootFilenameNum = GET_RANDOM_INT_IN_RANGE(0,6) #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("invalid iRootFilenameNum, randomized to ") SAVE_INT_TO_DEBUG_FILE(iRootFilenameNum) SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF ENDIF SWITCH iRootFilenameNum CASE 0 CASE 1 tAnimPlayer = "IG_14_IWishAll_A_PLAYER" tAnimFamMember = "IG_14_IWishAll_A_TRACY" tAnimFamProp = "IG_14_IWishAll_A_NOTE" tAnimFamCam = "IG_14_IWishAll_A_CAM" BREAK CASE 2 CASE 3 tAnimPlayer = "IG_14_IWishAll_B_PLAYER" tAnimFamMember = "IG_14_IWishAll_B_TRACY" tAnimFamProp = "IG_14_IWishAll_B_NOTE" tAnimFamCam = "IG_14_IWishAll_B_CAM" BREAK CASE 4 CASE 5 tAnimPlayer = "IG_14_ParentingAtItsFinest_PLAYER" tAnimFamMember = "IG_14_ParentingAtItsFinest_TRACY" tAnimFamProp = "IG_14_ParentingAtItsFinest_NOTE" tAnimFamCam = "IG_14_ParentingAtItsFinest_CAM" BREAK ENDSWITCH #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("iRootFilenameNum: ") SAVE_INT_TO_DEBUG_FILE(iRootFilenameNum) SAVE_STRING_TO_DEBUG_FILE(" \"") SAVE_STRING_TO_DEBUG_FILE(tAnimPlayer) SAVE_STRING_TO_DEBUG_FILE("\"") SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF ENDIF iScene = CREATE_SYNCHRONIZED_SCENE(vFamilyScenePos+vSynchSceneOffset+vScenePosOffset, <<0,0,fFamilySceneHead+fSynchSceneHead+fSceneRotOffset>>) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, TRUE) IF NOT IS_STRING_NULL_OR_EMPTY(tAnimPlayer) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iScene, tAnimDict, tAnimPlayer, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_NONE, RBF_PLAYER_IMPACT, INSTANT_BLEND_IN) ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tAnimFamMember) TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tAnimDict, tAnimFamMember, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_NONE, RBF_PLAYER_IMPACT, INSTANT_BLEND_IN) ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tAnimFamProp) PropIndex = CREATE_OBJECT(ePropModel, vFamilyScenePos+vSynchSceneOffset) PLAY_SYNCHRONIZED_ENTITY_ANIM(PropIndex, iScene, tAnimFamProp, tAnimDict, INSTANT_BLEND_IN) ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tAnimFamCam) CamIndex = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE) PLAY_SYNCHRONIZED_CAM_ANIM(CamIndex, iScene, tAnimFamCam, tAnimDict) RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDIF RESTART_TIMER_NOW(speechTimer) iCompletedGivingCash = iCONST_3_synchFinishing ENDIF ENDIF // ENDIF BREAK CASE iCONST_3_synchFinishing IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) FLOAT fScenePhase fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iScene) #IF IS_DEBUG_BUILD str = ("synchFinishing:phase ") str += GET_STRING_FROM_FLOAT(fScenePhase) IF IS_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene) str += (" hold last frame") ENDIF IF IS_SYNCHRONIZED_SCENE_LOOPED(iScene) str += (" looped") ENDIF DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) str = ("tAnimFamMember: \"") str += (tAnimFamMember) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_GREENDARK) IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) VECTOR vSynchSceneOffset FLOAT fSynchSceneHead vSynchSceneOffset = <<0,0,0>> fSynchSceneHead = 0 IF PRIVATE_Get_FamilyMember_Init_Offset(eFamilyMember, eFamilyEvent, vSynchSceneOffset, fSynchSceneHead) START_WIDGET_GROUP("PRIVATE_Update_Family_AskForCash") ADD_WIDGET_STRING("scene phase") ADD_WIDGET_FLOAT_SLIDER("fScenePhase", fScenePhase, 0.0, 1.0, 0.001) ADD_WIDGET_STRING("scene position") ADD_WIDGET_VECTOR_SLIDER("vFamilyScenePos", vFamilyScenePos, -4000.0, 4000.0, 0.0) ADD_WIDGET_VECTOR_SLIDER("vSynchSceneOffset", vSynchSceneOffset, -4000.0, 4000.0, 0.0) ADD_WIDGET_VECTOR_SLIDER("vScenePosOffset", vScenePosOffset, -20.0, 20.0, 0.001) ADD_WIDGET_STRING("scene orientation") ADD_WIDGET_FLOAT_SLIDER("fFamilySceneHead", fFamilySceneHead, -4000.0, 4000.0, 0.0) ADD_WIDGET_FLOAT_SLIDER("fSynchSceneHead", fSynchSceneHead, -4000.0, 4000.0, 0.0) ADD_WIDGET_FLOAT_SLIDER("fSceneRotOffset", fSceneRotOffset, 0.0, 360.0, 0.1) STOP_WIDGET_GROUP() WHILE NOT IS_KEYBOARD_KEY_JUST_RELEASED(KEY_C) SET_SYNCHRONIZED_SCENE_ORIGIN(iScene, vFamilyScenePos+vSynchSceneOffset+vScenePosOffset, <<0,0,fFamilySceneHead+fSynchSceneHead+fSceneRotOffset>>) SET_SYNCHRONIZED_SCENE_PHASE(iScene, fScenePhase) WAIT(0) ENDWHILE SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("fScenePhase = ")SAVE_FLOAT_TO_DEBUG_FILE(fScenePhase)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("vFamilyScenePos = ")SAVE_VECTOR_TO_DEBUG_FILE(vFamilyScenePos)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("vSynchSceneOffset = ")SAVE_VECTOR_TO_DEBUG_FILE(vSynchSceneOffset)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("vScenePosOffset = ")SAVE_VECTOR_TO_DEBUG_FILE(vScenePosOffset)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("fFamilySceneHead = ")SAVE_FLOAT_TO_DEBUG_FILE(fFamilySceneHead)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("fSynchSceneHead = ")SAVE_FLOAT_TO_DEBUG_FILE(fSynchSceneHead)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("fSceneRotOffset = ")SAVE_FLOAT_TO_DEBUG_FILE(fSceneRotOffset)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() ENDIF ENDIF #ENDIF IF (fScenePhase >= 0.95) iCompletedGivingCash = iCONST_4_synchFinished ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("synchFinishing:DONE", GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) #ENDIF iCompletedGivingCash = iCONST_4_synchFinished ENDIF BREAK CASE iCONST_4_synchFinished IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) #IF IS_DEBUG_BUILD FLOAT fScenePhase fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iScene) str = ("synchFinished:phase ") str += GET_STRING_FROM_FLOAT(fScenePhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENDARK) str = ("tDialogueAnimClip: \"") str += (tDialogueAnimClip) str += ("\"") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_GREENDARK) #ENDIF ENDIF TEXT_LABEL_63 tFamilySynchSceneDict TEXT_LABEL_63 tFamilySynchSceneClip tFamilySynchSceneDict = "" tFamilySynchSceneClip = "" ANIMATION_FLAGS eFamilySynchSceneFlag enumFamilyAnimProgress eFamilySynchSceneProgress eFamilySynchSceneFlag = AF_DEFAULT eFamilySynchSceneProgress = FAP_0_default FLOAT blendInDelta FLOAT blendOutDelta blendInDelta = INSTANT_BLEND_IN blendOutDelta = NORMAL_BLEND_OUT SYNCED_SCENE_PLAYBACK_FLAGS flags RAGDOLL_BLOCKING_FLAGS ragdollFlags FLOAT moverBlendInDelta flags = SYNCED_SCENE_USE_PHYSICS ragdollFlags = RBF_PLAYER_IMPACT moverBlendInDelta = INSTANT_BLEND_IN IF PRIVATE_Get_FamilyMember_Anim(eFamilyMember, eFamilyEvent, tFamilySynchSceneDict, tFamilySynchSceneClip, eFamilySynchSceneFlag, eFamilySynchSceneProgress) IF NOT IS_STRING_NULL_OR_EMPTY(tAnimFamMember) IF IS_BITMASK_ENUM_AS_ENUM_SET(ragdollFlags, SYNCED_SCENE_USE_PHYSICS) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) SET_PED_CAN_EVASIVE_DIVE(PedIndex, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE) ENDIF SET_SYNCHRONIZED_SCENE_PHASE(iScene, 0.0) SET_SYNCHRONIZED_SCENE_LOOPED(iScene, TRUE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iScene, FALSE) TASK_SYNCHRONIZED_SCENE(PedIndex, iScene, tFamilySynchSceneDict, tFamilySynchSceneClip, blendInDelta, blendOutDelta, flags, ragdollFlags, moverBlendInDelta) SET_FORCE_FOOTSTEP_UPDATE(PedIndex, TRUE) tDialogueAnimDict = tFamilySynchSceneDict tDialogueAnimClip = tFamilySynchSceneClip #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "PRIVATE_TaskSynchSceneDone(PedIndex, \"", tDialogueAnimDict, "\", \"", tDialogueAnimClip, "\": ", iScene, ")") #ENDIF ENDIF CLEAR_PED_TASKS(PLAYER_PED_ID()) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE) iCompletedGivingCash = iCONST_done ENDIF BREAK DEFAULT CPRINTLN(DEBUG_FAMILY, "unknown iCompletedGivingCash: ", iCompletedGivingCash) CASSERTLN(DEBUG_FAMILY, "unknown iCompletedGivingCash: ", iCompletedGivingCash) BREAK ENDSWITCH WAIT(0) ENDWHILE IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) SET_MODEL_AS_NO_LONGER_NEEDED(ePropModel) ENDIF IF DOES_ENTITY_EXIST(PropIndex) DELETE_OBJECT(PropIndex) ENDIF IF DOES_CAM_EXIST(CamIndex) STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() DESTROY_CAM(camIndex) ENDIF IF NOT IS_PED_INJURED(PedIndex) AND (iCashAskedFor > 0) DEBIT_BANK_ACCOUNT(charSheetID, BAAC_LESTER, iCashAskedFor) ENDIF DISPLAY_RADAR(TRUE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) RESTART_TIMER_NOW(speechTimer) IF IS_PED_INJURED(PedIndex) RETURN FALSE ENDIF ENDIF #IF IS_DEBUG_BUILD str = ("asking for cash:") str += iScene DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) #ENDIF RETURN TRUE ELSE IF cash_intention_index != NEW_CONTEXT_INTENTION RELEASE_CONTEXT_INTENTION(cash_intention_index) IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(strCASH, iCashAskedFor) CLEAR_HELP() ENDIF ENDIF IF (ePropModel <> DUMMY_MODEL_FOR_SCRIPT) SET_MODEL_AS_NO_LONGER_NEEDED(ePropModel) ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Find_Event(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, VECTOR vSequencePos, FLOAT fExitRad = 4.0, BOOL bSetCurrentFamilyMemberEvent = TRUE) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str #ENDIF IF VDIST2(vSequencePos, GET_ENTITY_COORDS(PedIndex)) > ((fExitRad)*(fExitRad)) #IF IS_DEBUG_BUILD str = ("Update_Family_Find_Event(") str += (Get_String_From_FamilyMember(eFamilyMember)) str += (")") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) str = ("VDIST ") str += GET_STRING_FROM_FLOAT(VDIST(vSequencePos, GET_ENTITY_COORDS(PedIndex))) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENLIGHT) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK) INT Time = DEFAULT_TIME_NEVER_WARP //DEFAULT_TIME_BEFORE_WARP FLOAT Radius = DEFAULT_NAVMESH_RADIUS TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vSequencePos, PEDMOVE_WALK, Time, Radius) ELSE #IF IS_DEBUG_BUILD str += (" FOLLOW_NAV_MESH_TO_COORD != performing") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) #ENDIF ENDIF ELSE IF IS_ENTITY_IN_WATER(PedIndex) #IF IS_DEBUG_BUILD str += ("PED IN WATER (Family_Find_Event)!!!") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) CPRINTLN(DEBUG_FAMILY, str) #ENDIF RETURN FALSE ENDIF enumFamilyEvents eDesiredFamilyEvent IF PRIVATE_Get_Desired_FamilyMember_Event(eFamilyMember, eDesiredFamilyEvent, TRUE) IF PRIVATE_Is_Valid_Find_FamilyMember_Event(eFamilyMember, eDesiredFamilyEvent) #IF IS_DEBUG_BUILD str = ("desired event ") str += (Get_String_From_FamilyEvent(eDesiredFamilyEvent)) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) #ENDIF PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, eDesiredFamilyEvent) RETURN TRUE ELSE #IF IS_DEBUG_BUILD str = ("Update_Family_Find_Event(") str += (Get_String_From_FamilyMember(eFamilyMember)) str += (") not valid? ") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENLIGHT) CPRINTLN(DEBUG_FAMILY, str) #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD str = ("Update_Family_Find_Event(") str += (Get_String_From_FamilyMember(eFamilyMember)) str += (")") TEXT_LABEL_63 str2 str2 = ("nothing desired? ") str2 += (Get_String_From_FamilyEvent(eDesiredFamilyEvent)) IF ARE_STRINGS_EQUAL(GET_THIS_SCRIPT_NAME(), "family_scene_m") SWITCH GetMichaelScheduleStage() CASE MSS_M2_WithFamily str2 += (" - M2_WithFam") BREAK CASE MSS_M4_WithoutFamily str2 += (" - M4_WithoutFam") BREAK CASE MSS_M6_Exiled str2 += (" - M6_Exiled") BREAK CASE MSS_M7_ReunitedWithFamily str2 += (" - M7_Reunited") BREAK DEFAULT str2 += (" - MSS_Mxxx") BREAK ENDSWITCH ELSE // ENDIF DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) DrawDebugFamilyTextWithOffset(str2, GET_ENTITY_COORDS(PedIndex, FALSE), 3, HUD_COLOUR_GREENLIGHT) CPRINTLN(DEBUG_FAMILY, str, str2) #ENDIF ENDIF ENDIF IF bSetCurrentFamilyMemberEvent IF IS_ENTITY_IN_WATER(PedIndex) #IF IS_DEBUG_BUILD str += ("PED IN WATER (Family_Find_Event)!!!") DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENLIGHT) CPRINTLN(DEBUG_FAMILY, str) #ENDIF RETURN FALSE ENDIF PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_wander_family_event) ENDIF RETURN FALSE ENDFUNC FUNC VECTOR PRIVATE_get_random_family_point(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, BOOL bClosest) VECTOR vEmergencyGotoCoords[10] VECTOR vOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PedIndex, <>) SWITCH eFamilyMember CASE FM_MICHAEL_SON CASE FM_MICHAEL_DAUGHTER CASE FM_MICHAEL_WIFE CASE FM_MICHAEL_MEXMAID #IF USE_TU_CHANGES CASE FM_MICHAEL_GARDENER #ENDIF //EXTERIOR vEmergencyGotoCoords[0] = <<-821.1343, 155.6063, 69.2348>> vEmergencyGotoCoords[1] = <<-793.1925, 165.5698, 70.3529>> vEmergencyGotoCoords[2] = <<-802.1196, 191.1686, 71.8350>> vEmergencyGotoCoords[3] = <<-779.3063, 184.1423, 71.8354>> vEmergencyGotoCoords[4] = <<-781.6624, 155.8212, 66.4745>> //INTERIOR vEmergencyGotoCoords[5] = <<-815.5585, 179.7955, 71.1531>> vEmergencyGotoCoords[6] = <<-806.1222, 169.9548, 71.8347>> vEmergencyGotoCoords[7] = <<-794.8763, 179.0604, 71.8347>> vEmergencyGotoCoords[8] = <<-798.2634, 185.7100, 71.6055>> IF eFamilyMember = FM_MICHAEL_SON vEmergencyGotoCoords[9] = <<-808.7040, 169.7271, 75.7504>> ELIF eFamilyMember = FM_MICHAEL_DAUGHTER vEmergencyGotoCoords[9] = <<-800.1566, 172.8743, 75.7504>> ELIF eFamilyMember = FM_MICHAEL_WIFE vEmergencyGotoCoords[9] = <<-815.9270, 179.6694, 75.7407>> ELSE vEmergencyGotoCoords[9] = <<-802.9651, 178.5574, 75.7483>> ENDIF BREAK #IF USE_TU_CHANGES CASE FM_FRANKLIN_AUNT #ENDIF CASE FM_FRANKLIN_LAMAR CASE FM_FRANKLIN_STRETCH //EXTERIOR vEmergencyGotoCoords[0] = <<-38.2037, -1459.5112, 30.3994>> vEmergencyGotoCoords[1] = <<-86.7261, -1471.7407, 31.5351>> //INTERIOR BREAK CASE FM_TREVOR_0_RON CASE FM_TREVOR_0_WIFE #IF USE_TU_CHANGES CASE FM_TREVOR_0_MICHAEL CASE FM_TREVOR_0_TREVOR #ENDIF //EXTERIOR vEmergencyGotoCoords[0] = <<1980.7178, 3819.2358, 31.4324>> vEmergencyGotoCoords[1] = <<1974.1460, 3825.4822, 31.3671>> vEmergencyGotoCoords[2] = <<1989.2611, 3820.5364, 31.3665>> vEmergencyGotoCoords[3] = <<1971.3353, 3837.5620, 30.9977>> //INTERIOR vEmergencyGotoCoords[4] = <<1975.6251, 3820.1807, 32.4501>> vEmergencyGotoCoords[5] = <<1969.5767, 3815.7659, 32.4287>> BREAK CASE FM_TREVOR_1_FLOYD //EXTERIOR vEmergencyGotoCoords[0] = <<-1148.7909, -1522.9229, 9.6330>> vEmergencyGotoCoords[1] = <<-1151.6345, -1521.5306, 3.3567>> vEmergencyGotoCoords[2] = <<-1145.8826, -1542.1782, 3.3772>> vEmergencyGotoCoords[3] = <<-1167.1464, -1505.1429, 3.3794>> vEmergencyGotoCoords[4] = <<-1187.0579, -1532.1716, 3.3795>> //INTERIOR vEmergencyGotoCoords[5] = <<-1156.8148, -1517.5059, 9.6327>> vEmergencyGotoCoords[6] = <<-1157.3087, -1525.3698, 9.6321>> vEmergencyGotoCoords[7] = <<-1148.6206, -1519.6217, 9.6327>> vEmergencyGotoCoords[8] = <<-1149.4954, -1513.1079, 9.6327>> IF (g_eCurrentSafehouseActivity = SA_TREVOR_BEER) OR (g_eCurrentSafehouseActivity = SA_TREVOR_SHOTS) vEmergencyGotoCoords[8] = <<0,0,0>> ELSE vEmergencyGotoCoords[8] = <<-1153.3973, -1522.3252, 9.6475>> ENDIF //RANDOM COORD vOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PedIndex, <>) BREAK ENDSWITCH // VECTOR vRandomCoord = GET_RANDOM_POINT_IN_SPHERE(GET_ENTITY_COORDS(PedIndex, FALSE), 20.0) // // INT iRandom = GET_RANDOM_INT_IN_RANGE(0,15) // IF iRandom < COUNT_OF(vEmergencyGotoCoords) // IF NOT ARE_VECTORS_ALMOST_EQUAL(vEmergencyGotoCoords[iRandom], <<0,0,0>>) // vRandomCoord = vEmergencyGotoCoords[iRandom] // ENDIF // ENDIF INT iCount FLOAT fShortDist = 9999999.99 INT iClosest = 99, iTotalAmount = 0 REPEAT COUNT_OF(vEmergencyGotoCoords) iCount IF NOT ARE_VECTORS_EQUAL(vEmergencyGotoCoords[iCount], <<0,0,0>>) FLOAT fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vOffset, vEmergencyGotoCoords[iCount]) IF fCurrentDist < fShortDist fShortDist = fCurrentDist iClosest = iCount ENDIF iTotalAmount++ ENDIF ENDREPEAT INT iSecondClosest = iClosest IF bClosest fShortDist = 9999999.99 REPEAT COUNT_OF(vEmergencyGotoCoords) iCount IF NOT ARE_VECTORS_EQUAL(vEmergencyGotoCoords[iCount], <<0,0,0>>) FLOAT fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vOffset, vEmergencyGotoCoords[iCount]) IF fCurrentDist < fShortDist AND iCount != iClosest fShortDist = fCurrentDist iSecondClosest = iCount ENDIF ENDIF ENDREPEAT ELSE #IF USE_TU_CHANGES IF iTotalAmount = 0 CASSERTLN(DEBUG_FAMILY, "iSecondClosest is somehow greater than COUNT_OF(vEmergencyGotoCoords)??") VECTOR vRandomCoord = <> VECTOR vSafeCoord IF GET_SAFE_COORD_FOR_PED(vRandomCoord, FALSE, vSafeCoord) vRandomCoord = vSafeCoord ENDIF CPRINTLN(DEBUG_FAMILY, "vRandomCoord[", iSecondClosest, "]: ", vRandomCoord, " //emergency bail") RETURN vRandomCoord ENDIF #ENDIF iSecondClosest = GET_RANDOM_INT_IN_RANGE(0, iTotalAmount-1) ENDIF VECTOR vRandomCoord = vEmergencyGotoCoords[iSecondClosest] VECTOR vSafeCoord IF GET_SAFE_COORD_FOR_PED(vEmergencyGotoCoords[iSecondClosest], FALSE, vSafeCoord) vRandomCoord = vSafeCoord ENDIF CPRINTLN(DEBUG_FAMILY, "vRandomCoord[", iSecondClosest, "]: ", vRandomCoord, " aka ", vEmergencyGotoCoords[iSecondClosest]) IF ARE_VECTORS_EQUAL(vRandomCoord, <<0,0,0>>) CASSERTLN(DEBUG_FAMILY, "PRIVATE_get_random_family_point(", Get_String_From_FamilyMember(eFamilyMember), ") is zero??? #1718002") RETURN vOffset ELSE RETURN vRandomCoord ENDIF ENDFUNC FUNC BOOL PRIVATE_Update_Family_Wander_Event(PED_INDEX PedIndex, enumFamilyMember eFamilyMember, INT &iWanderStage, OBJECT_INDEX &objLeftHand, MODEL_NAMES &ObjLeftHandModel, OBJECT_INDEX &objRightHand, MODEL_NAMES &eObjRightHandModel, OBJECT_INDEX &objChair, INT &iScene) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str #ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iScene) DETACH_SYNCHRONIZED_SCENE(iScene) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "detach synch scene ", Get_String_From_FamilyMember(eFamilyMember)) #ENDIF ENDIF IF (iScene <> -1) iScene = -1 #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalidate synch scene ", Get_String_From_FamilyMember(eFamilyMember)) #ENDIF ENDIF IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) #IF IS_DEBUG_BUILD str = "wanted: " DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_BLUEDARK) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK) PED_INDEX nearbyPeds[10] INT iNearbyPeds = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), nearbyPeds) INT iPed REPEAT iNearbyPeds iPed IF DOES_ENTITY_EXIST(nearbyPeds[iPed]) AND NOT IS_PED_INJURED(nearbyPeds[iPed]) IF GET_PED_TYPE(nearbyPeds[iPed]) = PEDTYPE_COP TASK_SMART_FLEE_PED(PedIndex, nearbyPeds[iPed], 75, -1, TRUE) iWanderStage = 0 RETURN FALSE ENDIF ENDIF ENDREPEAT IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_SMART_FLEE_POINT) <> PERFORMING_TASK) TASK_SMART_FLEE_COORD(PedIndex, GET_ENTITY_COORDS(PLAYER_PED_ID()), 75, -1, TRUE) iWanderStage = 0 RETURN FALSE ENDIF ENDIF IF DOES_ENTITY_EXIST(objLeftHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objLeftHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach left hand prop ", Get_String_From_FamilyMember(eFamilyMember)) DETACH_ENTITY(objLeftHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objLeftHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "left hand prop detach failed") CPRINTLN(DEBUG_FAMILY, "running inverse detach ped ", Get_String_From_FamilyMember(eFamilyMember), " from left hand prop") DETACH_ENTITY(PedIndex) ENDIF ObjLeftHandModel = DUMMY_MODEL_FOR_SCRIPT objLeftHand = NULL ENDIF ENDIF IF DOES_ENTITY_EXIST(objRightHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objRightHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach right hand prop ", Get_String_From_FamilyMember(eFamilyMember)) DETACH_ENTITY(objRightHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objRightHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "right hand prop detach failed") CPRINTLN(DEBUG_FAMILY, "running inverse detach ped ", Get_String_From_FamilyMember(eFamilyMember), " from right hand prop") DETACH_ENTITY(PedIndex) ENDIF eObjRightHandModel = DUMMY_MODEL_FOR_SCRIPT objRightHand = NULL ENDIF ENDIF IF DOES_ENTITY_EXIST(objChair) IF IS_ENTITY_ATTACHED_TO_ENTITY(objChair, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach chair prop from ped ", Get_String_From_FamilyMember(eFamilyMember)) DETACH_ENTITY(objChair) IF IS_ENTITY_ATTACHED_TO_ENTITY(objChair, PedIndex) CPRINTLN(DEBUG_FAMILY, "chair detach failed") CPRINTLN(DEBUG_FAMILY, "running inverse detach ped ", Get_String_From_FamilyMember(eFamilyMember), " from chair prop") DETACH_ENTITY(PedIndex) ENDIF objChair = NULL ENDIF ENDIF RETURN TRUE ENDIF CONST_INT Time DEFAULT_TIME_NEVER_WARP //DEFAULT_TIME_BEFORE_WARP CONST_FLOAT Radius DEFAULT_NAVMESH_RADIUS CONST_INT iCONST_WANDER_0_navmesh 0 CONST_INT iCONST_WANDER_1_wander 1 CONST_INT iCONST_WANDER_2_scenario 2 CONST_FLOAT fDIST_SCENARIO 5.0 //10.0 SWITCH iWanderStage CASE iCONST_WANDER_0_navmesh #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("0. iWander - Navmesh", GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_GREENDARK) #ENDIF IF PRIVATE_Update_Family_Find_Event(PedIndex, eFamilyMember, GET_ENTITY_COORDS(PedIndex, FALSE), 40.0) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_Find_Event (wander)!!!") SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) iWanderStage = 0 //reset RETURN TRUE ENDIF IF DOES_ENTITY_EXIST(objLeftHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objLeftHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach left hand prop") DETACH_ENTITY(objLeftHand) objLeftHand = NULL ENDIF ENDIF IF DOES_ENTITY_EXIST(objRightHand) IF IS_ENTITY_ATTACHED_TO_ENTITY(objRightHand, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach right hand prop") DETACH_ENTITY(objRightHand) objLeftHand = NULL ENDIF ENDIF IF DOES_ENTITY_EXIST(objChair) IF IS_ENTITY_ATTACHED_TO_ENTITY(objChair, PedIndex) CPRINTLN(DEBUG_FAMILY, "detach chair prop") DETACH_ENTITY(objChair) objChair = NULL ENDIF ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK) IF NOT IS_PED_IN_ANY_VEHICLE(PedIndex, TRUE) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, PRIVATE_get_random_family_point(PedIndex, eFamilyMember, TRUE), PEDMOVE_WALK, Time, Radius) RETURN FALSE ENDIF ELSE WAIT(5) IF IS_PED_INJURED(PedIndex) RETURN FALSE ENDIF NAVMESH_ROUTE_RESULT enavmesh_route_result FLOAT fOut_DistanceRemaining INT iOut_ThisIsLastRouteSection enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("navmesh...", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_GREENDARK) str = "navtask[" SWITCH enavmesh_route_result CASE NAVMESHROUTE_TASK_NOT_FOUND str += "TASK_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_NOT_YET_TRIED str += "ROUTE_NOT_YET_TRIED" BREAK CASE NAVMESHROUTE_ROUTE_NOT_FOUND str += "ROUTE_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_FOUND str += "ROUTE_FOUND" BREAK DEFAULT str += ENUM_TO_INT(enavmesh_route_result) BREAK ENDSWITCH str += ", " str += GET_STRING_FROM_FLOAT(fOut_DistanceRemaining) str += "m, s:" str += (iOut_ThisIsLastRouteSection) str += "]" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_BLUE) #ENDIF IF enavmesh_route_result != NAVMESHROUTE_ROUTE_NOT_FOUND iWanderStage = iCONST_WANDER_1_wander RETURN FALSE ELSE CLEAR_PED_TASKS(PedIndex) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, PRIVATE_get_random_family_point(PedIndex, eFamilyMember, FALSE), PEDMOVE_WALK, Time, Radius) WAIT(0) IF NOT IS_PED_INJURED(PedIndex) AND (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK) enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) IF enavmesh_route_result != NAVMESHROUTE_ROUTE_NOT_FOUND iWanderStage = iCONST_WANDER_1_wander RETURN FALSE ENDIF ENDIF ENDIF ENDIF // // STRING scenarioTypeName scenarioTypeName = "PROP_HUMAN_SEAT_CHAIR" BOOL bEnableScenarioType bEnableScenarioType = TRUE enumFamilyMember eThisFamMember PED_COMPONENT ePedCompID INT iDrawableId, iTextureID IF GetComponentForFamilyMember(FC_AMANDA_LEGS_5, eThisFamMember, ePedCompID, iDrawableId, iTextureID) IF (eFamilyMember = eThisFamMember) IF GET_PED_DRAWABLE_VARIATION(PedIndex, ePedCompID) = iDrawableId AND GET_PED_TEXTURE_VARIATION(PedIndex, ePedCompID) = iTextureID IF IS_SCENARIO_TYPE_ENABLED(scenarioTypeName) CPRINTLN(DEBUG_FAMILY, "disable \"", scenarioTypeName, "\" for heels...") SET_SCENARIO_TYPE_ENABLED(scenarioTypeName, FALSE) bEnableScenarioType = FALSE ENDIF ENDIF ENDIF ENDIF IF IS_COLLISION_MARKED_OUTSIDE(GET_ENTITY_COORDS(PedIndex, FALSE)) IF NOT IS_PED_IN_ANY_VEHICLE(PedIndex, TRUE) CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT) CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_BUMP) // TASK_WANDER_IN_AREA(PedIndex, GET_ENTITY_COORDS(PedIndex, FALSE), 40.0) TASK_WANDER_STANDARD(PedIndex) iWanderStage = iCONST_WANDER_1_wander RETURN FALSE ENDIF ENDIF BREAK CASE iCONST_WANDER_1_wander #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("1. iWander - Wander", GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_PINK) // DrawDebugFamilySphere(vSequencePos, fWanderRad, HUD_COLOUR_PINK, 0.25) #ENDIF IF PRIVATE_Update_Family_Find_Event(PedIndex, eFamilyMember, GET_ENTITY_COORDS(PedIndex, FALSE), 40.0) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_Find_Event (wander)!!!") SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) iWanderStage = 0 RETURN TRUE ENDIF IF NOT DOES_SCENARIO_EXIST_IN_AREA(GET_ENTITY_COORDS(PedIndex), fDIST_SCENARIO, TRUE) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("NO scenario in area", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_PINK) #ENDIF ELIF IS_SCENARIO_OCCUPIED(GET_ENTITY_COORDS(PedIndex), fDIST_SCENARIO, TRUE) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("scenario OCCUPIED in area", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_PINK) #ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("scenario in area", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_PINK) #ENDIF // IF eFamilyMember = FM_MICHAEL_SON // IF IS_SCENARIO_TYPE_ENABLED(scenarioTypeName) // CPRINTLN(DEBUG_FAMILY, "disable \"") // CPRINTLN(DEBUG_FAMILY, scenarioTypeName) // CPRINTLN(DEBUG_FAMILY, "\" for jimmy...") // CprintNL() // // SET_SCENARIO_TYPE_ENABLED(scenarioTypeName, FALSE) // bEnableScenarioType = FALSE // ENDIF // ENDIF IF bEnableScenarioType // IF NOT IS_SCENARIO_TYPE_ENABLED(scenarioTypeName) // CPRINTLN(DEBUG_FAMILY, "reenable \"") // CPRINTLN(DEBUG_FAMILY, scenarioTypeName) // CPRINTLN(DEBUG_FAMILY, "\" (not heels, not jimmy)...") // CprintNL() // // SET_SCENARIO_TYPE_ENABLED(scenarioTypeName, TRUE) // ENDIF ENDIF IF (g_eCurrentSafehouseActivity = SA_MICHAEL_SOFA) IF NOT IS_STRING_NULL_OR_EMPTY(scenarioTypeName) AND IS_SCENARIO_TYPE_ENABLED(scenarioTypeName) CPRINTLN(DEBUG_FAMILY, "disable \"", scenarioTypeName, "\" for sofa activity...") SET_SCENARIO_TYPE_ENABLED(scenarioTypeName, FALSE) RETURN FALSE ENDIF ENDIF IF NOT (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) <> PERFORMING_TASK) TASK_USE_NEAREST_SCENARIO_TO_COORD(PedIndex, GET_ENTITY_COORDS(PedIndex), fDIST_SCENARIO, 0) ELSE SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) iWanderStage = iCONST_WANDER_2_scenario RETURN FALSE ENDIF ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK) NAVMESH_ROUTE_RESULT enavmesh_route_result FLOAT fOut_DistanceRemaining INT iOut_ThisIsLastRouteSection enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("navmesh...", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_PINK) str = "navtask[" SWITCH enavmesh_route_result CASE NAVMESHROUTE_TASK_NOT_FOUND str += "TASK_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_NOT_YET_TRIED str += "ROUTE_NOT_YET_TRIED" BREAK CASE NAVMESHROUTE_ROUTE_NOT_FOUND str += "ROUTE_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_FOUND str += "ROUTE_FOUND" BREAK DEFAULT str += ENUM_TO_INT(enavmesh_route_result) BREAK ENDSWITCH str += ", " str += GET_STRING_FROM_FLOAT(fOut_DistanceRemaining) str += "m, s:" str += (iOut_ThisIsLastRouteSection) str += "]" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 5, HUD_COLOUR_BLUE) #ENDIF IF enavmesh_route_result = NAVMESHROUTE_ROUTE_NOT_FOUND VECTOR vRandomCoord vRandomCoord = PRIVATE_get_random_family_point(PedIndex, eFamilyMember, FALSE) CLEAR_PED_TASKS(PedIndex) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vRandomCoord, PEDMOVE_WALK, Time, Radius) CPRINTLN(DEBUG_FAMILY, "vRandomCoord: ", vRandomCoord) iWanderStage = iCONST_WANDER_0_navmesh RETURN FALSE ENDIF RETURN FALSE ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) = PERFORMING_TASK) NAVMESH_ROUTE_RESULT enavmesh_route_result FLOAT fOut_DistanceRemaining INT iOut_ThisIsLastRouteSection enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) #IF IS_DEBUG_BUILD str = "wandtask[" SWITCH enavmesh_route_result CASE NAVMESHROUTE_TASK_NOT_FOUND str += "TASK_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_NOT_YET_TRIED str += "ROUTE_NOT_YET_TRIED" BREAK CASE NAVMESHROUTE_ROUTE_NOT_FOUND str += "ROUTE_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_FOUND str += "ROUTE_FOUND" BREAK DEFAULT str += ENUM_TO_INT(enavmesh_route_result) BREAK ENDSWITCH str += ", " str += GET_STRING_FROM_FLOAT(fOut_DistanceRemaining) str += "m, s:" str += (iOut_ThisIsLastRouteSection) str += "]" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 5, HUD_COLOUR_BLUE) #ENDIF IF enavmesh_route_result = NAVMESHROUTE_ROUTE_NOT_FOUND TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, PRIVATE_get_random_family_point(PedIndex, eFamilyMember, TRUE), PEDMOVE_WALK, Time, Radius) iWanderStage = iCONST_WANDER_0_navmesh CPRINTLN(DEBUG_FAMILY, "NAVMESHROUTE_ROUTE_NOT_FOUND (wandmiss)") RETURN FALSE ENDIF ENDIF IF IS_PED_RAGDOLL(PedIndex) SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT|RBF_PLAYER_BUMP) iWanderStage = iCONST_WANDER_0_navmesh RETURN FALSE ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_IN_AREA) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_WANDER_STANDARD) = PERFORMING_TASK) ELSE iWanderStage = iCONST_WANDER_0_navmesh RETURN FALSE ENDIF RETURN TRUE BREAK CASE iCONST_WANDER_2_scenario #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("2. iWander - Scenario", GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_BLUE) #ENDIF IF (GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) <> PERFORMING_TASK) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("not performing...", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_BLUE) #ENDIF IF NOT (g_eCurrentSafehouseActivity = SA_MICHAEL_SOFA) IF DOES_SCENARIO_EXIST_IN_AREA(GET_ENTITY_COORDS(PedIndex), fDIST_SCENARIO, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD(PedIndex, GET_ENTITY_COORDS(PedIndex), fDIST_SCENARIO, 0) NAVMESH_ROUTE_RESULT enavmesh_route_result FLOAT fOut_DistanceRemaining INT iOut_ThisIsLastRouteSection enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) #IF IS_DEBUG_BUILD str = "wandtask[" SWITCH enavmesh_route_result CASE NAVMESHROUTE_TASK_NOT_FOUND str += "TASK_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_NOT_YET_TRIED str += "ROUTE_NOT_YET_TRIED" BREAK CASE NAVMESHROUTE_ROUTE_NOT_FOUND str += "ROUTE_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_FOUND str += "ROUTE_FOUND" BREAK DEFAULT str += ENUM_TO_INT(enavmesh_route_result) BREAK ENDSWITCH str += ", " str += GET_STRING_FROM_FLOAT(fOut_DistanceRemaining) str += "m, s:" str += (iOut_ThisIsLastRouteSection) str += "]" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 5, HUD_COLOUR_BLUE) #ENDIF IF enavmesh_route_result = NAVMESHROUTE_ROUTE_NOT_FOUND or enavmesh_route_result = NAVMESHROUTE_TASK_NOT_FOUND VECTOR vRandomCoord vRandomCoord = PRIVATE_get_random_family_point(PedIndex, eFamilyMember, TRUE) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vRandomCoord, PEDMOVE_WALK, Time, Radius) iWanderStage = iCONST_WANDER_0_navmesh CPRINTLN(DEBUG_FAMILY, "NAVMESHROUTE_ROUTE_NOT_FOUND (wandmiss)") RETURN FALSE ENDIF ELSE iWanderStage = iCONST_WANDER_1_wander RETURN FALSE ENDIF ELSE VECTOR vRandomCoord vRandomCoord = PRIVATE_get_random_family_point(PedIndex, eFamilyMember, TRUE) TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, vRandomCoord, PEDMOVE_WALK, Time, Radius) iWanderStage = iCONST_WANDER_0_navmesh CPRINTLN(DEBUG_FAMILY, "NAVMESHROUTE_ROUTE_NOT_FOUND (wandmiss)") RETURN FALSE ENDIF ELSE #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("performing...", GET_ENTITY_COORDS(PedIndex, FALSE), 4, HUD_COLOUR_BLUE) #ENDIF ENDIF IF NOT PED_HAS_USE_SCENARIO_TASK(PedIndex) #IF IS_DEBUG_BUILD DrawDebugFamilyTextWithOffset("not has task...", GET_ENTITY_COORDS(PedIndex, FALSE), 5, HUD_COLOUR_BLUE) #ENDIF ELSE NAVMESH_ROUTE_RESULT enavmesh_route_result FLOAT fOut_DistanceRemaining INT iOut_ThisIsLastRouteSection enavmesh_route_result = GET_NAVMESH_ROUTE_DISTANCE_REMAINING(PedIndex, fOut_DistanceRemaining, iOut_ThisIsLastRouteSection) #IF IS_DEBUG_BUILD str = "scenario[" SWITCH enavmesh_route_result CASE NAVMESHROUTE_TASK_NOT_FOUND str += "TASK_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_NOT_YET_TRIED str += "ROUTE_NOT_YET_TRIED" BREAK CASE NAVMESHROUTE_ROUTE_NOT_FOUND str += "ROUTE_NOT_FOUND" BREAK CASE NAVMESHROUTE_ROUTE_FOUND str += "ROUTE_FOUND" BREAK DEFAULT str += ENUM_TO_INT(enavmesh_route_result) BREAK ENDSWITCH str += ", " str += GET_STRING_FROM_FLOAT(fOut_DistanceRemaining) str += "m, s:" str += (iOut_ThisIsLastRouteSection) str += "]" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 5, HUD_COLOUR_BLUE) #ENDIF IF PRIVATE_Update_Family_Find_Event(PedIndex, eFamilyMember, GET_ENTITY_COORDS(PedIndex, FALSE), 40.0) CPRINTLN(DEBUG_FAMILY, "PRIVATE_Update_Family_Find_Event (scenario)!!!") RETURN TRUE ENDIF IF (iOut_ThisIsLastRouteSection > 0) IF IS_SCENARIO_OCCUPIED(GET_ENTITY_COORDS(PedIndex), fOut_DistanceRemaining+0.5, TRUE) enavmesh_route_result = enavmesh_route_result CLEAR_PED_TASKS(PedIndex) iWanderStage = iCONST_WANDER_1_wander RETURN FALSE ENDIF ENDIF ENDIF BREAK DEFAULT #IF IS_DEBUG_BUILD str = "iWanderStage: " str += iWanderStage DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(PedIndex, FALSE), 2, HUD_COLOUR_ORANGELIGHT) #ENDIF BREAK ENDSWITCH eFamilyMember = eFamilyMember RETURN FALSE ENDFUNC FUNC BOOL PRIVATE_Update_Family_Cop(PED_INDEX CrookPedIndex, enumFamilyMember eFamilyMember, PED_INDEX &CopPedIndex) IF NOT DOES_ENTITY_EXIST(CopPedIndex) // CLEAR_PED_TASKS(CopPedIndex) RETURN FALSE //TRUE ENDIF IF NOT IS_PED_INJURED(CopPedIndex) IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) // WEAPON_TYPE TypeOfWeapon = WEAPONTYPE_PISTOL IF NOT HAS_PED_GOT_WEAPON(CrookPedIndex, TypeOfWeapon) GIVE_WEAPON_TO_PED(CrookPedIndex, TypeOfWeapon, INFINITE_AMMO, FALSE) ENDIF IF NOT HAS_PED_GOT_WEAPON(CopPedIndex, TypeOfWeapon) GIVE_WEAPON_TO_PED(CopPedIndex, TypeOfWeapon, INFINITE_AMMO, FALSE) ENDIF IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), CopPedIndex) SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 1) RETURN FALSE ENDIF IF NOT IS_PED_FACING_PED(CopPedIndex, CrookPedIndex, 15.0) TASK_TURN_PED_TO_FACE_ENTITY(CopPedIndex, CrookPedIndex) #IF IS_DEBUG_BUILD DrawDebugFamilyLine(GET_ENTITY_COORDS(CopPedIndex), GET_ENTITY_COORDS(CrookPedIndex), HUD_COLOUR_REDDARK) #ENDIF ELSE IF NOT PED_HAS_USE_SCENARIO_TASK(CopPedIndex) TASK_START_SCENARIO_IN_PLACE(CopPedIndex, "WORLD_VEHICLE_POLICE_NEXT_TO_CAR") ENDIF ENDIF // IF NOT IS_PED_FACING_PED(CrookPedIndex, CopPedIndex, 30.0) // TASK_TURN_PED_TO_FACE_ENTITY(CrookPedIndex, CopPedIndex) // ENDIF #IF IS_DEBUG_BUILD DrawDebugFamilyLine(GET_ENTITY_COORDS(CopPedIndex), GET_ENTITY_COORDS(CrookPedIndex), HUD_COLOUR_BLUEDARK) #ENDIF ELSE // TASK_COMBAT_PED(CopPedIndex, PLAYER_PED_ID()) SET_PED_KEEP_TASK(CopPedIndex, TRUE) SET_PED_AS_NO_LONGER_NEEDED(CopPedIndex) PRIVATE_Set_Current_Family_Member_Event(eFamilyMember, FE_ANY_find_family_event) RETURN FALSE ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC