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

3705 lines
128 KiB
Python
Executable File

//World Point template
// Includes -----------------------------------------------//
USING "commands_player.sch"
USING "globals.sch"
USING "commands_brains.sch"
USING "commands_path.sch"
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "commands_event.sch"
USING "ambience_run_checks.sch"
USING "commands_misc.sch"
USING "script_blips.sch"
USING "script_PLAYER.sch"
USING "brains.sch"
USING "model_enums.sch"
USING "AggroSupport.sch"
USING "LineActivation.sch"
USING "finance_control_public.sch"
USING "context_control_public.sch"
USING "commands_debug.sch"
USING "flow_public_core_override.sch"
USING "friendActivity_public.sch"
USING "cutscene_public.sch"
//USING "net_cutscene.sch"
USING "net_FPS_Cam.sch"
USING "FM_Unlocks_Header.sch"
USING "net_hud_displays.sch"
//USING "net_invite_menu.sch"
USING "net_spawn.sch"
USING "CompletionPercentage_public.sch"
USING "tv_control_public.sch"
USING "cheat_handler.sch"
USING "timer_public.sch"
USING "net_spectator_cam.sch"
USING "net_cash_transactions.sch"
USING "script_misc.sch"
//vars for controlable first person view
//FIRST_PERSON_CAMERA fpsCam
//REINIT_FIRST_PERSON_CAMERA_STRUCT reinitCam
FIRST_PERSON_CAM_STRUCT newFPCam
SCRIPT_TIMER netStoredTime
//INVITE_ONLY_MENU_CONTROL_STRUCT inviteOnlyMenu
///INVITE_MENU_STRUCT sInviteMenu
//BOOL bInitInviteOptions
STRUCT CINEMA_INFO
VECTOR vSeatPos
FLOAT fSeatHeading
VECTOR vLookCamPos
VECTOR vLookCamRot
VECTOR vWarpExitLoc
FLOAT fWarpExitHeading
enumActivityLocation eLocation
VECTOR vScreenCentre
INT iVoiceChannel
VECTOR vWarpInsideCoords
VECTOR vScenarioActivationPoint
ENDSTRUCT
CINEMA_INFO cinemaInfo
VECTOR vInput
// FLOAT fInput
INT iContextButtonIntention = NEW_CONTEXT_INTENTION
INT iScriptTransactionIndex
//BOOL bIgnoreTimeConstraints
//BOOL bActivityTimeHelpPrinted
//BOOL bActivityWantedText
BOOL startedFadeOut
BOOL bWarpStarted
//BOOL bGotoCleanUpAfterCorona
BOOL bDisplayedBEHelp
//SCALEFORM_INSTRUCTIONAL_BUTTONS instructionalButtons
//SPRITE_PLACEMENT aSpriteCinemaControls
//SCALEFORM_INDEX scaleformCinemaControls
BOOL bUpdateCinemaControls = FALSE
STRING sAudioScene = "NULL"
CAMERA_INDEX camSCTV
//BLIP_INDEX blipDoor
INTERIOR_INSTANCE_INDEX interiorCinema
//CAMERA_INDEX cameraCinema
INT iRenderTarget = -1
SCRIPT_TIMER LoadMovieTimeOut
//BINK_MOVIE_ID MovieId
INT iEnterTimeStamp
SCRIPT_TIMER cashDisplayTimer
INT iSlowServerPlayerLoop
BOOL bAtLeast1PlayerInCinema
BOOL bPlayerLeftCinemaBecauseMovieEnded = FALSE
//FLOAT fMovieVolume
SCRIPT_TIMER spawnPedsTimeout
//FLOAT fMinYChange = -4
//FLOAT fMaxYChange = 4
//FLOAT fMinXChange = -45
//FLOAT fMaxXChange = 45
//FLOAT fCamSpeed = 4.0
//FLOAT fCamChangeY
//FLOAT fCamChangeX
//CONST_INT STICK_DEAD_ZONE 28
CONST_INT CINEMA_BS_EXITED 0
CONST_INT CINEMA_BS_DISPLAYED_EXIT_HELP 1
CONST_INT CINEMA_BS_MOVIE_STARTED 2
CONST_INT CINEMA_BS_SHOW_EXIT_WARNING 3
CONST_INT CINEMA_BS_PRESSED_CANCEL 4
CONST_INT CINEMA_BS_TAKEN_MONEY 5
CONST_INT CINEMA_BS_SCTV_CAMERA_CREATED 6
CONST_INT CINEMA_BS_SET_VOICE_CHANNEL 7
CONST_INT CINEMA_BS_SETUP_SPECIFIC_SPAWN 8
CONST_INT CINEMA_BS_KICKED_OUT_CLOSED 9
CONST_INT CINEMA_BS_SCTV_INTERIOR_LOAD_REQUESTED 10
CONST_INT CINEMA_BS_SCTV_NEEDS_CLEANUP 11
INT iCinemaBS
CONST_INT LOCAL_STAGE_INIT 0
CONST_INT LOCAL_STAGE_WAIT_TO_ENTER 1
CONST_INT LOCAL_STAGE_HANDLE_ENTERING 2
CONST_INT LOCAL_STAGE_WATCHING_MOVIE 3
CONST_INT LOCAL_STAGE_SCTV 4
CONST_INT LOCAL_STAGE_LEFT_CINEMA 5
CONST_INT LOCAL_STAGE_END 6
INT iLocalStage
CONST_INT iBS_STORE_ACTIVE 0
INT iBoolsBitSet
ENUM CINEMA_SHOWING_ENUM
CINEMA_SHOWING_NONE = 0,
CINEMA_SHOWING_MORNING,
CINEMA_SHOWING_AFTERNOON,
CINEMA_SHOWING_EVENING,
CINEMA_SHOWING_MULTIPLAYER
ENDENUM
CINEMA_SHOWING_ENUM eCurrentCinemaShowing = CINEMA_SHOWING_NONE
CONST_INT CINEMA_TIME_MORNING_START 10
CONST_INT CINEMA_TIME_MORNING_END 13
CONST_INT CINEMA_TIME_AFTERNOON_START 13
CONST_INT CINEMA_TIME_AFTERNOON_END 17
CONST_INT CINEMA_TIME_EVENING_START 17
CONST_INT CINEMA_TIME_EVENING_END 22
CONST_INT ACTIVITY_COST 20
INT iParticipants = 1
BOOL bStartedInMP
BOOL bCinemaTookAwayPlayerControl
BOOL bSetActAvailable
INT iEnterLeaveBS
INT iSlowParticipantLoop
WEAPON_TYPE currentWeapon
//STRUCT WARNING_SCREEN_STRUCT
// STRING sQuestionText
// FE_WARNING_FLAGS fButtonFlags
//ENDSTRUCT
//WARNING_SCREEN_STRUCT warningScreen
STRUCT SEAT_DETAILS
VECTOR vCamPos
VECTOR vCamRot
FLOAT fCamFOV
VECTOR vSeatPos
FLOAT fSeatHeading
ENDSTRUCT
SEAT_DETAILS thisPlayersSeat
INT seatOrdering[NUM_NETWORK_PLAYERS]
// The server broadcast data.
//// Everyone can read this data, only the server can update it.
//STRUCT ServerBroadcastData
// //SCRIPT_TIMER MovieStartTimer
// //FLOAT fMovieStartPosition
// //INT iChannel
//ENDSTRUCT
//ServerBroadcastData serverBD
STRUCT ServerBroadcastData
INT iSeats[NUM_NETWORK_PLAYERS]
INT iAssignedSeatBS
BOOL bSpawnedPeds
ENDSTRUCT
ServerBroadcastData serverBD
STRUCT PlayerBroadcastData
BOOL bInCinema
BOOL bWarpedInside
ENDSTRUCT
PlayerBroadcastData playerBD[NUM_NETWORK_PLAYERS]
BOOL bIsCinemaOwnerInPlayerGroup
#IF IS_DEBUG_BUILD
INT iCurrentSeat
INT iDebugSeat
BOOL bRefocusCam
BOOL bRefocusedCam
#ENDIF
/// PURPOSE:
/// Needed so Esc key on PC doesn't quit the cinema
/// and so we can use right mouse button to quit.
/// RETURNS:
///
FUNC BOOL IS_CANCEL_JUST_PRESSED()
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
AND NOT IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
RETURN TRUE
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
RETURN TRUE
ENDIF
ELSE
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Disables/enables the interior
/// PARAMS:
/// bIsDisabled - TRUE to disable, FALSE to enable.
PROC DISABLE_CINEMA_INTERIOR( BOOL bIsDisabled )
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
SET_INTERIOR_DISABLED(INTERIOR_V_CINEMA_DOWNTOWN, bIsDisabled )
BREAK
CASE ALOC_cinema_vinewood
SET_INTERIOR_DISABLED(INTERIOR_V_CINEMA_VINEWOOD, bIsDisabled )
BREAK
CASE ALOC_cinema_morningwood
SET_INTERIOR_DISABLED(INTERIOR_V_CINEMA_MORNINGWOOD, bIsDisabled )
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_CINEMA_OWNER_IN_PLAYER_GROUP()
enumCharacterList eCharacterPlayer = GET_CURRENT_PLAYER_PED_ENUM()
enumCharacterList eCharacterFriendA = CHAR_BLOCKED // Using CHAR)_BLOCKED as a default value as the player shouldn't be set to this value normally.
enumCharacterList eCharacterFriendB = CHAR_BLOCKED
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
IF DOES_ENTITY_EXIST(FRIEND_A_PED_ID())
eCharacterFriendA = GET_PLAYER_PED_ENUM(FRIEND_A_PED_ID())
// Fix for B* 1875291 - NO_CHARACTER is used by the property script so we need to change this value if not a player ped.
IF eCharacterFriendA = NO_CHARACTER
eCharacterFriendA = CHAR_BLOCKED
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(FRIEND_B_PED_ID())
eCharacterFriendB = GET_PLAYER_PED_ENUM(FRIEND_B_PED_ID())
// Fix for B* 1875291 - NO_CHARACTER is used by the property script so we need to change this value if not a player ped.
IF eCharacterFriendB = NO_CHARACTER
eCharacterFriendB = CHAR_BLOCKED
ENDIF
ENDIF
ENDIF
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_DOWNTOWN) = eCharacterPlayer
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_DOWNTOWN - CINEMA IS OWNED BY PLAYER" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_DOWNTOWN) = eCharacterFriendA
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_DOWNTOWN - CINEMA IS OWNED BY FRIEND A" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_DOWNTOWN) = eCharacterFriendB
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_DOWNTOWN - CINEMA IS OWNED BY FRIEND B" )
RETURN TRUE
ENDIF
BREAK
CASE ALOC_cinema_vinewood
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_VINEWOOD - CINEMA CAN'T BE OWNED" )
// The cinema the player owns in Vinewood isn't the one you can use, so we
// always return false here.
// This is because the cinema you can visit got changed to the Chinese theater
// but the cinema you can buy didn't get changed - it's next door.
/*
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_VINEWOOD) = eCharacterPlayer
CPRINTLN( DEBUG_AMBIENT, "PROPERTY_CINEMA_VINEWOOD - CINEMA IS OWNED BY PLAYER" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_VINEWOOD) = eCharacterFriendA
CPRINTLN( DEBUG_AMBIENT, "PROPERTY_CINEMA_VINEWOOD - CINEMA IS OWNED BY FRIEND A" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_VINEWOOD) = eCharacterFriendB
CPRINTLN( DEBUG_AMBIENT, "PROPERTY_CINEMA_VINEWOOD - CINEMA IS OWNED BY FRIEND B" )
RETURN TRUE
ENDIF
*/
RETURN FALSE
BREAK
CASE ALOC_cinema_morningwood
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_MORNINGWOOD) = eCharacterPlayer
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_MORNINGWOOD - CINEMA IS OWNED BY PLAYER" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_MORNINGWOOD) = eCharacterFriendA
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_MORNINGWOOD - CINEMA IS OWNED BY FRIEND A" )
RETURN TRUE
ENDIF
IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_CINEMA_MORNINGWOOD) = eCharacterFriendB
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: PROPERTY_CINEMA_MORNINGWOOD - CINEMA IS OWNED BY FRIEND B" )
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
CPRINTLN( DEBUG_AMBIENT, "ACT_CINEMA: CURRENT CINEMA ISN'T OWNED BY ANY CHAR IN THE CURRENT GROUP" )
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Pays for and logs the transaction against the correct cinema location.
PROC PAY_FOR_CINEMA()
// Cinema is free for owner
IF IS_CINEMA_OWNER_IN_PLAYER_GROUP()
EXIT
ENDIF
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_PROP_DCINEMA, ACTIVITY_COST*iParticipants)
BREAK
CASE ALOC_cinema_vinewood
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_PROP_VCINEMA, ACTIVITY_COST*iParticipants)
BREAK
CASE ALOC_cinema_morningwood
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_PROP_MCINEMA, ACTIVITY_COST*iParticipants)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Checks the time of day and returns the cinema showing slot.
/// RETURNS:
///
FUNC CINEMA_SHOWING_ENUM GET_CINEMA_SHOWING()
INT iTimeOfDay = GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY())
IF NETWORK_IS_GAME_IN_PROGRESS()
IF iTimeOfDay >= CINEMA_TIME_MORNING_START
AND iTimeOfDay < CINEMA_TIME_EVENING_END
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - MORNING SHOWING" )
RETURN CINEMA_SHOWING_MULTIPLAYER
ENDIF
ELSE
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - TIME = ", iTimeOfDay )
IF iTimeOfDay >= CINEMA_TIME_MORNING_START
AND iTimeOfDay < CINEMA_TIME_MORNING_END
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - MORNING SHOWING" )
RETURN CINEMA_SHOWING_MORNING
ENDIF
IF iTimeOfDay >= CINEMA_TIME_AFTERNOON_START
AND iTimeOfDay < CINEMA_TIME_AFTERNOON_END
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - AFTERNOON SHOWING" )
RETURN CINEMA_SHOWING_AFTERNOON
ENDIF
IF iTimeOfDay >= CINEMA_TIME_EVENING_START
AND iTimeOfDay <= CINEMA_TIME_EVENING_END
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - EVENING SHOWING" )
//
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_4)
RETURN CINEMA_SHOWING_EVENING
ELSE
RETURN CINEMA_SHOWING_AFTERNOON
ENDIF
ENDIF
ENDIF
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - NO SHOWING" )
RETURN CINEMA_SHOWING_NONE
ENDFUNC
PROC SET_CINEMA_AUDIO_SCENE()
sAudioScene = "NULL"
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
sAudioScene = "CINEMA_DOWNTOWN"
BREAK
CASE ALOC_cinema_vinewood
sAudioScene = "CINEMA_VINEWOOD"
BREAK
CASE ALOC_cinema_morningwood
sAudioScene = "CINEMA_MORNINGWOOD"
BREAK
ENDSWITCH
IF NOT ARE_STRINGS_EQUAL("NULL", sAudioScene)
IF NOT IS_AUDIO_SCENE_ACTIVE(sAudioScene)
START_AUDIO_SCENE( sAudioScene )
ENDIF
ENDIF
ENDPROC
PROC STOP_CINEMA_AUDIO_SCENE()
IF NOT ARE_STRINGS_EQUAL("NULL", sAudioScene)
IF IS_AUDIO_SCENE_ACTIVE(sAudioScene)
STOP_AUDIO_SCENE( sAudioScene )
ENDIF
ENDIF
IF IS_AUDIO_SCENE_ACTIVE( "LEAVE_CINEMA")
STOP_AUDIO_SCENE( "LEAVE_CINEMA" )
ENDIF
ENDPROC
PROC ACTIVATE_SCENARIO_GROUP()
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Textile")
IF NOT IS_SCENARIO_GROUP_ENABLED("Cinema_Textile")
SET_SCENARIO_GROUP_ENABLED("Cinema_Textile",TRUE)
PRINTLN("Player turning on scenario group: Cinema_Textile")
ENDIF
ENDIF
BREAK
CASE ALOC_cinema_morningwood
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Morningwood")
IF NOT IS_SCENARIO_GROUP_ENABLED("Cinema_Morningwood")
SET_SCENARIO_GROUP_ENABLED("Cinema_Morningwood",TRUE)
PRINTLN("Player turning on scenario group: Cinema_Morningwood")
ENDIF
ENDIF
BREAK
CASE ALOC_cinema_vinewood
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Downtown")
IF NOT IS_SCENARIO_GROUP_ENABLED("Cinema_Downtown")
SET_SCENARIO_GROUP_ENABLED("Cinema_Downtown",TRUE)
PRINTLN("Player turning on scenario group: Cinema_Downtown")
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DEACTIVATE_SCENARIO_GROUP()
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Textile")
IF IS_SCENARIO_GROUP_ENABLED("Cinema_Textile")
SET_SCENARIO_GROUP_ENABLED("Cinema_Textile",FALSE)
PRINTLN("Player turning off scenario group: Cinema_Textile")
ENDIF
ENDIF
BREAK
CASE ALOC_cinema_morningwood
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Morningwood")
IF IS_SCENARIO_GROUP_ENABLED("Cinema_Morningwood")
SET_SCENARIO_GROUP_ENABLED("Cinema_Morningwood",FALSE)
PRINTLN("Player turning off scenario group: Cinema_Morningwood")
ENDIF
ENDIF
BREAK
CASE ALOC_cinema_vinewood
IF DOES_SCENARIO_GROUP_EXIST("Cinema_Downtown")
IF IS_SCENARIO_GROUP_ENABLED("Cinema_Downtown")
SET_SCENARIO_GROUP_ENABLED("Cinema_Downtown",FALSE)
PRINTLN("Player turning off scenario group: Cinema_Downtown")
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC CLEAR_CONTEXT_OVERRIDE_HELP()
IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED("ACTCIN",g_sMptunables.icinema_expenditure_modifier)
CLEAR_HELP()
ENDIF
ENDPROC
PROC INIT_SCTV_CINEMA()
ACTIVATE_SCENARIO_GROUP()
ENDPROC
PROC CLEANUP_SCTV_CINEMA()
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SCTV_NEEDS_CLEANUP)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === CLEANUP_SCTV_CINEMA")
#ENDIF
IF DOES_CAM_EXIST(camSCTV)
DESTROY_CAM(camSCTV)
ENDIF
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SCTV_CAMERA_CREATED)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
UNPIN_INTERIOR(interiorCinema)
DISABLE_CINEMA_INTERIOR(TRUE)
DEACTIVATE_SCENARIO_GROUP()
ENABLE_SPECTATOR_FADES()
CLEAR_BIT(iCinemaBS,CINEMA_BS_SCTV_INTERIOR_LOAD_REQUESTED)
CLEAR_BIT(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
CLEAR_BIT(iCinemaBS,CINEMA_BS_SCTV_CAMERA_CREATED)
CLEAR_BIT(iCinemaBS,CINEMA_BS_SCTV_NEEDS_CLEANUP)
ENDIF
ENDPROC
PROC MISSION_CLEANUP()
PRINTSTRING("ACT_CINEMA: doing mission cleanup")
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
//IF MovieId != NULL
// STOP_BINK_MOVIE(MovieId)
// RELEASE_BINK_MOVIE(MovieId)
//ENDIF
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
RESTORE_STANDARD_CHANNELS()
SET_STORE_ENABLED(TRUE)
STOP_CINEMA_AUDIO_SCENE()
ENABLE_MOVIE_SUBTITLES(FALSE)
RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT)
ENDIF
IF IS_PLAYER_SCTV(PLAYER_ID())
CLEANUP_SCTV_CINEMA()
ENDIF
//Reset the global (previously used by chop)
g_bPlayerIsInCinema = FALSE
CLEAR_FIRST_PERSON_CAMERA(newFPCam)
IF iRenderTarget != -1
IF IS_NAMED_RENDERTARGET_REGISTERED("cinscreen")
RELEASE_NAMED_RENDERTARGET("cinscreen")
ENDIF
ENDIF
IF bCinemaTookAwayPlayerControl
IF NOT bStartedInMP
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), cinemaInfo.vWarpExitLoc)
SET_ENTITY_HEADING(PLAYER_PED_ID(), cinemaInfo.fWarpExitHeading)
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
LOAD_SCENE(cinemaInfo.vWarpExitLoc)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISABLE_PED_PAIN_AUDIO(PLAYER_PED_ID(),FALSE)
ENDIF
ENDIF
IF hasActivityStarted(cinemaInfo.eLocation)
IF NOT IS_PED_INJURED(FRIEND_A_PED_ID())
FREEZE_ENTITY_POSITION(FRIEND_A_PED_ID(), FALSE)
SET_ENTITY_COORDS(FRIEND_A_PED_ID(), cinemaInfo.vWarpExitLoc+<<1,0,0>>)
SET_ENTITY_HEADING(FRIEND_A_PED_ID(), cinemaInfo.fWarpExitHeading)
SET_PED_AS_GROUP_MEMBER(FRIEND_A_PED_ID(), PLAYER_GROUP_ID())
ENDIF
IF NOT IS_PED_INJURED(FRIEND_B_PED_ID())
FREEZE_ENTITY_POSITION(FRIEND_B_PED_ID(), FALSE)
SET_ENTITY_COORDS(FRIEND_B_PED_ID(), cinemaInfo.vWarpExitLoc+<<-1,0,0>>)
SET_ENTITY_HEADING(FRIEND_B_PED_ID(), cinemaInfo.fWarpExitHeading)
SET_PED_AS_GROUP_MEMBER(FRIEND_B_PED_ID(), PLAYER_GROUP_ID())
ENDIF
// Tell friend activity cinema has ended (passing AR_playerDraw indicates the movie watched was Meltdown)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_4)
AND GET_CINEMA_SHOWING() = CINEMA_SHOWING_EVENING
finishActivity(cinemaInfo.eLocation, AR_playerDraw)
PRINTLN("ACT_CINEMA: FRIEND ACTIVITY - PLAYER WATCHED MELTDOWN")
ELSE
IF bPlayerLeftCinemaBecauseMovieEnded
PRINTLN("ACT_CINEMA: FRIEND ACTIVITY - PLAYER WATCHED WHOLE FILM")
finishActivity(cinemaInfo.eLocation, AR_playerWon )
ELSE
PRINTLN("ACT_CINEMA: FRIEND ACTIVITY - PLAYER LEFT EARLY")
finishActivity(cinemaInfo.eLocation, AR_playerQuit)
ENDIF
ENDIF
//ELSE
// DO_SCREEN_FADE_IN(500)
ENDIF
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
CLEAR_SPECIFIC_SPAWN_LOCATION()
CLEAR_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
ENDIF
IF startedFadeOut
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
DO_SCREEN_FADE_IN(500)
ENDIF
startedFadeOut = FALSE
ENDIF
IF bStartedInMP
UNPause_Objective_Text()
SET_PLAYER_ON_MP_AMBIENT_SCRIPT(MPAM_TYPE_CINEMA, FALSE)
IF NETWORK_IS_GAME_IN_PROGRESS()
IF playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), cinemaInfo.vWarpExitLoc)
SET_ENTITY_HEADING(PLAYER_PED_ID(), cinemaInfo.fWarpExitHeading)
ENDIF
PRINTLN("ACT_CINEMA: Player was still in the cinema when script terminated. Forcing out of cinema")
ENDIF
playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = FALSE
ENDIF
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
NET_PRINT("ACT_CINEMA: Clearing voice channel: ") NET_NL()
NETWORK_CLEAR_VOICE_CHANNEL()
NETWORK_SET_LOCAL_PLAYER_SYNC_LOOK_AT(FALSE)
CLEAR_BIT(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
ENDIF
ENDIF
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
// ENABLE_SELECTOR()
ENDIF
IF bSetActAvailable
REMOVE_ACTIVITY_FROM_DISPLAY_LIST(cinemaInfo.vWarpExitLoc,GET_ACTIVITY_NAME_FROM_FMMC_TYPE(FMMC_TYPE_CINEMA))
bSetActAvailable = FALSE
ENDIF
CLEAR_BIT(GlobalPlayerBD[NATIVE_TO_INT(PLAYER_ID())].iOrbitalCannonBS, ORBITAL_CANNON_GLOBAL_BS_USING_CINEMA)
CLEANUP_MENU_ASSETS()
// make sure that we have released use of the context button if we still have it
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
TERMINATE_THIS_THREAD()
DEACTIVATE_SCENARIO_GROUP()
ENDPROC
/// PURPOSE: Do necessary pre game start ini
PROC PROCESS_PRE_GAME()
IF NETWORK_IS_GAME_IN_PROGRESS()
NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(NUM_NETWORK_PLAYERS, FALSE)
// This makes sure the net script is active, waits until it is.
HANDLE_NET_SCRIPT_INITIALISATION()
NETWORK_REGISTER_HOST_BROADCAST_VARIABLES(serverBD, SIZE_OF(serverBD))
NETWORK_REGISTER_PLAYER_BROADCAST_VARIABLES(playerBD, SIZE_OF(playerBD))
INT i
REPEAT NUM_NETWORK_PLAYERS i
serverBD.iSeats[i] = -1
ENDREPEAT
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
// KGM: Wait for the first network broadcast before moving on - call this as the last instruction in pre-game
// (after Initialisation and Broadcast Variable Registration - Hosts can do this too)
IF NOT Wait_For_First_Network_Broadcast()
PRINTSTRING("ACT_CINEMA: Failed to receive an initial network broadcast. Cleaning up.")
PRINTNL()
MISSION_CLEANUP()
ENDIF
bStartedInMP = TRUE
PRINTSTRING("ACT_CINEMA: set started in MP game")
PRINTNL()
ELSE
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP|DEFAULT_FORCE_CLEANUP_FLAGS| FORCE_CLEANUP_FLAG_DIRECTOR)
PRINTSTRING("ACT_CINEMA: going straight to end as force cleanup has occured")
PRINTNL()
MISSION_CLEANUP()
ENDIF
ENDIF
ENDPROC
PROC SET_LOCAL_STAGE(INT iStage)
SWITCH iStage
CASE LOCAL_STAGE_INIT
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_INIT")
PRINTNL()
BREAK
CASE LOCAL_STAGE_WAIT_TO_ENTER
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_WAIT_TO_ENTER")
PRINTNL()
BREAK
CASE LOCAL_STAGE_HANDLE_ENTERING
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_HANDLE_ENTERING")
PRINTNL()
BREAK
CASE LOCAL_STAGE_WATCHING_MOVIE
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_WATCHING_MOVIE")
PRINTNL()
BREAK
CASE LOCAL_STAGE_SCTV
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_SCTV")
PRINTNL()
BREAK
CASE LOCAL_STAGE_LEFT_CINEMA
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_LEFT_CINEMA")
PRINTNL()
BREAK
CASE LOCAL_STAGE_END
PRINTSTRING("ACT_CINEMA: Set local stage to be : ")
PRINTSTRING("LOCAL_STAGE_END")
PRINTNL()
BREAK
ENDSWITCH
iLocalStage = iStage
ENDPROC
PROC INIT_CURRENT_CINEMA_DATA()
IF VDIST2(vInput, <<394.368, -711.8287, 28.2877>>) < 8 // Cinema, Downtown
cinemaInfo.vSeatPos = << 377.1530, -717.5670, 10.0536 >>
cinemaInfo.fSeatHeading = 177.6
cinemaInfo.vLookCamPos = << 377.1530, -717.5670, 12.0536 >>
cinemaInfo.vLookCamRot = << 7.5652, 0.0000, -179.1837 >>
cinemaInfo.vWarpExitLoc = << 394.2567, -713.5439, 28.2853 >>
cinemaInfo.fWarpExitHeading = 276.6273
cinemaInfo.eLocation = ALOC_cinema_downtown
cinemaInfo.vScreenCentre = <<377.1794, -733.5583, 14.5136>>
cinemaInfo.iVoiceChannel = FM_VOICE_CHANNEL_CINEMA_1
cinemaInfo.vWarpInsideCoords = <<385.5010, -703.5972, 14.8930>>
cinemaInfo.vScenarioActivationPoint = <<376.7,-722.8,10.8>>
seatOrdering[0] = 2
seatOrdering[1] = 13
seatOrdering[2] = 1
seatOrdering[3] = 15
seatOrdering[4] = 14
seatOrdering[5] = 0
seatOrdering[6] = 3
seatOrdering[7] = 10
seatOrdering[8] = 6
seatOrdering[9] = 7
seatOrdering[10] = 23
seatOrdering[11] = 24
seatOrdering[12] = 4
seatOrdering[13] = 5
seatOrdering[14] = 16
seatOrdering[15] = 11
seatOrdering[16] = 12
seatOrdering[17] = 19
// seatOrdering[18] = 22
// seatOrdering[19] = 21
// seatOrdering[20] = 20
// seatOrdering[21] = 18
// seatOrdering[22] = 17
// seatOrdering[23] = 25
// seatOrdering[24] = 26
// seatOrdering[25] = 31
// seatOrdering[26] = 30
// seatOrdering[27] = 27
// seatOrdering[28] = 28
// seatOrdering[29] = 29
// seatOrdering[30] = 8
// seatOrdering[31] = 9
PRINTSTRING("\nact_cinema - SETUP_CURRENT_CINEMA() - cinema is Downtown\n")
ELIF VDIST2(vInput, <<283.7833, 200.4280, 103.3739>>) < 8 // Cinema, Vinewood
cinemaInfo.vSeatPos = <<320.9934, 265.2515, 82.1221>>
cinemaInfo.fSeatHeading = -179.5
cinemaInfo.vLookCamPos = << 320.9934, 265.2515, 84.1221 >>
cinemaInfo.vLookCamRot = << 7.6308, -0.0000, 177.8563 >>
cinemaInfo.vWarpExitLoc = <<301.2162, 202.1357, 103.3797>>
cinemaInfo.fWarpExitHeading = 156.5144
cinemaInfo.eLocation = ALOC_cinema_vinewood
cinemaInfo.vScreenCentre = <<320.223206,247.586487,86.662674>>
cinemaInfo.iVoiceChannel = FM_VOICE_CHANNEL_CINEMA_2
cinemaInfo.vWarpInsideCoords = <<329.0103, 277.3879, 86.5655>>
cinemaInfo.vScenarioActivationPoint = <<318.5567, 264.5815, 81.9749>>
seatOrdering[0] = 3
seatOrdering[1] = 8
seatOrdering[2] = 2
seatOrdering[3] = 7
seatOrdering[4] = 20
seatOrdering[5] = 5
seatOrdering[6] = 6
seatOrdering[7] = 4
seatOrdering[8] = 22
seatOrdering[9] = 0
seatOrdering[10] = 1
seatOrdering[11] = 23
seatOrdering[12] = 24
seatOrdering[13] = 25
seatOrdering[14] = 21
seatOrdering[15] = 11
seatOrdering[16] = 12
seatOrdering[17] = 9
// seatOrdering[18] = 10
// seatOrdering[19] = 16
// seatOrdering[20] = 15
// seatOrdering[21] = 26
// seatOrdering[22] = 27
// seatOrdering[23] = 28
// seatOrdering[24] = 29
// seatOrdering[25] = 17
// seatOrdering[26] = 18
// seatOrdering[27] = 31
// seatOrdering[28] = 30
// seatOrdering[29] = 14
// seatOrdering[30] = 13
// seatOrdering[31] = 19
PRINTSTRING("\nact_cinema - SETUP_CURRENT_CINEMA() - cinema is Vinewood\n")
ELIF VDIST2(vInput, <<-1422.673, -214.3225, 45.9932>>) < 8 // Cinema, Morningwood
cinemaInfo.vSeatPos = << -1425.5645, -244.3000, 15.8053 >>
cinemaInfo.fSeatHeading = 177
cinemaInfo.vLookCamPos = << -1425.5645, -244.3000, 17.8053 >>
cinemaInfo.vLookCamRot = << 7.4186, -0.0000, 177.3244 >>
cinemaInfo.vWarpExitLoc = <<-1423.4724, -214.2539, 45.5004>>
cinemaInfo.fWarpExitHeading = 353.8757
cinemaInfo.eLocation = ALOC_cinema_morningwood
cinemaInfo.vScreenCentre = <<-1426.543701,-258.994781,20.708384>>
cinemaInfo.iVoiceChannel = FM_VOICE_CHANNEL_CINEMA_3
cinemaInfo.vWarpInsideCoords = <<-1418.5088, -234.6433, 18.9931>>
cinemaInfo.vScenarioActivationPoint = <<-1426.4,-248.5,16.1>>
seatOrdering[0] = 3
seatOrdering[1] = 8
seatOrdering[2] = 2
seatOrdering[3] = 7
seatOrdering[4] = 20
seatOrdering[5] = 5
seatOrdering[6] = 6
seatOrdering[7] = 4
seatOrdering[8] = 22
seatOrdering[9] = 0
seatOrdering[10] = 1
seatOrdering[11] = 23
seatOrdering[12] = 24
seatOrdering[13] = 25
seatOrdering[14] = 21
seatOrdering[15] = 11
seatOrdering[16] = 12
seatOrdering[17] = 9
// seatOrdering[18] = 10
// seatOrdering[19] = 16
// seatOrdering[20] = 15
// seatOrdering[21] = 26
// seatOrdering[22] = 27
// seatOrdering[23] = 28
// seatOrdering[24] = 29
// seatOrdering[25] = 17
// seatOrdering[26] = 18
// seatOrdering[27] = 31
// seatOrdering[28] = 30
// seatOrdering[29] = 14
// seatOrdering[30] = 13
// seatOrdering[31] = 19
PRINTSTRING("\nact_cinema - SETUP_CURRENT_CINEMA() - cinema is Morningwood\n")
ENDIF
ENDPROC
/// PURPOSE:
/// For the issue of working out euler exactly on the ATAN wrap (0.0,0.0,1.0) or (0.0,0.0,-1.0)
/// PARAMS:
/// aFloat - The Z coord of the forward vector.
/// RETURNS:
///
FUNC FLOAT VERY_SMALL_FLOAT(FLOAT aFloat)
//
IF aFloat = 1.0
RETURN 0.999999
ENDIF
IF aFloat = -1.0
RETURN -0.999999
ENDIF
RETURN aFloat
ENDFUNC
FUNC VECTOR ComputeEulersFromVector(VECTOR vForwardVector)
VECTOR RotationEulers
// RotationEulers.x = ATAN2(vForwardVector.x, vForwardVector.y)
// RotationEulers.z = ATAN2(vForwardVector.z, SQRT((vForwardVector.x*vForwardVector.x)+(vForwardVector.y*vForwardVector.y)))
vForwardVector.z = VERY_SMALL_FLOAT(vForwardVector.z)
RotationEulers.z = ATAN2(-vForwardVector.x, vForwardVector.y)
RotationEulers.x = ASIN(vForwardVector.z)
RotationEulers.y = 0.0
RETURN RotationEulers
ENDFUNC
FUNC VECTOR GET_CAMERA_ROTATION_FROM_TWO_POINTS(VECTOR vStartPos, VECTOR vEndPos)
VECTOR vReturnValue
// VECTOR vCamTarget = (vEndPos-vStartPos)
// FLOAT fRotX = ATAN2(vCamTarget.z, VMAG(<<vCamTarget.x, vCamTarget.y, 0.0>>))
// vCamTarget = NORMALISE_VECTOR(vCamTarget)
// FLOAT fRotZ = GET_ANGLE_BETWEEN_2D_VECTORS(0.0, 1.0, vCamTarget.x, vCamTarget.y)
// VECTOR vTemp
// vTemp = CROSS_PRODUCT(<<0.0,1.0,0.0>>, vCamTarget)
// IF vTemp.z > 0
// fRotZ = ABSF(fRotZ)
// ELSE
// fRotZ = (ABSF(fRotZ) * -1)
// ENDIF
// vReturnValue.x = fRotx
// vReturnValue.z = fRotZ
// VECTOR vNormStart = NORMALISE_VECTOR(vStartPos)
// VECTOR vNormEnd = NORMALISE_VECTOR(vEndPos)
// FLOAT angle = ACOS( DOT_PRODUCT(vNormStart,vEndPos))
// IF ABSF(angle <= 0.001)
// RETURN <<0,0,1>>
// ENDIF
// IF ABSF(angle)
// NORMALISE(vNormStart)
// NORMALISE(vNormEnd)
VECTOR vCamTarget = (vEndPos-vStartPos)
VECTOR vNorm = NORMALISE_VECTOR(vCamTarget)
vReturnValue = ComputeEulersFromVector(vNorm)
//GET_ROTA
RETURN vReturnValue
ENDFUNC
FUNC SEAT_DETAILS GET_SEAT_DATA(INT iIndex)
//seated
//-0--1----------6--7--
//----2--3--4--5-------
//-8-9-----------14-15
//----10-11-12-13------
//16-17----------21-22-
//----18-19-20-------
FLOAT fCamZOffset = 1.2
SEAT_DETAILS seatData
//standing
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
SWITCH iIndex
CASE 0
seatData.vCamPos = << 372.289825, -716.910095, (10.497251+fCamZOffset) >>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
//<< 0.0, 0.0000, 178 >>
seatData.fCamFOV = 35
seatData.vSeatPos = << 372.289825, -716.910095, 10.497251>>
seatData.fSeatHeading = 178
BREAK
CASE 1
seatData.vCamPos = << 374.049194, -716.904480, (10.391301+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = << 374.049194, -716.904480, 10.391301>>
seatData.fSeatHeading = 178
BREAK
CASE 2
seatData.vCamPos = << 375.663330, -716.821472, (10.462126+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = << 375.663330, -716.821472, 10.462126>>
seatData.fSeatHeading = 178
BREAK
CASE 3
seatData.vCamPos = << 376.861206, -716.873291, (10.485737+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = << 376.861206, -716.873291, 10.485737>>
seatData.fSeatHeading = 178
BREAK
CASE 4
seatData.vCamPos = << 377.462616, -716.889404, (10.510453+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = << 377.462616, -716.889404, 10.510453>>
seatData.fSeatHeading = 178
BREAK
CASE 5
seatData.vCamPos = << 379.163452, -717.018311, (10.490685+fCamZOffset)>>
seatData.vCamRot =<<9.3121, 0.0000, 174.7176>>
seatData.fCamFOV = 35
seatData.vSeatPos = << 379.163452, -717.018311, 10.490685>>
seatData.fSeatHeading = 178
BREAK
CASE 6
seatData.vCamPos = << 371.872986, -720.420959, (10.490905+fCamZOffset)>>
seatData.vCamRot = <<10.9324, 0.0000, -161.6771>>
seatData.fCamFOV = 38
seatData.vSeatPos = << 371.872986, -720.420959, 10.391301>>
seatData.fSeatHeading = 178
BREAK
CASE 7
seatData.vCamPos = << 370.766327, -720.524048, (10.451876+fCamZOffset)>>
seatData.vCamRot = <<10.6360, -0.0000, -158.0298>>
seatData.fCamFOV = 38
seatData.vSeatPos = << 370.766327, -720.524048,10.451876>>
seatData.fSeatHeading = 178
BREAK
CASE 8
seatData.vCamPos = << 370.171295, -720.591675, (10.477077+fCamZOffset)>>
seatData.vCamRot = <<10.9668, -0.0000, -154.9859>>
seatData.fCamFOV = 38
seatData.vSeatPos = << 370.171295, -720.591675, 10.477077>>
seatData.fSeatHeading = 178
BREAK
CASE 9
seatData.vCamPos = << 369.021179, -720.644104, (10.460794+fCamZOffset)>>
seatData.vCamRot = <<11.4466, 0.0000, -151.1129>>
seatData.fCamFOV = 34
seatData.vSeatPos = << 369.021179, -720.644104, 10.460794>>
seatData.fSeatHeading = 178
BREAK
CASE 10
seatData.vCamPos = << 372.445374, -720.369690, (10.465681+fCamZOffset)>>
seatData.vCamRot = <<10.8786, -0.0000, -163.6012>>
seatData.fCamFOV = 45
seatData.vSeatPos = << 372.445374, -720.369690, 10.465681>>
seatData.fSeatHeading = 178
BREAK
CASE 11
seatData.vCamPos = << 380.509827, -721.362244, (10.442063+fCamZOffset)>>
seatData.vCamRot = <<12.7966, -0.0000, 167.9809>>
seatData.fCamFOV = 43
seatData.vSeatPos = << 380.509827, -721.362244, 10.442063>>
seatData.fSeatHeading = 178
BREAK
CASE 12
seatData.vCamPos = << 381.095581, -721.386841, (10.408819+fCamZOffset)>>
seatData.vCamRot = <<12.7995, 0.0000, 166.8188>>
seatData.fCamFOV = 43
seatData.vSeatPos = << 381.095581, -721.386841, 10.408819>>
seatData.fSeatHeading = 178
BREAK
CASE 13
seatData.vCamPos = << 377.599976, -720.191345, (10.351383+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 45
seatData.vSeatPos = << 377.599976, -720.191345, 10.351383>>
seatData.fSeatHeading = 178
BREAK
CASE 14
seatData.vCamPos = << 378.807190, -720.233765, (10.468294+fCamZOffset)>>
seatData.vCamRot = <<11.9675, -0.0000, 174.5444>>
seatData.fCamFOV = 45
seatData.vSeatPos = << 378.807190, -720.233765, 10.468294>>
seatData.fSeatHeading = 178
BREAK
CASE 15
seatData.vCamPos = << 378.197540, -720.221252, (10.485231+fCamZOffset)>>
seatData.vCamRot = <<11.9395, -0.0000, 177.0469>>
seatData.fCamFOV = 43.5883
seatData.vSeatPos = << 378.197540, -720.221252, 10.485231>>
seatData.fSeatHeading = 178
BREAK
CASE 16
seatData.vCamPos = << 379.384033, -720.262329, (10.468241+fCamZOffset)>>
seatData.vCamRot = <<11.9212, -0.0000, 173.1490>>
seatData.fCamFOV = 44
seatData.vSeatPos = << 379.384033, -720.262329, 10.468241>>
seatData.fSeatHeading = 178
BREAK
CASE 17
seatData.vCamPos = << 381.093475, -720.334839, (10.452884+fCamZOffset)>>
seatData.vCamRot = <<12.0421, 0.0000, 166.5301>>
seatData.fCamFOV = 41
seatData.vSeatPos = << 381.093475, -720.334839, 10.452884>>
seatData.fSeatHeading = 178
BREAK
CASE 18
seatData.vCamPos = << 380.537079, -720.324341, (10.467115+fCamZOffset)>>
seatData.vCamRot = <<11.3040, 0.0000, 169.0678>>
seatData.fCamFOV = 42
seatData.vSeatPos = << 380.537079, -720.324341, 10.467115>>
seatData.fSeatHeading = 178
BREAK
CASE 19
seatData.vCamPos = << 380.536438, -722.717529, (10.397058+fCamZOffset)>>
seatData.vCamRot = <<14.0036, 0.0000, 167.8718>>
seatData.fCamFOV = 50
seatData.vSeatPos = << 380.536438, -722.717529, 10.391301>>
seatData.fSeatHeading = 178
BREAK
CASE 20
seatData.vCamPos = << 381.111816, -723.741882, (10.298868+fCamZOffset)>>
seatData.vCamRot = <<15.2916, 0.0000, 165.1738>>
seatData.fCamFOV = 52
seatData.vSeatPos = << 381.111816, -723.741882, 10.298868>>
seatData.fSeatHeading = 178
BREAK
CASE 21
seatData.vCamPos = << 380.522949, -723.719421, (10.315695+fCamZOffset)>>
seatData.vCamRot = <<16.2153, 0.0000, 167.4701>>
seatData.fCamFOV = 52
seatData.vSeatPos = << 380.522949, -723.719421, 10.315695>>
seatData.fSeatHeading = 178
BREAK
CASE 22
seatData.vCamPos = << 381.112488, -722.664795, (10.353852+fCamZOffset)>>
seatData.vCamRot = <<13.1758, 0.0000, 165.9021>>
seatData.fCamFOV = 50
seatData.vSeatPos = << 381.112488, -722.664795, 10.353852>>
seatData.fSeatHeading = 178
BREAK
CASE 23
seatData.vCamPos = << 371.897522, -722.711243, (10.380223+fCamZOffset)>>
seatData.vCamRot = <<14.3705, 0.0000, -158.9876>>
seatData.fCamFOV = 45
seatData.vSeatPos = << 371.897522, -722.711243, 10.380223>>
seatData.fSeatHeading = 178
BREAK
CASE 24
seatData.vCamPos = << 372.486115, -722.787964, (10.335785+fCamZOffset)>>
seatData.vCamRot = <<13.9337, 0.0000, -161.5393>>
seatData.fCamFOV = 48.5
seatData.vSeatPos = << 372.486115, -722.787964, 10.335785>>
seatData.fSeatHeading = 178
BREAK
CASE 25
seatData.vCamPos = << 371.898712, -725.053040, (10.191216+fCamZOffset)>>
seatData.vCamRot = <<20.1102, 0.0000, -158.2016>>
seatData.fCamFOV = 56
seatData.vSeatPos = << 371.898712, -725.053040, 10.191216>>
seatData.fSeatHeading = 178
BREAK
CASE 26
seatData.vCamPos = << 372.451904, -725.037720, (10.230280+fCamZOffset)>>
seatData.vCamRot = <<18.3191, -0.0000, -159.9798>>
seatData.fCamFOV = 54.7944
seatData.vSeatPos = << 372.451904, -725.037720, 10.230280>>
seatData.fSeatHeading = 178
BREAK
CASE 27
seatData.vCamPos = << 377.632813, -724.854858, (10.211521+fCamZOffset)>>
seatData.vCamRot = <<17.9222, 0.0000, 178.7022>>
seatData.fCamFOV = 64.3802
seatData.vSeatPos = << 377.632813, -724.854858, 10.211521>>
seatData.fSeatHeading = 178
BREAK
CASE 28
seatData.vCamPos = << 378.196014, -724.884644, (10.225228+fCamZOffset)>>
seatData.vCamRot = <<18.6424, 0.0000, 177.6024>>
seatData.fCamFOV = 63.3742
seatData.vSeatPos = << 378.196014, -724.884644, 10.225228>>
seatData.fSeatHeading = 178
BREAK
CASE 29
seatData.vCamPos = << 380.557709, -724.933044, (10.226647+fCamZOffset)>>
seatData.vCamRot = <<18.0177, -0.0000, 166.7067>>
seatData.fCamFOV = 61.1889
seatData.vSeatPos = << 380.557709, -724.933044,10.226647>>
seatData.fSeatHeading = 178
BREAK
CASE 30
seatData.vCamPos = << 375.320007, -724.869812, (10.236370+fCamZOffset)>>
seatData.vCamRot = <<16.6198, 0.0000, -171.5697>>
seatData.fCamFOV = 59.1973
seatData.vSeatPos = << 375.320007, -724.869812, 10.236370>>
seatData.fSeatHeading = 178
BREAK
CASE 31
seatData.vCamPos = << 374.783997, -724.974792, (10.235142+fCamZOffset)>>
seatData.vCamRot = <<17.7571, -0.0000, -169.4913>>
seatData.fCamFOV = 59.8659
seatData.vSeatPos = << 374.783997, -724.974792, 10.235142>>
seatData.fSeatHeading = 178
BREAK
ENDSWITCH
BREAK
CASE ALOC_cinema_vinewood
SWITCH iIndex
// CASE 0
// seatData.vCamPos = <<312.985138, 255.309464, (82.084526+fCamZOffset)>>
// seatData.vCamRot = <<18.7145, 0.0000, -146.4130>>
// seatData.fCamFOV = 60.0480
// seatData.vSeatPos = <<312.985138, 255.309464, 82.084526>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 1
// seatData.vCamPos = <<311.804749, 255.397034, (82.349045+fCamZOffset)>>
// seatData.vCamRot = <<18.1450, 0.0000, -141.3365>>
// seatData.fCamFOV = 58.0427
// seatData.vSeatPos = <<311.804749, 255.397034, 82.349045>>
// seatData.fSeatHeading = -179.5
// BREAK
CASE 0//2
seatData.vCamPos = <<314.542480, 264.742767, (82.424187+fCamZOffset)>>
seatData.vCamRot = <<9.2307, -0.0000, -163.5652>>
seatData.fCamFOV = 31.2465
seatData.vSeatPos = <<314.542480, 264.742767, 82.424187>>
seatData.fSeatHeading = -179.5
BREAK
CASE 1//3
seatData.vCamPos = <<315.146881, 264.625031, (82.544693+fCamZOffset)>>
seatData.vCamRot = <<9.0841, -0.0000, -165.6775>>
seatData.fCamFOV = 31.6778
seatData.vSeatPos = <<315.146881, 264.625031, 82.544693>>
seatData.fSeatHeading = -179.5
BREAK
CASE 2//4
seatData.vCamPos = <<316.855957, 264.733124, (82.303383+fCamZOffset)>>
seatData.vCamRot = <<9.3184, 0.0000, -170.1787>>
seatData.fCamFOV = 32.1031
seatData.vSeatPos = <<316.855957, 264.733124, 82.303383>>
seatData.fSeatHeading = -179.5
BREAK
CASE 3//5
seatData.vCamPos = <<318.556671, 264.633881, (82.417770+fCamZOffset)>>
seatData.vCamRot = <<9.1300, 0.0000, -175.3555>>
seatData.fCamFOV = 32.7728
seatData.vSeatPos = <<318.556671, 264.633881, 82.417770>>
seatData.fSeatHeading = -179.5
BREAK
CASE 4//6
seatData.vCamPos = <<319.725616, 264.764954, (82.253479+fCamZOffset)>>
seatData.vCamRot = <<9.0963, 0.0000, -178.9855>>
seatData.fCamFOV = 33.9548
seatData.vSeatPos = <<319.725616, 264.764954, 82.253479>>
seatData.fSeatHeading = -179.5
BREAK
CASE 5//7
seatData.vCamPos = <<314.682983, 260.141205, (82.229774+fCamZOffset)>>
seatData.vCamRot = <<12.6364, -0.0000, -160.6232>>
seatData.fCamFOV = 40.6578
seatData.vSeatPos = <<314.682983, 260.141205, 82.229774>>
seatData.fSeatHeading = -179.5
BREAK
CASE 6//8
seatData.vCamPos = <<315.279602, 260.129211, (82.348740+fCamZOffset)>>
seatData.vCamRot = <<12.5850, -0.0000, -162.5030>>
seatData.fCamFOV = 40.2106
seatData.vSeatPos = <<315.279602, 260.129211, 82.348740>>
seatData.fSeatHeading = -179.5
BREAK
CASE 7//9
seatData.vCamPos = <<314.667084, 261.256439, (82.281876+fCamZOffset)>>
seatData.vCamRot = <<11.2958, -0.0000, -161.0049>>
seatData.fCamFOV = 36.7070
seatData.vSeatPos = <<314.667084, 261.256439, 82.281876>>
seatData.fSeatHeading = -179.5
BREAK
CASE 8//10
seatData.vCamPos = <<315.279266, 261.297791, (82.255669+fCamZOffset)>>
seatData.vCamRot = <<12.2435, 0.0000, -163.0314>>
seatData.fCamFOV = 37.5906
seatData.vSeatPos = <<315.279266, 261.297791, 82.255669>>
seatData.fSeatHeading = -179.5
BREAK
CASE 9//11
seatData.vCamPos = <<312.984894, 261.118103, (82.399330+fCamZOffset)>>
seatData.vCamRot = <<11.2778, 0.0000, -155.6107>>
seatData.fCamFOV = 36.9313
seatData.vSeatPos = <<312.984894, 261.118103, 82.399330>>
seatData.fSeatHeading = -179.5
BREAK
CASE 10//12
seatData.vCamPos = <<313.534729, 261.191803, (82.395164+fCamZOffset)>>
seatData.vCamRot = <<11.2399, 0.0000, -157.2202>>
seatData.fCamFOV = 37.5653
seatData.vSeatPos = <<313.534729, 261.191803, 82.395164>>
seatData.fSeatHeading = -179.5
BREAK
CASE 11//13
seatData.vCamPos = <<314.721283, 258.851654, (82.325218+fCamZOffset)>>
seatData.vCamRot = <<14.9193, -0.0000, -158.4475>>
seatData.fCamFOV = 47.0107
seatData.vSeatPos = <<314.721283, 258.851654, 82.325218>>
seatData.fSeatHeading = -179.5
BREAK
CASE 12//14
seatData.vCamPos = <<315.289429, 258.867004, (82.299316+fCamZOffset)>>
seatData.vCamRot = <<14.4042, -0.0000, -161.1789>>
seatData.fCamFOV = 46.0020
seatData.vSeatPos = <<315.289429, 258.867004, 82.299316>>
seatData.fSeatHeading = -179.5
BREAK
CASE 13//15
seatData.vCamPos = <<315.276581, 257.698944, (82.453506+fCamZOffset)>>
seatData.vCamRot = <<15.5013, -0.0000, -159.6257>>
seatData.fCamFOV = 49.9605
seatData.vSeatPos = <<315.276581, 257.698944, 82.453506>>
seatData.fSeatHeading = -179.5
BREAK
CASE 14//16
seatData.vCamPos = <<314.709839, 257.789307, (82.200951+fCamZOffset)>>
seatData.vCamRot = <<16.4339, 0.0000, -157.6264>>
seatData.fCamFOV = 49.0059
seatData.vSeatPos = <<314.709839, 257.789307, 82.200951>>
seatData.fSeatHeading = -179.5
BREAK
CASE 15//17
seatData.vCamPos = <<313.594391, 260.001740, (82.364540+fCamZOffset)>>
seatData.vCamRot = <<12.4146, -0.0000, -156.2165>>
seatData.fCamFOV = 40.2261
seatData.vSeatPos = <<313.594391, 260.001740, 82.364540>>
seatData.fSeatHeading = -179.5
BREAK
CASE 16//18
seatData.vCamPos = <<313.007843, 259.960785, (82.335617+fCamZOffset)>>
seatData.vCamRot = <<14.0373, -0.0000, -151.6856>>
seatData.fCamFOV = 38.9120
seatData.vSeatPos = <<313.007843, 259.960785, 82.335617>>
seatData.fSeatHeading = -179.5
BREAK
// CASE 19
// seatData.vCamPos = <<311.843964, 259.858276, (82.345467+fCamZOffset)>>
// seatData.vCamRot = <<12.6687, -0.0000, -150.7585>>
// seatData.fCamFOV = 39.0677
// seatData.vSeatPos = <<311.843964, 259.858276, 82.345467>>
// seatData.fSeatHeading = -179.5
// BREAK
CASE 17//20
seatData.vCamPos = <<312.999451, 258.750214, (82.284874+fCamZOffset)>>
seatData.vCamRot = <<15.1249, -0.0000, -152.2532>>
seatData.fCamFOV = 45.0003
seatData.vSeatPos = <<312.999451, 258.750214, 82.284874>>
seatData.fSeatHeading = -179.5
BREAK
CASE 18//21
seatData.vCamPos = <<313.576904, 258.844666, (82.276123+fCamZOffset)>>
seatData.vCamRot = <<14.8591, -0.0000, -153.6585>>
seatData.fCamFOV = 45.2251
seatData.vSeatPos = <<313.576904, 258.844666, 82.276123>>
seatData.fSeatHeading = -179.5
BREAK
CASE 19//22
seatData.vCamPos = <<313.586609, 257.728058, (82.119804+fCamZOffset)>>
seatData.vCamRot = <<17.1165, -0.0000, -153.0840>>
seatData.fCamFOV = 48.0088
seatData.vSeatPos = <<313.586609, 257.728058, 82.119804>>
seatData.fSeatHeading = -179.5
BREAK
// CASE 23
// seatData.vCamPos = <<312.999054, 257.688843, (82.234436+fCamZOffset)>>
// seatData.vCamRot = <<17.2230, -0.0000, -150.6844>>
// seatData.fCamFOV = 47.1060
// seatData.vSeatPos = <<312.999054, 257.688843, 82.234436>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 24
// seatData.vCamPos = <<311.840271, 257.594421, (82.069832+fCamZOffset)>>
// seatData.vCamRot = <<18.1083, 0.0000, -145.5764>>
// seatData.fCamFOV = 45.1777
// seatData.vSeatPos = <<311.840271, 257.594421, 82.069832>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 25
// seatData.vCamPos = <<312.976227, 256.451324, (82.098366+fCamZOffset)>>
// seatData.vCamRot = <<19.9102, 0.0000, -148.5161>>
// seatData.fCamFOV = 53.5330
// seatData.vSeatPos = <<312.976227, 256.451324, 82.098366>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 26
// seatData.vCamPos = <<311.806610, 256.466095, (82.396004+fCamZOffset)>>
// seatData.vCamRot = <<17.3154, -0.0000, -145.0639>>
// seatData.fCamFOV = 50.0194
// seatData.vSeatPos = <<311.806610, 256.466095, 82.396004>>
// seatData.fSeatHeading = -179.5
// BREAK
CASE 20//27
seatData.vCamPos = <<320.454102, 260.357483, (82.412720+fCamZOffset)>>
seatData.vCamRot = <<10.7720, 0.0000, 179.1309>>
seatData.fCamFOV = 44.5733
seatData.vSeatPos = <<320.454102, 260.357483, 82.412720>>
seatData.fSeatHeading = -179.5
BREAK
CASE 21//28
seatData.vCamPos = <<321.036804, 256.664917, (82.191971+fCamZOffset)>>
seatData.vCamRot = <<14.8740, -0.0000, 176.0925>>
seatData.fCamFOV = 60.6120
seatData.vSeatPos = <<321.036804, 256.664917, 82.191971>>
seatData.fSeatHeading = -179.5
BREAK
CASE 22//29
seatData.vCamPos = <<320.257477, 264.724640, (82.300560+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = <<320.257477, 264.724640, 82.300560>>
seatData.fSeatHeading = -179.5
BREAK
CASE 23//30
seatData.vCamPos = <<322.010559, 264.711121, (82.346603+fCamZOffset)>>
seatData.vCamRot = GET_CAMERA_ROTATION_FROM_TWO_POINTS(seatData.vCamPos,cinemaInfo.vScreenCentre)
seatData.fCamFOV = 35
seatData.vSeatPos = <<322.010559, 264.711121, 82.346603>>
seatData.fSeatHeading = -179.5
BREAK
CASE 24//31
seatData.vCamPos = <<321.611786, 261.441559, (82.394264+fCamZOffset)>>
seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
seatData.fCamFOV = 40.7381
seatData.vSeatPos = <<321.611786, 261.441559, 82.394264>>
seatData.fSeatHeading = -179.5
BREAK
CASE 25//32
seatData.vCamPos = <<322.199707, 261.377655, (82.366188+fCamZOffset)>>
seatData.vCamRot = <<11.6148, 0.0356, 173.0097>>
seatData.fCamFOV = 40.7381
seatData.vSeatPos = <<322.199707, 261.377655, 82.366188>>
seatData.fSeatHeading = -179.5
BREAK
CASE 26//33
seatData.vCamPos = <<323.355286, 261.353485, (82.239189+fCamZOffset)>>
seatData.vCamRot = <<12.1585, 0.0507, 168.9420>>
seatData.fCamFOV = 40.7381
seatData.vSeatPos = <<323.355286, 261.353485, 82.239189>>
seatData.fSeatHeading = -179.5
BREAK
CASE 27//34
seatData.vCamPos = <<323.925476, 261.326324, (82.386810+fCamZOffset)>>
seatData.vCamRot = <<10.7088, -0.0459, 166.7500>>
seatData.fCamFOV = 40.7381
seatData.vSeatPos = <<323.925476, 261.326324, 82.386810>>
seatData.fSeatHeading = -179.5
BREAK
CASE 28//35
seatData.vCamPos = <<323.336975, 259.009399, (82.309479+fCamZOffset)>>
seatData.vCamRot = <<16.2681, -0.0245, 167.8727>>
seatData.fCamFOV = 47.4776
seatData.vSeatPos = <<323.336975, 259.009399, 82.309479>>
seatData.fSeatHeading = -179.5
BREAK
CASE 29//36
seatData.vCamPos = <<323.888672, 258.997009, (82.233665+fCamZOffset)>>
seatData.vCamRot = <<15.3019, 0.0119, 165.6251>>
seatData.fCamFOV = 46.0227
seatData.vSeatPos = <<323.888672, 258.997009, 82.233665>>
seatData.fSeatHeading = -179.5
BREAK
CASE 30//37
seatData.vCamPos = <<323.891327, 257.895691, (82.222717+fCamZOffset)>>
seatData.vCamRot = <<17.0406, -0.0508, 164.8351>>
seatData.fCamFOV = 50.3730
seatData.vSeatPos = <<323.891327, 257.895691, 82.222717>>
seatData.fSeatHeading = -179.5
BREAK
CASE 31//38
seatData.vCamPos = <<323.338959, 257.897491, (82.090118+fCamZOffset)>>
seatData.vCamRot = <<17.4491, -0.0635, 167.2266>>
seatData.fCamFOV = 51.4625
seatData.vSeatPos = <<323.338959, 257.897491, 82.090118>>
seatData.fSeatHeading = -179.5
BREAK
// CASE 39
// seatData.vCamPos = <<326.486145, 258.822937, (82.205063+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<326.486145, 258.822937, 82.205063>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 40
// seatData.vCamPos = <<327.041504, 258.780060, (82.276276+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<327.041504, 258.780060, 82.276276>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 41
// seatData.vCamPos = <<326.451355, 260.101746, (82.357185+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<326.451355, 260.101746, 82.357185>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 42
// seatData.vCamPos = <<327.058990, 260.092041, (82.290123+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<327.058990, 260.092041, 82.290123>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 43
// seatData.vCamPos = <<313.588745, 255.426132, (82.054375+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<313.588745, 255.426132,82.054375>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 44
// seatData.vCamPos = <<317.631287, 255.600510, (82.049896+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<317.631287, 255.600510, 82.049896>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 45
// seatData.vCamPos = <<318.133453, 255.629242, (82.069077+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<318.133453, 255.629242, 82.069077>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 46
// seatData.vCamPos = <<320.484863, 255.577057, (82.076775+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<320.484863, 255.577057, 82.076775>>
// seatData.fSeatHeading = -179.5
// BREAK
// CASE 47
// seatData.vCamPos = <<321.008179, 255.567307, (82.133789+fCamZOffset)>>
// seatData.vCamRot = <<11.2188, -0.0000, 175.1725>>
// seatData.fCamFOV = 40.7381
// seatData.vSeatPos = <<321.008179, 255.567307, 82.133789>>
// seatData.fSeatHeading = -179.5
// BREAK
ENDSWITCH
BREAK
CASE ALOC_cinema_morningwood
SWITCH iIndex
CASE 0
seatData.vCamPos = << -1429.050537, -254.810852, (15.920204+fCamZOffset) >>
seatData.vCamRot = <<19.2615, -0.0000, 163.6450>>
seatData.fCamFOV = 68.1721
seatData.vSeatPos = << -1429.050537, -254.810852, 15.920204 >>
seatData.fSeatHeading = 177
BREAK
CASE 1
seatData.vCamPos = << -1428.560303, -254.773499, (15.859696+fCamZOffset) >>
seatData.vCamRot = <<21.2606, 0.0000, -173.0890>>
seatData.fCamFOV = 90.6714
seatData.vSeatPos = << -1428.560303, -254.773499, 15.859696 >>
seatData.fSeatHeading = 177
BREAK
CASE 2
seatData.vCamPos = << -1423.340576, -253.670715, (15.904275+fCamZOffset) >>
seatData.vCamRot = <<21.6562, 0.0000, 166.4629>>
seatData.fCamFOV = 73.8127
seatData.vSeatPos = << -1423.340576, -253.670715, 15.904275 >>
seatData.fSeatHeading = 177
BREAK
CASE 3
seatData.vCamPos = << -1422.787109, -252.696899, (15.8053+fCamZOffset) >>
seatData.vCamRot = <<21.2120, -0.0000, 163.4131>>
seatData.fCamFOV = 63.8607
seatData.vSeatPos = << -1422.787109, -252.696899, 15.8053 >>
seatData.fSeatHeading = 177
BREAK
CASE 4
seatData.vCamPos = << -1431.402710, -252.703918, (15.897184+fCamZOffset) >>
seatData.vCamRot = <<21.9209, 0.0000, -158.9840>>
seatData.fCamFOV = 60.2128
seatData.vSeatPos = << -1431.402710, -252.703918, 15.897184 >>
seatData.fSeatHeading = 177
BREAK
CASE 5
seatData.vCamPos = << -1429.104370, -247.892242, (16.175653+fCamZOffset) >>
seatData.vCamRot = <<12.9943, 0.0000, -171.0946>>
seatData.fCamFOV = 42.5781
seatData.vSeatPos = << -1429.104370, -247.892242, 16.175653 >>
seatData.fSeatHeading = 177
BREAK
CASE 6
seatData.vCamPos = << -1428.560791, -247.822433, (16.171135+fCamZOffset) >>
seatData.vCamRot = <<12.0150, 0.0000, -172.6889>>
seatData.fCamFOV = 44.0369
seatData.vSeatPos = << -1428.560791, -247.822433, 16.171135 >>
seatData.fSeatHeading = 177
BREAK
CASE 7
seatData.vCamPos = << -1431.956055, -250.338867, (16.063385+fCamZOffset) >>
seatData.vCamRot = <<16.2370, -0.0000, -158.8608>>
seatData.fCamFOV = 47.4492
seatData.vSeatPos = <<-1431.956055, -250.338867, 16.063385 >>
seatData.fSeatHeading = 177
BREAK
CASE 8
seatData.vCamPos = << -1424.482544, -246.819565, (16.249380+fCamZOffset) >>
seatData.vCamRot = <<11.7682, 0.0000, 173.2415>>
seatData.fCamFOV = 40.1148
seatData.vSeatPos = << -1424.482544, -246.819565, 16.249380 >>
seatData.fSeatHeading = 177
BREAK
CASE 9
seatData.vCamPos = << -1425.051880, -246.770447, (16.239958+fCamZOffset) >>
seatData.vCamRot = <<9.9640, 0.0000, 174.7147>>
seatData.fCamFOV = 40.4319
seatData.vSeatPos = << -1425.051880, -246.770447, 16.239958 >>
seatData.fSeatHeading = 177
BREAK
CASE 10
seatData.vCamPos = << -1425.635132, -246.721985, (16.240086+fCamZOffset) >>
seatData.vCamRot = <<11.0050, 0.0000, 176.6019>>
seatData.fCamFOV = 39.9151
seatData.vSeatPos = << -1425.635132, -246.721985, 16.240086 >>
seatData.fSeatHeading = 177
BREAK
CASE 11
seatData.vCamPos = << -1426.201538, -246.707962, (16.229538+fCamZOffset) >>
seatData.vCamRot = <<10.6480, 0.0000, 178.9974>>
seatData.fCamFOV = 40.3505
seatData.vSeatPos = << -1426.201538, -246.707962, 16.229538 >>
seatData.fSeatHeading = 177
BREAK
CASE 12
seatData.vCamPos = << -1429.112061, -250.199844, (16.057077+fCamZOffset) >>
seatData.vCamRot = <<15.8229, -0.0000, -169.8990>>
seatData.fCamFOV = 51.2850
seatData.vSeatPos = << -1429.112061, -250.199844, 16.057077>>
seatData.fSeatHeading = 177
BREAK
CASE 13
seatData.vCamPos = << -1422.752075, -249.166077, (16.119595+fCamZOffset) >>
seatData.vCamRot = <<14.9408, 0.0000, 164.8112>>
seatData.fCamFOV = 46.3151
seatData.vSeatPos = << -1422.752075, -249.166077, 16.119595 >>
seatData.fSeatHeading = 177
BREAK
CASE 14
seatData.vCamPos = << -1423.342773, -249.143524, (16.145742+fCamZOffset) >>
seatData.vCamRot = <<14.8875, -0.0000, 168.0431>>
seatData.fCamFOV = 48.2545
seatData.vSeatPos = << -1423.342773, -249.143524, 16.145742 >>
seatData.fSeatHeading = 177
BREAK
CASE 15
seatData.vCamPos = << -1432.007324, -246.925064, (16.231108+fCamZOffset) >>
seatData.vCamRot = <<10.6825, 0.0000, -160.9277>>
seatData.fCamFOV = 36.7552
seatData.vSeatPos = << -1432.007324, -246.925064, 16.231108 >>
seatData.fSeatHeading = 177
BREAK
CASE 16
seatData.vCamPos = << -1432.119019, -243.447556, (16.257864+fCamZOffset) >>
seatData.vCamRot = <<9.7801, -0.0000, -164.4297>>
seatData.fCamFOV = 31.1913
seatData.vSeatPos = << -1432.119019, -243.447556, 16.257864 >>
seatData.fSeatHeading = 177
BREAK
CASE 17
seatData.vCamPos = << -1431.545776, -243.407272, (16.264511+fCamZOffset) >>
seatData.vCamRot = <<9.6411, 0.0000, -165.3944>>
seatData.fCamFOV = 30.6452
seatData.vSeatPos = << -1431.545776, -243.407272, 16.264511 >>
seatData.fSeatHeading = 177
BREAK
CASE 18
seatData.vCamPos = << -1429.832764, -243.449982, (16.259052+fCamZOffset) >>
seatData.vCamRot = <<10.3535, -0.0000, -170.3195>>
seatData.fCamFOV = 32.4638
seatData.vSeatPos = << -1429.832764, -243.449982, 16.259052 >>
seatData.fSeatHeading = 177
BREAK
CASE 19
seatData.vCamPos = << -1426.996948, -243.405518, (16.260147+fCamZOffset) >>
seatData.vCamRot = <<10.0163, 0.0000, -178.3346>>
seatData.fCamFOV = 35
seatData.vSeatPos = << -1426.996948, -243.405518, 16.260147 >>
seatData.fSeatHeading = 177
BREAK
CASE 20
seatData.vCamPos = << -1426.429199, -243.394348, (16.265541+fCamZOffset) >>
seatData.vCamRot = <<9.8815, -0.0000, 179.5795>>
seatData.fCamFOV = 35
seatData.vSeatPos = << -1426.429199, -243.394348, 16.265541 >>
seatData.fSeatHeading = 177
BREAK
CASE 21
seatData.vCamPos = << -1424.644043, -243.442017, (16.255047+fCamZOffset) >>
seatData.vCamRot = <<9.8396, -0.0000, 173.0362>>
seatData.fCamFOV = 35
seatData.vSeatPos = << -1424.644043, -243.442017, 16.255047 >>
seatData.fSeatHeading = 177
BREAK
CASE 22
seatData.vCamPos = << -1433.651978, -249.374527, (16.136774+fCamZOffset) >>
seatData.vCamRot = <<13.7212, -0.0000, -152.3666>>
seatData.fCamFOV = 42.6996
seatData.vSeatPos = << -1433.651978,-249.374527, 16.136774 >>
seatData.fSeatHeading = 177
BREAK
CASE 23
seatData.vCamPos = << -1433.130737, -249.358917, (16.138220+fCamZOffset) >>
seatData.vCamRot = <<14.5802, -0.0000, -154.0087>>
seatData.fCamFOV = 44.3415
seatData.vSeatPos = << -1433.130737, -249.358917, 16.138220 >>
seatData.fSeatHeading = 177
BREAK
CASE 24
seatData.vCamPos = << -1420.214722, -250.473602, (16.033491+fCamZOffset) >>
seatData.vCamRot = <<16.2658, -0.0000, 154.2034>>
seatData.fCamFOV = 49.9236
seatData.vSeatPos = << -1420.214722, -250.473602, 16.033491 >>
seatData.fSeatHeading = 177
BREAK
CASE 25
seatData.vCamPos = << -1419.639404, -250.453400, (16.047110+fCamZOffset) >>
seatData.vCamRot = <<18.0073, 0.0000, 150.2106>>
seatData.fCamFOV = 46.1796
seatData.vSeatPos = << -1419.639404, -250.453400, 16.047110 >>
seatData.fSeatHeading = 177
BREAK
CASE 26
seatData.vCamPos = << -1432.014404, -251.537949, (15.997274+fCamZOffset) >>
seatData.vCamRot = <<20.0852, 0.0000, -156.1049>>
seatData.fCamFOV = 56.7451
seatData.vSeatPos = << -1432.014404, -251.537949, 15.997274 >>
seatData.fSeatHeading = 177
BREAK
CASE 27
seatData.vCamPos = << -1431.403809, -251.528305, (15.980005+fCamZOffset) >>
seatData.vCamRot = <<19.6972, 0.0000, -159.6045>>
seatData.fCamFOV = 52.9959
seatData.vSeatPos = << -1431.403809, -251.528305, 15.980005 >>
seatData.fSeatHeading = 177
BREAK
CASE 28
seatData.vCamPos = << -1419.901245, -247.003067, (16.259096+fCamZOffset) >>
seatData.vCamRot = <<11.3249, 0.0000, 155.5347>>
seatData.fCamFOV = 36.7464
seatData.vSeatPos = << -1419.901245, -247.003067, 16.259096 >>
seatData.fSeatHeading = 177
BREAK
CASE 29
seatData.vCamPos = << -1420.455322, -246.950592, (16.237331+fCamZOffset) >>
seatData.vCamRot = <<11.6390, 0.0000, 158.4869>>
seatData.fCamFOV = 38.5080
seatData.vSeatPos = << -1420.455322, -246.950592, 16.237331 >>
seatData.fSeatHeading = 177
BREAK
CASE 30
seatData.vCamPos = << -1425.614624, -252.528275, (15.951679+fCamZOffset) >>
seatData.vCamRot = <<18.7509, 0.0000, 176.4076>>
seatData.fCamFOV = 70.2974
seatData.vSeatPos = << -1425.614624, -252.528275, 15.951679 >>
seatData.fSeatHeading = 177
BREAK
CASE 31
seatData.vCamPos = << -1422.745605, -246.858246, (16.213160+fCamZOffset) >>
seatData.vCamRot = <<12.3960, 0.0000, 166.8724>>
seatData.fCamFOV = 39.0291
seatData.vSeatPos = << -1422.745605, -246.858246, 16.213160 >>
seatData.fSeatHeading = 177
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN seatData
ENDFUNC
PROC ASSIGN_SEATS()
INT i, j
REPEAT NUM_NETWORK_PLAYERS i
IF playerBD[i].bInCinema
IF NOT IS_BIT_SET(serverBD.iAssignedSeatBS,i)
REPEAT NUM_NETWORK_PLAYERS j
IF serverBD.iSeats[j] = -1
SET_BIT(serverBD.iAssignedSeatBS,i)
serverBD.iSeats[j] = i
NET_PRINT("Assigning a seat in the cinema for a player") NET_NL()
EXIT
ENDIF
ENDREPEAT
ENDIF
ELSE
IF IS_BIT_SET(serverBD.iAssignedSeatBS,i)
REPEAT NUM_NETWORK_PLAYERS j
IF serverBD.iSeats[j] = i
CLEAR_BIT(serverBD.iAssignedSeatBS,i)
serverBD.iSeats[j] = -1
EXIT
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC SPAWN_SCENARIO_PEDS()
IF playerBD[iSlowServerPlayerLoop].bWarpedInside = TRUE
bAtLeast1PlayerInCinema = TRUE
IF NOT serverBD.bSpawnedPeds
IF NOT ARE_VECTORS_EQUAL(cinemaInfo.vScenarioActivationPoint,<<0,0,0>>)
SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA(cinemaInfo.vScenarioActivationPoint,15,5)
PRINTLN("ACT_CINEMA: Server Setting scenario peds for cinema to spawn")
serverBD.bSpawnedPeds = TRUE
ELSE
PRINTLN("ACT_CINEMA: cinemaInfo.vScenarioActivationPoint = <<0,0,0>>????")
serverBD.bSpawnedPeds = TRUE
ENDIF
ENDIF
ENDIF
iSlowServerPlayerLoop++
IF iSlowServerPlayerLoop >= NUM_NETWORK_PLAYERS
iSlowServerPlayerLoop = 0
IF serverBD.bSpawnedPeds = TRUE
IF NOT bAtLeast1PlayerInCinema
serverBD.bSpawnedPeds = FALSE
PRINTLN("ACT_CINEMA: Server clearing peds in cinema spawn flag")
ENDIF
ENDIF
bAtLeast1PlayerInCinema = FALSE
ENDIF
ENDPROC
FUNC BOOL GET_CLIENT_SEAT()
INT i
IF IS_BIT_SET(serverBD.iAssignedSeatBS,PARTICIPANT_ID_TO_INT())
REPEAT NUM_NETWORK_PLAYERS i
IF serverBD.iSeats[i] = PARTICIPANT_ID_TO_INT()
thisPlayersSeat = GET_SEAT_DATA(seatOrdering[i])
#IF IS_DEBUG_BUILD
iCurrentSeat= seatOrdering[i]
iDebugSeat = seatOrdering[i]
PRINTLN("ACT_CINEMA: Setting player to be in seat # ", iCurrentSeat)
#ENDIF
RETURN TRUE
ENDIF
ENDREPEAT
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_OK(PLAYER_INDEX thePlayer)
IF NETWORK_IS_GAME_IN_PROGRESS()
RETURN IS_NET_PLAYER_OK(thePlayer)
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL LOADED_AND_CREATED_CINEMA_SCENE()
//BOOL bReturn = TRUE
// IF NOT g_bInMultiplayer AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
// blipDoor = CREATE_BLIP_FOR_COORD(vInput)
// SET_BLIP_SPRITE(blipDoor, RADAR_TRACE_CINEMA)
// SET_BLIP_NAME_FROM_TEXT_FILE(blipDoor,"MP_ACT_CIN")
// ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_ACTIVITY_TIME_ACCEPTABLE()
//IF bIgnoreTimeConstraints
// CPRINTLN( DEBUG_AMBIENT, "CINEMA - DEBUG! IGNORNING TIME CONSTRAINTS!" )
// RETURN TRUE
//ELSE
IF GET_CINEMA_SHOWING() != CINEMA_SHOWING_NONE
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - TIME IS ACCEPTABLE" )
RETURN TRUE
ENDIF
//ENDIF
//CPRINTLN( DEBUG_AMBIENT, "CINEMA - TIME IS NOT ACCEPTABLE" )
RETURN FALSE
ENDFUNC
FUNC BOOL IS_CINEMA_UNLOCKED()
IF NETWORK_IS_GAME_IN_PROGRESS()
//IF g_FMMC_STRUCT.g_InvitedToAmbientActivity
// RETURN TRUE
//ENDIF
RETURN IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CINEMA)
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_NET_FREE_FOR_CINEMA()
IF NETWORK_IS_GAME_IN_PROGRESS()
IF GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].iCurrentMissionType = FMMC_TYPE_INVALID
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ACTIVITY_COST_ACCEPTABLE()
IF NETWORK_IS_GAME_IN_PROGRESS()
IF GET_LOCAL_PLAYER_VC_AMOUNT(TRUE) >= g_sMptunables.icinema_expenditure_modifier
OR NETWORK_CAN_SPEND_MONEY(g_sMptunables.icinema_expenditure_modifier,FALSE,TRUE,FALSE,-1) //Use OR to catch cash values over SCRIPT_MAX_INT32.
RETURN TRUE
ENDIF
ELSE
IF GET_TOTAL_CASH(GET_CURRENT_PLAYER_PED_ENUM()) >= ACTIVITY_COST*iParticipants
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC FLOAT DETERMINE_MOVIE_TIME(#IF IS_DEBUG_BUILD BOOL bPrint = TRUE #ENDIF)
//(about 11.40)
INT iMovieLength = 700000
FLOAT fTimeSinceTVStarted
FLOAT fModTime
INT iSeconds,iMinutes,iHours,iDays,iMonths,iYears
TIMEOFDAY timeWhenShowStarted
TIMEOFDAY timeNow
INT iTotalSeconds
timeNow = GET_CURRENT_TIMEOFDAY()
SET_TIMEOFDAY_HOUR(timeWhenShowStarted, 12)
GET_DIFFERENCE_BETWEEN_TIMEOFDAYS(timeNow,timeWhenShowStarted,iSeconds,iMinutes,iHours,iDays,iMonths,iYears)
#IF IS_DEBUG_BUILD
IF bPrint
NET_PRINT_STRING_INT("Time since movie started in seconds: ", iSeconds) NET_NL()
NET_PRINT_STRING_INT("Time since movie started in minutes: ", iMinutes) NET_NL()
NET_PRINT_STRING_INT("Time since movie started in hours: ", iHours) NET_NL()
ENDIF
#ENDIF
iTotalSeconds = iSeconds + 60*iMinutes + iHours*60*60
fTimeSinceTVStarted = TO_FLOAT(iTotalSeconds*(GET_MILLISECONDS_PER_GAME_MINUTE()/60))
//TO_FLOAT(GET_NET_TIMER_DIFFERENCE(netStoredTime,serverBD.MovieStartTimer))
#IF IS_DEBUG_BUILD
IF bPrint
NET_PRINT_STRING_FLOAT("fTimeSinceTVStarted = ", fTimeSinceTVStarted) NET_NL()
ENDIF
#ENDIF
fModTime = fTimeSinceTVStarted%iMovieLength
#IF IS_DEBUG_BUILD
IF bPrint
NET_PRINT_STRING_FLOAT("fModTime = ",fModTime ) NET_NL()
ENDIF
#ENDIF
RETURN (fModTime/iMovieLength)*100
ENDFUNC
FUNC BOOL IS_PLAYER_AT_CINEMA()
IF IS_PED_ON_FOOT( PLAYER_PED_ID())
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<393.782684,-707.920105,27.783785>>, <<393.790588,-715.769348,31.285950>>, 2.250000)
RETURN TRUE
ENDIF
BREAK
CASE ALOC_cinema_vinewood
IF IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<284.272491,199.157990,103.273933>>, <<283.350037,201.643570,106.123932>>, 1.250000)
OR IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<314.478790,190.304138,102.891182>>, <<312.205353,188.985092,105.686943>>, 1.250000)
RETURN TRUE
ENDIF
BREAK
CASE ALOC_cinema_morningwood
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<-1419.397095,-215.492615,45.734562>>, <<-1427.096680,-215.040161,49.067776>>, 2.750000)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
// Can now automatically start the cinema activity if you're in a vehicle and on a friend activity.
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
RETURN FALSE
ENDIF
IF NOT canStartActivity(cinemaInfo.eLocation)
RETURN FALSE
ENDIF
IF NOT IS_ACTIVITY_TIME_ACCEPTABLE()
RETURN FALSE
ENDIF
IF NOT IS_ACTIVITY_COST_ACCEPTABLE()
RETURN FALSE
ENDIF
IF g_bPlayerIsInTaxi
PRINTLN(GET_THIS_SCRIPT_NAME(), " - IS_PLAYER_AT_CINEMA - PLAYER IS IN A TAXI")
RETURN FALSE
ENDIF
VEHICLE_INDEX vPlayerVehicle
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vPlayerVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT DOES_ENTITY_EXIST(vPlayerVehicle)
RETURN FALSE
ENDIF
IF VDIST( vInput, GET_PLAYER_COORDS(PLAYER_ID()) ) < 10.0
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vPlayerVehicle, 7.5)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC GET_SCTV_CINEMA_DATA(VECTOR &vCoords, VECTOR &vRot, FLOAT &fFOV)
SWITCH cinemaInfo.eLocation
CASE ALOC_cinema_downtown
vCoords = <<368.8175, -702.3699, 16.7201>>
vRot = <<-9.9537, 2.9472, -155.7807>>
fFOV = 31.6024
BREAK
CASE ALOC_cinema_vinewood
vCoords = <<310.2254, 278.9754, 90.1912>>
vRot = <<-13.3590, 4.3553, -151.7323>>
fFOV = 31.5767
BREAK
CASE ALOC_cinema_morningwood
vCoords = <<-1436.2330, -229.5830, 22.9699>>
vRot = <<-11.8237, 2.5506, -153.9601>>
fFOV = 31.5763
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL HAS_ANYONE_IN_GAME_UNLOCKED_ACTION_MOVIE()
INT i
REPEAT NUM_NETWORK_PLAYERS i
IF IS_BIT_SET(GlobalplayerBD_FM[i].iCinemaUnlockBS,CINEMA_UNLOCK_SP_ACTION_MOVIE)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL START_THE_MOVIE()
MODEL_NAMES cinemaScreen = V_ILEV_CIN_SCREEN
IF NOT IS_NAMED_RENDERTARGET_REGISTERED("cinscreen")
REGISTER_NAMED_RENDERTARGET("cinscreen")
LINK_NAMED_RENDERTARGET(cinemaScreen)
IF NOT IS_NAMED_RENDERTARGET_LINKED(cinemaScreen)
PRINTLN("RELEASE_NAMED_RENDERTARGET: releasing the cinema screen link failed")
RELEASE_NAMED_RENDERTARGET("cinscreen")
RETURN FALSE
ENDIF
ENDIF
iRenderTarget = GET_NAMED_RENDERTARGET_RENDER_ID("cinscreen")
SET_TEXT_RENDER_ID(iRenderTarget)
RESTORE_STANDARD_CHANNELS()
// MovieId = SET_BINK_MOVIE(theMovie)
// IF MovieId != NULL
//
// DRAW_BINK_MOVIE(MovieId, 0.5,0.5,1.0,1.0,0.0,255,255,255,255)
// fMovieTime = DETERMINE_MOVIE_TIME()
// SET_BINK_MOVIE_TIME(MovieId , fMovieTime)
// PLAY_BINK_MOVIE(MovieId)
// RESET_NET_TIMER(LoadMovieTimeOut)
// RETURN TRUE
// ENDIF
//
// IF HAS_NET_TIMER_EXPIRED(LoadMovieTimeOut,60000)
// SCRIPT_ASSERT("WARNING- GAME UNABLE TO LOAD MOVIE. ENTERING ANYWAY! ")
// RESET_NET_TIMER(LoadMovieTimeOut)
// RETURN TRUE
// ENDIF
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
IF eCurrentCinemaShowing = CINEMA_SHOWING_MORNING
SET_TV_CHANNEL_PLAYLIST( TVCHANNELTYPE_CHANNEL_1, "PL_CINEMA_CARTOON", TRUE)
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_AFTERNOON
SET_TV_CHANNEL_PLAYLIST( TVCHANNELTYPE_CHANNEL_1, "PL_CINEMA_ARTHOUSE", TRUE)
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_EVENING
SET_TV_CHANNEL_PLAYLIST( TVCHANNELTYPE_CHANNEL_1, "PL_CINEMA_ACTION", TRUE)
ELSE
IF HAS_ANYONE_IN_GAME_UNLOCKED_ACTION_MOVIE()
SET_TV_CHANNEL_PLAYLIST_AT_HOUR( TVCHANNELTYPE_CHANNEL_1, "PL_CINEMA_MULTIPLAYER", 10)
ELSE
SET_TV_CHANNEL_PLAYLIST_AT_HOUR( TVCHANNELTYPE_CHANNEL_1, "PL_CINEMA_MULTIPLAYER_NO_MELTDOWN", 10)
ENDIF
ENDIF
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_1)
SET_CINEMA_AUDIO_SCENE()
SET_TV_VOLUME(-5.0)
ENABLE_MOVIE_SUBTITLES(TRUE)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - LOCAL_STAGE_WATCHING_MOVIE - START_THE_MOVIE()")
RETURN TRUE
ENDFUNC
PROC DRAW_TV_TEXTURE_TO_RENDERTARGET()
SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, 0, -0.0375)
//IF MovieId != NULL
SET_TEXT_RENDER_ID(iRenderTarget)
//DRAW_BINK_MOVIE(MovieId, 0.5,0.5,1.0,1.0,0.0,255,255,255,255)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
IF IS_TVSHOW_CURRENTLY_PLAYING(HASH("MOVIE_ARTHOUSE"))
#IF IS_JAPANESE_BUILD
OR IS_TVSHOW_CURRENTLY_PLAYING(HASH("MOVIE_CARTOON"))
#ENDIF
DRAW_TV_CHANNEL(0.5,0.5,0.7375,1.0,0.0,255,255,255,255) // Standard wide screen 1.77:1
ELSE
DRAW_TV_CHANNEL(0.5,0.5,1.0,1.0,0.0,255,255,255,255) // Full wide screen 2.40:1
ENDIF
//PRINTLN("ACT_CINEMA: SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)")
//ENDIF
ENDPROC
PROC DISPLAY_INSTRUCTIONAL_BUTTONS()
INT iScreenX
IF HAVE_CONTROLS_CHANGED(FRONTEND_CONTROL)
bUpdateCinemaControls = FALSE
ENDIF
// IF HAS_SCALEFORM_MOVIE_LOADED(scaleformCinemaControls)
IF NOT bUpdateCinemaControls
IF LOAD_MENU_ASSETS()
CLEAR_MENU_DATA()
// REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons)
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "TXM_EXIT") //"IB_CIN_EXIT"
ADD_MENU_HELP_KEY_GROUP( INPUTGROUP_SCRIPT_RSTICK_ALL, "INPUTGROUP_LOOK") //"IB_CIN_LOOK"
ADD_MENU_HELP_KEY_INPUT( INPUT_SNIPER_ZOOM, "HUD_INPUT91") //"IB_CIN_ZOOM"
bUpdateCinemaControls = TRUE
// RUN_SCALEFORM_INSTRUCTIONAL_BUTTONS(scaleformCinemaControls, aSpriteCinemaControls, instructionalButtons, SHOULD_REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons))
ELSE
// scaleformCinemaControls = REQUEST_SCALEFORM_MOVIE("instructional_buttons")
// LOAD_MENU_ASSETS()
ENDIF
ELSE
DRAW_MENU_HELP_SCALEFORM(iScreenX)
ENDIF
ENDPROC
FUNC BOOL IS_ANYONE_IN_CINEMA()
INT i
REPEAT NUM_NETWORK_PLAYERS i
IF playerBD[i].bInCinema
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_STARTING_JOB()
//IF NOT bGotoCleanUpAfterCorona
//If the player enters a corona
IF GET_CORONA_STATUS() != CORONA_STATUS_IDLE
//Set the clean up flag
// bGotoCleanUpAfterCorona = TRUE
//ENDIF
//ELSE
//Check to see if they quit
/// IF GET_CORONA_STATUS() = CORONA_STATUS_IDLE
// bGotoCleanUpAfterCorona = FALSE
RETURN TRUE
ENDIF
//ENDIF
RETURN FALSE
ENDFUNC
//PROC HANDLE_TV_VOLUME()
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
// fMovieVolume++
//
// IF fMovieVolume > 0.0
// fMovieVolume = 0.0
// ENDIF
//
//// SET_BINK_MOVIE_VOLUME(MovieId, fMovieVolume)
//
// PRINTNL()
// PRINTSTRING ("Act_Cinema: fMovieVolume ")
// PRINTFLOAT (fMovieVolume)
// PRINTNL()
// ENDIF
//
// //turn movie volume down.
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
//
// fMovieVolume--
//
// IF fMovieVolume < -24.0
// fMovieVolume = -24.0
// ENDIF
//
// SET_BINK_MOVIE_VOLUME(MovieId,fMovieVolume)
//
// PRINTNL()
// PRINTSTRING ("Act_Cinema: fMovieVolume ")
// PRINTFLOAT (fMovieVolume)
// PRINTNL()
// ENDIF
//ENDPROC
//
//PROC MAINTAIN_TV_TIME()
// IF MovieId != NULL
// IF ABSF(GET_BINK_MOVIE_TIME(MovieId) - DETERMINE_MOVIE_TIME(#IF IS_DEBUG_BUILD FALSE #ENDIF)) > 0.25
// FLOAT fMovieTime
// fMovieTime = DETERMINE_MOVIE_TIME()
// NET_PRINT_STRING_FLOAT("GET_BINK_MOVIE_TIME(MovieId) : ", GET_BINK_MOVIE_TIME(MovieId)) NET_NL()
// NET_PRINT_STRING_FLOAT("DETERMINE_MOVIE_TIME() : ", fMovieTime)
// SET_BINK_MOVIE_TIME(MovieId , fMovieTime)
// NET_PRINT("Reseting Movie time as it has gone out of sync") NET_NL()
// ENDIF
// ENDIF
//ENDPROC
PROC RESET_FLAGS()
iCinemaBS = 0
startedFadeOut = FALSE
bWarpStarted = FALSE
RESET_NET_TIMER(LoadMovieTimeOut)
ENDPROC
#IF IS_DEBUG_BUILD
PROC TEST_SEAT_POSITIONS()
IF iLocalStage = LOCAL_STAGE_WATCHING_MOVIE
IF iCurrentSeat != iDebugSeat
thisPlayersSeat = GET_SEAT_DATA(iDebugSeat)
IF NET_WARP_TO_COORD(thisPlayersSeat.vSeatPos,thisPlayersSeat.fSeatHeading,FALSE,FALSE,FALSE,FALSE,FALSE)
CLEAR_FIRST_PERSON_CAMERA(newFPCam)
//IF DOES_SCENARIO_EXIST_IN_AREA(thisPlayersSeat.vSeatPos,0.5,TRUE)
// TASK_USE_NEAREST_SCENARIO_TO_COORD(PLAYER_PED_ID(),thisPlayersSeat.vSeatPos,0.5,-1)
TASK_START_SCENARIO_AT_POSITION(PLAYER_PED_ID(),"prop_human_seat_chair_upright",thisPlayersSeat.vSeatPos,thisPlayersSeat.fSeatHeading,-1)
//INIT_FIRST_PERSON_CAMERA(fpsCam,reinitCam,thisPlayersSeat.vCamPos,thisPlayersSeat.vCamRot,thisPlayersSeat.fCamFOV,20,20,10,10,14,-1,FALSE,10,10,0.1,FALSE,0,5)
INIT_FIRST_PERSON_CAMERA(newFPCam,thisPlayersSeat.vCamPos,thisPlayersSeat.vCamRot,thisPlayersSeat.fCamFOV,20,10,3)
iCurrentSeat = iDebugSeat
//ELSE
// PRINTSTRING("ACT_CINEMA: waiting for scenario to exist")
// PRINTNL()
//ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RUN_DEBUG()
//Do any debug processing
TEST_SEAT_POSITIONS()
IF NOT bRefocusedCam
IF bRefocusCam
REFOCUS_FIRST_PERSON_CAMERA_ON_WORLD_POSITION(newFPCam, <<387.1216, -731.6599, 12.2018>>)
bRefocusedCam = TRUE
ENDIF
ELSE
IF NOT bRefocusCam
REFOCUS_FIRST_PERSON_CAMERA_ON_WORLD_POSITION(newFPCam, <<0,0,0>>)
bRefocusedCam = FALSE
ENDIF
ENDIF
ENDPROC
PROC CREATE_WIDGETS()
START_WIDGET_GROUP("act_cinema")
ADD_WIDGET_INT_SLIDER("iSeat", iDebugSeat, 0,31,1)
ADD_WIDGET_BOOL("Refocus Cam", bRefocusCam)
STOP_WIDGET_GROUP()
ENDPROC
#ENDIF
PROC TIDY_UP_IF_DEAD()
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
HIDE_MY_PLAYER_BLIP(FALSE)
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
RESTORE_STANDARD_CHANNELS()
ENDIF
CLEAR_FIRST_PERSON_CAMERA(newFPCam)
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bCinemaTookAwayPlayerControl = FALSE
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ELSE
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
IF bCinemaTookAwayPlayerControl
NET_SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
ENDIF
bCinemaTookAwayPlayerControl = FALSE
playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = FALSE
//CLEANUP_MP_CUTSCENE()
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ENDPROC
PROC COUNT_PARTICIPANTS()
IF canStartActivity(cinemaInfo.eLocation)
IF NOT IS_PED_INJURED(FRIEND_A_PED_ID())
iParticipants++
ENDIF
IF NOT IS_PED_INJURED(FRIEND_B_PED_ID())
iParticipants++
ENDIF
ENDIF
ENDPROC
PROC MAINTAIN_MP_DISPLAY_FLAG()
IF IS_NET_PLAYER_OK(PLAYER_ID())
IF NOT IS_PLAYER_SCTV(PLAYER_ID())
IF IS_CINEMA_UNLOCKED()
IF GET_DISTANCE_BETWEEN_COORDS(GET_PLAYER_COORDS(PLAYER_ID()),cinemaInfo.vWarpExitLoc) <= 100
IF NOT bSetActAvailable
IF ADD_NAMED_ACTIVITY_TO_DISPLAY_LIST(cinemaInfo.vWarpExitLoc,GET_ACTIVITY_NAME_FROM_FMMC_TYPE(FMMC_TYPE_CINEMA),"")
bSetActAvailable = TRUE
ENDIF
ENDIF
ELSE
IF bSetActAvailable
REMOVE_ACTIVITY_FROM_DISPLAY_LIST(cinemaInfo.vWarpExitLoc,GET_ACTIVITY_NAME_FROM_FMMC_TYPE(FMMC_TYPE_CINEMA))
bSetActAvailable = FALSE
ENDIF
ENDIF
ELSE
IF bSetActAvailable
REMOVE_ACTIVITY_FROM_DISPLAY_LIST(cinemaInfo.vWarpExitLoc,GET_ACTIVITY_NAME_FROM_FMMC_TYPE(FMMC_TYPE_CINEMA))
bSetActAvailable = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_WANTED()
//IF NOT NETWORK_IS_GAME_IN_PROGRESS()
// RETURN FALSE
//ENDIF
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CLEAR_CINEMA_DENIED_HELP()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("NOCIN")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TIMCIN")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN1")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN2")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN2_JPN")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN3")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MP_CIN_WANT")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TIMCINMULTI")
CLEAR_HELP()
ENDIF
ENDPROC
//FUNC STRING GET_IN_CINEMA_HELP()
//IF NETWORK_IS_GAME_IN_PROGRESS()
// RETURN "MP_CIN_H0b"
//ENDIF
// RETURN "MP_CIN_H0"
//ENDFUNC
FUNC VECTOR GET_POSITION_INFRONT_OF_CURRENT_RENDERING_CAM(VECTOR vStart, FLOAT fDistance = 1000.0)
VECTOR vEnd
//end vector - pointing north
vEnd = <<0.0, 1.0, 0.0>>
//point it in the same direction as the camera
GET_VECTOR_FROM_ROTATION(vEnd,GET_CAM_ROT(newFPCam.theCam))
//GET_FINAL_RENDERED_CAM_ROT()
//Make the normilised roted vector 400 times larger
vEnd.x *= fDistance
vEnd.y *= fDistance
vEnd.z *= fDistance
//add it on to the start vector to get the end vector coordinates
vEnd += vStart
RETURN vEnd
ENDFUNC
PROC HANDLE_MOVING_HEAD()
VECTOR vLookAtCoord = GET_POSITION_INFRONT_OF_CURRENT_RENDERING_CAM(newFPCam.vInitCamPos,60)
TASK_LOOK_AT_COORD(PLAYER_PED_ID(),vLookAtCoord,1000,SLF_DEFAULT)
//NET_PRINT_STRING_VECTOR("ACT_CINEMA: Telling platyer to look at :", vLookAtCoord) NET_NL()
ENDPROC
PROC SET_ENTER_LEAVING_FLAGS_ON_ENTERING()
INT iParticipant
REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iParticipant
IF NOT IS_BIT_SET(iEnterLeaveBS,iParticipant)
IF playerBD[iParticipant].bInCinema
SET_BIT(iEnterLeaveBS,iParticipant)
ENDIF
ELSE
IF NOT playerBD[iParticipant].bInCinema
CLEAR_BIT(iEnterLeaveBS,iParticipant)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC MAINTAIN_ENTER_LEAVING_TICKER()
IF NOT IS_BIT_SET(iEnterLeaveBS,iSlowParticipantLoop)
IF playerBD[iSlowParticipantLoop].bInCinema
IF iSlowParticipantLoop != PARTICIPANT_ID_TO_INT()
PLAYER_INDEX thePlayer = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSlowParticipantLoop))
PRINT_TICKER_WITH_PLAYER_NAME("MP_CIN_TICKIN",thePlayer)
ENDIF
SET_BIT(iEnterLeaveBS,iSlowParticipantLoop)
ENDIF
ELSE
IF NOT playerBD[iSlowParticipantLoop].bInCinema
IF iSlowParticipantLoop != PARTICIPANT_ID_TO_INT()
PLAYER_INDEX thePlayer = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSlowParticipantLoop))
PRINT_TICKER_WITH_PLAYER_NAME("MP_CIN_TICKOUT",thePlayer)
ENDIF
CLEAR_BIT(iEnterLeaveBS,iSlowParticipantLoop)
ENDIF
ENDIF
iSlowParticipantLoop++
IF iSlowParticipantLoop >= NETWORK_GET_NUM_PARTICIPANTS()
iSlowParticipantLoop = 0
ENDIF
ENDPROC
FUNC BOOL SHOULD_CINEMA_CLEANUP()
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_EXITED)
//IF NOT IS_PLAYER_TELEPORT_ACTIVE()
IF NOT IS_WORLD_POINT_WITHIN_BRAIN_ACTIVATION_RANGE()
AND iLocalStage != LOCAL_STAGE_WATCHING_MOVIE
RETURN TRUE
ENDIF
IF g_bInMultiplayer
IF IS_PLAYER_ON_ANY_FM_MISSION(PLAYER_ID())
RETURN TRUE
ENDIF
ENDIF
IF iLocalStage = LOCAL_STAGE_WATCHING_MOVIE
IF IS_PLAYER_OK(PLAYER_ID())
IF GET_DISTANCE_BETWEEN_COORDS(newFPCam.vInitCamPos,GET_ENTITY_COORDS(PLAYER_PED_ID())) > 30
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ENDIF
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
//Block the cinema while in Director Mode
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DISPLAY_NOT_ENOUGH_MONEY_HELP()
IF eCurrentCinemaShowing = CINEMA_SHOWING_MORNING
#IF IS_JAPANESE_BUILD
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN1_JPN")
CLEAR_HELP()
PRINT_HELP("CASHCIN1_JPN")
ENDIF
#ENDIF
#IF NOT IS_JAPANESE_BUILD
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN1")
CLEAR_HELP()
PRINT_HELP("CASHCIN1")
ENDIF
#ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_AFTERNOON
#IF IS_JAPANESE_BUILD
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN2_JPN")
CLEAR_HELP()
PRINT_HELP("CASHCIN2_JPN")
ENDIF
#ENDIF
#IF NOT IS_JAPANESE_BUILD
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN2")
CLEAR_HELP()
PRINT_HELP("CASHCIN2")
ENDIF
#ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_EVENING
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN3")
CLEAR_HELP()
PRINT_HELP("CASHCIN3")
ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_MULTIPLAYER
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CASHCIN")
CLEAR_HELP()
PRINT_HELP("CASHCIN")
ENDIF
ENDIF
ENDPROC
// Mission Script -----------------------------------------//
SCRIPT (coords_struct in_coords)
vInput = in_coords.vec_coord[0]
// fInput = in_coords.headings[0]
PRINTNL()
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING(" launched at ")
PRINTVECTOR(vInput)
PRINTSTRING(" with heading ")
PRINTFLOAT(in_coords.headings[0])
PRINTNL()
//warningScreen.sQuestionText = "MP_ACT_LEAVE"
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
#ENDIF
INIT_CURRENT_CINEMA_DATA()
PROCESS_PRE_GAME()
IF NOT g_bInMultiplayer
IF IS_AMBIENT_SCRIPT_ALLOWED_TO_RUN(RUN_ON_ACTIVITY_ALWAYS)
IF g_bActivityLaunchedFromDebugMenu
//bIgnoreTimeConstraints = TRUE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("act_cinema")) = 1
g_bActivityLaunchedFromDebugMenu = FALSE
ENDIF
ELSE
IF NOT Get_Mission_Flow_Flag_State(FLOWFLAG_ALLOW_CINEMA_ACTIVITY)
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - FLOWFLAG_ALLOW_CINEMA_ACTIVITY is FALSE. Cinema will clean up.")
MISSION_CLEANUP()
ENDIF
ENDIF
ELSE
// Added this due to B* 1585280 - If a switch scene places you near a cinema it'll shut down because a switch gets flagged as a mission type.
// So I've added an exception for switch mission flags.
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_SWITCH)
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - RUN_ON_ACTIVITY_ALWAYS is FALSE, However, switch is active, so it's probably ok to continue.")
ELSE
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - RUN_ON_ACTIVITY_ALWAYS is FALSE. Cinema will clean up.")
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) is ", IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY))
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG) is ", IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG))
MISSION_CLEANUP()
ENDIF
ENDIF
ELSE
//bIgnoreTimeConstraints = TRUE
ENDIF
COUNT_PARTICIPANTS()
WHILE TRUE
WAIT(0)
#IF IS_DEBUG_BUILD
RUN_DEBUG()
#ENDIF
INT iTimeOfDay = GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY())
INT iTimeOfDayMinute = GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY())
// IF IS_PLAYER_STARTING_JOB()
// PRINTLN("IS_PLAYER_STARTING_JOB(): player starting a job script shoudl terminate")
// ENDIF
//exit if not in world braind activation range
IF SHOULD_CINEMA_CLEANUP()
PRINTSTRING("ACT_CINEMA: Ending script SHOULD_CINEMA_CLEANUP()")
PRINTNL()
SET_LOCAL_STAGE(LOCAL_STAGE_END)
ENDIF
IF NETWORK_IS_GAME_IN_PROGRESS()
REINIT_NET_TIMER(netStoredTime)
MAINTAIN_MP_DISPLAY_FLAG()
//IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
//IF NOT HAS_NET_TIMER_STARTED(serverBD.MovieStartTimer)
//IF IS_ANYONE_IN_CINEMA()
//START_NET_TIMER(serverBD.MovieStartTimer)
//NET_PRINT("ACT_CINEMA: server started the timer") NET_NL()
//ENDIF
//ENDIF
//ENDIF
ENDIF
IF bStartedInMP
// If we have a match end event, bail.
IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
PRINTSTRING("ACT_CINEMA: Ending script SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()")
PRINTNL()
MISSION_CLEANUP()
ENDIF
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
PRINTSTRING("ACT_CINEMA: Ending script not NOT NETWORK_IS_GAME_IN_PROGRESS()")
PRINTNL()
MISSION_CLEANUP()
ENDIF
//IF g_FMMC_STRUCT.g_InvitedToAmbientActivity
/// IF GET_DISTANCE_BETWEEN_COORDS(GET_PLAYER_COORDS(PLAYER_ID()), cinemaInfo.vWarpExitLoc) > 20
// g_FMMC_STRUCT.g_InvitedToAmbientActivity = FALSE
// ENDIF
//ENDIF
ENDIF
SWITCH iLocalStage
CASE LOCAL_STAGE_INIT
IF LOADED_AND_CREATED_CINEMA_SCENE()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
SET_LOCAL_STAGE(LOCAL_STAGE_WAIT_TO_ENTER)
ELSE
IF IS_PLAYER_SCTV(PLAYER_ID())
INIT_SCTV_CINEMA()
SET_LOCAL_STAGE(LOCAL_STAGE_SCTV)
ELSE
SET_LOCAL_STAGE(LOCAL_STAGE_WAIT_TO_ENTER)
ENDIF
ENDIF
ENDIF
BREAK
CASE LOCAL_STAGE_WAIT_TO_ENTER
RESET_FLAGS()
IF NETWORK_IS_GAME_IN_PROGRESS()
IF IS_BIT_SET(iBoolsBitSet, iBS_STORE_ACTIVE)
IF NOT g_sShopSettings.bProcessStoreAlert
CLEAR_BIT(iBoolsBitSet, iBS_STORE_ACTIVE)
//NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
PRINTLN(" --> CONTACT REQUESTS - LAUNCH_STORE_CASH_ALERT - CLEARED")
ENDIF
BREAK
ENDIF
ENDIF
IF IS_PLAYER_OK(PLAYER_ID())
// Main checks
IF NOT IS_PLAYER_AT_CINEMA()
//OR NOT IS_PED_ON_FOOT(PLAYER_PED_ID())
OR IS_PHONE_ONSCREEN()
OR IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONhUD)
OR NOT IS_SKYSWOOP_AT_GROUND()
OR ((IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)) AND NOT canStartActivity(cinemaInfo.eLocation))
OR IS_CUSTOM_MENU_ON_SCREEN()
OR IS_ENTITY_ON_FIRE(PLAYER_PED_ID())
OR IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_BROWSER_OPEN()
OR IS_PLAYER_CRITICAL_TO_ANY_EVENT(PLAYER_ID())
OR IS_PLAYER_ON_MP_AMBIENT_SCRIPT(PLAYER_ID(), MPAM_TYPE_TIME_TRIAL)
OR IS_PLAYER_ON_MP_AMBIENT_SCRIPT(PLAYER_ID(), MPAM_TYPE_RC_TIME_TRIAL)
OR GET_PLAYER_RIVAL_ENTITY_TYPE(PLAYER_ID()) = eRIVALENTITYTYPE_SMUGGLER
OR GB_IS_GLOBAL_CLIENT_BIT1_SET(PLAYER_ID(), eGB_GLOBAL_CLIENT_BITSET_1_RIVAL_BUSINESS_PLAYER)
OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
OR IS_PLAYER_AN_ANIMAL(PLAYER_ID())
// OR IS_PLAYER_USING_BALLISTIC_EQUIPMENT(PLAYER_ID())
// OR GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].bInfectionParticipant = TRUE
//CPRINTLN(DEBUG_AMBIENT, "CINEMA - MAIN CHECK FAILED")
CLEAR_CINEMA_DENIED_HELP()
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
IF IS_PLAYER_AT_CINEMA()
AND IS_PLAYER_USING_BALLISTIC_EQUIPMENT(PLAYER_ID())
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
AND NOT bDisplayedBEHelp
BEGIN_TEXT_COMMAND_DISPLAY_HELP("SHOP_JUGG_NONE")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL("THEMOVIETH")
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, FALSE, FALSE)
bDisplayedBEHelp = TRUE
ENDIF
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
eCurrentCinemaShowing = GET_CINEMA_SHOWING()
// Cinema unlocked?
IF NOT IS_CINEMA_UNLOCKED()
//CPRINTLN(DEBUG_AMBIENT, "CINEMA - UNLOCK CHECK FAILED")
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("NOCIN")
CLEAR_HELP()
PRINT_HELP("NOCIN")
ENDIF
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
IF NOT IS_ACTIVITY_TIME_ACCEPTABLE()
OR NOT IS_NET_FREE_FOR_CINEMA()
//CPRINTLN(DEBUG_AMBIENT, "CINEMA - TIME CHECK FAILED")
IF NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TIMCINMULTI")
CLEAR_HELP()
PRINT_HELP_FOREVER("TIMCINMULTI")
ENDIF
ELSE
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TIMCIN")
CLEAR_HELP()
PRINT_HELP_FOREVER("TIMCIN")
ENDIF
ENDIF
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
IF IS_PLAYER_WANTED()
//CPRINTLN(DEBUG_AMBIENT, "CINEMA - WANTED CHECK FAILED")
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MP_CIN_WANT")
CLEAR_HELP()
PRINT_HELP("MP_CIN_WANT")
ENDIF
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
IF NOT IS_ACTIVITY_COST_ACCEPTABLE()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
//CPRINTLN(DEBUG_AMBIENT, "CINEMA - COST CHECK FAILED")
DISPLAY_NOT_ENOUGH_MONEY_HELP()
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
BREAK
ENDIF
ENDIF
// Can activate cinema straight way if on a friend activity and in a vehicle.
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND (IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG))
AND canStartActivity(cinemaInfo.eLocation)
SET_CURRENT_PED_WEAPON( PLAYER_PED_ID(), WEAPONTYPE_UNARMED )
DISABLE_PED_PAIN_AUDIO(PLAYER_PED_ID(),TRUE)
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
startActivity(cinemaInfo.eLocation)
DISABLE_CINEMA_INTERIOR(FALSE) // Cinema interior is disabled by default, so we have to re-enable it.
SET_LOCAL_STAGE(LOCAL_STAGE_HANDLE_ENTERING)
BREAK
ENDIF
IF iContextButtonIntention = NEW_CONTEXT_INTENTION
CLEAR_CINEMA_DENIED_HELP()
eCurrentCinemaShowing = GET_CINEMA_SHOWING()
bIsCinemaOwnerInPlayerGroup = IS_CINEMA_OWNER_IN_PLAYER_GROUP()
// Display different help depending on which showing is currently active.
IF eCurrentCinemaShowing = CINEMA_SHOWING_MORNING
#IF IS_JAPANESE_BUILD
IF NOT bIsCinemaOwnerInPlayerGroup
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN1_JPN")
ELSE
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN1F_JPN")
ENDIF
#ENDIF
#IF NOT IS_JAPANESE_BUILD
IF NOT bIsCinemaOwnerInPlayerGroup
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN1")
ELSE
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN1F")
ENDIF
#ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_AFTERNOON
#IF IS_JAPANESE_BUILD
IF NOT bIsCinemaOwnerInPlayerGroup
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN2_JPN")
ELSE
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN2F_JPN")
ENDIF
#ENDIF
#IF NOT IS_JAPANESE_BUILD
IF NOT bIsCinemaOwnerInPlayerGroup
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN2")
ELSE
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN2F")
ENDIF
#ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_EVENING
IF NOT bIsCinemaOwnerInPlayerGroup
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN3")
ELSE
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "ACTCIN3F")
ENDIF
ELIF eCurrentCinemaShowing = CINEMA_SHOWING_MULTIPLAYER
PRINT_HELP_FOREVER_WITH_NUMBER("ACTCIN",g_sMptunables.icinema_expenditure_modifier)
REGISTER_CONTEXT_INTENTION(iContextButtonIntention, CP_MAXIMUM_PRIORITY, "",TRUE)
ENDIF
BREAK
ELSE
IF HAS_CONTEXT_BUTTON_TRIGGERED(iContextButtonIntention)
IF NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_ACTIVITY_COST_ACCEPTABLE()
IF NOT IS_BIT_SET(iBoolsBitSet, iBS_STORE_ACTIVE)
LAUNCH_STORE_CASH_ALERT()
SET_BIT(iBoolsBitSet, iBS_STORE_ACTIVE)
//NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
PRINTLN(" --> CONTACT REQUESTS - LAUNCH_STORE_CASH_ALERT - CALLED")
ENDIF
BREAK
ELSE
playerBD[PARTICIPANT_ID_TO_INT()].bInCinema = TRUE
SET_ENTER_LEAVING_FLAGS_ON_ENTERING()
Pause_Objective_Text()
SET_PLAYER_ON_MP_AMBIENT_SCRIPT(MPAM_TYPE_CINEMA, TRUE)
SET_BIT(GlobalPlayerBD[NATIVE_TO_INT(PLAYER_ID())].iOrbitalCannonBS, ORBITAL_CANNON_GLOBAL_BS_USING_CINEMA)
ENDIF
ELSE
SET_CURRENT_PED_WEAPON( PLAYER_PED_ID(), WEAPONTYPE_UNARMED )
DISABLE_PED_PAIN_AUDIO(PLAYER_PED_ID(),TRUE)
g_bPlayerIsInCinema = TRUE // B*2019260 - Used to tell the Chop script when the player is in a cinema
ENDIF
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET")
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
IF canStartActivity(cinemaInfo.eLocation)
startActivity(cinemaInfo.eLocation)
ENDIF
DISABLE_CINEMA_INTERIOR(FALSE) // Cinema interior is disabled by default, so we have to re-enable it.
bPlayerLeftCinemaBecauseMovieEnded = FALSE
SET_LOCAL_STAGE(LOCAL_STAGE_HANDLE_ENTERING)
BREAK
ELSE
// Check that the show time is still valid. (Player could be waiting on the trigger for a while)
// If not reset the context intention so we update the help text.
IF GET_CINEMA_SHOWING() != eCurrentCinemaShowing
CLEAR_CONTEXT_OVERRIDE_HELP()
RELEASE_CONTEXT_INTENTION(iContextButtonIntention)
ENDIF
BREAK
ENDIF
ENDIF
ENDIF
BREAK
CASE LOCAL_STAGE_HANDLE_ENTERING
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() // For B*1983849
SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME()
SUPPRESS_AGITATION_EVENTS_NEXT_FRAME()
IF bWarpStarted
IF IS_PLAYER_OK(PLAYER_ID())
IF NETWORK_IS_GAME_IN_PROGRESS()
SET_TRANSITION_SESSIONS_CLEAN_UP_ON_CALL_NOW_IF_NEEDED()//Cleans up any on calls
ENABLE_MOVIE_KEYFRAME_WAIT(TRUE)
PRINTLN("@@@@@@@@@@@@@@ ENABLE_MOVIE_KEYFRAME_WAIT(TRUE) @@@@@@@@@@@@@@")
CLEAR_ALL_HELP_MESSAGES()
IF GET_CLIENT_SEAT()
IF NET_WARP_TO_COORD(cinemaInfo.vWarpInsideCoords,thisPlayersSeat.fSeatHeading,FALSE,FALSE,FALSE,FALSE,FALSE)
//IF NET_WARP_TO_COORD(thisPlayersSeat.vSeatPos,thisPlayersSeat.fSeatHeading,FALSE,FALSE,FALSE,FALSE,FALSE)
ACTIVATE_SCENARIO_GROUP()
//TASK_START_SCENARIO_AT_POSITION(PLAYER_PED_ID(),"prop_human_seat_chair_upright",thisPlayersSeat.vSeatPos,thisPlayersSeat.fSeatHeading,-1)
playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = TRUE
PRINTLN("ACT_CINEMA: Setting playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = TRUE")
//INIT_FIRST_PERSON_CAMERA(newFPCam,thisPlayersSeat.vCamPos,thisPlayersSeat.vCamRot,thisPlayersSeat.fCamFOV,20,10,3)
INIT_FIRST_PERSON_CAMERA(newFPCam,thisPlayersSeat.vCamPos,thisPlayersSeat.vCamRot,thisPlayersSeat.fCamFOV,20,10,3, 20.0, FALSE, 0, -1.0, TRUE)
//SCRIPT_PLAYSTATS_MISSION_STARTED(GET_MISSION_NAME_FROM_TYPE(FMMC_TYPE_CINEMA))
HIDE_MY_PLAYER_BLIP(TRUE)
SET_LOCAL_STAGE(LOCAL_STAGE_WATCHING_MOVIE)
ELSE
PRINTSTRING("ACT_CINEMA: waiting for NET_WARP_TO_COORD")
PRINTNL()
ENDIF
ELSE
PRINTSTRING("ACT_CINEMA: waiting for server to assign seat")
PRINTNL()
ENDIF
ELSE
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
IF IS_INTERIOR_READY(interiorCinema)
AND IS_NEW_LOAD_SCENE_LOADED()
//IF IS_INTERIOR_SCENE()
//FIRST_PERSON_CAM_STRUCT& fpCam, VECTOR vInitPos, VECTOR vInitRot, FLOAT fInitFov, INT iLookXLimit = 20, INT iLookYLimit = 10, INT iRollLimit = 3, FLOAT fMaxZoom = 20.0, BOOL bLockMiniMap = FALSE, INT iLockAngle = 0, FLOAT fNearClip = -1.0, BOOL bDisableHandshake = FALSE
HUD_FORCE_WEAPON_WHEEL(FALSE)
INIT_FIRST_PERSON_CAMERA(newFPCam,cinemaInfo.vLookCamPos,cinemaInfo.vLookCamRot,35,20,10,3, 20.0, FALSE, 0, -1.0, TRUE)
RETAIN_ENTITY_IN_INTERIOR(PLAYER_PED_ID(), interiorCinema)
//INIT_FIRST_PERSON_CAMERA(fpsCam,reinitCam,cinemaInfo.vLookCamPos,cinemaInfo.vLookCamRot,35,20,20,10,10,14,-1,FALSE,10,10,0.1,FALSE,0,5)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE, DEFAULT, FALSE) //Disabled using multihead blinders
SET_LOCAL_STAGE(LOCAL_STAGE_WATCHING_MOVIE)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - SET_LOCAL_STAGE(LOCAL_STAGE_WATCHING_MOVIE)")
//ENDIF
ELSE
PRINTNL()
PRINTSTRING("act_cinema - IS_INTERIOR_READY(interiorCinema) = FALSE")
PRINTNL()
ENDIF
ENDIF
ELSE
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
DO_SCREEN_FADE_IN(500)
ENDIF
startedFadeOut = FALSE
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ELSE
IF NETWORK_IS_GAME_IN_PROGRESS()
//IF IS_PLAYER_OK_TO_START_MP_CUTSCENE()
IF NOT startedFadeOut
DO_SCREEN_FADE_OUT(500)
startedFadeOut = TRUE
ELSE
IF IS_PLAYER_OK(PLAYER_ID())
IF IS_SCREEN_FADED_OUT()
bCinemaTookAwayPlayerControl = TRUE
//MAKE_PLAYER_SAFE_FOR_MP_CUTSCENE(FALSE,TRUE,TRUE,TRUE)
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_SET_INVISIBLE | NSPC_CLEAR_TASKS | NSPC_NO_COLLISION | NSPC_FREEZE_POSITION)
//START_MP_CUTSCENE(TRUE)
//HUD_FORCE_WEAPON_WHEEL(FALSE)
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(),currentWeapon)
IF currentWeapon != WEAPONTYPE_UNARMED
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
PRINTLN("ACT_CINEMA: Setting current weapontype to unarmed")
ENDIF
bWarpStarted = TRUE
ENDIF
ELSE
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
HIDE_MY_PLAYER_BLIP(FALSE)
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ENDIF
//ENDIF
ELSE
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT startedFadeOut
DO_SCREEN_FADE_OUT(500)
startedFadeOut = TRUE
ELSE
IF IS_PLAYER_OK(PLAYER_ID())
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableTalk, TRUE)
IF IS_SCREEN_FADED_OUT()
bCinemaTookAwayPlayerControl = TRUE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
//SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_ENTITY_COORDS(PLAYER_PED_ID(),cinemaInfo.vSeatPos,TRUE,FALSE,FALSE,TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
SET_ENTITY_HEADING(PLAYER_PED_ID(), cinemaInfo.fSeatHeading)
IF NOT IS_PED_INJURED(FRIEND_A_PED_ID())
REMOVE_PED_FROM_GROUP(FRIEND_A_PED_ID())
SET_ENTITY_COORDS(FRIEND_A_PED_ID(), GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(cinemaInfo.vSeatPos, cinemaInfo.fSeatHeading, <<1.0, 0.0, 0.0>>),TRUE,FALSE,FALSE,TRUE)
FREEZE_ENTITY_POSITION(FRIEND_A_PED_ID(), TRUE)
SET_ENTITY_HEADING(FRIEND_A_PED_ID(), cinemaInfo.fSeatHeading)
ENDIF
IF NOT IS_PED_INJURED(FRIEND_B_PED_ID())
REMOVE_PED_FROM_GROUP(FRIEND_B_PED_ID())
SET_ENTITY_COORDS(FRIEND_B_PED_ID(), GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(cinemaInfo.vSeatPos, cinemaInfo.fSeatHeading, <<-1.0, 0.0, 0.0>>),TRUE,FALSE,FALSE,TRUE)
FREEZE_ENTITY_POSITION(FRIEND_B_PED_ID(), TRUE)
SET_ENTITY_HEADING(FRIEND_B_PED_ID(), cinemaInfo.fSeatHeading)
ENDIF
//HUD_FORCE_WEAPON_WHEEL(FALSE)
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(cinemaInfo.vSeatPos, <<0.0, 0.0, cinemaInfo.fSeatHeading>>, 10.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE )
ENDIF
interiorCinema = GET_INTERIOR_AT_COORDS(cinemaInfo.vSeatPos)
PIN_INTERIOR_IN_MEMORY(interiorCinema)
bWarpStarted = TRUE
ENDIF
ELSE
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
DO_SCREEN_FADE_IN(500)
ENDIF
startedFadeOut = FALSE
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE LOCAL_STAGE_WATCHING_MOVIE
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() // For B*1983849
//PRINTLN(GET_THIS_SCRIPT_NAME(), " - LOCAL_STAGE_WATCHING_MOVIE")
IF IS_PLAYER_OK(PLAYER_ID())
SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME()
SUPPRESS_AGITATION_EVENTS_NEXT_FRAME()
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(),currentWeapon)
IF currentWeapon != WEAPONTYPE_UNARMED
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
PRINTLN("ACT_CINEMA: Setting current weapontype to unarmed")
ENDIF
//GFX_ORDER_AFTER_HUD_PRIORITY_LOW
//GFX_ORDER_AFTER_HUD
//GFX_ORDER_AFTER_HUD_PRIORITY_HIGH
//PRINTLN(GET_THIS_SCRIPT_NAME(), " - LOCAL_STAGE_WATCHING_MOVIE - IS_PLAYER_OK")
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_SCRIPT_HUD_THIS_FRAME(HUDPART_TODOBOX)
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
//IF IS_SCRIPT_HUD_DISPLAYING (HUDPART_TRANSITIONhUD)
// SET_LOCAL_STAGE(LOCAL_STAGE_END)
// EXIT
//ENDIF
IF g_bInMultiplayer
SET_IDLE_KICK_DISABLED_THIS_FRAME()
MAINTAIN_ENTER_LEAVING_TICKER()
playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = TRUE
MPGlobals.invitedPlayers.vInviteLoc = cinemaInfo.vWarpExitLoc
MPGlobalsAmbience.playerBounty.bPausePlayerBountyNextFrame = TRUE
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
NET_PRINT_STRING_INT("ACT_CINEMA: Setting voice channel to: ",cinemaInfo.iVoiceChannel) NET_NL()
NETWORK_SET_LOCAL_PLAYER_SYNC_LOOK_AT(TRUE)
NETWORK_SET_VOICE_CHANNEL(cinemaInfo.iVoiceChannel)
SET_BIT(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
ENDIF
DISABLE_CELLPHONE_CAMERA_APP_THIS_FRAME_ONLY()
DISABLE_CELLPHONE_INTERNET_APP_THIS_FRAME_ONLY()
IF HAS_NET_TIMER_STARTED(cashDisplayTimer)
IF NOT HAS_NET_TIMER_EXPIRED(cashDisplayTimer,7000,TRUE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_CASH)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_MESSAGE)
ENDIF
IF NOT IS_BIT_SET(iCinemaBS, CINEMA_BS_TAKEN_MONEY)
//GIVE_LOCAL_PLAYER_FM_CASH(-ACTIVITY_COST,1,TRUE,0)<<-- SHOULD THIS BE BACK IN?
INT iCost
iCost = g_sMptunables.icinema_expenditure_modifier
INT iDifference
iDifference = 0
//If can't afford, adjust cost
IF NOT NETWORK_CAN_SPEND_MONEY2(iCost, FALSE, TRUE, FALSE, iDifference)
iCost -= iDifference
ENDIF
IF iCost > 0
IF USE_SERVER_TRANSACTIONS()
TRIGGER_FIRE_AND_FORGET_SERVICE_TRANSACTION(SERVICE_SPEND_CINEMA, iCost, iScriptTransactionIndex, FALSE, TRUE)
g_cashTransactionData[iScriptTransactionIndex].cashInfo.iLocation = ENUM_TO_INT(cinemaInfo.eLocation)
ELSE
NETWORK_SPENT_CINEMA(iCost,ENUM_TO_INT(cinemaInfo.eLocation),FALSE, TRUE)
ENDIF
ENDIF
//INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_CINEMA,ACTIVITY_COST)
SET_PACKED_STAT_BOOL( PACKED_MP_WENT_TO_CINEMA, TRUE)
INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_NO_TIMES_CINEMA,1)
PRINTLN("ACT_CINEMA: INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_NO_TIMES_CINEMA,1)")
iEnterTimeStamp = GET_CLOUD_TIME_AS_INT()
SET_BIT(iCinemaBS, CINEMA_BS_TAKEN_MONEY)
ENDIF
ELSE
START_NET_TIMER(cashDisplayTimer)
ENDIF
DISABLE_SCRIPT_HUD_THIS_FRAME(HUDPART_ALL_OVERHEADS)
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
IF HAS_NET_TIMER_STARTED(cashDisplayTimer)
IF NOT HAS_NET_TIMER_EXPIRED(cashDisplayTimer,7000,TRUE)
IF NOT bIsCinemaOwnerInPlayerGroup
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
ENDIF
ENDIF
ELSE
START_NET_TIMER(cashDisplayTimer)
ENDIF
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableTalk, TRUE)
ENDIF
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
IF g_bInMultiplayer
IF DOES_SCENARIO_EXIST_IN_AREA(thisPlayersSeat.vSeatPos,0.5,FALSE)
IF NOT HAS_NET_TIMER_STARTED(spawnPedsTimeout)
START_NET_TIMER(spawnPedsTimeout,TRUE)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(PLAYER_PED_ID(),thisPlayersSeat.vSeatPos,0.5,-1)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(),TRUE)
NET_SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
ENDIF
IF serverBD.bSpawnedPeds
OR HAS_NET_TIMER_EXPIRED_READ_ONLY(spawnPedsTimeout,10000,TRUE)
//TASK_USE_NEAREST_SCENARIO_TO_COORD(PLAYER_PED_ID(),thisPlayersSeat.vSeatPos,0.5,-1)
IF START_THE_MOVIE()
SET_STORE_ENABLED(FALSE)
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
SET_BIT(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
RESET_NET_TIMER(spawnPedsTimeout)
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("ACT_CINEMA: Waiting for START_THE_MOVIE()")
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("ACT_CINEMA: Waiting for serverBD.bSpawnedPeds")
#ENDIF
ENDIF
ELSE
PRINTSTRING("ACT_CINEMA: waiting for scenario to exist")
PRINTNL()
ENDIF
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), " - LOCAL_STAGE_WATCHING_MOVIE - NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_MOVIE_STARTED)")
IF START_THE_MOVIE()
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
IF IS_PED_DUCKING(PLAYER_PED_ID()) // forces player to not crouch
SET_PED_DUCKING(PLAYER_PED_ID(), FALSE)
ENDIF
SET_STORE_ENABLED(FALSE)
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
SET_BIT(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
PAY_FOR_CINEMA()
ENDIF
ENDIF
ELSE
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_EXITED)
//DRAW_RECT(0.5, 0.5, 1.0, 1.0, 0, 0, 0, 255)
IF IS_SCREEN_FADED_OUT()
OR IS_PLAYER_STARTING_JOB()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF NOT HAS_THIS_SCRIPT_BEEN_REGISTERED_IN_COMPLETION_PERCENTAGE_TOTAL(CP_CINEMA)
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_CINEMA)
MAKE_AUTOSAVE_REQUEST()
ENDIF
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
RESTORE_STANDARD_CHANNELS()
CLEAR_FIRST_PERSON_CAMERA(newFPCam)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), cinemaInfo.vWarpExitLoc)
SET_ENTITY_HEADING(PLAYER_PED_ID(), cinemaInfo.fWarpExitHeading)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
LOAD_SCENE(cinemaInfo.vWarpExitLoc)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bCinemaTookAwayPlayerControl = FALSE
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
SET_LOCAL_STAGE(LOCAL_STAGE_END)
ELSE
DO_SCREEN_FADE_IN(500)
startedFadeOut = FALSE
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ELSE
IF IS_PLAYER_STARTING_JOB()
OR WARP_TO_SPAWN_LOCATION(SPAWN_LOCATION_AT_SPECIFIC_COORDS_IF_POSSIBLE,FALSE, FALSE, FALSE)
HIDE_MY_PLAYER_BLIP(FALSE)
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_CINEMA)
//cinemaInfo.vWarpExitLoc,cinemaInfo.fWarpExitHeading,FALSE,FALSE,FALSE,FALSE,FALSE)
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_KICKED_OUT_CLOSED)
PRINT_HELP("MP_CIN_KICK")
ENDIF
CLEAR_BIT(iCinemaBS,CINEMA_BS_KICKED_OUT_CLOSED)
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
RESTORE_STANDARD_CHANNELS()
CLEAR_FIRST_PERSON_CAMERA(newFPCam)
//DO_SCREEN_FADE_IN(500)
bCinemaTookAwayPlayerControl = FALSE
IF NOT IS_PLAYER_STARTING_JOB()
CLEAR_SPECIFIC_SPAWN_LOCATION()
NET_SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
DO_SCREEN_FADE_IN(500)
ENDIF
CLEAR_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
//CLEANUP_MP_CUTSCENE()
CLEAR_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
SET_LOCAL_STAGE(LOCAL_STAGE_LEFT_CINEMA)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_SCRIPT_HUD_DISPLAYING (HUDPART_TRANSITIONhUD)
AND IS_SKYSWOOP_AT_GROUND()
//MAINTAIN_TV_TIME()
IF NOT IS_CUSTOM_MENU_ON_SCREEN()
AND NOT IS_PAUSE_MENU_ACTIVE()
AND NOT IS_PHONE_ONSCREEN()
DISPLAY_INSTRUCTIONAL_BUTTONS()
ELIF bUpdateCinemaControls
bUpdateCinemaControls = FALSE
ENDIF
DRAW_TV_TEXTURE_TO_RENDERTARGET()
ENDIF
IF NOT g_bInMultiplayer
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDIF
// IF IS_PLAYER_STARTING_JOB()
// PRINTLN("IS_PLAYER_STARTING_JOB() = TRUE abandon cinema")
// ENDIF
IF NOT IS_PAUSE_MENU_ACTIVE()
AND NOT IS_SCRIPT_HUD_DISPLAYING (HUDPART_TRANSITIONhUD)
AND IS_SKYSWOOP_AT_GROUND()
OR IS_PLAYER_STARTING_JOB()
UPDATE_FIRST_PERSON_CAMERA(newFPCam)
IF NOT IS_PHONE_ONSCREEN()
//IF NOT IS_BIT_SET(inviteOnlyMenu.iBS, INVONLY_MENU_BS_DRAWING_MENU)
//HANDLE_TV_VOLUME()
//IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_DISPLAYED_EXIT_HELP)
//PRINT_HELP(GET_IN_CINEMA_HELP())
// SET_BIT(iCinemaBS,CINEMA_BS_DISPLAYED_EXIT_HELP)
//ENDIF
//ELSE
// IF IS_BIT_SET(iCinemaBS,CINEMA_BS_DISPLAYED_EXIT_HELP)
// IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_IN_CINEMA_HELP())
// CLEAR_HELP()
// ENDIF
// CLEAR_BIT(iCinemaBS,CINEMA_BS_DISPLAYED_EXIT_HELP)
// ENDIF
//ENDIF
IF g_bInMultiplayer
// IF NOT HAS_NET_TIMER_STARTED(cashDisplayTimer)
// IF IS_SCREEN_FADED_IN()
//
// ENDIF
// ENDIF
IF IS_NET_PLAYER_OK(PLAYER_ID())
HANDLE_MOVING_HEAD()
ENDIF
//ELSE
// IF NOT HAS_NET_TIMER_STARTED(cashDisplayTimer)
// IF IS_SCREEN_FADED_IN()
// START_NET_TIMER(cashDisplayTimer)
// ENDIF
// ENDIF
ENDIF
IF NOT IS_CUSTOM_MENU_ON_SCREEN() //NOT IS_BIT_SET(inviteOnlyMenu.iBS, INVONLY_MENU_BS_DRAWING_MENU)
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
// warningScreen.fButtonFlags = FE_WARNING_YESNO
// SET_WARNING_MESSAGE_WITH_HEADER("MP_ACT_LEAVEH",warningScreen.sQuestionText,warningScreen.fButtonFlags)
// DISABLE_CELLPHONE_THIS_FRAME_ONLY()
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_CANCEL)
// IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
// //AND NOT IS_BIT_SET(inviteOnlyMenu.iButtonBS,INVONLY_BUT_BS_CANCEL)
// SET_BIT(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
// IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
//
// ENDIF
// CLEAR_BIT(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
// ENDIF
// ELSE
// IF IS_BIT_SET(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
// CLEAR_BIT(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
// ENDIF
// //CLEAR_BIT(inviteOnlyMenu.iButtonBS,INVONLY_BUT_BS_CANCEL)
// ENDIF
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_ACCEPT)
// DO_SCREEN_FADE_OUT(0)
// startedFadeOut = TRUE
// IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_IN_CINEMA_HELP())
// CLEAR_HELP()
// ENDIF
// IF NETWORK_IS_GAME_IN_PROGRESS()
// SETUP_SPECIFIC_SPAWN_LOCATION(cinemaInfo.vWarpExitLoc, cinemaInfo.fWarpExitHeading, 10, FALSE)
// SET_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
// ENDIF
// SET_BIT(iCinemaBS,CINEMA_BS_EXITED)
// ENDIF
ELSE
IF IS_CANCEL_JUST_PRESSED()
OR IS_TVSHOW_CURRENTLY_PLAYING(HASH("END_OF_MOVIE_MARKER")) // Single player gets kicked out when the movie is over - They always get to watch the movie all the way through.
OR (g_bInMultiplayer AND ((iTimeOfDay < CINEMA_TIME_MORNING_START AND iTimeOfDayMinute >= 0) AND (iTimeOfDay >= CINEMA_TIME_EVENING_END -22 AND iTimeOfDayMinute >= 30)))// Multiplayer gets kicked out if the cinema closes. //They always get to watch the movie all the way through.
OR IS_PLAYER_STARTING_JOB()
// IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_PRESSED_CANCEL) ///NOT IS_BIT_SET(inviteOnlyMenu.iBS, INVONLY_MENU_BS_DRAWING_MENU)
// //AND NOT IS_BIT_SET(inviteOnlyMenu.iButtonBS,INVONLY_BUT_BS_CANCEL)
//
// SET_BIT(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
// SET_BIT(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
// ENDIF
IF IS_TVSHOW_CURRENTLY_PLAYING(HASH("END_OF_MOVIE_MARKER"))
bPlayerLeftCinemaBecauseMovieEnded = TRUE
ENDIF
IF IS_CANCEL_JUST_PRESSED()
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET")
ENDIF
IF ((iTimeOfDay < CINEMA_TIME_MORNING_START
AND iTimeOfDayMinute >= 0)
AND (iTimeOfDay >= CINEMA_TIME_EVENING_END -22
AND iTimeOfDayMinute >= 30))
SET_BIT(iCinemaBS,CINEMA_BS_KICKED_OUT_CLOSED)
ENDIF
STOP_CINEMA_AUDIO_SCENE()
IF NOT IS_AUDIO_SCENE_ACTIVE( "LEAVE_CINEMA")
START_AUDIO_SCENE( "LEAVE_CINEMA")
ENDIF
DO_SCREEN_FADE_OUT(500)
startedFadeOut = TRUE
//IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_IN_CINEMA_HELP())
// CLEAR_HELP()
//ENDIF
IF NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_PLAYER_STARTING_JOB()
SETUP_SPECIFIC_SPAWN_LOCATION(cinemaInfo.vWarpExitLoc, cinemaInfo.fWarpExitHeading, 10, FALSE)
SET_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
ENDIF
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, FALSE) //Disable using multihead blinders
ENDIF
g_bPlayerIsInCinema = FALSE //Reset the global cinema bool
SET_BIT(iCinemaBS,CINEMA_BS_EXITED)
ELSE
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
CLEAR_BIT(iCinemaBS,CINEMA_BS_PRESSED_CANCEL)
ENDIF
//CLEAR_BIT(inviteOnlyMenu.iButtonBS,INVONLY_BUT_BS_CANCEL)
ENDIF
//IF g_bInMultiplayer
//IF NOT IS_BIT_SET(inviteOnlyMenu.iBS, INVONLY_MENU_BS_DRAWING_MENU)
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_Y)
// SET_BIT(inviteOnlyMenu.iBS, INVONLY_MENU_BS_DRAWING_MENU)
// ENDIF
//ENDIF
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
TIDY_UP_IF_DEAD()
ENDIF
BREAK
CASE LOCAL_STAGE_SCTV
MAINTAIN_ENTER_LEAVING_TICKER()
PLAYER_INDEX playerSpecTarget
IF DOES_ENTITY_EXIST(GET_SPECTATOR_SELECTED_PED())
IF IS_PED_A_PLAYER(GET_SPECTATOR_SELECTED_PED())
playerSpecTarget = NETWORK_GET_PLAYER_INDEX_FROM_PED(GET_SPECTATOR_SELECTED_PED())
ENDIF
ENDIF
IF NATIVE_TO_INT(playerSpecTarget) > -1
AND IS_NET_PLAYER_OK(playerSpecTarget)
AND IS_PLAYER_ON_MP_AMBIENT_SCRIPT(playerSpecTarget, MPAM_TYPE_CINEMA)
IF playerBD[NATIVE_TO_INT(NETWORK_GET_PARTICIPANT_INDEX(playerSpecTarget))].bInCinema
ACTIVATE_SCENARIO_GROUP()
ELSE
DEACTIVATE_SCENARIO_GROUP()
ENDIF
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_SCTV_NEEDS_CLEANUP)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === SET_BIT(iCinemaBS,CINEMA_BS_SCTV_NEEDS_CLEANUP)")
#ENDIF
SET_BIT(iCinemaBS,CINEMA_BS_SCTV_NEEDS_CLEANUP)
ENDIF
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_SCTV_INTERIOR_LOAD_REQUESTED)
DISABLE_CINEMA_INTERIOR(FALSE) // Cinema interior is disabled by default, so we have to re-enable it.
interiorCinema = GET_INTERIOR_AT_COORDS(cinemaInfo.vSeatPos)
PIN_INTERIOR_IN_MEMORY(interiorCinema)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === SET_BIT(iCinemaBS,CINEMA_BS_SCTV_INTERIOR_LOAD_REQUESTED)")
#ENDIF
SET_BIT(iCinemaBS,CINEMA_BS_SCTV_INTERIOR_LOAD_REQUESTED)
ELSE
IF IS_INTERIOR_READY(interiorCinema)
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_SCTV_CAMERA_CREATED)
IF NOT IS_SCREEN_FADED_OUT()
DISABLE_SPECTATOR_FADES_DURING_THIS_EVENT(TRUE)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === DO_SCREEN_FADE_OUT(0)")
#ENDIF
DO_SCREEN_FADE_OUT(0)
ELSE
VECTOR vPos, vRot
FLOAT fFOV
vPos = <<0.0, 0.0, 0.0>>
vRot = <<0.0, 0.0, 0.0>>
fFOV = 0.0
GET_SCTV_CINEMA_DATA(vPos, vRot, fFOV)
IF DOES_CAM_EXIST(camSCTV)
DESTROY_CAM(camSCTV)
ENDIF
camSCTV = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_PARAMS(camSCTV, vPos, vRot, fFOV)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF DOES_ENTITY_EXIST(GET_SPECTATOR_SELECTED_PED())
FORCE_ROOM_FOR_GAME_VIEWPORT(interiorCinema, GET_KEY_FOR_ENTITY_IN_ROOM(GET_SPECTATOR_SELECTED_PED()))
ENDIF
ENABLE_SPECTATOR_FADES()
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === SET_BIT(iCinemaBS,CINEMA_BS_SCTV_CAMERA_CREATED)")
#ENDIF
SET_BIT(iCinemaBS,CINEMA_BS_SCTV_CAMERA_CREATED)
ENDIF
ELSE
IF NOT IS_BIT_SET(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
IF START_THE_MOVIE()
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SPECTATOR, "=== CINEMA === SET_BIT(iCinemaBS,CINEMA_BS_MOVIE_STARTED)")
#ENDIF
SET_BIT(iCinemaBS,CINEMA_BS_MOVIE_STARTED)
ENDIF
ELSE
//MAINTAIN_TV_TIME()
DRAW_TV_TEXTURE_TO_RENDERTARGET()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEANUP_SCTV_CINEMA()
ENDIF
BREAK
CASE LOCAL_STAGE_LEFT_CINEMA
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() // For B*1983849
IF NETWORK_IS_GAME_IN_PROGRESS()
HIDE_MY_PLAYER_BLIP(FALSE)
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
NET_PRINT("ACT_CINEMA: Clearing voice channel: ") NET_NL()
NETWORK_CLEAR_VOICE_CHANNEL()
NETWORK_SET_LOCAL_PLAYER_SYNC_LOOK_AT(FALSE)
CLEAR_BIT(iCinemaBS,CINEMA_BS_SET_VOICE_CHANNEL)
ENDIF
#IF IS_DEBUG_BUILD
g_bFM_IgnoreRankOnNextLaunchedActivity = FALSE
#ENDIF
playerBD[PARTICIPANT_ID_TO_INT()].bInCinema = FALSE
CLEAR_BIT(GlobalPlayerBD[NATIVE_TO_INT(PLAYER_ID())].iOrbitalCannonBS, ORBITAL_CANNON_GLOBAL_BS_USING_CINEMA)
UNPause_Objective_Text()
//UPDATE_FMMC_END_OF_MISSION_STATUS(ciFMMC_END_OF_MISSION_STATUS_PASSED, FMMC_TYPE_CINEMA)
SET_PLAYER_ON_MP_AMBIENT_SCRIPT(MPAM_TYPE_CINEMA, FALSE)
INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_TOTAL_TIME_CINEMA,GET_CLOUD_TIME_AS_INT() - iEnterTimeStamp )
PRINTLN("ACT_CINEMA: INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_TOTAL_TIME_CINEMA,GET_CLOUD_TIME_AS_INT() - iEnterTimeStamp ))")
playerBD[PARTICIPANT_ID_TO_INT()].bWarpedInside = FALSE
RESET_NET_TIMER(cashDisplayTimer)
SET_MP_DAILY_OBJECTIVE_COMPLETE(MP_DAILY_AM_WATCH_A_MOVIE)
ELSE
RESET_NET_TIMER(cashDisplayTimer)
DISABLE_PED_PAIN_AUDIO(PLAYER_PED_ID(),FALSE)
UNPIN_INTERIOR(interiorCinema)
ENDIF
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
RESTORE_STANDARD_CHANNELS()
SET_STORE_ENABLED(TRUE)
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
CLEAR_SPECIFIC_SPAWN_LOCATION()
CLEAR_BIT(iCinemaBS,CINEMA_BS_SETUP_SPECIFIC_SPAWN)
ENDIF
IF IS_BIT_SET(iCinemaBS,CINEMA_BS_SHOW_EXIT_WARNING)
// ENABLE_SELECTOR()
ENDIF
IF iRenderTarget != -1
IF IS_NAMED_RENDERTARGET_REGISTERED("cinscreen")
RELEASE_NAMED_RENDERTARGET("cinscreen")
ENDIF
ENDIF
// SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformCinemaControls)
CLEANUP_MENU_ASSETS()
bUpdateCinemaControls = FALSE
ENABLE_MOVIE_KEYFRAME_WAIT(FALSE)
PRINTLN("@@@@@@@@@@@@@@ ENABLE_MOVIE_KEYFRAME_WAIT(FALSE) @@@@@@@@@@@@@@")
DEACTIVATE_SCENARIO_GROUP()
DISABLE_CINEMA_INTERIOR(TRUE)
IF IS_PLAYER_OK(PLAYER_ID())
//IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vInput, <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS>>)
SET_LOCAL_STAGE(LOCAL_STAGE_WAIT_TO_ENTER)
//ENDIF
ENDIF
BREAK
CASE LOCAL_STAGE_END
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> - LOCAL_STAGE_END. Cinema will clean up.")
MISSION_CLEANUP()
BREAK
ENDSWITCH
IF NETWORK_IS_GAME_IN_PROGRESS()
// Process server game logic
// NOTE: one one group of switch statements as this script "should" only be run by one person
IF NETWORK_GET_THIS_SCRIPT_IS_NETWORK_SCRIPT()
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
ASSIGN_SEATS()
SPAWN_SCENARIO_PEDS()
ENDIF
ENDIF
ENDIF
ENDWHILE
ENDSCRIPT