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

1278 lines
60 KiB
Python
Executable File

CONST_INT GOLF_IS_MP 1
CONST_INT COMPILE_LOOKUPS 1
CONST_INT GOLF_USE_FALLTHROUGH_WORLD_CHECK 1
BOOL bDebugSpew
USING "net_blips.sch"
USING "golf.sch"
INT iGolfPlayingParticipantID[MP_GOLF_MAX_PLAYERS] // save the participant id of the people actualy playing the game
USING "net_include.sch"
USING "golf_mp.sch"
USING "golf_mp_support.sch"
USING "golf_mp_client_lib.sch"
USING "golf_mp_server_lib.sch"
USING "cheat_handler.sch"
USING "golf_mp_spectate.sch"
DPAD_VARS dPadVars
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// Main Loop //////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SCRIPT(MP_MISSION_DATA fmmcMissionData)
#IF IS_DEBUG_BUILD
GOLF_CONTROL_FLAGS savedGCF[MP_GOLF_MAX_PLAYERS]
VECTOR savedBallPositions[MP_GOLF_MAX_PLAYERS]
//GOLF_CONTROL_FLAGS mySavedGCF
//GOLF_CONTROL_FLAGS savedServerGCF
#ENDIF
GOLF_MP_SERVER_BROADCAST_DATA serverBD
GOLF_MP_PLAYER_BROADCAST_DATA playerBD[MP_GOLF_MAX_PLAYERS]
STREAMED_MODEL golfAssets[11]
GOLF_PLAYER currentPlayers[MP_GOLF_MAX_PLAYERS]
GOLF_FOURSOME currentPlayerFoursome
GOLF_COURSE currentCourse
GOLF_GAME currentGame
GOLF_HELPERS currentHelpers
TEXT_LABEL_63 sPlayerNames[MP_GOLF_MAX_PLAYERS]
GOLF_HEADSET_STATE golfHeadsetStates[MP_GOLF_MAX_PLAYERS]
GOLF_XP_TRACKER golfXPTracker
structTimer timerPreInitWait
structTimer timerFailToLoad
structTimer timeForLoadSceneToFinish
TEXT_LABEL_23 contentID
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED)
CDEBUG1LN(DEBUG_GOLF,"Force golf_mp cleanup")
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers)
ENDIF
INT playerIndex, iDisplayQuitterIndex = -1
PED_INDEX tempPed = NULL
// FMMC_EOM_DETAILS sEndOfMission
// PLAYER_CURRENT_STATUS_COUNTS sPlayerCounts
// BOOL bRematchInit = FALSE
CELEBRATION_SCREEN_DATA golfCelebrationData
INT iWinnerIndex, iWinnerNetIndex, iPlacement, iBetWinnings
CAMERA_INDEX camGolfEndScreen
BOOL bDrawGame, bTiedPlacement = FALSE
INT iHeadTextureLoadIndex = 0, iHeadTextureLoadFailSafe
BOOL bIsHeadTexturedRegistered = FALSE
PEDHEADSHOT_ID myPedHeadshot
BOOL bHereForInit = FALSE
BOOL bAllowOverideClock = TRUE
BOOL bGolfersAddedToGameLocally = FALSE
BOOL bDidFMGameStartCall = FALSE
BOOL bHaveSavedNames = FALSE
BOOL bRecreatePlayercard = FALSE
BOOL bDoLocalQuit = FALSE //quit without entering the speical quit state, used for spectators
//PRINT_HELP("MP_GOLF_HELP")
bFlagPassed = bFlagPassed
SETUP_PC_GOLF_CONTROLS()
// Carry out all the initial game starting duties
IF NOT PROCESS_PRE_GAME(fmmcMissionData, serverBD, playerBD)
CDEBUG1LN(DEBUG_GOLF,"Golf MP failed to receive an initial network broadcast. Cleaning up.")
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers)
ENDIF
CDEBUG1LN(DEBUG_GOLF,"Start MP Golf! Dev Network")
currentHelpers.iStartingHole = g_FMMC_STRUCT.iStartingHole
currentHelpers.iEndingHole = g_FMMC_STRUCT.iNumberOfHoles-1
CDEBUG1LN(DEBUG_GOLF,"Starting Hole is ", currentHelpers.iStartingHole, " ending hole is ", currentHelpers.iEndingHole)
IF currentHelpers.iEndingHole > 8
currentHelpers.iEndingHole = 8
ENDIF
IF currentHelpers.iStartingHole > currentHelpers.iEndingHole
CDEBUG1LN(DEBUG_GOLF,"Invalid options")
currentHelpers.iStartingHole = 0
currentHelpers.iEndingHole = 8
ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
serverBD.iStartHole = currentHelpers.iStartingHole
serverBD.iEndHole = currentHelpers.iEndingHole
serverBD.iWeather = g_FMMC_STRUCT.iWeather
ENDIF
IF NOT DID_I_JOIN_MISSION_AS_SPECTATOR()
CDEBUG1LN(DEBUG_GOLF,"Golf Weather option ", g_FMMC_STRUCT.iWeather)
//EXTRASUNNY CLEAR SMOG CLOUDY RAIN NEUTRAL SNOW
IF g_FMMC_STRUCT.iWeather = ciGOLF_OPTION_SUNNY
SET_OVERRIDE_WEATHER("EXTRASUNNY")
ELIF g_FMMC_STRUCT.iWeather = ciGOLF_OPTION_RAINING
SET_OVERRIDE_WEATHER("RAIN")
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
// bStopMPTimer = TRUE
#ENDIF
IF IS_PED_WEARING_HIGH_HEELS(PLAYER_PED_ID())
//Set appropiate golf shoes for female golfers, no high heels
CDEBUG1LN(DEBUG_GOLF,"Changing into appropiate golf shoes")
currentHelpers.eFeetProp = GET_PED_COMP_ITEM_CURRENT_MP(PLAYER_PED_ID(), COMP_TYPE_FEET)
SET_PED_COMP_ITEM_CURRENT_MP(PLAYER_PED_ID(), COMP_TYPE_FEET, FEET_FMF_10_1, FALSE)
FINALIZE_HEAD_BLEND(PLAYER_PED_ID())
ENDIF
// Setup widgets
INT iNumMissionPlayers = NETWORK_GET_NUM_PARTICIPANTS() //NETWORK_GET_NUM_PARTICIPANTS()
DUMMY_REFERENCE_INT(iNumMissionPlayers)
#IF IS_DEBUG_BUILD
GOLF_SETUP_DEBUG_WIDGETS(currentGame#IF NOT COMPILE_LOOKUPS, currentCourse#ENDIF , "Golf MP")
// GOLF_SETUP_MP_DEBUG_WIDGETS(currentGame)
#ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
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
ENDIF
IF GET_PACKED_STAT_BOOL(PACKED_MP_TOGGLE_EXPANDED_RADAR)
CDEBUG1LN(DEBUG_GOLF,"Golf Minimap was expanded")
SET_GOLF_STREAMING_FLAG(currentHelpers, GSF_TURNED_OFF_EXPANDED_MAP)
SET_PACKED_STAT_BOOL(PACKED_MP_TOGGLE_EXPANDED_RADAR, FALSE)
RUN_RADAR_MAP()
ENDIF
SET_GOLF_TRAIL_STATIC_DATA(currentHelpers)
currentHelpers.eLastPuttStyle = SWING_STYLE_GREEN
//gDisableRankupMessage = TRUE
ANIMPOSTFX_STOP_ALL()
SET_DPADDOWN_ACTIVE(FALSE)
SET_MINIGAME_IN_PROGRESS(TRUE)
NETWORK_SET_LOOK_AT_TALKERS(FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
NETWORK_SET_OVERRIDE_SPECTATOR_MODE(TRUE)
NETWORK_SET_TALKER_PROXIMITY(0)
DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE)
SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(), FALSE)
NET_NL()NET_PRINT("golf_mp: SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(),FALSE)")
TOGGLE_STEALTH_RADAR(FALSE)
DISABLE_SCRIPT_HUD(HUDPART_ALL_OVERHEADS, TRUE)
CLEAR_GLOBAL_GOLF_CONTROL_FLAG(GGCF_PLAYER_QUIT_MP_GOLF)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CADDY, TRUE)
INITAILIZE_GOLF_STATS()
currentHelpers.iTimesPlayedGolf = GET_GOLF_STAT_ROUNDS_PLAYED()
GOLF_TOGGLE_LOADING_SPINNER(TRUE)
CDEBUG1LN(DEBUG_GOLF,"Number times played golf before this ", currentHelpers.iTimesPlayedGolf)
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
WHILE NOT PLAYSTATS_CREATE_MATCH_HISTORY_ID_2(serverBD.iHashMac, serverBD.iPosixTime)
WAIT(0)
ENDWHILE
ELSE
WHILE serverBD.iPosixTime = -1 //waiting for server to get info
WAIT(0)
ENDWHILE
ENDIF
DO_SCREEN_FADE_OUT(250)
IF DID_I_JOIN_MISSION_AS_SPECTATOR()
OR IS_PLAYER_SCTV(PLAYER_ID())
CDEBUG1LN(DEBUG_GOLF,"I am a fucking spectator")
bAllowLeaderboardUpload = FALSE
bGolfersAddedToGameLocally = TRUE
GOLF_MANAGE_SPECTATOR(serverBD, playerBD, sPlayerNames, currentGame, currentPlayerFoursome, currentCourse, currentHelpers, currentPlayers)
IF IS_TRANSITION_ACTIVE()
TAKE_CONTROL_OF_TRANSITION(FALSE, FALSE)
ENDIF
SET_MG_READY_FOR_TRANSITION_STATE_FM_SWOOP_DOWN()
GOLF_TOGGLE_LOADING_SPINNER(FALSE)
ELSE
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_CLEAR_TASKS | NSPC_NO_COLLISION | NSPC_FREEZE_POSITION)
ENDIF
INIT_GOLF_XP_TRACKER(golfXPTracker)
CLEAR_AREA_OF_PEDS(GET_GOLF_COURSE_CENTER(currentCourse), 400)
currentHelpers.golfScenarioBlockingIndex = ADD_SCENARIO_BLOCKING_AREA(<<-1383.30615, 195.57402, 57.64289>>, <<-886.40259, -117.18439, 36.96122>>)
// SET_PED_NON_CREATION_AREA(<<-1383.30615, 195.57402, 57.64289>>, <<-886.40259, -117.18439, 36.96122>>)
WHILE TRUE
// One wait to rule them all. This can be the ONLY wait from here on in.....
WAIT(0)
IF GOLF_SHOULD_MAKE_PLAYER_HOST()
CDEBUG1LN(DEBUG_GOLF, "Someone took host from desired, reset it")
NETWORK_REQUEST_TO_BE_HOST_OF_THIS_SCRIPT()
ENDIF
IF (DID_I_JOIN_MISSION_AS_SPECTATOR()OR IS_PLAYER_SCTV(PLAYER_ID()))
AND NETWORK_IS_HOST_OF_THIS_SCRIPT()
CDEBUG1LN(DEBUG_GOLF, "Spectator is host!!! Very bad don't do anything until a player takes it from him")
IF NETWORK_GET_NUM_PARTICIPANTS() <= 1
CDEBUG1LN(DEBUG_GOLF, "Only local spectator is left on script. Kill golf.")
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, DEFAULT, DEFAULT, FALSE)
ENDIF
ELSE
MAINTAIN_CELEBRATION_PRE_LOAD(golfCelebrationData)
// If we have a match end event, bail
IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE() OR IS_SC_COMMUNITY_PLAYLIST_LAUNCHING(ciEVENT_TOURNAMENT_PLAYLIST) OR IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR ((IS_TRANSITION_ACTIVE() OR IS_SKYSWOOP_MOVING() OR IS_SKYSWOOP_IN_SKY()) AND golfCelebrationData.eCurrentStage = CELEBRATION_STAGE_SETUP)
CDEBUG1LN(DEBUG_GOLF, "Golf Mp - SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE")
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, DEFAULT, DEFAULT, FALSE)
ELSE
IF NOT DID_I_JOIN_MISSION_AS_SPECTATOR() AND NOT IS_PLAYER_SCTV(PLAYER_ID())
//Golf game has started and the plaeyer skipped the loading phase, kick player
IF (GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) > GMS_PRE_INIT_WAIT AND GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) != GMS_REMATCH
AND bHereForInit = FALSE)
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers)
ENDIF
ENDIF
IF NOT IS_SELECTOR_DISABLED()
DISABLE_SELECTOR()
ENDIF
DISABLE_GOLF_CONTROLS(GOLF_SHOULD_MP_MENUS_BE_DISABLED(GET_GOLF_MP_SERVER_GOLF_STATE(serverBD), currentPlayerFoursome), GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) != GPS_BALL_IN_FLIGHT)
DISABLE_GOLF_HUD(TRUE)
IF IS_WAYPOINT_ACTIVE()
SET_WAYPOINT_OFF()
ENDIF
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
ENDIF
IF IS_SCREEN_FADED_OUT()
RESET_ADAPTATION()
ENDIF
SET_IDLE_KICK_DISABLED_THIS_FRAME()
//GOLF_MP_HANDLE_NET_EVENTS(serverBD)
// REPEAT 9 hole
// DRAW_DEBUG_SPHERE(GET_GOLF_HOLE_PIN_POSITION(currentCourse, hole), GIMMIE_FORCE_RADIUS, 0, 0, 255, 50)
// DRAW_DEBUG_SPHERE(GET_GOLF_HOLE_PIN_POSITION(currentCourse, hole), BALL_IN_HOLE_RADIUS, 255, 0, 0, 50)
// DRAW_DEBUG_SPHERE(GET_GOLF_HOLE_PIN_POSITION(currentCourse, hole), 0.02, 0, 0, 0, 255)
// DRAW_DEBUG_SPHERE(GET_GOLF_HOLE_PIN_POSITION(currentCourse, hole) + <<0,0,0.11>>, 0.02, 0, 255, 255, 255)
// ENDREPEAT
#IF IS_DEBUG_BUILD
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
IF bTestReplay
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
SET_GOLF_MP_SERVER_CONTROL_FLAG2(serverBD, GCF2_GO_TO_REMATCH)
INT iOppIndex
REPEAT MP_GOLF_MAX_PLAYERS iOppIndex
// IF iOppIndex = 0 OR iOppIndex = 1 OR iOppIndex = 2
// SET_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(serverBD, iOppIndex, 15)
// ELSE
// SET_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(serverBD, iOppIndex, 15)
// ENDIF
SET_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(serverBD, iOppIndex, 42+iOppIndex)
ENDREPEAT
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, ciFMMC_END_OF_MISSION_STATUS_PASSED, TRUE)
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_R)
GOLF_KNOCK_OVER_PED(PLAYER_PED_ID(), NULL)
ENDIF
ENDIF
IF IS_GOLF_MP_SERVER_CONTROL_FLAG_SET2(serverBD, GCF2_GO_TO_REMATCH)
//CDEBUG1LN(DEBUG_GOLF,"Server go to rematch override is set")
IF NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_GO_TO_REMATCH)
CDEBUG1LN(DEBUG_GOLF,"Setup variables to go to rematch screen")
SET_GOLF_FOURSOME_CURRENT_HOLE(currentPlayerFoursome, 8)
SET_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_GO_TO_REMATCH)
bTestReplay = FALSE
ENDIF
ENDIF
#ENDIF
IF GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) >= GMS_PLAY_GOLF
AND GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) != GMS_OUTRO_INIT
AND GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) != GMS_OUTRO
AND GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) != GMS_REMATCH
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
//in the middle of removing player
IF serverBD.iPlayerWhoQuitIndex > -1
//all players have started removing player
IF IS_ALL_GOLF_CLIENT_CONTROL_FLAGS_SET2(currentPlayerFoursome, playerBD, currentPlayers, GFC2_DISPLAYING_QUITING_PLAYER)
serverBD.iPlayerWhoQuitIndex = -1
ENDIF
ELSE
//no players are in the middle of removing players
IF NOT IS_ANY_GOLF_MP_CLIENT_CONTROL_FLAG_SET2(currentPlayerFoursome, playerBD, currentPlayers, GFC2_DISPLAYING_QUITING_PLAYER)
serverBD.iPlayerWhoQuitIndex = GET_GOLF_MISSING_PLAYER(currentPlayerFoursome, currentPlayers)
ENDIF
ENDIF
ENDIF
IF IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET2(playerBD, PARTICIPANT_ID_TO_INT(), GFC2_DISPLAYING_QUITING_PLAYER)
AND serverBD.iPlayerWhoQuitIndex < 0 //everyone handled quiter, clear flag
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GFC2_DISPLAYING_QUITING_PLAYER)
ENDIF
ENDIF
// -----------------------------------
// Process your game logic.....
SWITCH GET_GOLF_MP_SERVER_MISSION_STATE(serverBD)
// Wait untill the server gives the all go before moving on
CASE GAME_STATE_INI
DEBUG_MESSAGE("CLIENT GAME_STATE_INI")
BREAK
// Main gameplay state
CASE GAME_STATE_RUNNING
IF bDebugSpew DEBUG_MESSAGE("CLIENT GAME_STATE_RUNNING") ENDIF
IF GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) > GMS_PRE_INIT_WAIT
AND GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) != GMS_REMATCH
AND NETWORK_GET_NUM_PARTICIPANTS() != GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome)
AND NOT bGolfersAddedToGameLocally
GOLF_SETUP_NETWORK_PLAYERS(currentPlayers, currentPlayerFoursome)
bGolfersAddedToGameLocally = TRUE
CDEBUG1LN(DEBUG_GOLF,"Setup golf for ", GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome), " players")
ENDIF
IF bGolfersAddedToGameLocally AND bDebugSpew
INT iCheckPlayerExistIndex
REPEAT 4 iCheckPlayerExistIndex
IF NOT DOES_ENTITY_EXIST(GET_GOLF_FOURSOME_INDEXED_PLAYER_PED(currentPlayerFoursome, iCheckPlayerExistIndex))
CDEBUG1LN(DEBUG_GOLF,"Player ", iCheckPlayerExistIndex, " doesn't exsist ", NATIVE_TO_INT(GET_GOLF_FOURSOME_INDEXED_PLAYER_PED(currentPlayerFoursome, iCheckPlayerExistIndex)) )
ELSE
CDEBUG1LN(DEBUG_GOLF,"Player ", iCheckPlayerExistIndex, " exsist! ", NATIVE_TO_INT(GET_GOLF_FOURSOME_INDEXED_PLAYER_PED(currentPlayerFoursome, iCheckPlayerExistIndex)) )
ENDIF
ENDREPEAT
ENDIF
IF GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) = GMS_EXIT_OK OR GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) = GMS_PLAY_GOLF
//golf clients request to the server to enter quit state
GOLF_MP_CLIENT_MANAGE_QUIT_REQUEST(currentGame, currentPlayerFoursome, currentHelpers, playerBD, currentPlayers)
//Host script is in charage of changing to golf quit state
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
//When switching to different hole there is a syncing issue
//This flags stops that from happening
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) = GPS_ADDRESS_BALL
CLEAR_BITMASK_ENUM_AS_ENUM(serverBD.golfServerControlFlags2, GCF2_NEW_GOLFER_IS_SET)
ENDIF
ENDIF
ENDIF
IF GET_GOLF_MP_SERVER_GOLF_STATE(serverBD) < GMS_INIT_STREAMING_DONE
START_TIMER_NOW(timerFailToLoad)
IF TIMER_DO_ONCE_WHEN_READY(timerFailToLoad, 120.0)
AND NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_MP_PLAYERS_ADDED)
CDEBUG1LN(DEBUG_GOLF,"Participant ", PARTICIPANT_ID_TO_INT(), " failed during load." )
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers)
ENDIF
ENDIF
SWITCH GET_GOLF_MP_SERVER_GOLF_STATE(serverBD)
CASE GMS_PRE_INIT
DEBUG_MESSAGE("GMS_PRE_INIT")
// Wait here til we have everyone
IF NOT IS_SCREEN_FADING_OUT() AND NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(250)
ENDIF
IF currentHelpers.bGameIsReplay
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_PRE_INIT_WAIT)
ENDIF
BREAK
CASE GMS_PRE_INIT_WAIT
CDEBUG1LN(DEBUG_GOLF, "GMS_PRE_INIT_WAIT")
START_TIMER_NOW(timerPreInitWait)
bHereForInit = TRUE
IF IS_SCREEN_FADED_OUT()
IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -1370.668, 172.609, 56.895 >>)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
CLEAR_PRINTS()
IF TIMER_DO_WHEN_READY(timerPreInitWait, 2.0)
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_INIT)
ENDIF
ENDIF
BREAK
CASE GMS_INIT
DEBUG_MESSAGE("GMS_INIT")
GOLF_SETUP_CURRENT_COURSE(currentCourse)
GOLF_STREAM_ASSETS(golfAssets)
GOLF_STREAM_UI(currentHelpers)
REQUEST_ADDITIONAL_TEXT("SP_GOLF", MINIGAME_TEXT_SLOT)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
REMOVE_AMBIENT_GOLF_FLAGS()
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_INIT_STREAMING_DONE)
BREAK
CASE GMS_INIT_STREAMING_DONE
DEBUG_MESSAGE("GMS_INIT_STREAMING_DONE")
START_TIMER_NOW(timeForLoadSceneToFinish)
//IF NOT IS_STREAMVOL_ACTIVE()
IF GOLF_ASSETS_ARE_STREAMED(currentHelpers, golfAssets)
IF HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
IF NEW_LOAD_SCENE_START_SPHERE(<< -1370.668, 172.609, 56.895 >>, 30, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
OR TIMER_DO_WHEN_READY(timeForLoadSceneToFinish, 10) //shit is taking to long, just go ahead
IF IS_TIMER_STARTED(timeForLoadSceneToFinish)
CDEBUG1LN(DEBUG_GOLF,"NETWORK_UPDATE_LOAD_SCENE has returned true. Time to load is ", GET_TIMER_IN_SECONDS(timeForLoadSceneToFinish))
CANCEL_TIMER(timeForLoadSceneToFinish)
ENDIF
IF ARE_ALL_PLAYERS_ALIVE(currentPlayerFoursome, currentPlayers)
CDEBUG1LN(DEBUG_GOLF,"Done loading")
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_INIT_DONE)
CANCEL_TIMER(timerFailToLoad)
IF NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_MP_PLAYERS_ADDED)
REMOVE_DECALS_IN_RANGE(GET_GOLF_COURSE_CENTER(currentCourse), 400)
CLEAR_AREA_OF_VEHICLES(GET_GOLF_COURSE_CENTER(currentCourse), 400)
GOLF_SETUP_CLUBS (currentGame.golfBag)
SET_SCOREBOARD_TITLE(currentHelpers)
SET_COURSE_PAR(currentHelpers)
SET_GOLF_UI_FLAG(currentHelpers, GUC_MP_PLAYERS_ADDED)
DEBUG_MESSAGE("GMS_INIT_PLACE - screen faded, moving player")
DEBUG_MESSAGE("CLEAR PLAYER TASK FOR TELEPORT")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_CURRENT_PED_WEAPON(GET_GOLF_FOURSOME_LOCAL_PLAYER_PED(currentPlayerFoursome), WEAPONTYPE_UNARMED, TRUE)
SET_ENTITY_LOD_DIST(GET_GOLF_FOURSOME_LOCAL_PLAYER_PED(currentPlayerFoursome), 500)
IF NOT DOES_ENTITY_EXIST(GET_GOLF_HOLE_FLAG(currentCourse, 0))
CDEBUG1LN(DEBUG_GOLF,"Create Golf Flags")
INT iHoleIndex
REPEAT GET_GOLF_COURSE_NUM_HOLES(currentCourse) iHoleIndex
CREATE_GOLF_FLAG(currentCourse, iHoleIndex)
ENDREPEAT
ENDIF
bAllowOverideClock = TRUE
SET_GOLF_FOURSOME_CURRENT_HOLE(currentPlayerFoursome, currentHelpers.iStartingHole)
ENDIF
ELSE
CDEBUG1LN(DEBUG_GOLF,"Not all players are alive?!")
ENDIF
ELSE
CDEBUG1LN(DEBUG_GOLF,"Network update load scene is returning false")
ENDIF
ELSE
CDEBUG1LN(DEBUG_GOLF,"Loading in golf text")
ENDIF
ENDIF
// ELSE
// CDEBUG1LN(DEBUG_GOLF,"Stream volume active")
// ENDIF
BREAK
CASE GMS_INIT_DONE
DEBUG_MESSAGE("GMS_INIT_DONE")
IF ARE_ALL_PLAYERS_ALIVE(currentPlayerFoursome, currentPlayers)
IF iHeadTextureLoadIndex < MP_GOLF_MAX_PLAYERS
IF REGISTER_HEAD_TEXTURE_MP(iHeadTextureLoadIndex, currentPlayerFoursome, currentPlayers, myPedHeadshot, bIsHeadTexturedRegistered)
OR iHeadTextureLoadFailSafe > 10
iHeadTextureLoadIndex++
bIsHeadTexturedRegistered = FALSE
CDEBUG1LN(DEBUG_GOLF,"Frames needed to load headshot ", iHeadTextureLoadFailSafe)
iHeadTextureLoadFailSafe = 0
ELSE
iHeadTextureLoadFailSafe++
ENDIF
ELSE
GOLF_MANAGE_NAVIGATE_AI(currentCourse, currentPlayerFoursome)
GOLF_INIT_CURRENT_HOLE(currentCourse, currentPlayerFoursome)
// Sync some initial data rather than doing GOLF_MP_CLIENT_MOVE_TO_NEXT_HOLE()
SET_GOLF_MP_CLIENT_LOCAL_BALL_POSITION (playerBD, GET_GOLF_FOURSOME_LOCAL_PLAYER_BALL_POSITION( currentPlayerFoursome ))
SET_GOLF_MP_CLIENT_LOCAL_DISTANCE_TO_HOLE(playerBD, GET_GOLF_FOURSOME_LOCAL_PLAYER_DISTANCE_TO_HOLE(currentPlayerFoursome))
SET_GOLF_MP_CLIENT_LOCAL_LIE(playerBD, GET_GOLF_FOURSOME_LOCAL_PLAYER_LIE(currentPlayerFoursome))
GOLF_ADD_NETWORK_PLAYERS_TO_UI(sPlayerNames, currentHelpers, currentCourse, currentPlayerFoursome, currentPlayers, !bHaveSavedNames)
SET_GOLF_FOURSOME_STATE(currentPlayerFoursome, GGS_NAVIGATE_TO_SHOT)
SET_GOLF_MINIMAP(currentPlayerFoursome, currentCourse)
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_NAVIGATE | GUC_REFRESH_PERMANENT | GUC_REFRESH_ADDRESS)
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_PLAY_GOLF)
TRIGGER_MUSIC_EVENT("MGGF_START")
HIDE_ALL_PLAYER_BLIPS(TRUE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
currentHelpers.bWantsTeleport = TRUE
SET_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_PLAYER_HAS_TELEPORTED)
// bRematchInit = FALSE
bHaveSavedNames = TRUE
GOLF_TOGGLE_LOADING_SPINNER(FALSE)
IF NOT bDidFMGameStartCall
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
SERVER_GET_WIND_FOR_HOLE(serverBD, currentGame, currentPlayerFoursome, g_FMMC_STRUCT.iWeather)
ENDIF
CLEAR_HELP()
NEW_LOAD_SCENE_STOP()
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
currentHelpers.iMatchHistoryID = serverBD.iPosixTime
DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_GOLF, serverBD.iPosixTime, serverBD.iHashMac)
REQUEST_SYSTEM_ACTIVITY_TYPE_PLAY_GOLF()
bDidFMGameStartCall = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE GMS_PLAY_GOLF
SYNC_WIND_FOR_HOLE(serverBD, currentGame)
MANAGE_GOLF_MP_PLAYER_INDEXES(currentPlayers)
GOLF_MANAGE_PRE_UPDATE_UI(currentGame, currentHelpers)
GOLF_MANAGE_PERMANENT_UI(currentGame, currentCourse, currentPlayerFoursome, currentHelpers)
#IF IS_DEBUG_BUILD
//DEBUG_MP_PLAYER_DATA_SYNC_DISPLAY(serverBD, playerBD, currentGame, currentPlayerFoursome, currentPlayers)
//GOLF_DEBUG_DRAW(currentGame, currentCourse, currentPlayerFoursome)
//SET_GOLF_DEBUG_PLAYER_SCORE(currentPlayerFoursome, currentHelpers, currentPlayers)
#ENDIF
DISPLAY_AREA_NAME(FALSE)
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_PLAY_GOLF)
IF bDoLocalQuit
OR IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_KICK_PLAYER)
IF NOT IS_GOLF_FOURSOME_LOCAL_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_REMOVED)
//you are the last person to quit, in a game that started with more then one player
IF GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome) > 1
AND GET_GOLF_FOURSOME_NUMBER_OF_ACTIVE_PLAYERS(currentPlayerFoursome) = 1
IF MPGlobals.g_MPBettingData.iYourTotalBet > 0
BROADCAST_BETTING_MISSION_FINISHED_TIED()
ENDIF
ENDIF
ENDIF
SET_VARS_ON_FMMC_EOM_VOTE_PASSING(ciFMMC_EOM_VOTE_STATUS_QUIT, <<0.0, 0.0, 0.0>>, contentID)
SET_GOLF_UI_FLAG(currentHelpers, GUC_DISABLE_UI)
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(TRUE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, ciFMMC_END_OF_MISSION_STATUS_CANCELLED)
ELIF ARE_ALL_PLAYERS_ALIVE(currentPlayerFoursome, currentPlayers)
IF GOLF_SHOULD_HANDLE_DISCONNECTED_PLAYER(serverBD, currentPlayerFoursome)
//remove players who quit
CDEBUG1LN(DEBUG_GOLF, "Golfer ", serverBD.iPlayerWhoQuitIndex, " has left golf!!!")
GOLF_MP_HANDLE_PLAYER_QUITING(serverBD, playerBD, currentPlayerFoursome, currentGame, currentHelpers, currentPlayers,
iDisplayQuitterIndex, bRecreatePlayercard, bDoLocalQuit)
ENDIF
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_AI_HIT_BALL_THIS_FRAME)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_BALL_JUST_HIT)
IF bRecreatePlayercard
GOLF_MP_SET_PLAYERCARDS(playerBD, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, FALSE, IS_GOLF_FOURSOME_STATE_AT_END(currentPlayerFoursome))
bRecreatePlayercard = FALSE
ENDIF
//server wants to move to next hole for legit reasons
IF (IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(serverBD, GCF_MOVE_TO_NEXT_HOLE_MP)
//and the player hasn't cleared their 'done with hole flag' yet. Note: spectating players set their done with hole flag at the start of the hole
AND IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_HOLE))
//Or server wants to debug move
OR ((IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(serverBD, GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE) OR IS_GOLF_MP_SERVER_CONTROL_FLAG_SET2(serverBD, GCF2_GO_TO_REMATCH))
//And the player hasn't debug moved yet
AND NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE))
GOLF_MP_CLIENT_MOVE_TO_NEXT_HOLE(serverBD, playerBD, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, currentGame)
currentHelpers.bWantsTeleport = TRUE
ENDIF
#IF IS_DEBUG_BUILD
//dont upload stats if debug skipping holes
IF IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(serverBD, GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE)
OR IS_GOLF_MP_SERVER_CONTROL_FLAG_SET2(serverBD, GCF2_GO_TO_REMATCH)
bAllowLeaderboardUpload = FALSE
ENDIF
#ENDIF
//a litte extra for mp in address ball mode
IF (GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) = GPS_ADDRESS_BALL)
RESET_GOLF_EFFECTS_FLAGS(playerBD)
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MP_SYNC_SPLASH_TEXT)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_BALL_JUST_LAND)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_BALL_IN_CUP_SOUND)
CLEAR_GOLF_UI_FLAG(currentHelpers, GUC_END_GAME_SPLASH_DISPLAYED)
IF IS_GOLF_MP_APPROACH_CAM_RENDERING(currentHelpers) OR IS_GOLF_CAM_RENDERING(currentHelpers.camAddress)
SET_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_VIEWING_ADDRESS_BALL)
ENDIF
//spectaing player is done with hole
IF IS_GOLF_FOURSOME_LOCAL_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_REMOVED)
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_HOLE)
ENDIF
INT iCurrentPlayerParticipantIndex
iCurrentPlayerParticipantIndex = GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_CURRENT_PLAYER(currentPlayerFoursome))
IF IS_GOLF_NETWORK_PARTICIPANT_ACTIVE(iCurrentPlayerParticipantIndex)
IF NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET2(playerBD, iCurrentPlayerParticipantIndex, GCF2_PLAYER_HAS_TELEPORTED)
OR NOT IS_CURRENT_GOLFER_NEAR_HIS_BALL(currentPlayerFoursome)
IF IS_GOLF_MP_APPROACH_CAM_RENDERING(currentHelpers)
CDEBUG1LN(DEBUG_GOLF, "the player has not teleported yet and you are rendering the pan camera")
SET_CAM_SPLINE_PHASE(currentHelpers.camMPApproach, 0.0)
ENDIF
ENDIF
ENDIF
IF GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome) = GET_GOLF_FOURSOME_CURRENT_PLAYER(currentPlayerFoursome)
IF IS_ALL_GOLF_CLIENT_CONTROL_FLAGS_SET2(currentPlayerFoursome, playerBD, currentPlayers, GCF2_VIEWING_ADDRESS_BALL)
IF GOLF_CHECK_PLAYER_NEAR_BALL(currentGame, currentPlayerFoursome)
SET_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_PLAYER_HAS_TELEPORTED)
ENDIF
ENDIF
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(currentPlayerFoursome) = LIE_CUP
CDEBUG1LN(DEBUG_GOLF, "Player is in adress state with LIE_CUP! Bad news. End hole for player for safety.")
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_SHOT)
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_HOLE)
ENDIF
ENDIF
ELIF GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) > GPS_BALL_IN_FLIGHT
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_PLAYER_HAS_TELEPORTED)
ELSE
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_VIEWING_ADDRESS_BALL)
ENDIF
// Move to next shooter?
IF GET_GOLF_MP_SERVER_CURRENT_SHOOTER_NET_INDEX(serverBD) != GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_CURRENT_PLAYER( currentPlayerFoursome ))
AND GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) != GGS_SCORECARD_END_GAME
GOLF_MP_CLIENT_MOVE_TO_NEXT_SHOOTER(serverBD, playerBD, currentHelpers, currentCourse, currentPlayerFoursome, currentPlayers)
currentHelpers.bWantsTeleport = TRUE
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
SERVER_GET_WIND_FOR_HOLE(serverBD, currentGame, currentPlayerFoursome, g_FMMC_STRUCT.iWeather)
ENDIF
ENDIF
// Move to next shot?
IF IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(serverBD, GCF_MOVE_TO_NEXT_SHOT_MP)
CDEBUG1LN(DEBUG_GOLF,"Server move to next shot is set")
IF NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_SHOT_MP)
CDEBUG1LN(DEBUG_GOLF,"Move to next shot")
IF IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_SHOT)
GOLF_MP_CLIENT_MOVE_TO_NEXT_SHOT(serverBD, playerBD, currentHelpers, currentPlayerFoursome)
CLEAR_AREA_OF_PEDS(GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL_POSITION(currentPlayerFoursome), 20)
ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
SERVER_GET_WIND_FOR_HOLE(serverBD, currentGame, currentPlayerFoursome, g_FMMC_STRUCT.iWeather)
ENDIF
currentHelpers.bWantsTeleport = TRUE
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_SHOT_MP)
ENDIF
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_PLAYER_DONE_WITH_SHOT)
ELSE
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_SHOT_MP)
ENDIF
IF currentHelpers.bWantsTeleport AND GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) != GGS_SCORECARD_END_HOLE
AND GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) != GGS_SCORECARD_END_GAME
AND IS_ALL_GOLF_CLIENT_CONTROL_FLAGS_SET2(currentPlayerFoursome, playerBD, currentPlayers, GCF2_VIEWING_ADDRESS_BALL)
currentHelpers.bWantsTeleport = FALSE
IF NOT IS_GOLF_FOURSOME_LOCAL_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_REMOVED)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) //make sure isn't forzen before teleport
ENDIF
GOLF_MP_CLIENT_UPDATE_LOCAL_PLAYER_TELEPORT(serverBD, currentGame, currentCourse, currentPlayerFoursome, currentHelpers, currentPlayers)
CDEBUG1LN(DEBUG_GOLF,"Set has teleported flag")
SET_GOLF_MP_CLIENT_CONTROL_FLAG2(playerBD, PARTICIPANT_ID_TO_INT(), GCF2_PLAYER_HAS_TELEPORTED)
ELIF currentHelpers.bWantsTeleport
//you want to teleport but havn't yet, don't allow camera switching
currentHelpers.bAllowPlayerViewCam = FALSE
ENDIF
// Play Golf!
IF (NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_SCOREBOARD_DISPLAYED) //scorecard is up, don't update
OR GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(currentPlayerFoursome) != HUMAN_LOCAL) //well its not your turn, okay to update
OR IS_GOLF_FOURSOME_STATE_AT_END(currentPlayerFoursome) //always update end of game
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GOLF_PLAY_GOLF(currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers))
ENDIF
// Check to see if we should end
IF GET_GOLF_MP_CLIENT_GOLF_STATE(playerBD, PARTICIPANT_ID_TO_INT()) = GMS_CLEANUP
OR GET_GOLF_MP_CLIENT_GOLF_STATE(playerBD, PARTICIPANT_ID_TO_INT()) = GMS_OUTRO_INIT
//tell sever to go to outro scene
CDEBUG1LN(DEBUG_GOLF,"Golf play golf returned GMS_OUTRO_INIT OR GMS_CLEANUP ", GET_GOLF_MP_CLIENT_GOLF_STATE(playerBD, PARTICIPANT_ID_TO_INT()))
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_MP_OUTRO)
ENDIF
// Check to see if local / current player is done with shot or hole
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(currentPlayerFoursome) = HUMAN_LOCAL_MP
GOLF_MP_CLIENT_UPDATE_LOCAL_PLAYER_SHOT(serverBD, playerBD, currentHelpers, currentPlayerFoursome, currentGame)
ENDIF
GOLF_MP_CLIENT_MANAGE_AUTO_SWING_TIMER(serverBD, playerBD, currentPlayerFoursome, currentCourse, currentHelpers, currentPlayers)
//Sometimes we want players to be invisible
MANAGE_GOLFER_INVISIBLE(playerBD, currentPlayerFoursome, currentHelpers, currentPlayers)
//Manage golf objects so the are consistent
GOLF_MP_CLIENT_MANAGE_GOLF_OBJECTS(playerBD, currentPlayerFoursome, currentHelpers, currentGame, currentCourse, currentPlayers)
MANAGE_MP_GOLF_BALL_SYNCING(serverBD, currentPlayerFoursome)
// Synchronize data
REPEAT GET_GOLF_FOURSOME_NUM_PLAYERS( currentPlayerFoursome ) playerIndex
IF GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT( currentPlayers, playerIndex) != PARTICIPANT_ID_TO_INT()
AND NOT IS_GOLF_FOURSOME_INDEXED_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, playerIndex, GOLF_PLAYER_REMOVED)
GOLF_MP_CLIENT_SYNC_REMOTE_PLAYER_DATA(serverBD, playerBD, currentGame, currentPlayerFoursome, currentHelpers, currentPlayers, playerIndex)
ELSE
GOLF_MP_CLIENT_SYNC_LOCAL_PLAYER_DATA(playerBD, currentPlayerFoursome, currentGame)
ENDIF
ENDREPEAT
//Syc headset display on player card
GOLF_MP_SYNC_HEADSETS(golfHeadsetStates, currentPlayerFoursome, currentHelpers, currentPlayers)
//At end of hole, wait for player to put away scorecard.
GOLF_MP_MANAGE_END_OF_HOLE_SCORECARD(serverBD, playerBD, currentPlayerFoursome, currentCourse, currentGame, currentHelpers, currentPlayers)
//Synchronize blips
GOLF_MP_CLIENT_MANAGE_BLIPS(currentPlayerFoursome)
//Synchronize particle effects
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(currentPlayerFoursome) = HUMAN_NETWORK
GOLF_MP_CLIENT_SYNCHRONIZE_PARTICLE_EFFECTS(playerBD, currentGame, currentPlayerFoursome, currentCourse, currentPlayers)
GOLF_MP_CLIENT_SYNCHRONIZE_SOUNDS(playerBD, currentPlayerFoursome, currentGame, currentPlayers, currentCourse)
GOLF_MP_CLIENT_SYNCHRONIZE_BALL_CONTACT(playerBD, currentPlayerFoursome, currentPlayers)
ENDIF
//Synchronize splash text
GOLF_MP_SYNC_SPLASH_TEXT(currentPlayerFoursome, currentHelpers, playerBD, currentPlayers)
// Error checking
#IF IS_DEBUG_BUILD
//DEBUG_GOLF_MP_CLIENT_FLAGS(serverBD, playerBD, mySavedGCF, savedServerGCF)
IF NOT (IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(serverBD, GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE) OR IS_GOLF_MP_SERVER_CONTROL_FLAG_SET2(serverBD, GCF2_GO_TO_REMATCH))
AND IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE)
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_NEXT_HOLE_MP_OVERRIDE)
ENDIF
#ENDIF
// //Manage pause menu
// IF IS_PAUSE_MENU_ACTIVE()
// IF GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) >= GPS_BALL_IN_FLIGHT
// CDEBUG1LN(DEBUG_GOLF,"Pause menu is active. State is ball in flight or greater")
// SET_FRONTEND_ACTIVE(FALSE)
// DISABLE_FRONTEND_THIS_FRAME() //don't allow pause menu when ball is in air, like in sp
// ENDIF
// ENDIF
// Manage scoreboard display
IF NOT IS_GOLF_FOURSOME_STATE_AT_END(currentPlayerFoursome)
AND NOT IS_SCREEN_FADED_OUT() AND NOT IS_PAUSE_MENU_ACTIVE()
AND NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MP_OUTRO)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
AND NOT IS_GOLF_MP_SCOREBOARD_FORCED_CLOSED(serverBD, currentPlayerFoursome, currentHelpers)
AND NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_SCOREBOARD_DISPLAYED)
AND NOT NETWORK_TEXT_CHAT_IS_TYPING()
CLEAR_HELP()
DISPLAY_RADAR(FALSE)
DISPLAY_SCOREBOARD(currentHelpers, TRUE)
GOLF_TRAIL_SET_ENABLED(FALSE)
PLAY_SOUND_FRONTEND(-1, "HIGHLIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET")
SET_PUTTMETER (currentHelpers, currentHelpers.golfUI)
SETUP_GOLF_SCOREBOARD_CONTROLS(currentHelpers)
ELIF IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_SCOREBOARD_DISPLAYED)
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(currentPlayerFoursome) = HUMAN_NETWORK
AND GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) <= GPS_SWING_METER
//Make sure adress camera is still updating when player is spectating others
ADJUST_ADDRESS_CAMERA(currentPlayerFoursome, currentPlayerFoursome.playerCore[GET_GOLF_FOURSOME_CURRENT_PLAYER(currentPlayerFoursome)], currentHelpers , GET_GOLF_FOURSOME_CURRENT_PLAYER_AIM(currentPlayerFoursome))
ENDIF
GOLF_TRAIL_SET_ENABLED(FALSE)
IF IS_GOLF_MP_SCORECARD_QUIT_PRESSED()
OR IS_GOLF_MP_SCOREBOARD_FORCED_CLOSED(serverBD, currentPlayerFoursome, currentHelpers)
IF currentHelpers.spectatorCamState != GOLF_SPECTATOR_POV_CAM
OR IS_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL_HUMAN_LOCAL(currentPlayerFoursome)
DISPLAY_RADAR(TRUE)
ENDIF
DISPLAY_SCOREBOARD(currentHelpers, FALSE)
CLEAR_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_INPUT)
IF currentHelpers.bGreenPreviewCam = 0
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_SWING)
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_GOLF_TRAIL)
ENDIF
ENDIF
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) <= GPS_SWING_METER
//If you are quit out of the scoreboard, display adress help text right away
GOLF_MANAGE_ADDRESS_HELP(currentCourse, currentPlayerFoursome, currentHelpers, currentGame, currentPlayers[GET_GOLF_FOURSOME_CURRENT_PLAYER(currentPlayerFoursome)])
MANAGE_PLAYERCARD(currentHelpers, currentGame)
ENDIF
GOLF_DISPLAY_CONTROLS(currentHelpers, TRUE)
ENDIF
ENDIF
//if client requested to see the quit menu
IF IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_MP_START_QUIT_MENU)
SET_WARNING_MESSAGE_WITH_HEADER("QUIT", "QUIT_DET", FE_WARNING_YES | FE_WARNING_NO)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_SELECT) // dont allow map to pop up
//KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
IF IS_MESSAGE_BEING_DISPLAYED()
CLEAR_PRINTS()
ENDIF
IF NOT IS_RADAR_HIDDEN()
DISPLAY_RADAR(FALSE)
ENDIF
GOLF_TRAIL_SET_ENABLED(FALSE)
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
//END GOLF
SET_FRONTEND_ACTIVE(FALSE)
bDoLocalQuit = TRUE
CALL_END_OF_MISSION_QUIT_TELEMETRY()
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) = GGS_SCORECARD_END_GAME //OR GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) = GGS_SCORECARD_END_HOLE
OR IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_END_GOLF_SCOREBOARD)
//If its the local players turn, turn off the scoreboard if he is going to auto swing, or if it is the start of his turn
OR (IS_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL_HUMAN_LOCAL(currentPlayerFoursome)
AND (IS_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_TIME_OUT)))
IF IS_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL_HUMAN_LOCAL(currentPlayerFoursome)
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_GOLF_TRAIL)
ENDIF
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_MP_START_QUIT_MENU)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_MP_START_QUIT_MENU)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_STOP_INPUT)
IF NOT IS_GOLF_FOURSOME_STATE_AT_END(currentPlayerFoursome)
AND NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_SCOREBOARD_DISPLAYED)
DISPLAY_RADAR(TRUE)
ENDIF
ENDIF
ENDIF
ELSE
CDEBUG1LN(DEBUG_GOLF,"Some one is dead?")
ENDIF
//Wait until the player is lined up with the ball before fading back in
IF IS_SCREEN_FADED_OUT()
AND ((GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) = GGS_SCORECARD_END_HOLE OR GET_GOLF_FOURSOME_STATE(currentPlayerFoursome) = GGS_SCORECARD_END_GAME
AND NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_DISABLE_FADE_IN))
OR (GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) > GPS_ADDRESS_BALL
AND (GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) < GPS_BALL_AT_REST OR GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(currentPlayerFoursome) = GPS_BALL_IN_HOLE_CELEBRATION)))
START_TIMER_NOW(currentHelpers.navTimer)
CDEBUG1LN(DEBUG_GOLF,"Fading in from golf_mp.sc timer is at ", GET_TIMER_IN_SECONDS(currentHelpers.navTimer))
IF TIMER_DO_ONCE_WHEN_READY(currentHelpers.navTimer, 0.75)
CDEBUG1LN(DEBUG_GOLF,"Fading in from golf_mp.sc")
DO_SCREEN_FADE_IN(250)
SET_SPLASH_TEXT(currentHelpers)
CLEAR_GOLF_UI_FLAG(currentHelpers, GUC_DISABLE_FADE_IN)
ENDIF
ENDIF
BREAK
CASE GMS_OUTRO_INIT
CDEBUG1LN(DEBUG_GOLF,"Outro Init")
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_OUTRO_INIT)
RESTART_TIMER_NOW(currentHelpers.uiTimer)
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_MP_OUTRO)
CLEAR_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_TURN_OFF_SCOREBOARD_MP_OVERRIDE)
CLEAR_GOLF_UI_DISPLAY(currentHelpers, GOLF_DISPLAY_PLAYERCARD)
SET_GOLF_FOURSOME_LOCAL_PLAYER_STATE(currentPlayerFoursome, GPS_PLACE_BALL)
SET_GOLF_FOURSOME_STATE(currentPlayerFoursome, GGS_TAKING_SHOT)
DISABLE_GOLF_MINIMAP()
SET_END_OF_HOLE_CAMERA(currentHelpers, 7, FALSE, TRUE)
MANAGE_GOLFER_INVISIBLE(playerBD, currentPlayerFoursome, currentHelpers, currentPlayers, TRUE)
IF NETWORK_IS_IN_SPECTATOR_MODE()
SET_IN_SPECTATOR_MODE(FALSE, tempPed)
ENDIF
//Display winner
IF NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_END_GAME_SPLASH_DISPLAYED)
AND IS_GOLF_END_SCREEN_READY(golfCelebrationData)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_ENDED_MISSION_AT_LEADERBOARD_VOTE_OR_TIME_OUT()
TRIGGER_CELEBRATION_PRE_LOAD(golfCelebrationData)
IF NOT IS_GOLF_FOURSOME_LOCAL_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_REMOVED)
iBetWinnings = 0
// iPlayersScore = GET_GOLF_PLAYER_CURRENT_SCORE(currentPlayers[GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)])
iPlacement = GET_GOLFER_PLACEMENT(currentPlayerFoursome, currentPlayers, bTiedPlacement)
iWinnerIndex = GET_GOLF_WINNER(currentPlayerFoursome, currentPlayers)
iWinnerNetIndex = GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, iWinnerIndex)
IF NOT IS_GOLF_STREAMING_FLAG_SET(currentHelpers, GSF_END_GAME_XP_CALCULATED)
IF GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome) > 1
HANDLE_GOLF_BETTING_WINS(currentPlayerFoursome, currentPlayers, iBetWinnings, iPlacement)
ENDIF
IF GET_GOLF_FOURSOME_NUMBER_OF_ACTIVE_PLAYERS(currentPlayerFoursome) = 1
IF GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome) > 1
CDEBUG1LN(DEBUG_GOLF,"Every one else quit golf, i guess you won")
currentHelpers.iXPGained += GIVE_LOCAL_PLAYER_XP(eXPTYPE_STANDARD, "XPT_GOLF",XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_GOLF_WON, ROUND(g_sMPTunables.fxp_tunable_Minigames_Golf * 500))
ENDIF
ELIF IS_GOLF_GAME_TIE(currentPlayerFoursome, currentPlayers)
CDEBUG1LN(DEBUG_GOLF,"No extra xp if tie")
ELIF iWinnerIndex = GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)
currentHelpers.iXPGained += GIVE_LOCAL_PLAYER_XP(eXPTYPE_STANDARD, "XPT_GOLF",XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_GOLF_WON, ROUND(g_sMPTunables.fxp_tunable_Minigames_Golf * 500))
ENDIF
SET_GOLF_STREAMING_FLAG(currentHelpers, GSF_END_GAME_XP_CALCULATED)
ENDIF
SET_GOLF_UI_FLAG(currentHelpers, GUC_END_GAME_SPLASH_DISPLAYED)
INT iNumHolesPlayed, IncStrength
iNumHolesPlayed = currentHelpers.iEndingHole - currentHelpers.iStartingHole
IF iNumHolesPlayed <= 3
IncStrength = 1
ELIF iNumHolesPlayed <= 7
IncStrength = 2
ELSE //all 8 holes
IncStrength = 3
ENDIF
//Increase streangth based on number of holes played
INC_GOLF_PLAYER_STRENGTH(IncStrength)
SET_MP_DAILY_OBJECTIVE_COMPLETE(MP_DAILY_JOB_PLAY_GOLF)
IF GET_GOLF_FOURSOME_NUMBER_OF_ACTIVE_PLAYERS(currentPlayerFoursome) = 1
// IF IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_DISPLAY_NEW_BEST_SCORE)
// PLAY_GOLF_SPLASH("GOLF_NEW_HIGH")
// ENDIF
ELIF IS_GOLF_GAME_TIE(currentPlayerFoursome, currentPlayers)
CDEBUG1LN(DEBUG_GOLF,"Tie game")
bDrawGame = TRUE
ELIF iWinnerIndex = GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome) //if the player won
CDEBUG1LN(DEBUG_GOLF,"This player won")
INC_GOLF_STAT_NUM_WINS()
ELSE //if someone else won
CDEBUG1LN(DEBUG_GOLF,"Player who won is ", sPlayerNames[iWinnerIndex])
INC_GOLF_STAT_NUM_LOSSES()
ENDIF
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_DONE_WITH_GAME)
CLEAR_GOLF_SPLASH()
ELSE //player is spectator
iBetWinnings = 0
iPlacement = 0
bTiedPlacement = FALSE
iWinnerIndex = GET_GOLF_WINNER(currentPlayerFoursome, currentPlayers)
iWinnerNetIndex = GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, iWinnerIndex)
bDrawGame = IS_GOLF_GAME_TIE(currentPlayerFoursome, currentPlayers)
SET_GOLF_UI_FLAG(currentHelpers, GUC_END_GAME_SPLASH_DISPLAYED)
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_DONE_WITH_GAME)
CLEAR_GOLF_SPLASH()
ENDIF
ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
IF IS_ALL_GOLF_CLIENT_CONTROL_FLAGS_SET(currentPlayerFoursome, playerBD, currentPlayers, GCF_DONE_WITH_GAME)
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_OUTRO)
SET_GOLF_MP_SERVER_GOLF_STATE(serverBD, GMS_OUTRO)
ENDIF
ENDIF
BREAK
CASE GMS_OUTRO
CDEBUG1LN(DEBUG_GOLF,"GMS_OUTRO")
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_OUTRO)
SET_GOLF_UI_FLAG(currentHelpers, GUC_DISABLE_UI)
// MANAGE_GOLFER_INVISIBLE(playerBD, currentPlayerFoursome, currentHelpers, currentPlayers, TRUE)
IF IS_GOLF_MP_ALL_CLIENTS_AT_GOLF_STATE(playerBD, currentPlayers, currentPlayerFoursome, GMS_OUTRO)
IF DISPLAY_GOLF_END_SCREEN(golfCelebrationData, camGolfEndScreen, golfXPTracker, iPlacement, bTiedPlacement, currentHelpers.iXPGained,
GET_GOLF_FOURSOME_NUM_PLAYERS(currentPlayerFoursome) > 1, bDrawGame, iWinnerNetIndex, iBetWinnings,
IS_GOLF_FOURSOME_LOCAL_PLAYER_CONTROL_FLAG_SET(currentPlayerFoursome, GOLF_PLAYER_REMOVED), dPadVars)
SET_GOLF_MP_CLIENT_CONTROL_FLAG(playerBD, PARTICIPANT_ID_TO_INT(), GCF_MOVE_TO_REMATCH_SCREEN)
SET_VARS_ON_FMMC_EOM_VOTE_PASSING(ciFMMC_EOM_VOTE_STATUS_CONTINUE, <<0.0, 0.0, 0.0>>, contentID)
CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(FALSE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, ciFMMC_END_OF_MISSION_STATUS_PASSED, FALSE, FALSE)
// IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
// IF IS_ALL_GOLF_CLIENT_CONTROL_FLAGS_SET(currentPlayerFoursome, playerBD, currentPlayers, GCF_MOVE_TO_REMATCH_SCREEN)
// SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_REMATCH)
// SET_GOLF_MP_SERVER_GOLF_STATE(serverBD, GMS_REMATCH)
// ENDIF
// ENDIF
ENDIF
ENDIF
BREAK
CASE GMS_REMATCH
CDEBUG1LN(DEBUG_GOLF,"GMS_REMATCH")
// SET_GOLF_MP_CLIENT_LOCAL_GOLF_STATE(playerBD, GMS_REMATCH)
//
// bAllowOverideClock = FALSE
// IF NOT bRematchInit
// GOLF_CLEANUP_ALL_CAMERA(currentHelpers)
// RESTART_TIMER_NOW(timerFailToLoad)
// bRematchInit = TRUE
// ENDIF
//
// IF IS_NEW_LOAD_SCENE_ACTIVE()
// NEW_LOAD_SCENE_STOP()
// ENDIF
// IF DID_I_JOIN_MISSION_AS_SPECTATOR()
// CLEAR_I_JOIN_MISSION_AS_SPECTATOR()
// ENDIF
//
// IF bDoLocalQuit
// OR IS_PLAYER_SCTV(PLAYER_ID())
// CLEANUP_GOLF_MP_WITH_LEADERBOARD_CAM(TRUE, currentGame, currentCourse, currentPlayerFoursome, currentPlayers, currentHelpers, ciFMMC_END_OF_MISSION_STATUS_PASSED)
// ELSE
// IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
// IF NOT HAS_NET_TIMER_STARTED(serverBD.timeLeaderboardTimeOut)
// START_NET_TIMER(serverBD.timeLeaderboardTimeOut)
// ENDIF
//
// FMMC_EOM_SERVER_RESET_PLAYER_COUNTS(sPlayerCounts)
// INT iRematchLoop
// REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iRematchLoop
// IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iRematchLoop))
// FMMC_EOM_SERVER_PLAYER_PROCESSING(sPlayerCounts, iRematchLoop)
// ENDIF
// ENDREPEAT
//
// FMMC_EOM_SERVER_END_OF_FRAME_PROCESSING(sPlayerCounts, serverBD.sServerFMMC_EOM, FMMC_TYPE_MG_GOLF, 0)
// ENDIF
//
// IF HAS_NET_TIMER_STARTED(serverBD.timeLeaderboardTimeOut)
// //IF MAINTAIN_MINI_GAME_END_OF_MISSION_SCREEN(sEndOfMission, serverBD.sServerFMMC_EOM, serverBD.timeLeaderboardTimeOut.timer, VIEW_LEADERBOARD_TIME, "LBD_TIMEOUT")
// IF MAINTAIN_END_OF_MISSION_SCREEN(sEndOfMission, serverBD.sServerFMMC_EOM,
// GET_TIME_DIFFERENCE(GET_NETWORK_TIME(),serverBD.timeLeaderboardTimeOut.timer) >= VIEW_LEADERBOARD_TIME,
// FALSE, FALSE, FALSE, FALSE, FALSE, serverBD.timeLeaderboardTimeOut.timer, VIEW_LEADERBOARD_TIME, "END_LBD_CONT", TRUE)
// //Go to cleanup state
// bDoLocalQuit = TRUE
// ELSE
//
// ENDIF
// ENDIF
//
// SET_END_OF_HOLE_CAMERA(currentHelpers, 7, FALSE, TRUE)
// MANAGE_GOLFER_INVISIBLE(playerBD, currentPlayerFoursome, currentHelpers, currentPlayers, TRUE)
// ENDIF
BREAK
CASE GMS_EXIT_OK
CDEBUG1LN(DEBUG_GOLF,"GMS_EXIT_OK")
BREAK
CASE GMS_CLEANUP
CDEBUG1LN(DEBUG_GOLF, "GMS_CLEANUP")
BREAK
ENDSWITCH
IF IS_GOLF_SPLASH_DISPLAYING() AND IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
MANAGE_GOLF_UI_DISPLAY(currentHelpers)
IF GET_GOLF_MP_CLIENT_GOLF_STATE(playerBD, PARTICIPANT_ID_TO_INT()) >= GMS_PLAY_GOLF
AND NOT IS_GOLF_MP_CLIENT_CONTROL_FLAG_SET(playerBD, GET_GOLF_PLAYER_NET_INDEX_BY_INDEX_AS_INT(currentPlayers, GET_GOLF_FOURSOME_LOCAL_PLAYER(currentPlayerFoursome)), GCF_MP_START_QUIT_MENU)
AND (IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN())
IF IS_GOLF_CONTROL_FLAG_SET(currentGame, GCF_DISPLAY_QUITTER) AND iDisplayQuitterIndex > -1
PRINT_GOLF_MP_PLAYER_WHO_QUIT_MATCH(sPlayerNames, iDisplayQuitterIndex)
iDisplayQuitterIndex = -1
GOLF_TRAIL_SET_ENABLED(FALSE)
DISPLAY_RADAR(FALSE)
ENDIF
IF NOT IS_GOLF_UI_FLAG_SET(currentHelpers, GUC_DISABLE_UI)
AND NOT IS_PAUSE_MENU_ACTIVE() AND NOT IS_TRANSITION_ACTIVE()
IF SHOULD_GOLF_SC_LEADERBOARD_DSIPLAY(currentPlayerFoursome, currentHelpers)
GOLF_DISPLAY_SOCIAL_CLUB_LEADERBOARD(currentHelpers.leaderboardUI)
MANAGE_GOLF_SC_LEADERBOARD_INPUT(currentPlayerFoursome, currentHelpers)
ELSE
DRAW_SCALEFORM_MOVIE_FULLSCREEN(currentHelpers.golfUI,255,255,255,0)
ENDIF
ENDIF
IF IS_PAUSE_MENU_ACTIVE()
CLEAR_GOLF_SPLASH()
ENDIF
UPDATE_GOLF_SPLASH()
IF IS_GOLF_CONTROL_FLAG_SET(currentGame, GCF_DISPLAY_QUITTER) AND NOT IS_GOLF_SPLASH_DISPLAYING()
CDEBUG1LN(DEBUG_GOLF,"No longer displaying quitter")
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_GOLF_TRAIL)
SET_GOLF_UI_FLAG(currentHelpers, GUC_REFRESH_ADDRESS)
CLEAR_GOLF_CONTROL_FLAG(currentGame, GCF_DISPLAY_QUITTER)
DISPLAY_RADAR(TRUE)
ENDIF
ENDIF
INT iLinesToMoveUp
iLinesToMoveUp = GOLF_INSTRUCTIONS_BUTTONS_GET_LINES(currentPlayerFoursome)
SET_INSTRUCTIONAL_BUTTONS_UNDER_HUD_THIS_FRAME(iLinesToMoveUp)
BREAK
ENDSWITCH
// -----------------------------------
// Process server game logic
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
GOLF_MP_GAME_STATE newServerState = GAME_STATE_UNDEFINED
GOLF_MINIGAME_STATE newServerGolfState = GMS_UNDEFINED
#IF IS_DEBUG_BUILD
DEBUG_GOLF_MP_SERVER_FLAGS(playerBD, savedGCF, savedBallPositions)
GOLF_MANAGE_MP_DEBUG_INPUT(serverBD, playerBD, currentPlayerFoursome, currentGame, currentCourse, currentHelpers, currentPlayers)
#ENDIF
// Do Lockstep
// Check if all clients are on a different state than the server
newServerState = GET_CLIENT_STATE_SYNC(playerBD)
IF newServerState != GAME_STATE_UNDEFINED AND newServerState > GET_GOLF_MP_SERVER_MISSION_STATE(serverBD)
IF bDebugSpew CDEBUG1LN(DEBUG_GOLF,"Server State moving to ",newServerState) ENDIF
SET_GOLF_MP_SERVER_MISSION_STATE(serverBD, newServerState)
ENDIF
newServerGolfState = GET_CLIENT_GOLF_STATE_SYNC(serverBD, playerBD)
IF newServerGolfState != GMS_UNDEFINED AND newServerGolfState > GET_GOLF_MP_SERVER_GOLF_STATE(serverBD)
IF bDebugSpew CDEBUG1LN(DEBUG_GOLF,"Server Golf State moving to ",newServerGolfState) ENDIF
SET_GOLF_MP_SERVER_GOLF_STATE(serverBD, newServerGolfState)
ENDIF
SWITCH GET_GOLF_MP_SERVER_MISSION_STATE(serverBD)
CASE GAME_STATE_INI
DEBUG_MESSAGE("SERVER GAME_STATE_INI")
SET_GOLF_MP_SERVER_CURRENT_HOLE(serverBD, currentHelpers.iStartingHole)
serverBD.iPlayerWhoQuitIndex = -1 //no one has quit
iNumMissionPlayers = NETWORK_GET_NUM_PARTICIPANTS() //NETWORK_GET_NUM_PARTICIPANTS()
CDEBUG1LN(DEBUG_GOLF,"Num participating in this script: ",iNumMissionPlayers)
// IF iNumMissionPlayers >= 1
START_TIMER_NOW(currentHelpers.navTimer)
CDEBUG1LN(DEBUG_GOLF,"Time waiting on init ", GET_TIMER_IN_SECONDS(currentHelpers.navTimer))
IF TIMER_DO_ONCE_WHEN_READY(currentHelpers.navTimer, 7.5)
SET_FM_MISSION_AS_NOT_JOINABLE() //you've had plenty of time to join, no more
SET_GOLF_MP_SERVER_CURRENT_SHOOTER_NET_INDEX(serverBD, GET_FIRST_ACTIVE_PLAYER())
SET_GOLF_MP_SERVER_MISSION_STATE(serverBD, GAME_STATE_RUNNING)
SET_GOLF_MP_SERVER_GOLF_STATE(serverBD, GMS_PRE_INIT_WAIT)
ENDIF
// ENDIF
BREAK
// Look for game end conditions
CASE GAME_STATE_RUNNING
IF bDebugSpew DEBUG_MESSAGE("SERVER GAME_STATE_RUNNING") ENDIF
// Handle any game logic needed
SWITCH GET_GOLF_MP_SERVER_GOLF_STATE(serverBD)
CASE GMS_PRE_INIT
BREAK
CASE GMS_PLAY_GOLF
IF bDebugSpew DEBUG_MESSAGE("SERVER GMS_PLAY_GOLF") ENDIF
//SET_CLOCK_TIME(FLOOR(vPreviousTime.x), FLOOR(vPreviousTime.y), FLOOR(vPreviousTime.z)) //only the server can set the time
GOLF_MP_SERVER_UPDATE_SHOT_STATUS(serverBD, playerBD, currentPlayerFoursome, currentPlayers, currentCourse)
IF IS_ANY_GOLF_MP_CLIENT_CONTROL_FLAG_SET(currentPlayerFoursome, playerBD, currentPlayers, GCF_MP_OUTRO)
SET_GOLF_MP_SERVER_GOLF_STATE(serverBD, GMS_OUTRO_INIT)
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
IF bAllowOverideClock
NETWORK_OVERRIDE_CLOCK_TIME(12, 0, 0)
ENDIF
//dont give the player control in mp golf
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
ENDIF
/*INT iParticpantIDForHeadTexture //Old style of headshot management, calling this every frame should no longer be neccessary DaveyG
REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iParticpantIDForHeadTexture
IF NETWORK_IS_PARTICIPANT_ACTIVE( INT_TO_PARTICIPANTINDEX(iParticpantIDForHeadTexture) )
Keep_Player_Headshot_Active(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iParticpantIDForHeadTexture)))
ENDIF
ENDREPEAT*/
ENDIF // SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
ENDIF //is spectator host
ENDWHILE
// End of Mission
ENDSCRIPT