Files
gtav-src/script/dev_ng/singleplayer/scripts/Minigames/Tennis/tennis_client.sch
T
2025-09-29 00:52:08 +02:00

271 lines
9.3 KiB
Scheme
Executable File

USING "globals.sch"
USING "tennis_mp.sch"
USING "Net_XP_func.sch"
USING "tennis_ui.sch"
// The client broadcast data
// Everyone can read this data, only the local player only the server can update it
STRUCT TENNIS_CLIENT_BD
TENNIS_MP_STATE eMPState
TENNIS_GAME_STATE_ENUM eGameState
TENNIS_GAME_STATE_ENUM ePrevGameState
PLAYER_INDEX piCurPlayerID
enumActivityResult eResult
TENNIS_HEADSET_ENUM eMyHeadset
VECTOR vPredBallPos, vPredBallVel
TENNIS_BALL_SPIN ePredSpin
INT iControlFlags
INT iFrameStamp
INT iRallyCounter
INT iWaitStamp
INT iOutroStamp
// INT iBallUpdateStamp
INT iBallCatchupTime
LAUNCH_DETAIL_ENUM eServeGrade
FMMC_EOM_DETAILS sEndOfMission
VECTOR vForward, vRight
TENNIS_PLAYER_ID eCourtside
PED_INDEX pedClones[TENNIS_PLAYERS]
ENDSTRUCT
FUNC STRING GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( enumActivityResult eResult )
SWITCH eResult
CASE AR_playerWon RETURN "AR_playerWon"
CASE AR_playerQuit RETURN "AR_playerQuit"
CASE AR_buddyA_won RETURN "AR_buddyA_won"
ENDSWITCH
RETURN "unknown result"
ENDFUNC
PROC SET_TENNIS_CLIENT_OUTRO_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_OUTRO_STAMP :: clientBD.iOutroStamp =, ", iNewStamp)
clientBD.iOutroStamp = iNewStamp
ENDPROC
FUNC INT GET_TENNIS_CLIENT_OUTRO_STAMP(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.iOutroStamp
ENDFUNC
//PROC SET_TENNIS_CLIENT_BALL_UPDATE_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp)
// CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_BALL_UPDATE_STAMP :: iNewStamp=", iNewStamp)
// clientBD.iBallUpdateStamp = iNewStamp
//ENDPROC
//
//FUNC INT GET_TENNIS_CLIENT_BALL_UPDATE_STAMP(TENNIS_CLIENT_BD &clientBD)
// RETURN clientBD.iBallUpdateStamp
//ENDFUNC
PROC SET_TENNIS_CLIENT_BALL_CATCHUP_TIME(TENNIS_CLIENT_BD &clientBD, INT iNewTime)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_BALL_CATCHUP_TIME :: iNewTime=", iNewTime)
clientBD.iBallCatchupTime = iNewTime
ENDPROC
FUNC INT GET_TENNIS_CLIENT_BALL_CATCHUP_TIME(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.iBallCatchupTime
ENDFUNC
PROC SET_TENNIS_CLIENT_PRED_BALL_SPIN(TENNIS_CLIENT_BD & clientBD, TENNIS_BALL_SPIN eNewSpin)
clientBD.ePredSpin = eNewSpin
ENDPROC
FUNC TENNIS_BALL_SPIN GET_TENNIS_CLIENT_PRED_BALL_SPIN(TENNIS_CLIENT_BD & clientBD)
RETURN clientBD.ePredSpin
ENDFUNC
PROC SET_TENNIS_CLIENT_PRED_BALL_POS(TENNIS_CLIENT_BD & clientBD, VECTOR vNewPos)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_PRED_BALL_POS vNewPos=", vNewPos)
clientBD.vPredBallPos = vNewPos
ENDPROC
FUNC VECTOR GET_TENNIS_CLIENT_PRED_BALL_POS(TENNIS_CLIENT_BD & clientBD)
RETURN clientBD.vPredBallPos
ENDFUNC
PROC SET_TENNIS_CLIENT_PRED_BALL_VEL(TENNIS_CLIENT_BD & clientBD, VECTOR vNewVel)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_PRED_BALL_POS vNewVel=", vNewVel)
clientBD.vPredBallVel = vNewVel
ENDPROC
FUNC VECTOR GET_TENNIS_CLIENT_PRED_BALL_VEL(TENNIS_CLIENT_BD & clientBD)
RETURN clientBD.vPredBallVel
ENDFUNC
PROC SET_TENNIS_CLIENT_WAIT_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp)
CPRINTLN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_WAIT_STAMP iNewStamp=", iNewStamp)
clientBD.iWaitStamp = iNewStamp
ENDPROC
FUNC INT GET_TENNIS_CLIENT_WAIT_STAMP(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.iWaitStamp
ENDFUNC
FUNC TENNIS_HEADSET_ENUM GET_TENNIS_CLIENT_HEADSET_STATE(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.eMyHeadset
ENDFUNC
PROC SET_TENNIS_CLIENT_HEADSET_STATE(TENNIS_CLIENT_BD &clientBD, TENNIS_HEADSET_ENUM eHeadset)
CDEBUG2LN( DEBUG_TENNIS, "SET_TENNIS_CLIENT_HEADSET_STATE :: setting to ", GET_STRING_FROM_TENNIS_HEADSET_ENUM( eHeadset ), " for player ", NATIVE_TO_INT( clientBD.piCurPlayerID ) )
clientBD.eMyHeadset = eHeadset
ENDPROC
PROC SET_TENNIS_CLIENT_FLAG(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_FLAG :: Setting ", GET_STRING_FROM_TENNIS_CLIENT_FLAG(eFlag))
SET_BITMASK_AS_ENUM(clientBD.iControlFlags, eFlag)
ENDPROC
PROC CLEAR_TENNIS_CLIENT_FLAG(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag)
CDEBUG2LN(DEBUG_TENNIS, "CLEAR_TENNIS_CLIENT_FLAG :: Clearing ", GET_STRING_FROM_TENNIS_CLIENT_FLAG(eFlag))
CLEAR_BITMASK_AS_ENUM(clientBD.iControlFlags, eFlag)
ENDPROC
FUNC BOOL IS_TENNIS_CLIENT_FLAG_SET(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag)
RETURN IS_BITMASK_AS_ENUM_SET(clientBD.iControlFlags, eFlag)
ENDFUNC
/// PURPOSE:
/// Increase the client's rally counter by 1.
/// PARAMS:
/// clientBD -
PROC INCREASE_TENNIS_CLIENT_RALLY_COUNTER(TENNIS_CLIENT_BD &clientBD)
clientBD.iRallyCounter++
CPRINTLN( DEBUG_TENNIS, "INCREASE_TENNIS_CLIENT_RALLY_COUNTER called, iRallyCounter=", clientBD.iRallyCounter )
ENDPROC
/// PURPOSE:
/// Tells us whether to award bonus XP or not
/// PARAMS:
/// clientBD -
/// RETURNS:
/// TRUE If the rally counter is >= RALLY_XP_THRESHOLD
FUNC BOOL SHOULD_TENNIS_CLIENT_GET_RALLY_XP_BONUS(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.iRallyCounter >= RALLY_XP_THRESHOLD
ENDFUNC
/// PURPOSE:
/// Reset the player's rally counter to 0
/// PARAMS:
/// clientBD -
PROC RESET_TENNIS_CLIENT_RALLY_COUNTER(TENNIS_CLIENT_BD &clientBD)
CDEBUG2LN( DEBUG_TENNIS, "RESET_TENNIS_CLIENT_RALLY_COUNTER called" )
clientBD.iRallyCounter = 0
ENDPROC
/// PURPOSE:
/// Award the local player RALLY_XP_BONUS
PROC AWARD_TENNIS_CLIENT_RALLY_XP_BONUS()
INT iXPToGive = ROUND(RALLY_XP_BONUS * g_sMPTunables.fxp_tunable_Minigames_Tennis_Rally)
CPRINTLN(DEBUG_TENNIS, "AWARD_TENNIS_CLIENT_RALLY_XP_BONUS given, make sure this doesn't happen every frame, iXPToGive=", iXPToGive)
GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_TENNIS",XPTYPE_SKILL, XPCATEGORY_SKILL_TENNIS_RALLY, iXPToGive)
ENDPROC
PROC SET_TENNIS_CLIENT_SERVE_GRADE(TENNIS_CLIENT_BD &clientBD, LAUNCH_DETAIL_ENUM eServe)
clientBD.eServeGrade = eServe
ENDPROC
FUNC LAUNCH_DETAIL_ENUM GET_TENNIS_CLIENT_SERVE_GRADE(TENNIS_CLIENT_BD &clientBD)
RETURN clientBD.eServeGrade
ENDFUNC
PROC SET_TENNIS_CLIENT_ACTIVITY_RESULT(TENNIS_CLIENT_BD &clientBD, enumActivityResult eNewResult)
CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_ACTIVITY_RESULT set to ", GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( eNewResult ) )
clientBD.eResult = eNewResult
ENDPROC
FUNC enumActivityResult GET_TENNIS_CLIENT_ACTIVITY_RESULT(TENNIS_CLIENT_BD &clientBD)
CDEBUG2LN(DEBUG_TENNIS, "GET_TENNIS_CLIENT_ACTIVITY_RESULT returning ", GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( clientBD.eResult ) )
RETURN clientBD.eResult
ENDFUNC
PROC SET_TENNIS_CLIENT_FRAME_STAMP(TENNIS_CLIENT_BD &thisBD, INT iNewFrameStamp)
CPRINTLN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_FRAME_STAMP iNewFrameStamp=", iNewFrameStamp)
thisBD.iFrameStamp = iNewFrameStamp
ENDPROC
FUNC INT GET_TENNIS_CLIENT_FRAME_STAMP(TENNIS_CLIENT_BD &thisBD)
RETURN thisBD.iFrameStamp
ENDFUNC
/// PURPOSE:
/// accessor
/// PARAMS:
/// thisBD -
/// RETURNS:
///
FUNC PLAYER_INDEX GET_TENNIS_MP_PI_CUR_PLAYER_ID(TENNIS_CLIENT_BD &thisBD)
RETURN thisBD.piCurPlayerID
ENDFUNC
/// PURPOSE:
/// mutator
/// PARAMS:
/// thisBD -
/// piID -
PROC SET_TENNIS_PI_CUR_PLAYER_ID(TENNIS_CLIENT_BD &thisBD, PLAYER_INDEX piID)
thisBD.piCurPlayerID = piID
ENDPROC
/// PURPOSE:
/// accessor
/// PARAMS:
/// thisBD -
/// RETURNS:
///
FUNC TENNIS_MP_STATE GET_TENNIS_CLIENT_MP_STATE(TENNIS_CLIENT_BD &thisBD)
RETURN thisBD.eMPState
ENDFUNC
/// PURPOSE:
/// mutator
/// PARAMS:
/// thisBD -
/// newMPState -
PROC SET_TENNIS_CLIENT_MP_STATE(TENNIS_CLIENT_BD &thisBD, TENNIS_MP_STATE newTMPS)
IF thisBD.eMPState <> newTMPS
thisBD.eMPState = newTMPS
SET_TENNIS_CLIENT_WAIT_STAMP(thisBD, GET_GAME_TIMER() + ROUND(DESYNC_THRESHOLD * 1000))
CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_MP_STATE: Client Set to MP State: ", GET_STRING_FROM_TENNIS_MP_STATE(newTMPS), ", ", thisBD.eMPState)
ELSE
CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_MP_STATE: Client Already Set to MP State: ", GET_STRING_FROM_TENNIS_MP_STATE(thisBD.eMPState))
ENDIF
ENDPROC
/// PURPOSE:
/// accessor
/// PARAMS:
/// thisBD -
/// RETURNS:
///
FUNC TENNIS_GAME_STATE_ENUM GET_TENNIS_CLIENT_GAME_STATE(TENNIS_CLIENT_BD &thisBD)
RETURN thisBD.eGameState
ENDFUNC
/// PURPOSE:
/// accessor
/// PARAMS:
/// thisBD -
/// RETURNS:
///
FUNC TENNIS_GAME_STATE_ENUM GET_TENNIS_CLIENT_PREV_GAME_STATE(TENNIS_CLIENT_BD &thisBD)
RETURN thisBD.ePrevGameState
ENDFUNC
/// PURPOSE:
/// Sets the clientBD game state and changes the MP state to lockstep
/// Will not go to lockstep if it's trying to set the state to one it already wants to go to.
/// PARAMS:
/// thisBD -
/// newTGSE -
PROC SET_TENNIS_CLIENT_GAME_STATE(TENNIS_CLIENT_BD &thisBD, TENNIS_GAME_STATE_ENUM newTGSE)
IF thisBD.eGameState <> newTGSE
thisBD.ePrevGameState = thisBD.eGameState
thisBD.eGameState = newTGSE
CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_GAME_STATE: Client Requesting to go to ", GET_STRING_FROM_TENNIS_GAME_STATE(newTGSE), ", ", newTGSE)
ELSE
CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_GAME_STATE: Trying to request ", GET_STRING_FROM_TENNIS_GAME_STATE(newTGSE), ". State already requested")
ENDIF
ENDPROC