USING "rage_builtins.sch" USING "globals.sch" USING "commands_camera.sch" USING "finance_modifiers_public.sch" USING "drunk_private.sch" #IF IS_DEBUG_BUILD USING "player_ped_public.sch" #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : drunk_public.sch // AUTHOR : Keith / Alwyn // DESCRIPTION : The public interface into the drunk control routines. // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** CONST_FLOAT MAX_DRUNK_CAMERA_STRENGTH 5.0 ENUM SMOKING_EFFECT SMOKING_EFFECT_STONED, #IF FEATURE_MUSIC_STUDIO SMOKING_EFFECT_SHORT_TRIP #ENDIF ENDENUM // ----------------------------------------------------------------------------------------- // Public Drunk Request routines // ----------------------------------------------------------------------------------------- /// PURPOSE: /// /// RETURNS: /// FUNC BOOL Should_Drunk_Controller_Be_Running() IF (g_drunkCameraActive) #IF IS_DEBUG_BUILD IF g_bDrawDebugDrunkInfo CDEBUG3LN(DEBUG_DRUNK, " g_drunkCameraActive ") ENDIF #ENDIF RETURN TRUE ENDIF IF DOES_CAM_EXIST(g_drunkCameraIndex) #IF IS_DEBUG_BUILD IF g_bDrawDebugDrunkInfo CDEBUG3LN(DEBUG_DRUNK, " DOES_CAM_EXIST(g_drunkCameraIndex) ") ENDIF #ENDIF RETURN TRUE ENDIF IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("drunk")) > 0 #IF IS_DEBUG_BUILD IF g_bDrawDebugDrunkInfo CDEBUG3LN(DEBUG_DRUNK, " number of drunk threads = ", GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("drunk"))) ENDIF #ENDIF RETURN TRUE ENDIF IF g_drunkRequestsPending > 0 #IF IS_DEBUG_BUILD IF g_bDrawDebugDrunkInfo CDEBUG3LN(DEBUG_DRUNK, " g_drunkRequestsPending = ", g_drunkRequestsPending) ENDIF #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD IF g_bDrawDebugDrunkInfo CDEBUG3LN(DEBUG_DRUNK, " g_drunkRequestsPending = ", g_drunkRequestsPending) ENDIF #ENDIF RETURN FALSE ENDFUNC // ----------------------------------------------------------------------------------------- // Public Drunk Request routines // ----------------------------------------------------------------------------------------- // PURPOSE: Clear out one slot in the Drunk request array // // INPUT PARAMS: paramArrayIndex Index into the drunk requests array PROC Clear_One_Drunk_Request(INT paramArrayIndex) IF (paramArrayindex < 0) OR (paramArrayIndex >= MAX_NUMBER_OF_DRUNK_REQUESTS) SCRIPT_ASSERT("Clear_One_Drunk_Request: array index out of bounds") EXIT ENDIF IF NOT (g_drunkRequests[paramArrayIndex].ped = NULL) IF (g_drunkRequests[paramArrayIndex].ped = PLAYER_PED_ID()) g_playerRequestedToBeDrunk = FALSE ENDIF ENDIF g_drunkRequests[paramArrayIndex].status = DS_NO_STATUS g_drunkRequests[paramArrayIndex].ped = NULL g_drunkRequests[paramArrayIndex].ragdoll_msec = DRUNK_LEVEL_NOT_DRUNK g_drunkRequests[paramArrayIndex].overall_msec = DRUNK_LEVEL_NOT_DRUNK g_drunkRequests[paramArrayIndex].vehicle = NULL DEBUG_PRINTCALLSTACK() g_drunkRequestsPending-- IF g_drunkRequestsPending < 0 g_drunkRequestsPending = 0 ENDIF ENDPROC // PURPOSE: Clear out all slots in the Drunk request array PROC Clear_All_Drunk_Requests() INT tempLoop = 0 REPEAT MAX_NUMBER_OF_DRUNK_REQUESTS tempLoop Clear_One_Drunk_Request(tempLoop) ENDREPEAT ENDPROC // ----------------------------------------------------------------------------------------- // Public Drunk Ped routines // ----------------------------------------------------------------------------------------- /// PURPOSE: /// Returns true if the timecycle modifier for the ped being /// either drunk or high is active. FUNC BOOL Is_Drunk_Or_High_Cam_Effect_Active() RETURN g_drunkCameraActive AND NOT IS_STRING_NULL_OR_EMPTY(g_drunkCameraTimeCycleName) ENDFUNC // PURPOSE: Get the array index in the Drunk ped array that contains this Unique Drunk Ped ID // // INPUT PARAMS: paramUniqueID Unique Drunk Ped ID being searched for // RETURN VALUE: INT Array Index associated with this Ped ID, or UNKNOWN_DRUNK_ARRAY_INDEX FUNC INT Get_Drunk_Ped_Array_Index_For_This_Unique_Drunk_Ped_ID(INT paramUniqueID) INT tempLoop = 0 REPEAT MAX_NUMBER_OF_DRUNK_PEDS tempLoop IF (g_drunkPeds[tempLoop].uniqueID = paramUniqueID) RETURN tempLoop ENDIF ENDREPEAT RETURN UNKNOWN_DRUNK_ARRAY_INDEX ENDFUNC // PURPOSE: Clear one slot in the Drunk Ped array // // INPUT PARAMS: paramArrayIndex Index into the drunk peds array PROC Clear_One_Drunk_Ped(INT paramArrayIndex) IF (paramArrayindex < 0) OR (paramArrayIndex >= MAX_NUMBER_OF_DRUNK_PEDS) SCRIPT_ASSERT("Clear_One_Drunk_Ped: array index out of bounds") EXIT ENDIF g_drunkPeds[paramArrayIndex].uniqueID = NO_UNIQUE_DRUNK_PED_ID g_drunkPeds[paramArrayIndex].myPedIndex = NULL g_drunkPeds[paramArrayIndex].eDrunkLevel = DL_NO_LEVEL g_drunkPeds[paramArrayIndex].iAlcoholHit = 0 g_drunkPeds[paramArrayIndex].iWeedHit = 0 ENDPROC // PURPOSE: Clear all slots in the Drunk Ped array PROC Clear_All_Drunk_Peds() INT tempLoop = 0 REPEAT MAX_NUMBER_OF_DRUNK_PEDS tempLoop Clear_One_Drunk_Ped(tempLoop) ENDREPEAT ENDPROC // NOTES: The intention of this function is to tidy up after drunk peds where the 'drunk' script has terminated. // This function will not terminate the 'drunk' script since it assumes it has already terminated. // // PURPOSE: To clear all Drunk Ped details for this Unique Drunk Ped ID. // Details include the Drunk Ped details and any notices directly to or from this Drunk Ped ID. // (more... Alt-G) // // INPUT PARAMS: paramUniqueID Unique Drunk Ped ID of ped that is no longer drunk PROC Clear_All_Drunk_Ped_Details_For_This_ID(INT paramUniqueID) Clear_All_Notices_With_This_Unique_Drunk_Ped_ID(paramUniqueID) INT drunkPedIndex = Get_Drunk_Ped_Array_Index_For_This_Unique_Drunk_Ped_ID(paramUniqueID) IF (drunkPedIndex = UNKNOWN_DRUNK_ARRAY_INDEX) EXIT ENDIF Clear_One_Drunk_Ped(drunkPedIndex) ENDPROC // PURPOSE: Clear out all variables PROC Reset_All_Drunk_Variables_And_Terminate_All_Unneeded_Scripts() // Initial set up // ...clear out all the drunk requests Clear_All_Drunk_Requests() // ...clear out all the drunk peds Clear_All_Drunk_Peds() // ...clear out all the drunk notices Clear_All_Drunk_Notices() // ...reset drunk camera variables Reset_Drunk_Camera_Variables() // Reset Player Is Drunk variable g_playerIsDrunk = FALSE g_playerRequestedToBeDrunk = FALSE g_drunkRequestsPending = 0 TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("drunk") ENDPROC // PURPOSE: Forces all drunk peds to become sober PROC Force_All_Drunk_Peds_To_Become_Sober() CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Force_All_Drunk_Peds_To_Become_Sober()") // Make all drunk peds sober? INT drunkPedArrayIndex = 0 INT uniqueDrunkPedID = 0 REPEAT MAX_NUMBER_OF_DRUNK_PEDS drunkPedArrayIndex uniqueDrunkPedID = g_drunkPeds[drunkPedArrayIndex].uniqueID IF NOT (uniqueDrunkPedID = NO_UNIQUE_DRUNK_PED_ID) // ...found a drunk ped, so send a 'Become Sober' notice Post_Drunk_Notice(UNIQUE_ID_PUBLIC_FUNCTIONS, uniqueDrunkPedID, DNID_BECOME_SOBER) ENDIF ENDREPEAT // Ped isn't drunk, so check if it has been requested to be drunk INT drunkRequestArrayIndex = 0 REPEAT MAX_NUMBER_OF_DRUNK_REQUESTS drunkRequestArrayIndex IF (g_drunkRequests[drunkRequestArrayIndex].status = DS_REQUEST_SCRIPT) // Clear this drunk request array index Clear_One_Drunk_Request(drunkRequestArrayIndex) ENDIF ENDREPEAT ENDPROC // ----------------------------------------------------------------------------------------- // Public Unique Ped ID routines // ----------------------------------------------------------------------------------------- // PURPOSE: To get the already created Unique Drunk Ped ID for a ped // // INPUT PARAMS: paramPed Ped whose unique ID is being searched for // RETURN VALUE: INT Unique ID if the ped is drunk, or NO_UNIQUE_DRUNK_PED_ID FUNC INT Get_Peds_Unique_Drunk_Ped_ID(PED_INDEX paramPed) IF (paramPed = NULL) RETURN NO_UNIQUE_DRUNK_PED_ID ENDIF INT tempLoop = 0 REPEAT MAX_NUMBER_OF_DRUNK_PEDS tempLoop IF (paramPed = g_drunkPeds[tempLoop].myPedIndex) RETURN (g_drunkPeds[tempLoop].uniqueID) ENDIF ENDREPEAT RETURN NO_UNIQUE_DRUNK_PED_ID ENDFUNC // ----------------------------------------------------------------------------------------- // Drunk Level Ped ID routines // ----------------------------------------------------------------------------------------- // PURPOSE: To get the already created Unique Drunk Ped ID for a ped // // INPUT PARAMS: paramPed Ped whose unique ID is being searched for // RETURN VALUE: INT Unique ID if the ped is drunk, or NO_UNIQUE_DRUNK_PED_ID FUNC g_eDrunkLevel Get_Peds_Drunk_Level(PED_INDEX paramPed) IF (paramPed = NULL) RETURN DL_NO_LEVEL ENDIF IF NOT (DOES_ENTITY_EXIST(paramPed)) RETURN DL_NO_LEVEL ENDIF // Ignore duplicate requests INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramPed) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) RETURN DL_NO_LEVEL ENDIF RETURN g_drunkPeds[arrayIndex].eDrunkLevel ENDFUNC // PURPOSE: To get the already created Unique Drunk Ped ID for a ped // // INPUT PARAMS: paramPed Ped whose unique ID is being searched for // RETURN VALUE: INT Unique ID if the ped is drunk, or NO_UNIQUE_DRUNK_PED_ID FUNC STRING Get_Drunk_Level_Moveclip(g_eDrunkLevel thisDrunkLevel) SWITCH thisDrunkLevel CASE DL_verydrunk RETURN "move_m@drunk@verydrunk" BREAK CASE DL_slightlydrunk RETURN "move_m@drunk@slightlydrunk" BREAK CASE DL_moderatedrunk RETURN "move_m@drunk@moderatedrunk" BREAK ENDSWITCH RETURN "" ENDFUNC // ----------------------------------------------------------------------------------------- // Drunk Level Ped ID routines // ----------------------------------------------------------------------------------------- FUNC INT Get_Peds_Drunk_Alcohol_Hit_Count(PED_INDEX paramPed) IF (paramPed = NULL) RETURN 0 ENDIF IF NOT (DOES_ENTITY_EXIST(paramPed)) RETURN 0 ENDIF // Ignore duplicate requests INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramPed) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) RETURN ENUM_TO_INT(DL_NO_LEVEL) ENDIF RETURN g_drunkPeds[arrayIndex].iAlcoholHit ENDFUNC FUNC INT Get_Peds_Drunk_Weed_Hit_Count(PED_INDEX paramPed) IF (paramPed = NULL) RETURN 0 ENDIF IF NOT (DOES_ENTITY_EXIST(paramPed)) RETURN 0 ENDIF // Ignore duplicate requests INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramPed) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) RETURN ENUM_TO_INT(DL_NO_LEVEL) ENDIF RETURN g_drunkPeds[arrayIndex].iWeedHit ENDFUNC // ----------------------------------------------------------------------------------------- // Public Drunk control routines // ----------------------------------------------------------------------------------------- // PURPOSE: Find the array index of the ped in the Drunk Ped array. // This doesn't check the drunk requests, only the existing drunks. // // INPUT PARAMS: paramPed The ped index of the ped being checked // RETURN VALUE: INT The Drunk Ped array index, or UNKNOWN_DRUNK_ARRAY_INDEX FUNC INT Get_Drunk_Ped_Array_Index_For_This_Ped_Index(PED_INDEX paramPed) IF (paramPed = NULL) RETURN UNKNOWN_DRUNK_ARRAY_INDEX ENDIF INT tempLoop = 0 REPEAT MAX_NUMBER_OF_DRUNK_PEDS tempLoop IF NOT (g_drunkPeds[tempLoop].uniqueID = NO_UNIQUE_DRUNK_PED_ID) IF (paramPed = g_drunkPeds[tempLoop].myPedIndex) RETURN tempLoop ENDIF ENDIF ENDREPEAT RETURN UNKNOWN_DRUNK_ARRAY_INDEX ENDFUNC // PURPOSE: Checks the Drunk Ped array to see if a ped is drunk. // This doesn't check the drunk requests, only the existing drunks. // // INPUT PARAMS: paramPed The ped index of the ped being checked // RETURN VALUE: BOOL TRUE if the ped is drunk, otherwise FALSE FUNC BOOL Is_Ped_Drunk(PED_INDEX paramPed) IF (paramPed = NULL) RETURN FALSE ENDIF IF (Get_Drunk_Ped_Array_Index_For_This_Ped_Index(paramPed) = UNKNOWN_DRUNK_ARRAY_INDEX) RETURN FALSE ENDIF RETURN TRUE ENDFUNC // PURPOSE: Requests that the ped becomes drunk // // INPUT PARAMS: paramPed The ped index for the ped that is about to become drunk // paramRagdollMsec Number of Msec the ped should ragdoll for // RETURN VALUE: BOOL TRUE if the ped has successfully become drunk, otherwise FALSE FUNC BOOL Make_Ped_Drunk(PED_INDEX paramPed, INT paramRagdoll_msec, BOOL ignoreParamTimeCheck = FALSE) IF (paramPed = NULL) RETURN FALSE ENDIF IF NOT (DOES_ENTITY_EXIST(paramPed)) RETURN FALSE ENDIF // Ignore duplicate requests // Check if the drunk ped is already drunk INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramPed) IF NOT (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) // ...ped is already drunk RETURN TRUE ENDIF // Ped isn't already drunk, so check if the ped has been requested to be drunk INT arrayIndex = Get_Peds_Drunk_Request_Array_Index(paramPed) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // ...ped has already been requested to be drunk RETURN TRUE ENDIF // Ignore illegal drunk time parameters IF NOT ignoreParamTimeCheck IF (paramRagdoll_msec = DRUNK_LEVEL_NOT_DRUNK) OR (paramRagdoll_msec < 0) SCRIPT_ASSERT("Attempt to Make_Ped_Drunk but ragdoll msec requested is NOT_DRUNK or a negative value") RETURN FALSE ENDIF ENDIF // Request this ped to become drunk INT freeSlot = Get_An_Empty_Drunk_Request_Slot() IF (freeSlot = UNKNOWN_DRUNK_ARRAY_INDEX) CPRINTLN(DEBUG_DRUNK, "All drunk request slots are full - Need to increase MAX_NUMBER_OF_DRUNK_REQUESTS") RETURN FALSE ENDIF // Store the details // NOTE: Initially store the overall msec to be the same as the ragdolling msec - a separate command can change this g_drunkRequests[freeSlot].status = DS_REQUEST_SCRIPT g_drunkRequests[freeSlot].ped = paramPed g_drunkRequests[freeSlot].ragdoll_msec = paramRagdoll_msec g_drunkRequests[freeSlot].overall_msec = paramRagdoll_msec g_drunkRequests[freeSlot].vehicle = NULL // Set the 'player requested to be drunk' flag IF (paramPed = PLAYER_PED_ID()) g_playerRequestedToBeDrunk = TRUE ENDIF g_drunkRequestsPending++ #IF IS_DEBUG_BUILD TEXT_LABEL_63 tlDrunkPedName = "" IF (paramPed = PLAYER_PED_ID()) tlDrunkPedName = "player " ENDIF MODEL_NAMES paramPedModel = GET_ENTITY_MODEL(paramPed) enumCharacterList ePed = GET_PLAYER_PED_ENUM(paramPed) IF ePed <> NO_CHARACTER tlDrunkPedName += GET_PLAYER_PED_STRING(ePed) ELIF (paramPedModel = MP_M_FREEMODE_01) tlDrunkPedName += "MP_M_FREEMODE_01" ELIF (paramPedModel = MP_F_FREEMODE_01) tlDrunkPedName += "MP_F_FREEMODE_01" ELSE tlDrunkPedName += GET_MODEL_NAME_FOR_DEBUG(paramPedModel) ENDIF CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Make_Ped_Drunk(", tlDrunkPedName, ", ", paramRagdoll_msec, ") //", g_drunkRequestsPending) #ENDIF RETURN TRUE ENDFUNC // PURPOSE: Requests that the ped becomes drunk // // INPUT PARAMS: paramPed The ped index for the ped that is about to become drunk // paramRagdollMsec Number of Msec the ped should ragdoll for // RETURN VALUE: BOOL TRUE if the ped has successfully become drunk, otherwise FALSE FUNC BOOL Make_Ped_Drunk_Constant(PED_INDEX paramPed) RETURN Make_Ped_Drunk(paramPed, DRUNK_LEVEL_CONSTANT, TRUE) ENDFUNC // NOTES: A notice gets posted for the drunk ped informing it to become sober. When read, the associated // drunk script will terminate. This will cause it to stop sending 'Still Drunk' messages to the // control script and the control script will tidy up any other details associated with that // drunk ped. // // PURPOSE: Makes a ped instantly sober - doesn't affect camera effects. // (more... Alt_G) // // INPUT PARAMS: paramPed The ped index of the ped that must become sober. PROC Make_Ped_Sober(PED_INDEX paramPed) IF (paramPed = NULL) EXIT ENDIF IF NOT (DOES_ENTITY_EXIST(paramPed)) EXIT ENDIF // Is the ped drunk? INT drunkPedArrayIndex = Get_Drunk_Ped_Array_Index_For_This_Ped_Index(paramPed) IF NOT (drunkPedArrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // ...the ped does exist and is drunk, so send a 'Become Sober' notice INT uniqueDrunkPedID = g_drunkPeds[drunkPedArrayIndex].uniqueID Post_Drunk_Notice(UNIQUE_ID_PUBLIC_FUNCTIONS, uniqueDrunkPedID, DNID_BECOME_SOBER) EXIT ENDIF // Ped isn't drunk, so check if it has been requested to be drunk INT drunkRequestArrayIndex = Get_Peds_Drunk_Request_Array_Index(paramPed) IF (drunkRequestArrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) EXIT ENDIF // Clear this drunk request array index Clear_One_Drunk_Request(drunkRequestArrayIndex) #IF IS_DEBUG_BUILD enumCharacterList ePed = GET_PLAYER_PED_ENUM(paramPed) IF ePed <> NO_CHARACTER CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Make_Ped_Sober(", GET_PLAYER_PED_STRING(ePed), ") //", g_drunkRequestsPending) ELSE CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Make_Ped_Sober(", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(paramPed)), ") //", g_drunkRequestsPending) ENDIF #ENDIF ENDPROC // PURPOSE: Extend the drunk time for other drunk effects like steering bias (0 to cancel extension) // Doesn't apply to ragdolling // // INPUT PARAMS: paramDrunkPed The Drunk Ped having time extended for other effects // paramTime_msec The extended time in milliseconds PROC Extend_Overall_Drunk_Time(PED_INDEX paramDrunkPed, INT paramTime_msec) IF (paramDrunkPed = NULL) EXIT ENDIF IF NOT (DOES_ENTITY_EXIST(paramDrunkPed)) EXIT ENDIF // Ignore illegal time parameters IF (paramTime_msec < 0) SCRIPT_ASSERT("Extend_Overall_Drunk_Time(): time msec requested is a negative value") EXIT ENDIF // Check if the drunk ped is already drunk INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) INT arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) // ...drunk ped isn't already drunk, so check if the ped has been requested to be drunk arrayIndex = Get_Peds_Drunk_Request_Array_Index(paramDrunkPed) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // ...ped has been requested to be drunk, so add the extended time parameter g_drunkRequests[arrayIndex].overall_msec += paramTime_msec g_drunkRequests[arrayIndex].ragdoll_msec += paramTime_msec ENDIF EXIT ENDIF // Drunk Ped is already drunk, so update the overall time details Post_Drunk_Notice_With_Int(UNIQUE_ID_PUBLIC_FUNCTIONS, drunkPedUniqueID, DNID_EXTENDED_TIME, paramTime_msec) ENDPROC PROC Force_Cleanup_Drunk_Ped(PED_INDEX paramDrunkPed) RESET_PED_MOVEMENT_CLIPSET(paramDrunkPed) CLEAR_PED_ALTERNATE_MOVEMENT_ANIM(paramDrunkPed, AAT_IDLE) SET_PED_RESET_FLAG(paramDrunkPed, PRF_DisableActionMode, FALSE) SET_PED_CAN_PLAY_AMBIENT_ANIMS(paramDrunkPed, TRUE) SET_PED_FLEE_ATTRIBUTES(paramDrunkPed, FA_DISABLE_AMBIENT_CLIPS, FALSE) SET_PED_IS_DRUNK(paramDrunkPed, FALSE) ENDPROC // PURPOSE: Activate the drunk camera for a set time // // INPUT PARAMS: paramTime_msec The time in milliseconds that the drunk camera should be active for // paramTimeout The time in milliseconds that the drunk camera should start returning to normal // paramStrength The strength of the camera effect (between 0.0 to 1.0) [default = 0.3] // amplitudeScalar The strength of the camera effect (between 0.0 to 1.0) [default = 0.3] PROC Activate_Drunk_Camera(INT paramTime_msec, INT paramTimeout_msec = DRUNK_DEFAULT_TIMEOUT_msec, FLOAT paramStrength = 0.3, FLOAT amplitudeScalar = 1.0, CAMERA_INDEX scriptCamIndex = NULL, BOOL ignoreParamTimeCheck = FALSE) IF (g_bMagDemoActive) EXIT ENDIF IF (g_drunkCameraActive) EXIT ENDIF IF NOT ignoreParamTimeCheck IF (paramTime_msec < 0) SCRIPT_ASSERT("Activate_Drunk_Camera: Camera activated with a negative activation time") EXIT ENDIF ENDIF IF (paramStrength < 0.0) OR (paramStrength > MAX_DRUNK_CAMERA_STRENGTH) SCRIPT_ASSERT("Activate_Drunk_Camera: The camera shake strength is outside acceptable boundaries") EXIT ENDIF IF NOT IS_GAMEPLAY_CAM_SHAKING() SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", amplitudeScalar) ENDIF IF NOT IS_CINEMATIC_CAM_SHAKING() SHAKE_CINEMATIC_CAM("DRUNK_SHAKE", amplitudeScalar * g_drunkenCinematicCamMultiplier) ENDIF IF DOES_CAM_EXIST(scriptCamIndex) SHAKE_CAM(scriptCamIndex, "DRUNK_SHAKE", amplitudeScalar) g_drunkCameraIndex = scriptCamIndex ELSE g_drunkCameraIndex = NULL ENDIF g_drunkCameraActive = TRUE INT gameTimer = GET_GAME_TIMER() g_drunkCameraTimeout = gameTimer + paramTime_msec IF ignoreParamTimeCheck IF (paramTime_msec = DRUNK_LEVEL_CONSTANT) g_drunkCameraTimeout = DRUNK_LEVEL_CONSTANT ENDIF ENDIF g_drunkCameraTimeoutDuration = paramTimeout_msec g_drunkCameraMotionBlur = paramStrength g_drunkCameraDesiredAmplitudeScalar = amplitudeScalar g_drunkCameraActualAmplitudeScalar = amplitudeScalar #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Activate_Drunk_Camera(paramTime:", paramTime_msec, "ms, paramTimeout:", paramTimeout_msec, "ms, paramStrength:", paramStrength, ", amplitudeScalar:", amplitudeScalar, ", ignoreParamTimeCheck:", GET_STRING_FROM_BOOL(ignoreParamTimeCheck), ", scriptCamIndex:", NATIVE_TO_INT(scriptCamIndex), ")") #ENDIF ENDPROC // PURPOSE: Activate the drunk camera indefinately // // INPUT PARAMS: paramTime_msec The time in milliseconds that the drunk camera should be active for // paramStrength The strength of the camera effect (between 0.0 to 1.0) [default = 0.3] // amplitudeScalar The strength of the camera effect (between 0.0 to 1.0) [default = 0.3] PROC Activate_Drunk_Camera_Constant(INT TimeoutDuration = DRUNK_DEFAULT_TIMEOUT_msec, FLOAT paramStrength = 0.3, FLOAT amplitudeScalar = 1.0, CAMERA_INDEX scriptCamIndex = NULL) Activate_Drunk_Camera(DRUNK_LEVEL_CONSTANT, TimeoutDuration, paramStrength, amplitudeScalar, scriptCamIndex, true) ENDPROC PROC Update_Drunk_Camera_ParamTime(INT paramTime_msec) IF NOT (g_drunkCameraActive) EXIT ENDIF #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Update_Drunk_Camera_ParamTime(", paramTime_msec, ")") #ENDIF INT gameTimer = GET_GAME_TIMER() g_drunkCameraTimeout = gameTimer + paramTime_msec ENDPROC PROC Update_Drunk_Camera_ParamStrength(FLOAT paramStrength) IF NOT (g_drunkCameraActive) EXIT ENDIF IF (paramStrength < 0.0) OR (paramStrength > MAX_DRUNK_CAMERA_STRENGTH) SCRIPT_ASSERT("Update_Drunk_Camera_ParamStrength: The camera shake strength is outside acceptable boundaries") EXIT ENDIF g_drunkCameraMotionBlur = paramStrength ENDPROC /// PURPOSE: /// sets a desired amplitude for the drunk camera to try and reach /// PARAMS: /// amplitudeScalar - PROC Update_Drunk_Camera_ParamDesiredAmplitude(FLOAT amplitudeScalar) IF NOT (g_drunkCameraActive) EXIT ENDIF g_drunkCameraDesiredAmplitudeScalar = amplitudeScalar ENDPROC /// PURPOSE: /// instantly updates the drunk camera amplitude /// PARAMS: /// amplitudeScalar - PROC Update_Drunk_Camera_ParamAmplitude(FLOAT amplitudeScalar) IF NOT (g_drunkCameraActive) EXIT ENDIF g_drunkCameraDesiredAmplitudeScalar = amplitudeScalar g_drunkCameraActualAmplitudeScalar = amplitudeScalar ENDPROC FUNC FLOAT Get_Drunk_Cam_Timeout_Multiplier() INT gameTimer = GET_GAME_TIMER() // timeout multiplier FLOAT fDrunkCamTimeoutMult = 1.0 INT iDrunkCameraTimeoutRemaining = g_drunkCameraTimeout - gameTimer IF iDrunkCameraTimeoutRemaining <= g_drunkCameraTimeoutDuration IF (g_drunkCameraTimeout <> DRUNK_LEVEL_CONSTANT) fDrunkCamTimeoutMult = TO_FLOAT(iDrunkCameraTimeoutRemaining) / TO_FLOAT(g_drunkCameraTimeoutDuration) ENDIF ENDIF RETURN fDrunkCamTimeoutMult ENDFUNC FUNC FLOAT Get_Drunk_Cam_Hit_Count_Multiplier() FLOAT fDrunkCamHitMult = 0.1 INT iPlayerDrunkAlcoholHitCount = Get_Peds_Drunk_Alcohol_Hit_Count(PLAYER_PED_ID()) INT iPlayerDrunkWeedHitCount = Get_Peds_Drunk_Weed_Hit_Count(PLAYER_PED_ID()) IF (iPlayerDrunkWeedHitCount = 0) IF (iPlayerDrunkAlcoholHitCount = 0) fDrunkCamHitMult = 0.1 ELSE fDrunkCamHitMult = TO_FLOAT(iPlayerDrunkAlcoholHitCount) / TO_FLOAT(10) IF (fDrunkCamHitMult > 1.0) fDrunkCamHitMult = 1.0 ENDIF ENDIF ELSE IF (iPlayerDrunkWeedHitCount = 0) fDrunkCamHitMult = 0.1 ELSE fDrunkCamHitMult = TO_FLOAT(iPlayerDrunkWeedHitCount) / TO_FLOAT(5) IF (fDrunkCamHitMult > 1.0) fDrunkCamHitMult = 1.0 ENDIF ENDIF ENDIF RETURN fDrunkCamHitMult ENDFUNC PROC Request_Drunk_Audio_Scene(STRING SceneName) IF NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneScript) IF ARE_STRINGS_EQUAL(g_drunkAudioSceneName, SceneName) AND ARE_STRINGS_EQUAL(g_drunkAudioSceneScript, GET_THIS_SCRIPT_NAME()) CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Request_Drunk_Audio_Scene(\"", SceneName, "\") with script request \"", g_drunkAudioSceneName, "\" already from ", g_drunkAudioSceneScript, ".sc") EXIT ENDIF CASSERTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Request_Drunk_Audio_Scene(\"", SceneName, "\") with an existing script request \"", g_drunkAudioSceneName, "\" from ", g_drunkAudioSceneScript, ".sc") EXIT ENDIF CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Request_Drunk_Audio_Scene(\"", SceneName, "\")") g_drunkAudioSceneName = SceneName g_drunkAudioSceneScript = GET_THIS_SCRIPT_NAME() ENDPROC // PURPOSE: Causes the drunk camera effect to come to an immediate end PROC Quit_Drunk_Camera_Immediately(BOOL bClearTimecycles = TRUE) CPRINTLN(DEBUG_DRUNK, "<", GET_THIS_SCRIPT_NAME(), "> Quit_Drunk_Camera_Immediately()") DEBUG_PRINTCALLSTACK() // IF NOT (g_drunkCameraActive) // EXIT // ENDIF CPRINTLN(DEBUG_DRUNK, " Quit immediately called by \"", GET_THIS_SCRIPT_NAME(), ".sc\", bClearTimecycles: ", bClearTimecycles) SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(0.0) SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0) SET_GAMEPLAY_CAM_SHAKE_AMPLITUDE(0.0) STOP_GAMEPLAY_CAM_SHAKING(TRUE) SET_CINEMATIC_CAM_SHAKE_AMPLITUDE(0.0) STOP_CINEMATIC_CAM_SHAKING(TRUE) SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_NORMAL) IF IS_AUDIO_SCENE_ACTIVE("SAFEHOUSE_STONED_MICHAEL") STOP_AUDIO_SCENE("SAFEHOUSE_STONED_MICHAEL") ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneName) IF IS_AUDIO_SCENE_ACTIVE(g_drunkAudioSceneName) STOP_AUDIO_SCENE(g_drunkAudioSceneName) ENDIF ENDIF IF DOES_CAM_EXIST(g_drunkCameraIndex) IF IS_CAM_SHAKING(g_drunkCameraIndex) SET_CAM_SHAKE_AMPLITUDE(g_drunkCameraIndex, 0.0) STOP_CAM_SHAKING(g_drunkCameraIndex, TRUE) ENDIF ENDIF IF IS_SCRIPT_GLOBAL_SHAKING() CPRINTLN(DEBUG_DRUNK, " someone started a global script cam shake, nuke it on killing drunk cam!!") STOP_SCRIPT_GLOBAL_SHAKING() ENDIF IF bClearTimecycles // Dave W. DOn't want to do this if the GTAO passive mode cutscene is running // Graeme - If you don't want to clear the timecycle modifier then call Quit_Drunk_Camera_Immediately_Without_Clearing_Time_Cycle() instead IF GET_TIMECYCLE_MODIFIER_INDEX() != -1 OR GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX() != -1 CPRINTLN(DEBUG_DRUNK, " CLEAR TIME MODIFIER (TCM: ", GET_TIMECYCLE_MODIFIER_INDEX(), ", TCTM: ", GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(), ")") CLEAR_TIMECYCLE_MODIFIER() ELIF IS_PLAYER_SWITCH_IN_PROGRESS() CPRINTLN(DEBUG_DRUNK, " CLEAR TIME MODIFIER (TCM: ", GET_TIMECYCLE_MODIFIER_INDEX(), ", TCTM: ", GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(), ", switch in progress)") CLEAR_TIMECYCLE_MODIFIER() ELSE CPRINTLN(DEBUG_DRUNK, " Don't clear time modifier (TCM: ", GET_TIMECYCLE_MODIFIER_INDEX(), ", TCTM: ", GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(), ")") ENDIF ELSE CPRINTLN(DEBUG_DRUNK, " bClearTimecycles set to false") ENDIF g_drunkCameraTimeCycleModifier = 0 g_drunkCameraTimeCycleName = "" g_drunkAudioSceneName = "" g_drunkAudioSceneScript = "" Reset_Drunk_Camera_Variables() ENDPROC PROC Quit_Drunk_Camera_Immediately_Without_Clearing_Time_Cycle() Quit_Drunk_Camera_Immediately(FALSE) ENDPROC // PURPOSE: Causes the drunk camera effect to gradually stop // // INPUT PARAMS: paramTime_msec The time in milliseconds over which to quit drunk camera [default = 30000] PROC Quit_Drunk_Camera_Gradually(INT paramTime_msec = DRUNK_DEFAULT_TIMEOUT_msec) IF NOT (g_drunkCameraActive) EXIT ENDIF // SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(0.0) // SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0) // Update the drunk camera variables INT gameTimer = GET_GAME_TIMER() g_drunkCameraTimeout = gameTimer + paramTime_msec g_drunkCameraTimeoutDuration = paramTime_msec ENDPROC // PURPOSE: Sobers up all drunk peds and quit drunk camera PROC Force_All_Drunk_Peds_To_Become_Sober_And_Quit_Camera() // Make all peds sober Force_All_Drunk_Peds_To_Become_Sober() // Clear camera drunk effects Quit_Drunk_Camera_Immediately() ENDPROC FUNC STRING GET_SMOKING_EFFECT_STRING(SMOKING_EFFECT eSmokingEffect) SWITCH eSmokingEffect CASE SMOKING_EFFECT_STONED RETURN "STONED" #IF FEATURE_MUSIC_STUDIO CASE SMOKING_EFFECT_SHORT_TRIP RETURN "FixerShortTrip" #ENDIF ENDSWITCH RETURN "INVALID_SMOKING_EFFECT" ENDFUNC PROC Player_Takes_Alcohol_Hit(PED_INDEX paramDrunkPed, CAMERA_INDEX scriptCamIndex = NULL, INT iHitCount = 1) IF (paramDrunkPed = NULL) EXIT ENDIF IF NOT (DOES_ENTITY_EXIST(paramDrunkPed)) EXIT ENDIF IF IS_BIT_SET(g_iArcadeFortuneBS, ARCADE_FORTUNE_GLOBAL_BS_PEYOTE) SET_BIT(g_iArcadeFortuneBS, ARCADE_FORTUNE_GLOBAL_BS_DRANK_PEYOTE) ENDIF IF (Get_Peds_Drunk_Alcohol_Hit_Count(paramDrunkPed) + iHitCount) > 15 iHitCount = (15 - Get_Peds_Drunk_Alcohol_Hit_Count(paramDrunkPed)) ENDIF CPRINTLN(DEBUG_DRUNK, " Called by \"", GET_THIS_SCRIPT_NAME(), ".sc\"") CPRINTLN(DEBUG_DRUNK, " Hit Count: ", iHitCount) CONST_INT iCONST_ALCOHOL_HIT_TIMEOUT_msec 20000 INT ALCOHOL_HIT_TIMEOUT_msec = iCONST_ALCOHOL_HIT_TIMEOUT_msec IF NETWORK_IS_GAME_IN_PROGRESS() ALCOHOL_HIT_TIMEOUT_msec *= 3 ELSE IF ARE_STRINGS_EQUAL(GET_THIS_SCRIPT_NAME(), "ob_drinking_shots") ALCOHOL_HIT_TIMEOUT_msec *= 2 ENDIF ENDIF IF NOT Is_Ped_Drunk(paramDrunkPed) Make_Ped_Drunk(paramDrunkPed, ALCOHOL_HIT_TIMEOUT_msec) Activate_Drunk_Camera(ALCOHOL_HIT_TIMEOUT_msec, ALCOHOL_HIT_TIMEOUT_msec, //INT paramTimeout_msec = DRUNK_DEFAULT_TIMEOUT_msec, 0.3, //FLOAT paramStrength = 0.3, Get_Drunk_Cam_Hit_Count_Multiplier(), //FLOAT amplitudeScalar = 1.0) scriptCamIndex) INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) g_drunkPeds[arrayIndex].iAlcoholHit += iHitCount // SCRIPT_ASSERT("g_drunkPeds[arrayIndex].iAlcoholHit 111") ENDIF ENDIF ELSE INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) INT arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // g_drunkRequests[arrayIndex].overall_msec += ALCOHOL_HIT_TIMEOUT_msec // g_drunkRequests[arrayIndex].ragdoll_msec += ALCOHOL_HIT_TIMEOUT_msec g_drunkPeds[arrayIndex].iAlcoholHit += iHitCount // SCRIPT_ASSERT("g_drunkPeds[arrayIndex].iAlcoholHit 222") ENDIF ENDIF IF g_drunkCameraTimeout = DRUNK_LEVEL_NOT_DRUNK OR g_drunkCameraTimeout <= GET_GAME_TIMER() Activate_Drunk_Camera(ALCOHOL_HIT_TIMEOUT_msec, ALCOHOL_HIT_TIMEOUT_msec, //INT paramTimeout_msec = DRUNK_DEFAULT_TIMEOUT_msec, 0.3, //FLOAT paramStrength = 0.3, Get_Drunk_Cam_Hit_Count_Multiplier(), //FLOAT amplitudeScalar = 1.0) scriptCamIndex) ELSE g_drunkCameraTimeout += ALCOHOL_HIT_TIMEOUT_msec Extend_Overall_Drunk_Time(paramDrunkPed, ALCOHOL_HIT_TIMEOUT_msec) ENDIF ENDIF IF Get_Peds_Drunk_Alcohol_Hit_Count(paramDrunkPed) >= 2 g_drunkCameraTimeCycleModifier = 0.25 IF IS_STRING_NULL_OR_EMPTY(g_drunkCameraTimeCycleName) g_drunkCameraTimeCycleName = "DRUNK" ENDIF ENDIF // // Check if the drunk ped is already drunk INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // g_drunkPeds[arrayIndex].iAlcoholHit++ // // SCRIPT_ASSERT("g_drunkPeds[arrayIndex].iAlcoholHit 333") ENDIF EXIT ENDIF Post_Drunk_Notice_With_Ped_Index(UNIQUE_ID_PUBLIC_FUNCTIONS, drunkPedUniqueID, DNID_HIT_ALCOHOL, paramDrunkPed, iHitCount) ENDPROC PROC RESET_DRUNK_WEED_EFFECT_STRENGTH() g_drunkCameraEffectStrength = 1.0 PRINTLN("[RESET_DRUNK_WEED_EFFECT_STRENGTH] - set to: ", g_drunkCameraEffectStrength) ENDPROC PROC SET_DRUNK_WEED_EFFECT_STRENGTH(FLOAT fStrength) PRINTLN("[SET_DRUNK_WEED_EFFECT_STRENGTH] - setting from: ", g_drunkCameraEffectStrength, " to: ", fStrength) g_drunkCameraEffectStrength = fStrength ENDPROC PROC Player_Takes_Weed_Hit(PED_INDEX paramDrunkPed, CAMERA_INDEX scriptCamIndex = NULL, INT iHitCount = 1, SMOKING_EFFECT eSmokingEffect = SMOKING_EFFECT_STONED,INT ioverridingduration = -1) IF (paramDrunkPed = NULL) EXIT ENDIF IF NOT (DOES_ENTITY_EXIST(paramDrunkPed)) EXIT ENDIF IF (Get_Peds_Drunk_Weed_Hit_Count(paramDrunkPed) + iHitCount) > 10 iHitCount = (10 - Get_Peds_Drunk_Weed_Hit_Count(paramDrunkPed)) ENDIF CPRINTLN(DEBUG_DRUNK, " Called by \"", GET_THIS_SCRIPT_NAME(), "\"") DEBUG_PRINTCALLSTACK() INT iCONST_WEED_HIT_TIMEOUT_msec = 20000 IF ioverridingduration !=-1 iCONST_WEED_HIT_TIMEOUT_msec = ioverridingduration ENDIF INT WEED_HIT_TIMEOUT_msec = iCONST_WEED_HIT_TIMEOUT_msec IF NETWORK_IS_GAME_IN_PROGRESS() AND ioverridingduration =-1 WEED_HIT_TIMEOUT_msec *= 3 ENDIF IF NOT Is_Ped_Drunk(paramDrunkPed) Make_Ped_Drunk(paramDrunkPed, Weed_HIT_TIMEOUT_msec) Activate_Drunk_Camera(Weed_HIT_TIMEOUT_msec, Weed_HIT_TIMEOUT_msec, //INT paramTimeout_msec = DRUNK_DEFAULT_TIMEOUT_msec, 0.3, //FLOAT paramStrength = 0.3, Get_Drunk_Cam_Hit_Count_Multiplier(), //FLOAT amplitudeScalar = 1.0) scriptCamIndex) INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) g_drunkPeds[arrayIndex].iWeedHit += iHitCount ENDIF ENDIF ELSE INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) INT arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // g_drunkRequests[arrayIndex].overall_msec += Weed_HIT_TIMEOUT_msec // g_drunkRequests[arrayIndex].ragdoll_msec += Weed_HIT_TIMEOUT_msec g_drunkPeds[arrayIndex].iWeedHit += iHitCount ENDIF ENDIF IF g_drunkCameraTimeout = DRUNK_LEVEL_NOT_DRUNK OR g_drunkCameraTimeout <= GET_GAME_TIMER() Activate_Drunk_Camera(Weed_HIT_TIMEOUT_msec, Weed_HIT_TIMEOUT_msec, //INT paramTimeout_msec = DRUNK_DEFAULT_TIMEOUT_msec, 0.3, //FLOAT paramStrength = 0.3, Get_Drunk_Cam_Hit_Count_Multiplier(), //FLOAT amplitudeScalar = 1.0) scriptCamIndex) ELSE g_drunkCameraTimeout += WEED_HIT_TIMEOUT_msec Extend_Overall_Drunk_Time(paramDrunkPed, WEED_HIT_TIMEOUT_msec) ENDIF ENDIF g_drunkCameraTimeCycleModifier = 0.25 g_drunkCameraTimeCycleName = GET_SMOKING_EFFECT_STRING(eSmokingEffect) // Check if the drunk ped is already drunk INT drunkPedUniqueID = Get_Peds_Unique_Drunk_Ped_ID(paramDrunkPed) IF (drunkPedUniqueID = NO_UNIQUE_DRUNK_PED_ID) INT arrayIndex = Get_Peds_Drunk_Ped_Array_Index(drunkPedUniqueID) IF NOT (arrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX) // g_drunkPeds[arrayIndex].iWeedHit++ //SCRIPT_ASSERT("g_drunkPeds[arrayIndex].iWeedHit 111") ENDIF EXIT ENDIF Post_Drunk_Notice_With_Ped_Index(UNIQUE_ID_PUBLIC_FUNCTIONS, drunkPedUniqueID, DNID_HIT_Weed, paramDrunkPed, iHitCount) ENDPROC // ----------------------------------------------------------------------------------------- // Public Drunk modifier routines // ----------------------------------------------------------------------------------------- // PURPOSE: Increment the BAWSAQ drunk modifier stat for pubs and clubs visited PROC BawsaqIncrementDrunkModifier_PUBCLUBVISIT() ////BAWSAQ_INCREMENT_MODIFIER(BSMF_PUBCLUBVISIT) ENDPROC // PURPOSE: Increment the BAWSAQ drunk modifier stat for times drunk PROC BawsaqIncrementDrunkModifier_TIMESDRUNK() ////BAWSAQ_INCREMENT_MODIFIER(BSMF_TIMESDRUNK) ENDPROC // PURPOSE: Increment the BAWSAQ drunk modifier stat for friends taken to the pub PROC BawsaqIncrementDrunkModifier_FRNDTOPUB() ////BAWSAQ_INCREMENT_MODIFIER(BSMF_FRNDTOPUB) ENDPROC // PURPOSE: Increment the BAWSAQ drunk modifier stat for number of drunk crimes PROC BawsaqIncrementDrunkModifier_DRNKCRIME() ////BAWSAQ_INCREMENT_MODIFIER(BSMF_DRNKCRIME) ENDPROC // PURPOSE: Increment the BAWSAQ drunk modifier stat for number of hangovers (E2 - blackout and wake up elsewhere) PROC BawsaqIncrementDrunkModifier_HANGOVERS() ////BAWSAQ_INCREMENT_MODIFIER(BSMF_HANGOVERS) ENDPROC