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

245 lines
8.5 KiB
XML
Executable File

USING "golf.sch"
USING "Net_Script_Timers.sch"
USING "fmmc_restart_header.sch"
ENUM GOLF_MP_GAME_STATE
GAME_STATE_UNDEFINED = -1,
GAME_STATE_INI,
GAME_STATE_INI_SPAWN,
GAME_STATE_RUNNING
ENDENUM
STRUCT GOLF_MP_PLAYER_SCORESHEET
GOLF_PLAYER_COURSE_SCORE iCourseScore[18]
INT iCurrentScore
ENDSTRUCT
// The server broadcast data
// Everyone can read this data, only the server can update it
STRUCT GOLF_MP_SERVER_BROADCAST_DATA
GOLF_MP_GAME_STATE eServerGameState
GOLF_MINIGAME_STATE eServerGolfState
GOLF_CONTROL_FLAGS golfServerControlFlags
GOLF_CONTROL_FLAGS2 golfServerControlFlags2
GOLF_MP_PLAYER_SCORESHEET serverScore[MP_GOLF_MAX_PLAYERS]
NETWORK_INDEX hostGolfBallIndex[MP_GOLF_MAX_PLAYERS]
INT iCurrentShooterNetIndex
INT iCurrentHole
INT iPlayerWhoQuitIndex
INT iWeather
FLOAT fWindStrength
VECTOR vWindDirection
INT iHashMac, iPosixTime = -1
INT iMPTimer, iStartHole, iEndHole
SERVER_EOM_VARS sServerFMMC_EOM
SCRIPT_TIMER timeLeaderboardTimeOut
ENDSTRUCT
/// PURPOSE:
/// Checks scorecard quit button - different on PC.
/// RETURNS:
/// TRUE if quit button is pressed
FUNC BOOL IS_GOLF_MP_SCORECARD_QUIT_PRESSED()
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF NETWORK_TEXT_CHAT_IS_TYPING()
RETURN FALSE
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
RETURN TRUE
ENDIF
ELSE
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// SERVER BD ACCESSORS
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC GOLF_MP_GAME_STATE GET_GOLF_MP_SERVER_MISSION_STATE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
RETURN serverBD.eServerGameState
ENDFUNC
PROC SET_GOLF_MP_SERVER_MISSION_STATE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_MP_GAME_STATE eServerGameState)
serverBD.eServerGameState = eServerGameState
ENDPROC
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC GOLF_MINIGAME_STATE GET_GOLF_MP_SERVER_GOLF_STATE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
RETURN serverBD.eServerGolfState
ENDFUNC
PROC SET_GOLF_MP_SERVER_GOLF_STATE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_MINIGAME_STATE eServerGolfState)
serverBD.eServerGolfState = eServerGolfState
ENDPROC
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC GOLF_CONTROL_FLAGS GET_GOLF_MP_SERVER_CONTROL_FLAGS(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
RETURN serverBD.golfServerControlFlags
ENDFUNC
PROC OVERWRITE_GOLF_MP_SERVER_CONTROL_FLAGS(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS golfServerControlFlags)
serverBD.golfServerControlFlags = golfServerControlFlags
ENDPROC
PROC SET_GOLF_MP_SERVER_CONTROL_FLAG(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS golfServerControlFlags)
serverBD.golfServerControlFlags = serverBD.golfServerControlFlags | golfServerControlFlags
ENDPROC
PROC CLEAR_GOLF_MP_SERVER_CONTROL_FLAG(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS golfServerControlFlags)
serverBD.golfServerControlFlags -= serverBD.golfServerControlFlags & golfServerControlFlags
ENDPROC
FUNC BOOL IS_GOLF_MP_SERVER_CONTROL_FLAG_SET(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS golfServerControlFlags)
RETURN (serverBD.golfServerControlFlags & golfServerControlFlags) != GCF_NO_FLAGS
ENDFUNC
//Control flag 2
PROC SET_GOLF_MP_SERVER_CONTROL_FLAG2(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS2 golfServerControlFlags2)
serverBD.golfServerControlFlags2 = serverBD.golfServerControlFlags2 | golfServerControlFlags2
ENDPROC
PROC CLEAR_GOLF_MP_SERVER_CONTROL_FLAG2(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS2 golfServerControlFlags2)
serverBD.golfServerControlFlags2 -= serverBD.golfServerControlFlags2 & golfServerControlFlags2
ENDPROC
FUNC BOOL IS_GOLF_MP_SERVER_CONTROL_FLAG_SET2(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, GOLF_CONTROL_FLAGS2 golfServerControlFlags2)
RETURN (serverBD.golfServerControlFlags2 & golfServerControlFlags2) != GCF2_NO_FLAG
ENDFUNC
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC INT GET_GOLF_MP_SERVER_CURRENT_SHOOTER_NET_INDEX(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
RETURN serverBD.iCurrentShooterNetIndex
ENDFUNC
PROC SET_GOLF_MP_SERVER_CURRENT_SHOOTER_NET_INDEX(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iCurrentShooterNetIndex)
CDEBUG1LN(DEBUG_GOLF, "Setting current player to ", iCurrentShooterNetIndex)
serverBD.iCurrentShooterNetIndex = iCurrentShooterNetIndex
ENDPROC
/// PURPOSE: Helper function to get the servers game/mission state
/// RETURNS: The server game state.
FUNC INT GET_GOLF_MP_SERVER_CURRENT_HOLE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
RETURN serverBD.iCurrentHole
ENDFUNC
PROC SET_GOLF_MP_SERVER_CURRENT_HOLE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iCurrentHole)
serverBD.iCurrentHole = iCurrentHole
ENDPROC
PROC INCREMENT_GOLF_MP_SERVER_CURRENT_HOLE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD)
serverBD.iCurrentHole++
IF serverBD.iCurrentHole > 8
serverBD.iCurrentHole = 0
ENDIF
ENDPROC
FUNC INT GET_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
RETURN 0
ENDIF
RETURN serverBD.serverScore[iPlayer].iCurrentScore
ENDFUNC
PROC SET_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer, INT iCurrentScore)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
EXIT
ENDIF
serverBD.serverScore[iPlayer].iCurrentScore = iCurrentScore
ENDPROC
PROC ADD_GOLF_MP_SERVER_PLAYER_CURRENT_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer, INT iAddScore)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
EXIT
ENDIF
serverBD.serverScore[iPlayer].iCurrentScore += iAddScore
ENDPROC
FUNC INT GET_GOLF_MP_SERVER_PLAYER_HOLE_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer, INT iHole)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
RETURN 0
ENDIF
IF iHole < 0 OR iHole >= COUNT_OF(serverBD.serverScore[].iCourseScore)
RETURN 0
ENDIF
RETURN serverBD.serverScore[iPlayer].iCourseScore[iHole].iHoleScore
ENDFUNC
PROC SET_GOLF_MP_SERVER_PLAYER_HOLE_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer, INT iHole, INT iHoleScore)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
EXIT
ENDIF
IF iHole < 0 OR iHole >= COUNT_OF(serverBD.serverScore[].iCourseScore)
EXIT
ENDIF
serverBD.serverScore[iPlayer].iCourseScore[iHole].iHoleScore = iHoleScore
ENDPROC
FUNC INT GET_GOLF_MP_SERVER_PLAYER_CURRENT_HOLE_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
RETURN 0
ENDIF
IF serverBD.iCurrentHole < 0 OR serverBD.iCurrentHole >= COUNT_OF(serverBD.serverScore[].iCourseScore)
RETURN 0
ENDIF
RETURN serverBD.serverScore[iPlayer].iCourseScore[serverBD.iCurrentHole].iHoleScore
ENDFUNC
PROC SET_GOLF_MP_SERVER_PLAYER_CURRENT_HOLE_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer, INT iHoleScore)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
EXIT
ENDIF
IF serverBD.iCurrentHole < 0 OR serverBD.iCurrentHole >= COUNT_OF(serverBD.serverScore[].iCourseScore)
EXIT
ENDIF
serverBD.serverScore[iPlayer].iCourseScore[serverBD.iCurrentHole].iHoleScore = iHoleScore
ENDPROC
PROC INCREMENT_GOLF_MP_SERVER_PLAYER_CURRENT_HOLE_SCORE(GOLF_MP_SERVER_BROADCAST_DATA &serverBD, INT iPlayer)
IF iPlayer < 0 OR iPlayer >= COUNT_OF(serverBD.serverScore)
EXIT
ENDIF
IF serverBD.iCurrentHole < 0 OR serverBD.iCurrentHole >= COUNT_OF(serverBD.serverScore[].iCourseScore)
EXIT
ENDIF
serverBD.serverScore[iPlayer].iCourseScore[serverBD.iCurrentHole].iHoleScore++
ENDPROC
FUNC BOOL GOLF_SHOULD_MP_MENUS_BE_DISABLED(GOLF_MINIGAME_STATE eGameState, GOLF_FOURSOME &thisFoursome)
IF IS_GOLF_FOURSOME_STATE_AT_END(thisFoursome)
RETURN FALSE
ENDIF
IF eGameState = GMS_OUTRO
RETURN TRUE
ENDIF
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_STATE(thisFoursome) >= GPS_BALL_IN_FLIGHT
AND GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) != HUMAN_NETWORK
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC