//////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : MP_Darts.sc // // AUTHOR : Lino Manansala // // DESCRIPTION : Multiplayer Darts // // // ////////////////////////////////////////////////////////////// // GUIDE // search for these and add bookmarks to make your life easier // // #SPECTATE // #NORMAL // #THROWOFF // #REALGAME // USING "net_mission.sch" USING "net_hud_activating.sch" USING "fmmc_restart_header.sch" USING "net_celebration_screen.sch" USING "Darts.sch" USING "Darts_Core.sch" USING "Darts_UI_lib.sch" USING "MP_Darts.sch" USING "MP_Darts_Client_lib.sch" USING "MP_Darts_Server_lib.sch" USING "MP_Darts_Broadcast_lib.sch" USING "Darts_Leaderboard_lib.sch" USING "fmmc_mp_setup_mission.sch" USING "achievement_public.sch" CONST_INT BASE_BULLSEYE_XP 10 // award for succesful bullseyes CONST_INT BASE_LEG_WIN_XP 50 // award for each leg win CONST_INT BASE_MATCH_WIN_XP 250 // award for a total match win CONST_INT BASE_DART_PLAY_XP 100 // award for participating INT iSelfID, iOtherID //INT iAllowSkipCutsceneTime BOOL bSoloMP BOOL bPlayerQuit STRING sFacialDictPed STRING sFacialClip[3] STRING sFacialDictPed2 STRING sFacialClip2[3] INT iNumberOfPlayers CELEBRATION_SCREEN_DATA sCelebrationData CAMERA_INDEX camEndScreen CAMERA_INDEX renderingCam CAMERA_INDEX ciDartsQuit CAMERA_INDEX camDartsSync SCRIPT_SHARD_BIG_MESSAGE shardBigMessage SCRIPT_SHARD_BIG_MESSAGE shardMidSizeMessage ENUM DART_PLAYER_POSITION DART_PLAYER_IN_POSITION, DART_PLAYER_OUT_POSITION ENDENUM #IF IS_DEBUG_BUILD BOOL bDartsNoSocialClub #ENDIF PROC PRINT_WITH_NAME_AND_TWO_NUMBERS(STRING pTextLabel, STRING PlayerName, INT FirstNumberToInsert, INT SecondNumberToInsert, INT Duration, INT Colour) Colour = Colour BEGIN_TEXT_COMMAND_PRINT(pTextLabel) // IF NOT (Colour = HUD_COLOUR_PURE_WHITE) // SET_COLOUR_OF_NEXT_TEXT_COMPONENT(Colour) // ENDIF ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(PlayerName) ADD_TEXT_COMPONENT_INTEGER(FirstNumberToInsert) ADD_TEXT_COMPONENT_INTEGER(SecondNumberToInsert) END_TEXT_COMMAND_PRINT(Duration, TRUE) ENDPROC PROC PRINT_WITH_NAME(STRING pTextLabel, STRING PlayerName, INT Duration, INT Colour) Colour = Colour BEGIN_TEXT_COMMAND_PRINT(pTextLabel) // IF NOT (Colour = HUD_COLOUR_PURE_WHITE) // SET_COLOUR_OF_NEXT_TEXT_COMPONENT(Colour) // ENDIF ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(PlayerName) END_TEXT_COMMAND_PRINT(Duration, TRUE) ENDPROC PROC PRINT_WITH_NAME_AND_NUMBER(STRING pTextLabel, STRING PlayerName, INT NumberToInsert, INT Duration, INT Colour) Colour = Colour BEGIN_TEXT_COMMAND_PRINT(pTextLabel) // IF NOT (Colour = HUD_COLOUR_PURE_WHITE) // SET_COLOUR_OF_NEXT_TEXT_COMPONENT(Colour) // ENDIF ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(PlayerName) ADD_TEXT_COMPONENT_INTEGER(NumberToInsert) END_TEXT_COMMAND_PRINT(Duration, TRUE) ENDPROC PROC PRINT_WITH_TWO_NAMES_AND_NUMBER(STRING pTextLabel, STRING FirstPlayerName, STRING SecondPlayerName, INT NumberToInsert, INT Duration, INT Colour) Colour = Colour BEGIN_TEXT_COMMAND_PRINT(pTextLabel) // IF NOT (Colour = HUD_COLOUR_PURE_WHITE) // SET_COLOUR_OF_NEXT_TEXT_COMPONENT(Colour) // ENDIF ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(FirstPlayerName) ADD_TEXT_COMPONENT_INTEGER(NumberToInsert) ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(SecondPlayerName) END_TEXT_COMMAND_PRINT(Duration, TRUE) ENDPROC PROC PRINT_WITH_TWO_NAMES_AND_TWO_NUMBERS(STRING pTextLabel, STRING FirstPlayerName, STRING SecondPlayerName, INT FirstNumberToInsert, INT SecondNumberToInsert, INT Duration, INT Colour) Colour = Colour BEGIN_TEXT_COMMAND_PRINT(pTextLabel) // IF NOT (Colour = HUD_COLOUR_PURE_WHITE) // SET_COLOUR_OF_NEXT_TEXT_COMPONENT(Colour) // ENDIF ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(FirstPlayerName) ADD_TEXT_COMPONENT_INTEGER(FirstNumberToInsert) ADD_TEXT_COMPONENT_INTEGER(SecondNumberToInsert) ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(SecondPlayerName) END_TEXT_COMMAND_PRINT(Duration, TRUE) ENDPROC /// PURPOSE: /// how many participants are actually players? rather then spectators or sctv /// PARAMS: /// bPrintDebugInfo - TRUE to show info about who's who, should not be set if this is getting called every frame /// RETURNS: /// FUNC INT NETWORK_GET_NUM_PLAYERS(DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS], BOOL bPrintDebugInfo = FALSE) INT iNumPlayers INT idx, iNumParticipants INT partID PARTICIPANT_INDEX participantID iNumParticipants = ENUM_TO_INT(DARTSMP_IDS) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "checking players, current participants = ", iNumParticipants) ENDIF // can't run a repeat method if there's only one participant, because the first participant gets id 1 // this would work if it started at 0 REPEAT iNumParticipants idx participantID = INT_TO_PARTICIPANTINDEX( idx ) IF NETWORK_IS_PARTICIPANT_ACTIVE( participantID ) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) OR DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) IF bPrintDebugInfo partID = DartsPlayerData[idx].iParticipantID CDEBUG1LN(DEBUG_DARTS, "this participant is sctv: ", DartsPlayerData[idx].iParticipantID) IF partID = idx CDEBUG1LN(DEBUG_DARTS, "partID = idx") ENDIF ENDIF ENDIF IF DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "this participant is spectator: ", DartsPlayerData[idx].iParticipantID) ENDIF ENDIF ELSE iNumPlayers++ IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "this participant is a player: ", DartsPlayerData[idx].iParticipantID) CDEBUG1LN(DEBUG_DARTS, "number of players: ", iNumPlayers) ENDIF ENDIF ENDIF ENDREPEAT RETURN iNumPlayers ENDFUNC /// PURPOSE: /// how many participants are spectators? /// PARAMS: /// bPrintDebugInfo - TRUE to show info about who's who, should not be set if this is getting called every frame /// RETURNS: /// FUNC INT NETWORK_GET_NUM_SPECTATORS(DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS], BOOL bPrintDebugInfo = FALSE) INT iNumPlayers INT idx, iNumParticipants iNumParticipants = ENUM_TO_INT(DARTSMP_IDS) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "checking spectators, current participants = ", iNumParticipants) ENDIF REPEAT iNumParticipants idx IF DARTS_CHECK_CLIENT_FLAG(DartsPlayerData[idx], DARTS_CLIENTFLAG_PARTICIPANT_SET) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(DartsPlayerData[idx].iParticipantID))) OR DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(DartsPlayerData[idx].iParticipantID))) IF DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(DartsPlayerData[idx].iParticipantID))) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "this participant is spectator: ", DartsPlayerData[idx].iParticipantID) ENDIF iNumPlayers++ ENDIF IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(DartsPlayerData[idx].iParticipantID))) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "this participant is sctv: ", DartsPlayerData[idx].iParticipantID) ENDIF iNumPlayers-- ENDIF ENDIF ENDIF ENDREPEAT RETURN iNumPlayers ENDFUNC /// PURPOSE: /// how many participants are SCTV? not as important as players or spectators, but putting in place anyway /// PARAMS: /// bPrintDebugInfo - TRUE to show info about who's who, should not be set if this is getting called every frame /// RETURNS: /// FUNC INT NETWORK_GET_NUM_SCTV(DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS], BOOL bPrintDebugInfo = FALSE) INT iNumPlayers INT idx, iNumParticipants iNumParticipants = ENUM_TO_INT(DARTSMP_IDS) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "checking SCTV, current participants = ", iNumParticipants) ENDIF REPEAT iNumParticipants idx IF DARTS_CHECK_CLIENT_FLAG(DartsPlayerData[idx], DARTS_CLIENTFLAG_PARTICIPANT_SET) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(idx))) IF bPrintDebugInfo CDEBUG1LN(DEBUG_DARTS, "this participant is sctv: ", idx) ENDIF iNumPlayers++ ENDIF ENDIF ENDREPEAT RETURN iNumPlayers ENDFUNC FUNC INT DART_GET_OTHER_PLAYERS_ID(DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS], INT & returnID) INT myPartID INT idx, iNumParticipants, iMaxParticipants PARTICIPANT_INDEX participantID myPartID = PARTICIPANT_ID_TO_INT() iMaxParticipants = ENUM_TO_INT(DARTSMP_IDS) REPEAT iMaxParticipants idx participantID = INT_TO_PARTICIPANTINDEX( idx ) IF NETWORK_IS_PARTICIPANT_ACTIVE( participantID ) AND DARTS_CHECK_CLIENT_FLAG(DartsPlayerData[idx], DARTS_CLIENTFLAG_PARTICIPANT_SET) IF NOT IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) AND NOT DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) IF myPartID <> DartsPlayerData[idx].iParticipantID returnID = DartsPlayerData[idx].iParticipantID CDEBUG1LN(DEBUG_DARTS, "the other participant is: ", returnID) ENDIF iNumParticipants++ ENDIF ENDIF ENDREPEAT CDEBUG1LN(DEBUG_DARTS, "num players seen: ", iNumParticipants) RETURN iNumParticipants ENDFUNC /// PURPOSE: /// /// PARAMS: /// DartsPlayerData - /// iReturnPlayers - /// RETURNS: /// FUNC BOOL GET_BOTH_PLAYERS_ID(DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS], INT & iReturnPlayers[DART_PLAYER_IDS]) INT idx, iMaxParticipants, iNumParticipants PARTICIPANT_INDEX participantID iMaxParticipants = ENUM_TO_INT(DARTSMP_IDS) REPEAT iMaxParticipants idx participantID = INT_TO_PARTICIPANTINDEX( idx ) IF NETWORK_IS_PARTICIPANT_ACTIVE( participantID ) AND DARTS_CHECK_CLIENT_FLAG(DartsPlayerData[idx], DARTS_CLIENTFLAG_PARTICIPANT_SET) IF NOT IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) AND NOT DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) iReturnPlayers[DartsPlayerData[idx].iOffsetPlayerID] = DartsPlayerData[idx].iParticipantID iNumParticipants++ CDEBUG1LN(DEBUG_DARTS, "found a participant") CDEBUG1LN(DEBUG_DARTS, "which one : ", DartsPlayerData[idx].iOffsetPlayerID) CDEBUG1LN(DEBUG_DARTS, "what ID: ", DartsPlayerData[idx].iParticipantID) CDEBUG1LN(DEBUG_DARTS, "num participants: ", iNumParticipants) ENDIF ENDIF ENDREPEAT IF iNumParticipants = 2 RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC PROC CLEANUP_MP_DARTS_GAME(MP_DARTS_GAME & MPDartGame, DARTS_UI & DartsUI, BOOL bRestoreUI = TRUE, BOOL bLeaveArea = FALSE, BOOL bQuitter = FALSE) CDEBUG1LN(DEBUG_DARTS, "Starting Darts cleanup procedure") IF NOT bPlayerQuit SET_ENDED_MISSION_AT_LEADERBOARD_VOTE_OR_TIME_OUT() CDEBUG1LN(DEBUG_DARTS, "dart mission ended at leaderboard or timed out ") ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID()) //FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) TASK_SWAP_WEAPON(PLAYER_PED_ID(), TRUE) IF NOT IS_ENTITY_VISIBLE(PLAYER_PED_ID()) AND NOT IS_PLAYER_SCTV(PLAYER_ID()) // B*2339942 SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) ENDIF ENDIF DISPLAY_AREA_NAME(TRUE) IF bRestoreUI AND NETWORK_IS_SIGNED_ONLINE() CDEBUG1LN(DEBUG_DARTS, "Restoring UI in Darts cleanup") DISABLE_CELLPHONE(FALSE) // SET_MP_OVERHEAD_STATS_ACTIVE(TRUE) // DISABLE_SCRIPT_HUD(HUDPART_ALL_OVERHEADS, FALSE) // ENABLE_RANK_AND_XP_BAR() // DISABLE_SCRIPT_HUD(HUDPART_RANKBAR, FALSE) ENABLE_ALL_MP_HUD() DISPLAY_RADAR(TRUE) PLAYER_INDEX broadcastIndex broadcastIndex = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(PARTICIPANT_ID_TO_INT())) CDEBUG1LN(DEBUG_DARTS, "Broadcasting darts clear to all players on team ", GET_PLAYER_TEAM(broadcastIndex)) BROADCAST_DARTS_CLEAR(broadcastIndex, GET_PLAYER_TEAM(broadcastIndex)) ENDIF IF bQuitter CLEAR_PRINTS() ENDIF // cleanup big splash text //CLEANUP_BIG_MESSAGE() CLEAR_ALL_BIG_MESSAGES() SET_BIT_FOR_FRANKIE_SAYS_ACHIEVEMENT(ACH45_DARTS) // cleanup dem darts here INT iTemp1 REPEAT NUM_DART_TURNS iTemp1 CLEANUP_DART(MPDartGame.Darts[iTemp1]) ENDREPEAT CLEANUP_BOARD(MPDartGame.dBoard) CLEANUP_RETICLE() CLEANUP_SOCIAL_CLUB_LEADERBOARD(DartsUI.dartsLB_control) IF NOT bLeaveArea CLEANUP_HUD() ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(modelDart1) // SET_MODEL_AS_NO_LONGER_NEEDED(modelDart2) SET_MODEL_AS_NO_LONGER_NEEDED(modelReticleRegular) IF (MPDartGame.iGamesWon = MPDartGame.iGamesLost) AND NOT bQuitter iTemp1 = ciFMMC_END_OF_MISSION_STATUS_CANCELLED ELIF (MPDartGame.iGamesWon > MPDartGame.iGamesLost) iTemp1 = ciFMMC_END_OF_MISSION_STATUS_PASSED ELSE iTemp1 = ciFMMC_END_OF_MISSION_STATUS_FAILED ENDIF //Clean up freemode variables IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM RESET_FMMC_MISSION_VARIABLES(TRUE, FALSE, iTemp1) ENDIF IF NETWORK_IS_SIGNED_ONLINE() AND NOT bSoloMP #IF IS_DEBUG_BUILD IF NOT bDartsNoSocialClub #ENDIF WRITE_DARTS_SCLB_DATA(LEADERBOARD_MINI_GAMES_DARTS,TRUE) #IF IS_DEBUG_BUILD ELSE CDEBUG1LN(DEBUG_DARTS, "Debug used, not uploading stats to social club") ENDIF #ENDIF ELIF bSoloMP CDEBUG1LN(DEBUG_DARTS, "soloMP, no leaderboard write") ENDIF IF MPGlobals.DartsData.bResultsDisplayed MPGlobals.DartsData.bResultsDisplayed = FALSE ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) RELEASE_SCRIPT_AUDIO_BANK() SET_CELEBRATION_SCREEN_AS_ACTIVE(FALSE) CLEANUP_CELEBRATION_SCREEN(sCelebrationData) CDEBUG1LN(DEBUG_DARTS, "All Cleaned Up") // IF IS_SCREEN_FADED_OUT() // DO_SCREEN_FADE_IN(2000) // ENDIF CLEANUP_DARTS_PC_CONTROLS() //gdisablerankupmessage = FALSE SET_DISABLE_RANK_UP_MESSAGE(FALSE) SET_ON_JOB_INTRO(FALSE) IF DOES_CAM_EXIST(renderingCam) IF IS_CAM_ACTIVE(renderingCam) SET_CAM_ACTIVE(renderingCam, FALSE) ENDIF DESTROY_CAM(renderingCam) ENDIF IF DOES_CAM_EXIST(ciDartsQuit) IF IS_CAM_ACTIVE(ciDartsQuit) SET_CAM_ACTIVE(ciDartsQuit, FALSE) ENDIF DESTROY_CAM(ciDartsQuit) ENDIF IF DOES_CAM_EXIST(camDartsSync) IF IS_CAM_ACTIVE(camDartsSync) SET_CAM_ACTIVE(camDartsSync, FALSE) ENDIF DESTROY_CAM(camDartsSync) ENDIF IF DOES_CAM_EXIST(camEndScreen) IF IS_CAM_ACTIVE(camEndScreen) SET_CAM_ACTIVE(camEndScreen, FALSE) ENDIF DESTROY_CAM(camEndScreen) ENDIF TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS() ENDPROC /// PURPOSE: /// Grab the necessary assets for Darts PROC REQUEST_STREAMS(DARTS_SCOREBOARD & DartsSB) REQUEST_MODEL(modelDart1) // REQUEST_MODEL(modelDart2) REQUEST_MODEL(modelReticleRegular) REQUEST_STREAMED_TEXTURE_DICT("Darts") REQUEST_ANIM_DICT("mini@darts") REQUEST_ANIM_DICT(sFacialDictPed) REQUEST_ANIM_DICT(sFacialDictPed2) REQUEST_ANIM_DICT("mini@dartsintro_alt1") REQUEST_ANIM_DICT("mini@dartsoutro") DartsSB.siScoreBoard = REQUEST_SCALEFORM_MOVIE("darts_scoreboard") shardBigMessage.siMovie = REQUEST_MG_BIG_MESSAGE() shardMidSizeMessage.siMovie = REQUEST_MG_MIDSIZED_MESSAGE() // REQUEST_CELEBRATION_SCREEN(sCelebrationData) REQUEST_ADDITIONAL_TEXT("DARTS", MINIGAME_TEXT_SLOT) ENDPROC /// PURPOSE: /// Asset loading checker /// RETURNS: /// TRUE if all the needed assets have loaded FUNC BOOL HAVE_STREAMS_LOADED(DARTS_SCOREBOARD & DartsSB) // IF NOT LOAD_MENU_ASSETS() // CDEBUG1LN(DEBUG_DARTS, "Menu assets loading") // RETURN FALSE // ENDIF IF NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\DARTS") CDEBUG1LN(DEBUG_DARTS, "Darts Audio loading") RETURN FALSE ENDIF IF NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FAMILY1_2") CDEBUG1LN(DEBUG_DARTS, "Family Audio loading") RETURN FALSE ENDIF IF NOT REQUEST_SCRIPT_AUDIO_BANK("HUD_AWARDS") CDEBUG1LN(DEBUG_DARTS, "HUD_AWARDS Audio loading") RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(modelDart1) CDEBUG1LN(DEBUG_DARTS, "modelDart1 loading") RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(modelReticleRegular) CDEBUG1LN(DEBUG_DARTS, "modelReticleRegular loading") RETURN FALSE ENDIF IF NOT HAS_SCALEFORM_MOVIE_LOADED(DartsSB.siScoreBoard) CDEBUG1LN(DEBUG_DARTS, "DartsSB.siScoreBoard loading") RETURN FALSE ENDIF IF NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT) CDEBUG1LN(DEBUG_DARTS, "MINIGAME_TEXT_SLOT loading") RETURN FALSE ENDIF IF NOT HAS_ANIM_DICT_LOADED("mini@darts") CDEBUG1LN(DEBUG_DARTS, "mini@darts loading") RETURN FALSE ENDIF IF NOT HAS_ANIM_DICT_LOADED(sFacialDictPed) CDEBUG1LN(DEBUG_DARTS, "sFacialDictPed loading") RETURN FALSE ENDIF IF NOT HAS_ANIM_DICT_LOADED(sFacialDictPed2) CDEBUG1LN(DEBUG_DARTS, "sFacialDictPed2 loading") RETURN FALSE ENDIF IF NOT HAS_ANIM_DICT_LOADED("mini@dartsintro_alt1") CDEBUG1LN(DEBUG_DARTS, "mini@dartsintro_alt1 loading") RETURN FALSE ENDIF IF NOT HAS_ANIM_DICT_LOADED("mini@dartsoutro") CDEBUG1LN(DEBUG_DARTS, "mini@dartsoutro loading") RETURN FALSE ENDIF IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("Darts") CDEBUG1LN(DEBUG_DARTS, "Darts streamed texture dict loading") RETURN FALSE ENDIF // IF NOT HAS_CELEBRATION_SCREEN_LOADED(sCelebrationData) // CDEBUG1LN(DEBUG_DARTS, "Celebration data loading") // RETURN FALSE // ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Do necessary pre game start ini. /// RETURNS: /// FALSE if the script fails to receive an initial network broadcast. FUNC BOOL DARTS_NETWORK_INIT(MP_MISSION_DATA & missionScriptArgs, DARTS_SERVER_BROADCAST_DATA & DartsServerData, DARTS_PLAYER_BROADCAST_DATA & DartsPlayerData[DARTSMP_IDS]) CLEAR_HELP() // This marks the script as a net script, and handles any instancing setup. IF missionScriptArgs.mdID.idMission <> eAM_DARTS CDEBUG1LN(DEBUG_DARTS, "Changing missionScriptArgs.mdID.idMission to eAM_DARTS...") missionScriptArgs.mdID.idMission = eAM_DARTS ENDIF //If we are in freemode launch diffrently IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM CDEBUG1LN(DEBUG_DARTS, "Set this script as a network script with 2 players. FM VERSION") //Freemode mission start details INT iPlayerMissionToLoad = FMMC_MINI_GAME_CREATOR_ID INT iMissionVariation = 0 INT iNumberPlayers = ENUM_TO_INT(DARTSMP_IDS)//2 //Call the function that controls the setting up of this script FMMC_PROCESS_PRE_GAME_COMMON(missionScriptArgs, iPlayerMissionToLoad, iMissionVariation, iNumberPlayers) GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].iCurrentMissionType = FMMC_TYPE_MG_DARTS //Script has started set the global broadcast data up so every body knows SET_FM_MISSION_LAUNCHED_SUCESS(missionScriptArgs.mdID.idCreator, missionScriptArgs.mdID.idVariation, missionScriptArgs.iInstanceId) //If we are not in freemode deal with it normally ELSE CDEBUG1LN(DEBUG_DARTS, "Set this script as a network script with 2 players. CNC VERSION") SETUP_MP_MISSION_FOR_NETWORK(GET_MAX_NUM_PARTICIPANTS_FOR_MP_MISSION(missionScriptArgs.mdID.idMission), missionScriptArgs) //NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(2, FALSE) // This makes sure the net script is active, waits untull it is. HANDLE_NET_SCRIPT_INITIALISATION() RESERVE_NETWORK_MISSION_OBJECTS(5)//8) // TODO: just the dart board? // This script will not be paused if another script calls PAUSE_GAME SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE) ENDIF //These are common to all modes NETWORK_REGISTER_HOST_BROADCAST_VARIABLES(DartsServerData, SIZE_OF(DartsServerData)) NETWORK_REGISTER_PLAYER_BROADCAST_VARIABLES(DartsPlayerData, SIZE_OF(DartsPlayerData)) iSelfID = PARTICIPANT_ID_TO_INT() CDEBUG1LN(DEBUG_DARTS, "*********ID Check********************") CDEBUG1LN(DEBUG_DARTS, "* iSelfID = ", iSelfID) CDEBUG1LN(DEBUG_DARTS, "*************************************") IF DID_I_JOIN_MISSION_AS_SPECTATOR() OR IS_PLAYER_SCTV(PLAYER_ID()) iSelfID = PARTICIPANT_ID_TO_INT() CDEBUG1LN(DEBUG_DARTS, "*********ID Check********************") CDEBUG1LN(DEBUG_DARTS, "* iSelfID = ", iSelfID) CDEBUG1LN(DEBUG_DARTS, "*************************************") IF DID_I_JOIN_MISSION_AS_SPECTATOR() CDEBUG1LN(DEBUG_DARTS, "FTR THIS IS STARTING AS SPECTATOR") DARTS_SET_CLIENT_FLAG(DartsPlayerData[iSelfID], DARTS_CLIENTFLAG_I_AM_SPECTATOR) ENDIF IF IS_PLAYER_SCTV(PLAYER_ID()) CDEBUG1LN(DEBUG_DARTS, "FTR THIS IS STARTING AS SCTV") DARTS_SET_CLIENT_FLAG(DartsPlayerData[iSelfID], DARTS_CLIENTFLAG_I_AM_SCTV) DARTS_CLEAR_CLIENT_FLAG(DartsPlayerData[iSelfID], DARTS_CLIENTFLAG_I_AM_SPECTATOR) ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "FTR THIS IS NOT SPECTATING") ENDIF DARTS_SET_PLAYER_MP_STATE(DartsPlayerData[iSelfID], DARTS_MPSTATE_WAIT_PRE_INIT) IF NETWORK_IS_HOST_OF_THIS_SCRIPT() DARTS_SET_SERVER_MP_STATE(DartsServerData, DARTS_MPSTATE_INIT) //DartsServerData.iMatchHistoryID = PLAYSTATS_CREATE_MATCH_HISTORY_ID() PLAYSTATS_CREATE_MATCH_HISTORY_ID_2(DartsServerData.iMatchType, DartsServerData.iMatchHistoryID) ENDIF // 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() RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL SHOULD_DARTS_LEVEL_HELP_SHOW(INT iNumGames, INT & iBitToSet) IF iNumGames >= 10 IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_MP_LVL_UP_SHWN) iBitToSet = gDARTS_MP_LVL_UP_SHWN RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // take in a vector from the other player, and your own darts // Draw the sprite reticle at that point // Sprite reticle has to be different color, so make sure a function is ready for that PROC DARTS_DRAW_PLAYERS_RETICLE(VECTOR vReticlePos, INT iDartPlayerID, BOOL bWatching = FALSE) spriteReticle.x = vReticlePos.x spriteReticle.y = vReticlePos.y IF iDartPlayerID = 0 // color - blue spriteReticle.r = 255 spriteReticle.g = 255 spriteReticle.b = 255 ELIF iDartPlayerID = 1 // color - red spriteReticle.r = 255 spriteReticle.g = 255 spriteReticle.b = 255 ELSE // color - white spriteReticle.r = 255 spriteReticle.g = 250 spriteReticle.b = 255 ENDIF IF bWatching //DRAW_2D_SPRITE("MPCharCard", "MP_CharCard_Stats_Icons5", spriteReticle) ENDIF ENDPROC PROC COPY_DART_TO_LOCAL(DART & localDart, DARTS_PLAYER_BROADCAST_DATA & thatPlayerData, INT iOtherPlayerID = 0) localDart.vPosition = thatPlayerData.ClientDart.vPosition localDart.vThrow = thatPlayerData.ClientDart.vThrow localDart.vTarget = thatPlayerData.ClientDart.vTarget localDart.vRotation = thatPlayerData.ClientDart.vRotation localDart.vOffsetTarget = thatPlayerData.ClientDart.vOffsetTarget localDart.bStuck = thatPlayerData.ClientDart.bStuck localDart.bTravelling = thatPlayerData.ClientDart.bTravelling MODEL_NAMES otherDart otherDart = modelDart1 iOtherPlayerID = iOtherPlayerID // // IF iOtherPlayerID = 0 // otherDart = modelDart1 // CDEBUG1LN(DEBUG_DARTS, "**********PROP_DART_1 registered**********") // ELSE // otherDart = modelDart2 // CDEBUG1LN(DEBUG_DARTS, "**********PROP_DART_2 registered**********") // ENDIF CDEBUG1LN(DEBUG_DARTS, "**********localDart.vTarget = ", localDart.vTarget) CDEBUG1LN(DEBUG_DARTS, "**********localDart.vOffsetTarget = ", localDart.vOffsetTarget) CDEBUG1LN(DEBUG_DARTS, "**********localDart.vThrow = ", localDart.vThrow) localDart.object = CREATE_OBJECT(otherDart, vInitDartPos, FALSE, FALSE) ENDPROC FUNC BOOL DARTS_PLAYER_QUIT_CONTROL(DARTS_PLAYER_BROADCAST_DATA & playerData, DARTS_UI & DartsUI, INT & iDebugThrottle) IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) AND NOT IS_PAUSE_MENU_ACTIVE() IF NOT DARTS_CHECK_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DARTS_SET_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) CLEAR_HELP() ENDIF ENDIF IF DARTS_CHECK_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DEBUG_MESSAGE_PERIODIC("CLIENT DARTS_MPSTATE_LEAVE", iDebugThrottle) DARTS_QUIT_UI(DartsUI) IF NOT IS_PAUSE_MENU_ACTIVE() IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) CLEAR_PRINTS() DARTS_SET_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_CONFIRMED) bPlayerQuit = TRUE RETURN TRUE ENDIF IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_QUITUI, FALSE) DARTS_CLEAR_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL DARTS_PLAYER_QUIT_CONTROL_SPECTATOR(DARTS_PLAYER_BROADCAST_DATA & playerData, DARTS_UI & DartsUI, INT & iDebugThrottle) IF DARTS_CHECK_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DEBUG_MESSAGE_PERIODIC("CLIENT DARTS_MPSTATE_LEAVE", iDebugThrottle) DARTS_QUIT_UI(DartsUI) IF NOT IS_PAUSE_MENU_ACTIVE() IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) CLEAR_PRINTS() bPlayerQuit = TRUE RETURN TRUE ENDIF IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_QUITUI, FALSE) DARTS_CLEAR_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) ENDIF ENDIF ELSE IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) AND NOT IS_PAUSE_MENU_ACTIVE() IF NOT DARTS_CHECK_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DARTS_SET_CLIENT_FLAG(playerData, DARTS_CLIENTFLAG_QUIT_ATTEMPTED) CLEAR_HELP() ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC CONST_FLOAT fBoard_offsetZ -0.7744 #IF IS_DEBUG_BUILD USING "shared_debug.sch" BOOL bDangerZoneOccupied BOOL bWinDartsGame BOOL bTurnOffShakes PROC ADD_AM_DART_WIDGETS() START_WIDGET_GROUP("AM_DARTS") ADD_WIDGET_BOOL("Occupy Danger Zone", bDangerZoneOccupied) ADD_WIDGET_BOOL("Win Game", bWinDartsGame) ADD_WIDGET_BOOL("Turn off shake", bTurnOffShakes) STOP_WIDGET_GROUP() ENDPROC PROC PROCESS_WIDGETS(DARTS_SERVER_BROADCAST_DATA & ServerData) IF NETWORK_IS_HOST_OF_THIS_SCRIPT() IF bDangerZoneOccupied ServerData.bDangerZoneOccupied = TRUE ELSE ServerData.bDangerZoneOccupied = FALSE ENDIF IF bWinDartsGame ServerData.bDoWinning = TRUE bWinDartsGame = FALSE ENDIF ENDIF IF bTurnOffShakes fWobbleFactor = 0.0 fRealWobFactor = 0.0 ENDIF ENDPROC #ENDIF FUNC BOOL DARTS_TUTORIAL(DARTS_TUTORIAL_STAGE & DartsTutorialStage, DARTS_BOARD & DartsBoard, DARTS_AI_BRAIN & AIBrain, DARTS_PLAYER_STATE & TurnStage, DART & TutorialDarts[], structTimer & TutorialTimer, DARTS_PLAYER_BROADCAST_DATA & playerData[]) // IF HANDLE_SKIP_CUTSCENE(iAllowSkipCutsceneTime) // DartsTutorialStage = TS_SKIP // ENDIF // IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() // IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_SKIP) // DARTS_SET_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_SKIP) // ELSE // DARTS_CLEAR_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_SKIP) // ENDIF // ENDIF IF DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_SKIP) AND DARTS_CHECK_CLIENT_FLAG(playerData[iOtherID], DARTS_CLIENTFLAG_TUTORIAL_SKIP) DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE DartsTutorialStage = TS_SKIP ENDIF SWITCH DartsTutorialStage CASE TS_THROWING //iAllowSkipCutsceneTime = GET_GAME_TIMER() RESTART_TIMER_NOW(TutorialTimer) DISPLAY_RADAR(FALSE) DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_THROWING), GET_TUTORIAL_CAM_ROT_OFFSET(), 0, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() CDEBUG1LN(DEBUG_DARTS, "[DARTS_MPSTATE_TUTORIAL] fade in called for") DO_SCREEN_FADE_IN(500) ENDIF CDEBUG1LN(DEBUG_DARTS, "Finished TS_THROWING") DartsTutorialStage = TS_DART_LANDING BREAK CASE TS_DART_LANDING SWITCH iTurn CASE 0 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 1.0 PRINT_HELP("DARTS_HOW_TO_2") RESTART_TIMER_NOW(TutorialTimer) iTurn++ ENDIF BREAK CASE 1 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 2.0 IF TurnStage = DPS_AIM AIBrain.iThrowValue = 20 AIBrain.iThrowMultiplier = 3 GET_AI_THROW_VECTOR(TutorialDarts[0], DartsBoard, TurnStage, AIBrain, TRUE) ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[0], DartsBoard) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) iTurn++ RESTART_TIMER_NOW(TutorialTimer) TurnStage = DPS_AIM ENDIF ENDIF ENDIF BREAK CASE 2 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 PRINT_HELP("DARTS_HOW_TO_3") RESTART_TIMER_NOW(TutorialTimer) iTurn++ ENDIF BREAK CASE 3 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 2.0 IF TurnStage = DPS_AIM AIBrain.iThrowValue = 50 AIBrain.iThrowMultiplier = 1 GET_AI_THROW_VECTOR(TutorialDarts[1], DartsBoard, TurnStage, AIBrain, TRUE) ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[1], DartsBoard) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) RESTART_TIMER_NOW(TutorialTimer) TurnStage = DPS_AIM iTurn++ ENDIF ENDIF ENDIF BREAK CASE 4 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 PRINT_HELP("DARTS_HOW_3A") RESTART_TIMER_NOW(TutorialTimer) iTurn++ ENDIF BREAK CASE 5 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 2.0 IF TurnStage = DPS_AIM AIBrain.iThrowValue = 20 AIBrain.iThrowMultiplier = 2 GET_AI_THROW_VECTOR(TutorialDarts[2], DartsBoard, TurnStage, AIBrain, TRUE) CDEBUG1LN(DEBUG_DARTS, "*****************Got the last Throw Vector") ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[2], DartsBoard) RESTART_TIMER_NOW(TutorialTimer) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) CDEBUG1LN(DEBUG_DARTS, "*****************Threw the last Dart") TurnStage = DPS_AIM DartsTutorialStage = TS_DOUBLE ENDIF ENDIF ENDIF BREAK ENDSWITCH BREAK CASE TS_DOUBLE IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 RESTART_TIMER_NOW(TutorialTimer) CLEAR_HELP() DARTS_TUTORIAL_CAM_INTERP(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DOUBLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1500) //HELP_AT_ENTITY_OFFSET("DARTS_DOUBLE_T", DartGame.TutorialDarts[0].object, << 0, 0, -0.85 >>) DartsTutorialStage = TS_TRIPLE CDEBUG1LN(DEBUG_DARTS, "Leaving TS_DOUBLE") ENDIF BREAK CASE TS_TRIPLE IF NOT IS_CAM_INTERPOLATING(camTutInterp) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DOUBLE_T") PRINT_HELP("DARTS_DOUBLE_T") //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_DOUBLE_T") // HELP_AT_ENTITY_OFFSET("DARTS_DOUBLE_T", DartGame.TutorialDarts[0].object, << 0, 0, -0.85 >>) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 RESTART_TIMER_NOW(TutorialTimer) DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_TRIPLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) //HELP_AT_ENTITY("DARTS_TRIPLE_T", DartGame.TutorialDarts[0].object) //CLEAR_THIS_FLOATING_HELP("DARTS_DOUBLE_T") DartsTutorialStage = TS_BULLSEYE CDEBUG1LN(DEBUG_DARTS, "Leaving TS_TRIPLE") ENDIF BREAK CASE TS_BULLSEYE IF NOT IS_CAM_INTERPOLATING(camTutorial) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_TRIPLE_T") PRINT_HELP("DARTS_TRIPLE_T") //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_TRIPLE_T") // HELP_AT_ENTITY("DARTS_TRIPLE_T", DartGame.TutorialDarts[0].object) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 RESTART_TIMER_NOW(TutorialTimer) DARTS_TUTORIAL_CAM_INTERP(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_BULLSEYE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) //HELP_AT_ENTITY("DARTS_BULL_T", DartGame.TutorialDarts[1].object) //CLEAR_THIS_FLOATING_HELP("DARTS_TRIPLE_T") DartsTutorialStage = TS_DBL_TO_WIN CDEBUG1LN(DEBUG_DARTS, "Leaving TS_BULLSEYE") ENDIF BREAK CASE TS_DBL_TO_WIN IF NOT IS_CAM_INTERPOLATING(camTutInterp) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_BULL_T") PRINT_HELP("DARTS_BULL_T") //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_BULL_T") // HELP_AT_ENTITY("DARTS_BULL_T", DartGame.TutorialDarts[1].object) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 RESTART_TIMER_NOW(TutorialTimer) DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DBL_TO_WIN), GET_TUTORIAL_CAM_ROT_OFFSET(), 1500) //HELP_AT_ENTITY("DARTS_DBL_WIN", DartGame.TutorialDarts[2].object) //CLEAR_THIS_FLOATING_HELP("DARTS_BULL_T") DartsTutorialStage = TS_ENDING CDEBUG1LN(DEBUG_DARTS, "Leaving TS_DBL_TO_WIN") ENDIF BREAK CASE TS_ENDING IF NOT IS_CAM_INTERPOLATING(camTutorial) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DBL_WIN") PRINT_HELP("DARTS_DBL_WIN") //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_DBL_WIN") // HELP_AT_ENTITY("DARTS_DBL_WIN", DartGame.TutorialDarts[2].object) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 //TIMERA() > 6000 SET_CAM_ACTIVE_WITH_INTERP(camDartGame, camTutorial, 1500) //CLEAR_THIS_FLOATING_HELP("DARTS_DBL_WIN") DartsTutorialStage = TS_ENDING2 CDEBUG1LN(DEBUG_DARTS, "Leaving TS_ENDING") ENDIF BREAK CASE TS_ENDING2 IF NOT IS_CAM_INTERPOLATING(camDartGame) iTurn = 0 CLEAR_HELP() CLEAR_PRINTS() CLEAR_ALL_FLOATING_HELP() INT i REPEAT NUM_DART_TURNS i CLEANUP_DART(TutorialDarts[i]) ENDREPEAT RETURN TRUE ENDIF BREAK CASE TS_SKIP IF IS_SCREEN_FADED_OUT() iTurn = 0 CLEAR_HELP() CLEAR_PRINTS() CLEAR_ALL_FLOATING_HELP() INT i REPEAT NUM_DART_TURNS i CLEANUP_DART(TutorialDarts[i]) ENDREPEAT SET_CAM_ACTIVE(camDartGame, TRUE) //DO_SCREEN_FADE_IN(500) RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC DARTS_SETUP_MP_QUIT_CAM() IF NOT DOES_CAM_EXIST(ciDartsQuit) ciDartsQuit = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<0,0,0>>, <<0,0,0>>) ENDIF SET_CAM_COORD(ciDartsQuit, <<1993.8000, 3049.7000, 47.8000>>) SET_CAM_ROT(ciDartsQuit, <<5.8000, -0.0000, 55.6000>>) SET_CAM_FOV(ciDartsQuit, 50.0) SET_CAM_ACTIVE(ciDartsQuit, TRUE) ENDPROC /// PURPOSE: /// takes off high heels, ONLY USE FOR CLONED PEDS /// PARAMS: /// dartPed - one of the players PROC DARTS_TAKE_OFF_HIGH_HEELS(PED_INDEX & dartPed) SET_PED_COMPONENT_VARIATION(dartPed, PED_COMP_FEET, 1, 0) ENDPROC FUNC BOOL IS_DARTS_GAME_ALMOST_DONE(DARTS_SERVER_BROADCAST_DATA & ServerData, DARTS_PLAYER_BROADCAST_DATA & PlayerData[]) BOOL bGameAlmostDone // sets and legs are both 1, score is at least < 100 // sets > 1, set amount is greater then set max * 66% // sets = 1, leg amount is greater then leg max * 66% IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF ((serverData.iNumLegs = 1 AND serverData.iNumSets = 1) AND (ServerData.iScores[iSelfID] < 101 OR ServerData.iScores[iOtherID] < 101)) OR ( serverData.iNumSets > 1 AND (serverData.iSets[iSelfID] >= FLOOR(serverData.iNumSets * 0.66) OR serverData.iSets[iOtherID] >= FLOOR(serverData.iNumSets * 0.66)) ) OR ( serverData.iNumLegs > 1 AND (serverData.iLegs[iSelfID] >= FLOOR(serverData.iNumLegs * 0.33) OR serverData.iLegs[iOtherID] >= FLOOR(serverData.iNumLegs * 0.33)) ) CDEBUG1LN(DEBUG_DARTS, "dart game is almost done") bGameAlmostDone = TRUE ELSE CDEBUG1LN(DEBUG_DARTS, "dart game is NOT almost done") ENDIF CDEBUG1LN(DEBUG_DARTS, "serverData.iNumLegs = ", serverData.iNumLegs) CDEBUG1LN(DEBUG_DARTS, "serverData.iNumSets = ", serverData.iNumSets) CDEBUG1LN(DEBUG_DARTS, "serverData.iSets[iSelfID] = ", serverData.iSets[iSelfID]) CDEBUG1LN(DEBUG_DARTS, "serverData.iSets[iOtherID] = ", serverData.iSets[iOtherID]) CDEBUG1LN(DEBUG_DARTS, "serverData.iLegs[iSelfID] = ", serverData.iLegs[iSelfID]) CDEBUG1LN(DEBUG_DARTS, "serverData.iLegs[iOtherID] = ", serverData.iLegs[iOtherID]) CDEBUG1LN(DEBUG_DARTS, "serverData.iScores[iSelfID] = ", serverData.iScores[iSelfID]) CDEBUG1LN(DEBUG_DARTS, "serverData.iScores[iOtherID] = ", serverData.iScores[iOtherID]) ENDIF RETURN bGameAlmostDone ENDFUNC PROC DARTS_DISPLAY_SPECIAL_SPLASH_MP_SHARD(DARTS_UI & DartsUI) IF DartsUI.bTriggerSplash IF DartsUI.eSplashStage = DARTSSPLASHSTAGE_DONE DartsUI.eSplashStage = DARTSSPLASHSTAGE_INIT ENDIF DartsUI.bTriggerSplash = FALSE ENDIF SWITCH DartsUI.eSplashStage CASE DARTSSPLASHSTAGE_INIT SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, DARTS_GET_SPLASH_STRING(DartsUI.eWhichSplash), "", 2000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) DartsUI.eSplashStage = DARTSSPLASHSTAGE_DISPLAY BREAK CASE DARTSSPLASHSTAGE_DISPLAY IF NOT UPDATE_SHARD_BIG_MESSAGE(shardMidSizeMessage, FALSE) RESET_SHARD_BIG_MESSAGE(shardMidSizeMessage) DartsUI.eSplashStage = DARTSSPLASHSTAGE_DONE ENDIF BREAK CASE DARTSSPLASHSTAGE_DONE // nada BREAK ENDSWITCH ENDPROC PROC DARTS_MAINTAIN_REALTIME_MP(DARTS_MP_STATE eMPState) IF eMPState < DARTS_MPSTATE_IN_PROGRESS NETWORK_DISABLE_REALTIME_MULTIPLAYER() ENDIF ENDPROC SCRIPT (MP_MISSION_DATA missionScriptArgs) MP_DARTS_GAME MPDartGame DARTS_ARGS Args DARTS_STARTING_RETICLE_POS DartsInitReticlePos DARTS_PLAYER_POS DartsPlayerPos DARTS_MP_TERMINATE_REASON terminateReason DARTS_MP_LEAVE_STATE leaveState DARTS_SCOREBOARD DartsSB DARTS_UI DartsUI DARTS_TIMER localDartsTimer //for use with the rematch/quit clock DART_PLAYER_POSITION DartPlayerPosition DARTS_LOCATION DartsLocation DARTS_TUTORIAL_STAGE DartsTutorialStage DARTS_AI_BRAIN AIBrain DARTS_PLAYER_STATE TurnStage = DPS_AIM //DART TutorialDarts[3] DARTS_MP_STATE eSpecState = DARTS_MPSTATE_INIT DARTS_MP_WAIT_STAGE eSpecWaitStage DARTS_MP_TURN_STATUS eSpecTurnStatus //END_SCREEN_DATASET_TITLE_UPDATE DartsEndScreen GAMER_HANDLE DartsGamerHandle[NUM_DART_PLAYERS] SCRIPT_TIMER timeDartsAwardFailSafe structTimer controlTimer structTimer ReThrowTimer structTimer TutorialTimer structTimer SpectateGateTimer structTimer endDelay // FMMC_EOM_DETAILS sEndOfMission // PLAYER_CURRENT_STATUS_COUNTS sPlayerCounts GENERIC_MINIGAME_STAGE eGenericMGStage = GENERIC_CELEBRATION_WINNER PLAYER_INDEX winningPlayer PLAYER_INDEX broadcastIndex SEQUENCE_INDEX siTemp PED_INDEX piOtherPlayer //PED_INDEX piOpponentClone PED_INDEX piPlayerClones[2] OBJECT_INDEX oiDartChallenge VECTOR vPlayerCoord VECTOR vCamCoord VECTOR vPlayerCurrentPos VECTOR vHickBar //, vRockClub //, vLostHideout //VECTOR vTemp VECTOR vSpectatePos = <<1993.2574, 3044.2151, 46.2151>>//<<1995.5557, 3047.5154, 46.2153>> VECTOR scenePosition VECTOR sceneRotation INT i, j INT iSplashStage INT iDebugThrottle INT iStaminaXP INT iLevelBit INT iBullseyeXP INT iXPGained INT iXPToGive INT iBetWinnings INT iNumParticipants INT iLastNumParticipants INT iNumPlayers INT iLastNumPlayers //for use by spectators / sctv INT iSpectatePlayerID[DART_PLAYER_IDS] INT iSpecTurn INT iSpecThower INT iSpecLastScore[DART_PLAYER_IDS] INT iSceneId FLOAT fStaminaPercentage FLOAT fSteadyShotLength FLOAT fSpectateHeading = 42.3856 BOOL bFoundPlayer BOOL bAlreadyInGangHouse BOOL bWaitUIShown // TODO: CONVERT TO FLAG SYSTEM BOOL bBoardTakenUIShown // TODO: CONVERT TO FLAG SYSTEM BOOL bInWinRange BOOL bWaitUIShow BOOL bShowSplash BOOL bShowShotClockThrowHelp BOOL bSpecResetDone BOOL bCheckPlayers BOOL bPlaySplashFX BOOL bPhaseGrabbed TEXT_LABEL_7 sCrewTags[NUM_DART_PLAYERS] TEXT_LABEL_63 sShardPlayerName TEXT_LABEL_23 contentID STRING sDartsPlayerNames[NUM_DART_PLAYERS] STRING sOutroWin[3] STRING sOutroLoss[3] STRING sOutroCam[3] sOutroWin[0] = "darts_outro_01_guy1" sOutroWin[1] = "darts_outro_02_guy2" sOutroWin[2] = "darts_outro_03_guy2" sOutroLoss[0] = "darts_outro_01_guy2" sOutroLoss[1] = "darts_outro_02_guy1" sOutroLoss[2] = "darts_outro_03_guy1" sOutroCam[0] = "darts_outro_01_cam" sOutroCam[1] = "darts_outro_02_cam" sOutroCam[2] = "darts_outro_03_cam" sFacialDictPed = "facials@gen_male@variations@happy" sFacialDictPed2 = "facials@gen_male@variations@angry" sFacialClip[0] = "mood_happy_1" sFacialClip[1] = "mood_happy_2" sFacialClip[2] = "mood_happy_3" sFacialClip2[0] = "mood_angry_1" sFacialClip2[1] = "mood_angry_2" sFacialClip2[2] = "mood_angry_3" vHickBar = <<1992.293213,3050.582764,47.989731>> //vRockClub = <<-572.040649,294.195770,79.937401>> // uncomment this to reset flags //g_iDartsTutorialFlags = 0 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // IF GET_PLAYER_DISTANCE_FROM_LOCATION(vRockClub) < GET_PLAYER_DISTANCE_FROM_LOCATION(vHickBar) // DartsLocation = DARTSLOCATION_ROCK_CLUB // Args.vDartBoard = vRockClub // Args.fBoardHeading = -4.999956 // CDEBUG1LN(DEBUG_DARTS, "Darts game started at Rock Club") // ELSE DartsLocation = DARTSLOCATION_HICK_BAR Args.vDartBoard = vHickBar Args.fBoardHeading = 57.783146 CDEBUG1LN(DEBUG_DARTS, "Darts game started at Hick Bar") // ENDIF ENDIF // IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(Args.vDartBoard, 5.0, PROP_DART_BD_CAB_01) // Args.oiDartBoard = GET_CLOSEST_OBJECT_OF_TYPE(Args.vDartBoard, 5.0, PROP_DART_BD_CAB_01) // GET_COORDS_AND_ROTATION_OF_CLOSEST_OBJECT_OF_TYPE(Args.vDartBoard, 5.0, PROP_DART_BD_CAB_01, Args.vDartBoard, vTemp, EULER_XYZ) // Args.fBoardHeading = vTemp.z // CDEBUG1LN(DEBUG_DARTS, "PROP_DART_BD_CAB_01 found in area.") // CDEBUG1LN(DEBUG_DARTS, "Args.vDartBoard is now ", Args.vDartBoard) // CDEBUG1LN(DEBUG_DARTS, "Args.fBoardHeading is now ", Args.fBoardHeading) // ELSE // CDEBUG1LN(DEBUG_DARTS, "PROP_DART_BD_CAB_01 not found in area of Darts Args.") // ENDIF SETUP_DARTS_PC_CONTROLS() MPGlobals.DartsData.bDartsPlayBusy = FALSE bShowSplash = FALSE DARTS_SERVER_BROADCAST_DATA ServerData DARTS_PLAYER_BROADCAST_DATA PlayerData[DARTSMP_IDS]//[DART_PLAYER_IDS] IF NOT DARTS_NETWORK_INIT(missionScriptArgs, ServerData, PlayerData) CDEBUG1LN(DEBUG_DARTS, "Failed to receive an initial network broadcast. Cleaning up.") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) ENDIF IF NOT IS_PLAYER_SCTV(PLAYER_ID()) NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_CLEAR_TASKS | NSPC_NO_COLLISION | NSPC_FREEZE_POSITION) ENDIF //DARTS_SET_PLAYER_NAME(PlayerData[iSelfID], GET_PLAYER_NAME(PLAYER_ID())) fScaledWobble = 0.06 fScaledRealWobble = 0.08 fWobbleFactor = fScaledWobble fRealWobFactor = fScaledRealWobble PlayerData[iSelfID].iParticipantID = iSelfID DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_PARTICIPANT_SET) IF NETWORK_IS_HOST_OF_THIS_SCRIPT() PlayerData[iSelfID].iOffsetPlayerID = ENUM_TO_INT(DART_PLAYER_HOME) ELSE PlayerData[iSelfID].iOffsetPlayerID = ENUM_TO_INT(DART_PLAYER_AWAY) ENDIF CLIENT_SET_UP_PROXIMITY_CHAT(CHAT_PROXIMITY_MAX) REQUEST_SYSTEM_ACTIVITY_TYPE_PLAY_DARTS() WHILE NOT bFoundPlayer WAIT(0) MAINTAIN_CELEBRATION_PRE_LOAD(sCelebrationData) iNumberOfPlayers = NETWORK_GET_NUM_PLAYERS(PlayerData) IF NOT NETWORK_IS_IN_SESSION() CDEBUG1LN(DEBUG_DARTS, "NETWORK_IS_IN_SESSION() is FALSE, cleaning up") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) ELIF DID_I_JOIN_MISSION_AS_SPECTATOR() OR IS_PLAYER_SCTV(PLAYER_ID()) IF iNumberOfPlayers >= 2 IF GET_BOTH_PLAYERS_ID(PlayerData, iSpectatePlayerID) bFoundPlayer = TRUE CDEBUG1LN(DEBUG_DARTS, "am_darts: joining as spectator for 2 player game") ENDIF ELIF iNumberOfPlayers >= 1 IF NOT IS_TIMER_STARTED(controlTimer) CDEBUG1LN(DEBUG_DARTS, "looking for more players ") START_TIMER_NOW(controlTimer) ELIF GET_TIMER_IN_SECONDS(controlTimer) > 4.0 GET_BOTH_PLAYERS_ID(PlayerData, iSpectatePlayerID) bFoundPlayer = TRUE CDEBUG1LN(DEBUG_DARTS, "am_darts: joining as spectator for one player game") ENDIF ELSE IF NOT IS_TIMER_STARTED(controlTimer) CDEBUG1LN(DEBUG_DARTS, "no players, wait 10 seconds for one to appear ") START_TIMER_NOW(controlTimer) ELIF GET_TIMER_IN_SECONDS(controlTimer) > 10.0 CDEBUG1LN(DEBUG_DARTS, "no players, clean up") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) ENDIF ENDIF ELIF iNumberOfPlayers >= NUM_DART_PLAYERS IF DART_GET_OTHER_PLAYERS_ID(PlayerData, iOtherID) = NUM_DART_PLAYERS bFoundPlayer = TRUE IF IS_TIMER_STARTED(controlTimer) CANCEL_TIMER(controlTimer) ENDIF CDEBUG1LN(DEBUG_DARTS, "2 player game started") //Stop people joining my mission // this will be changed for SCTV SET_FM_MISSION_AS_NOT_JOINABLE() ENDIF ELIF (MPGlobals.DartsData.bDartsPlayBusy = TRUE) CLEAR_HELP() BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "am_darts: player started sitting, cleaning up") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) ELIF IS_BIT_SET(MPGlobals.DartsData.iDisplayState, 5) PRINT_NOW("DARTS_ENEMIES", DEFAULT_GOD_TEXT_TIME, 0) BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "ENEMIES IN THE HOUSE, CLEANING UP") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ELSE IF (GET_CURRENT_GAMEMODE() = GAMEMODE_FM) IF NOT IS_TIMER_STARTED(controlTimer) CDEBUG1LN(DEBUG_DARTS, "bFoundPlayer = False, setting controlTimer ") START_TIMER_NOW(controlTimer) ELIF GET_TIMER_IN_SECONDS(controlTimer) > 4.0 CDEBUG1LN(DEBUG_DARTS, "controlTimer > 4.0, must be a single player darts game") bFoundPlayer = TRUE DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) bSoloMP = TRUE PlayerData[iSelfID].iOffsetPlayerID = ENUM_TO_INT(DART_PLAYER_HOME) IF IS_TIMER_STARTED(controlTimer) CANCEL_TIMER(controlTimer) ENDIF //Stop people joining my mission // this will be changed for SCTV SET_FM_MISSION_AS_NOT_JOINABLE() ENDIF ENDIF renderingCam = GET_RENDERING_CAM() IF DOES_CAM_EXIST(renderingCam) vCamCoord = GET_CAM_COORD(GET_RENDERING_CAM()) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF ELSE vCamCoord = vPlayerCoord ENDIF // See if we are changing players. IF vCamCoord.z > vPlayerCoord.z + 50.0 BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "Player initiated MP menu. Cleaning up AM_DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) // Show help text. ELIF NOT bWaitUIShown bWaitUIShown = TRUE ENDIF ENDIF ENDWHILE CDEBUG1LN(DEBUG_DARTS, "*********ID Check********************") CDEBUG1LN(DEBUG_DARTS, "* iOtherID = ", iOtherID) CDEBUG1LN(DEBUG_DARTS, "*************************************") // Wait for server and client broadcast data to sync up. IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM WAIT(500) ENDIF // Make sure we aren't trying to join a game in progress. // this check was mainly for CnC IF (DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_MATCH_MADE) AND GET_CURRENT_GAMEMODE() != GAMEMODE_FM) AND NOT DID_I_JOIN_MISSION_AS_SPECTATOR() AND NOT IS_PLAYER_SCTV(PLAYER_ID()) WHILE TRUE // Print a message saying we can't join this game. IF NOT bBoardTakenUIShown START_TIMER_NOW(controlTimer) bBoardTakenUIShown = TRUE // Wait for confirmation from player or timeout. ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR GET_TIMER_IN_SECONDS(controlTimer) >= 8.0 CLEAR_HELP() CDEBUG1LN(DEBUG_DARTS, "Darts game was already in progress, cleaning up AM_DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, FALSE) ENDIF WAIT(0) ENDWHILE ENDIF #IF IS_DEBUG_BUILD ADD_AM_DART_WIDGETS() #ENDIF DISPLAY_AREA_NAME(FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) AND NOT DID_I_JOIN_MISSION_AS_SPECTATOR() AND NOT IS_PLAYER_SCTV(PLAYER_ID()) PlayerData[iSelfID].piOther = GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) CDEBUG1LN(DEBUG_DARTS, "piOther is set") ELSE CDEBUG1LN(DEBUG_DARTS, "piOther is not set, must be a single player game, or spectator") ENDIF iStaminaXP = GET_MP_INT_CHARACTER_STAT(MP_STAT_STAMINA) //GET_SP_PLAYER_PED_STAT_VALUE(CHAR_MULTIPLAYER, PS_STAMINA) CDEBUG1LN(DEBUG_DARTS, "stamina stat = ", iStaminaXP) fStaminaPercentage = TO_FLOAT(iStaminaXP)/100 fSteadyShotLength = fStaminaPercentage * 540 iSteadyShotLength = ROUND(fSteadyShotLength) + 660 CDEBUG1LN(DEBUG_DARTS, "steady shot = ", iSteadyShotLength) IF iSteadyShotLength < 660 iSteadyShotLength = 660 CDEBUG1LN(DEBUG_DARTS, "steady shot readjusted to 660") ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached the while loop") CPRINTLN(DEBUG_DARTS, "TYPING CHANGES ARE IN") IF bMinigamePlayerQuitFlag bMinigamePlayerQuitFlag = FALSE ENDIF STORE_PLAYER_INTERACTION_ANIM_VALUES_FOR_CELEBRATION_SCREEN() IF NOT DID_I_JOIN_MISSION_AS_SPECTATOR() ANIMPOSTFX_STOP_ALL() ENDIF //gdisablerankupmessage = TRUE SET_DISABLE_RANK_UP_MESSAGE(TRUE) WHILE TRUE WAIT(0) iNumberOfPlayers = NETWORK_GET_NUM_PLAYERS(PlayerData) //Check at the start of the frame if the script should die. IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE() CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, 0.0, -0.0375) NETWORK_PREVENT_SCRIPT_HOST_MIGRATION() // _______________________________DEBUG START______________________________________________ #IF IS_DEBUG_BUILD // Debug Key: win game IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) CDEBUG1LN(DEBUG_DARTS, "Darts debug succeed! setting win flag") bDartsNoSocialClub = TRUE RESTART_TIMER_NOW(controlTimer) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_WINNERD) ENDIF // Debug Key: lose game IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) CDEBUG1LN(DEBUG_DARTS, "Darts debug failed! setting lose flag") bDartsNoSocialClub = TRUE RESTART_TIMER_NOW(controlTimer) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_LOSERD) ENDIF IF (PlayerData[iOtherID].eMPState = DARTS_MPSTATE_GAME_END) AND NOT (PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END) AND ( DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_LOSERD) ) CDEBUG1LN(DEBUG_DARTS, "DARTS_MPSTATE_GAME_END getting set because opponent debugged") bDartsNoSocialClub = TRUE RESTART_TIMER_NOW(controlTimer) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END ENDIF PROCESS_WIDGETS(ServerData) #ENDIF // _______________________________DEBUG END________________________________________________ //TODO: add an every frame check here to see who are players and who are sctv's INT idx INT IDcheck PARTICIPANT_INDEX participantID iNumPlayers = 0 iNumParticipants = NETWORK_GET_NUM_PARTICIPANTS() IDcheck = PARTICIPANT_ID_TO_INT() IF IDcheck <> iSelfID CDEBUG1LN(DEBUG_DARTS, "ID has changed! WHAT?!!") iSelfID = IDcheck ENDIF IF iLastNumParticipants <> iNumParticipants CDEBUG1LN(DEBUG_DARTS, "last num participants has changed!") CDEBUG1LN(DEBUG_DARTS, "last num participants = ", iLastNumParticipants) CDEBUG1LN(DEBUG_DARTS, "current participants = ", iNumParticipants) bCheckPlayers = TRUE iLastNumParticipants = iNumParticipants ENDIF REPEAT iNumParticipants idx participantID = INT_TO_PARTICIPANTINDEX( idx ) IF NETWORK_IS_PARTICIPANT_ACTIVE( participantID ) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) OR DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) IF IS_PLAYER_SCTV(NETWORK_GET_PLAYER_INDEX(participantID)) IF bCheckPlayers CDEBUG1LN(DEBUG_DARTS, "this participant is sctv: ", idx) ENDIF ENDIF IF DID_PLAYER_JOIN_MISSION_AS_SPECTATOR(NETWORK_GET_PLAYER_INDEX(participantID)) IF bCheckPlayers CDEBUG1LN(DEBUG_DARTS, "this participant is spectator: ", idx) ENDIF ENDIF ELSE IF bCheckPlayers CDEBUG1LN(DEBUG_DARTS, "this participant is a player: ", idx) iNumPlayers++ CDEBUG1LN(DEBUG_DARTS, "number of players: ", iNumPlayers) IF iNumPlayers <> iLastNumPlayers CDEBUG1LN(DEBUG_DARTS, "number of players: ", iNumPlayers) CDEBUG1LN(DEBUG_DARTS, "number of last players: ", iLastNumPlayers) ENDIF ENDIF ENDIF ELSE IF bCheckPlayers CDEBUG1LN(DEBUG_DARTS, "this participant is NOT active! : ", idx) ENDIF ENDIF ENDREPEAT iLastNumPlayers = iNumPlayers bCheckPlayers = FALSE // doing this to hide location text HIDE_HUD_AND_RADAR_THIS_FRAME() DISABLE_SELECTOR_THIS_FRAME() SET_LOADING_ICON_SUBTITLES_OFFSET_SHIFT_THIS_FRAME() ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(PLAYER_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL) DARTS_MAINTAIN_REALTIME_MP(PlayerData[iSelfID].eMPState) // #SPECTATE GAMEPLAY HERE VVVVV //IF IS_PLAYER_SCTV(PLAYER_ID()) IF DID_I_JOIN_MISSION_AS_SPECTATOR() OR IS_PLAYER_SCTV(PLAYER_ID()) IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE() OR PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPState > DARTS_MPSTATE_WAIT_POST_GAME OR PlayerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPState > DARTS_MPSTATE_TERMINATE_SPLASH OR iNumberOfPlayers < 1 CDEBUG1LN(DEBUG_DARTS, "looks like game players are quitting, CLEANING UP DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF IF PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPState > DARTS_MPSTATE_SETUP AND eSpecState > DARTS_MPSTATE_SETUP DRAW_SCALEFORM_MOVIE_3D(DartsSB.siScoreBoard, DartsSB.vScoreBoardPos, DartsSB.vScoreBoardRot, DartsSB.vScoreBoardScale, DartsSB.vScoreBoardScale) ENDIF // checking the current sync'd data from the spectators view point // // IF (GET_GAME_TIMER() % 1500) < 50 // CDEBUG1LN(DEBUG_DARTS, "********** ************ ***********") // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_HOME_SERVER].eMPState = ", PlayerData[DART_PLAYER_HOME_SERVER].eMPState) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_HOME_SERVER].eMPThrowStage = ", PlayerData[DART_PLAYER_HOME_SERVER].eMPThrowStage) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_HOME_SERVER].eMPWaitStage = ", PlayerData[DART_PLAYER_HOME_SERVER].eMPWaitStage) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_HOME_SERVER].sName = ", PlayerData[DART_PLAYER_HOME_SERVER].sName) // CDEBUG1LN(DEBUG_DARTS, "********** ************ ***********") // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_AWAY_SERVER].eMPState = ", PlayerData[DART_PLAYER_AWAY_SERVER].eMPState) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_AWAY_SERVER].eMPThrowStage = ", PlayerData[DART_PLAYER_AWAY_SERVER].eMPThrowStage) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_AWAY_SERVER].eMPWaitStage = ", PlayerData[DART_PLAYER_AWAY_SERVER].eMPWaitStage) // CDEBUG1LN(DEBUG_DARTS, "PlayerData[DART_PLAYER_AWAY_SERVER].sName = ", PlayerData[DART_PLAYER_AWAY_SERVER].sName) // CDEBUG1LN(DEBUG_DARTS, "********** ************ ***********") // CDEBUG1LN(DEBUG_DARTS, "serverData.mpState = ", serverData.mpState) // CDEBUG1LN(DEBUG_DARTS, "serverData.mpTurnStatus[DART_PLAYER_HOME_SERVER] = ", serverData.mpTurnStatus[DART_PLAYER_HOME_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.mpTurnStatus[DART_PLAYER_AWAY_SERVER] = ", serverData.mpTurnStatus[DART_PLAYER_AWAY_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iScores[DART_PLAYER_HOME_SERVER] = ", serverData.iScores[DART_PLAYER_HOME_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iScores[DART_PLAYER_AWAY_SERVER] = ", serverData.iScores[DART_PLAYER_AWAY_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iLastScore[DART_PLAYER_HOME_SERVER].iLastScore = ", serverData.iLastScore[DART_PLAYER_HOME_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iLastScore[DART_PLAYER_AWAY_SERVER].iLastScore = ", serverData.iLastScore[DART_PLAYER_AWAY_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iLegs[DART_PLAYER_HOME_SERVER] = ", serverData.iLegs[DART_PLAYER_HOME_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iLegs[DART_PLAYER_AWAY_SERVER] = ", serverData.iLegs[DART_PLAYER_AWAY_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iSets[DART_PLAYER_HOME_SERVER] = ", serverData.iSets[DART_PLAYER_HOME_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iSets[DART_PLAYER_AWAY_SERVER] = ", serverData.iSets[DART_PLAYER_AWAY_SERVER]) // CDEBUG1LN(DEBUG_DARTS, "serverData.iNumLegs = ", serverData.iNumLegs) // CDEBUG1LN(DEBUG_DARTS, "serverData.iNumSets = ", serverData.iNumSets) // CDEBUG1LN(DEBUG_DARTS, "serverData.iServerTurn = ", serverData.iServerTurn) // CDEBUG1LN(DEBUG_DARTS, "serverData.iTurnscore = ", serverData.iTurnscore) // CDEBUG1LN(DEBUG_DARTS, "serverData.iWinner = ", serverData.iWinner) // CDEBUG1LN(DEBUG_DARTS, "serverData.iThrower = ", serverData.iThrower) // CDEBUG1LN(DEBUG_DARTS, "********** ************ ***********") // ENDIF IF eSpecState >= DARTS_MPSTATE_THROW_OFF AND eSpecState < DARTS_MPSTATE_GAME_END IF NOT IS_PLAYER_SCTV(PLAYER_ID()) IF NOT IS_PLAYER_SWITCH_IN_PROGRESS() IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_INGAME) INIT_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext, FALSE, FALSE, FALSE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "DARTS_END_QT", FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_INGAME, TRUE) ENDIF IF NOT NETWORK_TEXT_CHAT_IS_TYPING() UPDATE_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext, 200, default, default, FALSE) ENDIF IF DARTS_PLAYER_QUIT_CONTROL(PlayerData[iSelfID], DartsUI, iDebugThrottle) eSpecState = DARTS_MPSTATE_END ENDIF ENDIF ELSE IF NOT IS_PLAYER_SWITCH_IN_PROGRESS() IF DARTS_PLAYER_QUIT_CONTROL_SPECTATOR(PlayerData[iSelfID], DartsUI, iDebugThrottle) eSpecState = DARTS_MPSTATE_END ENDIF ENDIF ENDIF ENDIF SWITCH eSpecState CASE DARTS_MPSTATE_INIT CDEBUG1LN(DEBUG_DARTS, "Spectator has reached Client side INIT") INIT_BOARD(MPDartGame.dBoard, Args) INIT_CAM(MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading) INT k REPEAT NUM_DART_TURNS k INIT_DARTS(MPDartGame.Darts[k], 0)//iSelfID) ENDREPEAT DARTS_INIT_SCOREBOARD(DartsSB, ENUM_TO_INT(DartsLocation), MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading) REQUEST_STREAMS(DartsSB) REGISTER_SCRIPT_WITH_AUDIO() //Disabling UI DISABLE_ALL_MP_HUD() DISPLAY_RADAR(FALSE) DISABLE_CELLPHONE(TRUE) GET_WORLD_OFFSETS(MPDartGame.dBoard, DartsPlayerPos, DartsInitReticlePos, TRUE) CDEBUG1LN(DEBUG_DARTS, "GET_WORLD_OFFSETS obtained in DARTS_MPSTATE_SETUP") CDEBUG1LN(DEBUG_DARTS, "GET_WORLD_OFFSETS obtained in DARTS_MPSTATE_SETUP") DartsPlayerPos.vDartPlayrPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << -0.4, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ-1 >>) DartsPlayerPos.vOpponentPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << 0.5, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ >>) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), vSpectatePos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fSpectateHeading) IF IS_ENTITY_VISIBLE(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF IF GET_PLAYER_CURRENT_HELD_WEAPON() <> WEAPONTYPE_UNARMED //TASK_SWAP_WEAPON(PLAYER_PED_ID(), FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) CDEBUG1LN(DEBUG_DARTS, "Had to holster weapon again in spectate") ENDIF IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) IF NOT IS_PLAYER_SCTV(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "Had to turn player control off again in spectate") ENDIF ENDIF ENDIF //NEW_LOAD_SCENE_START(vHickBar, <<-3.4831, 0.0223, 60.6925>>, 20) CDEBUG1LN(DEBUG_DARTS, "Spectator Finished Stage_init") eSpecState = DARTS_MPSTATE_STREAMING BREAK CASE DARTS_MPSTATE_STREAMING IF HAVE_STREAMS_LOADED(DartsSB) //AND ( IS_NEW_LOAD_SCENE_LOADED() ) CDEBUG1LN(DEBUG_DARTS, "Spectator Finished DARTS_MPSTATE_STREAMING") eSpecState = DARTS_MPSTATE_SETUP ELSE CDEBUG1LN(DEBUG_DARTS, "Spectator Loading scene") ENDIF BREAK CASE DARTS_MPSTATE_SETUP CDEBUG1LN(DEBUG_DARTS, "Reached Spectator side SETUP") DARTS_ACTIVATE_QUIT_UI(DartsUI.uiQuitControls) DARTS_ACTIVATE_ENDGAME_UI(DartsUI.uiEndGameControls) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) sDartsPlayerNames[DART_PLAYER_AWAY] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY]))) DartsGamerHandle[DART_PLAYER_AWAY] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY]))) sCrewTags[DART_PLAYER_AWAY] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[DART_PLAYER_AWAY]) IF NOT IS_PED_INJURED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY])))) piPlayerClones[DART_PLAYER_AWAY] = CLONE_PED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY]))), FALSE, FALSE) ENDIF CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iSpectatePlayerID[DART_PLAYER_AWAY], " = ", sCrewTags[DART_PLAYER_AWAY]) IF NOT IS_STRING_EMPTY(sCrewTags[DART_PLAYER_AWAY]) DARTS_ADD_SB_CREW_TAG(DartsSB, ENUM_TO_INT(DART_PLAYER_AWAY), sCrewTags[DART_PLAYER_AWAY]) ENDIF DARTS_CLEAR_SCORES(DartsSB, ENUM_TO_INT(DART_PLAYER_AWAY)) IF IS_PED_WEARING_HIGH_HEELS(piPlayerClones[DART_PLAYER_AWAY]) CDEBUG1LN(DEBUG_DARTS, "clone away ped is wearing high heels, taking them off") DARTS_TAKE_OFF_HIGH_HEELS(piPlayerClones[DART_PLAYER_AWAY]) ELSE CDEBUG1LN(DEBUG_DARTS, "clone away ped is not wearing high heels") ENDIF ENDIF sDartsPlayerNames[DART_PLAYER_HOME] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME]))) DartsGamerHandle[DART_PLAYER_HOME] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME]))) sCrewTags[DART_PLAYER_HOME] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[DART_PLAYER_HOME]) piOtherPlayer = GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME]))) IF NOT IS_PED_INJURED(piOtherPlayer) piPlayerClones[DART_PLAYER_HOME] = CLONE_PED(piOtherPlayer, FALSE, FALSE) ENDIF IF IS_PED_WEARING_HIGH_HEELS(piPlayerClones[DART_PLAYER_HOME]) CDEBUG1LN(DEBUG_DARTS, "clone home ped is wearing high heels, taking them off") DARTS_TAKE_OFF_HIGH_HEELS(piPlayerClones[DART_PLAYER_HOME]) ELSE CDEBUG1LN(DEBUG_DARTS, "clone home ped is not wearing high heels") ENDIF CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iSpectatePlayerID[DART_PLAYER_HOME], " = ", sCrewTags[DART_PLAYER_HOME]) IF NOT IS_STRING_EMPTY(sCrewTags[DART_PLAYER_HOME]) DARTS_ADD_SB_CREW_TAG(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME), sCrewTags[DART_PLAYER_HOME]) ENDIF DARTS_CLEAR_SCORES(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) DARTS_ADD_NAMES(DartsSB, sDartsPlayerNames[DART_PLAYER_AWAY], sDartsPlayerNames[DART_PLAYER_HOME]) ELSE DARTS_ADD_NAMES(DartsSB, "", sDartsPlayerNames[DART_PLAYER_HOME]) ENDIF // maybe add already listed scores here CDEBUG1LN(DEBUG_DARTS, "AM_Darts.sc: g_FMMC_STRUCT.iNumberOfLegs = ", g_FMMC_STRUCT.iNumberOfLegs) CDEBUG1LN(DEBUG_DARTS, "AM_Darts.sc: g_FMMC_STRUCT.iNumberOfSets = ", g_FMMC_STRUCT.iNumberOfSets) IF g_FMMC_STRUCT.iNumberOfLegs > 0 OR g_FMMC_STRUCT.iNumberOfSets > 0 UPDATE_SB_SETS_LEGS(DartsSB, 0, 0, 0, 0) ENDIF CLEAR_AREA(Args.vDartBoard, 0.5, TRUE) DARTS_GAME_CAM() CDEBUG1LN(DEBUG_DARTS, "spectator Going from DARTS_MPSTATE_SETUP to DARTS_MPSTATE_TUTORIAL") eSpecState = DARTS_MPSTATE_TUTORIAL BREAK CASE DARTS_MPSTATE_TUTORIAL IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) AND ServerData.mpState < DARTS_MPSTATE_SETUP CDEBUG1LN(DEBUG_DARTS, "spectator Going to DARTS_MPSTATE_THROW_OFF_SETUP") eSpecState = DARTS_MPSTATE_THROW_OFF_SETUP ELSE DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, ServerData.iMatchType) CDEBUG1LN(DEBUG_DARTS, "spectator Going to DARTS_MPSTATE_SYNC_OBJECTS") CDEBUG1LN(DEBUG_DARTS, "ServerData.mpState = ", ServerData.mpState) CDEBUG1LN(DEBUG_DARTS, "single player flag = ", DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER)) eSpecState = DARTS_MPSTATE_SYNC_OBJECTS ENDIF BREAK CASE DARTS_MPSTATE_THROW_OFF_SETUP IF NOT IS_TIMER_STARTED(controlTimer) //SETUP_NEW_BIG_MESSAGE(BIG_MESSAGE_CUSTOM, "DARTS_THRW_OFF", "DARTS_THRW_STR") //SET_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, "DARTS_THRW_OFF", "DARTS_THRW_STR", default, default, default, TRUE, MG_BIG_MESSAGE_ANIM_TIME) START_TIMER_NOW(controlTimer) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF ELIF GET_TIMER_IN_SECONDS_SAFE(controlTimer) >= 5.0 //OR NOT UPDATE_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage) OR PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPState = DARTS_MPSTATE_THROW_OFF OR PlayerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPState = DARTS_MPSTATE_THROW_OFF CLEANUP_BIG_MESSAGE() CANCEL_TIMER(controlTimer) UPDATE_HIGHLIGHT(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) DARTS_INIT_TIMERS(localDartsTimer) DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, ServerData.iMatchType) eSpecState = DARTS_MPSTATE_THROW_OFF eSpecTurnStatus = DARTS_MPTURN_WAITING eSpecWaitStage = DARTS_MPWAIT_AIM iSpecThower = ENUM_TO_INT(DART_PLAYER_HOME) ENDIF BREAK CASE DARTS_MPSTATE_THROW_OFF IF DARTS_SERVER_CHECK_FLAG(ServerData, DARTSERVERFLAG_DO_THROWOFF) IF serverData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = DARTS_MPTURN_WINNING OR serverData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]] = DARTS_MPTURN_WINNING eSpecTurnStatus = DARTS_MPTURN_WINNING ENDIF // Do everyting playing related right chea SWITCH eSpecTurnStatus CASE DARTS_MPTURN_WAITING SWITCH eSpecWaitStage CASE DARTS_MPWAIT_AIM IF playerData[iSpectatePlayerID[iSpecThower]].bDartThrown CDEBUG1LN(DEBUG_DARTS, "Current client finished WAIT - AIMING") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // grab other players dart throw info so we can throw that thang iSpecTurn = ServerData.iServerTurn COPY_DART_TO_LOCAL(MPDartGame.Darts[iSpecTurn], playerData[iSpectatePlayerID[iSpecThower]]) eSpecWaitStage = DARTS_MPWAIT_THROW ELSE IF (GET_GAME_TIMER() % 1500) < 50 CDEBUG1LN(DEBUG_DARTS, "spectator is waiting for other client to throw") CDEBUG1LN(DEBUG_DARTS, "iSpecThower = ", iSpecThower) CDEBUG1LN(DEBUG_DARTS, "iSpectatePlayerID[iSpecThower] = ", iSpectatePlayerID[iSpecThower]) CDEBUG1LN(DEBUG_DARTS, "serverdata.iThrower = ", serverdata.iThrower) ENDIF ENDIF BREAK CASE DARTS_MPWAIT_THROW CDEBUG1LN(DEBUG_DARTS, "[spec] current client is WAITING - Throwing") IF THROW_DART(MPDartGame.Darts[iSpecTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw Completed - spec side") bSpecResetDone = FALSE eSpecWaitStage = DARTS_MPWAIT_SCORE CDEBUG1LN(DEBUG_DARTS, "[spec] going to spec side score check") eSpecTurnStatus = DARTS_MPTURN_SCORE_CHECK ENDIF BREAK CASE DARTS_MPWAIT_SCORE IF (GET_GAME_TIMER() % 2000) < 50 CDEBUG1LN(DEBUG_DARTS, "[spec] going to spec side score check") ENDIF BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_SCORE_CHECK // spectate is only for sp darts, so tuning this just for that IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED) // if prints are needed DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, TRUE) ENDIF IF NOT bSpecResetDone //AND DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_TURN_CONTINUE) IF (playerData[iSpectatePlayerID[DART_PLAYER_HOME]].bResetDone OR playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].bResetDone) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec is in SCORE CHECK") eSpecWaitStage = DARTS_MPWAIT_AIM RESTART_TIMER_NOW(SpectateGateTimer) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec finished reset in SCORE CHECK") bSpecResetDone = TRUE ENDIF ELSE IF (GET_GAME_TIMER() % 2000) < 50 CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec waiting for client flag bResetDone") ENDIF ENDIF IF bSpecResetDone AND ( ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = DARTS_MPTURN_THROWING OR ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]] = DARTS_MPTURN_THROWING ) AND ( playerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPThrowStage = DARTS_MPTHROW_AIM OR playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPThrowStage = DARTS_MPTHROW_AIM ) AND GET_TIMER_IN_SECONDS_SAFE(SpectateGateTimer) > 1.0 // IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) //serverData.bDoSwitchPlayer CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec did see server flag for switch_player") iSpecThower = playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].iOffsetPlayerID IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_HIGHLIGHT(DartsSB, playerData[serverData.iWaiter].iOffsetPlayerID) ENDIF // ELSE // CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec did not see server flag for switch_player") // ENDIF CANCEL_TIMER(SpectateGateTimer) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec going back to waiting") eSpecTurnStatus = DARTS_MPTURN_WAITING ENDIF BREAK CASE DARTS_MPTURN_WINNING INT y REPEAT NUM_MP_DART_TURNS y RESET_DART(MPDartGame.Darts[y]) MPDartGame.Darts[y].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", y, " was reset") ENDREPEAT CANCEL_TIMER(controlTimer) eSpecState = DARTS_MPSTATE_SYNC_OBJECTS BREAK ENDSWITCH ENDIF BREAK CASE DARTS_MPSTATE_SYNC_OBJECTS CDEBUG1LN(DEBUG_DARTS, "spectator DARTS_MPSTATE_SYNC_OBJECTS") i = 0 j = 0 // TODO this will have to be adjusted to account for mid game joins // looks like other player will have to place this info in the broadcast data REPEAT NUM_MP_DART_PLAYERS i MPDartGame.iThrowsTaken[i] = 0 MPDartGame.iBullsEyesHit[i] = 0 DARTS_CLEAR_SCORES(DartsSB, i) iSpecLastScore[i] = 301 ENDREPEAT DARTS_ADD_SCORE(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME), 301) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) DARTS_ADD_SCORE(DartsSB, ENUM_TO_INT(DART_PLAYER_AWAY), 301) ENDIF REPEAT NUM_MP_DART_TURNS j RESET_DART(MPDartGame.Darts[j]) MPDartGame.Darts[j].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", j, " was reset") ENDREPEAT //RESET_CLIENT_DART(PlayerData[DART_PLAYER_HOME_SERVER]) DARTS_INIT_TIMERS(localDartsTimer) eSpecWaitStage = DARTS_MPWAIT_AIM MPDartGame.bEndGameMessageDisplayed = FALSE MPDartGame.bWinNoise = FALSE bInWinRange = FALSE CLEAR_AREA(Args.vDartBoard, 0.5, TRUE) REMOVE_DECALS_IN_RANGE(Args.vDartBoard, 0.5) eSpecState = DARTS_MPSTATE_SETUP_POST BREAK CASE DARTS_MPSTATE_SETUP_POST IF ServerData.mpState = DARTS_MPSTATE_IN_PROGRESS DARTS_GAME_CAM() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) eSpecState = DARTS_MPSTATE_IN_PROGRESS eSpecTurnStatus = DARTS_MPTURN_WAITING eSpecWaitStage = DARTS_MPWAIT_AIM CDEBUG1LN(DEBUG_DARTS, "spectator is proceeding to IN PROGRESS") IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) iSpecThower = PICK_INT((serverData.iCoinFlip = 0), ENUM_TO_INT(DART_PLAYER_AWAY), ENUM_TO_INT(DART_PLAYER_HOME)) ELSE iSpecThower = ENUM_TO_INT(DART_PLAYER_HOME) ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_HIGHLIGHT(DartsSB, PICK_INT((serverData.iCoinFlip = 0), ENUM_TO_INT(DART_PLAYER_AWAY), ENUM_TO_INT(DART_PLAYER_HOME))) ELSE UPDATE_HIGHLIGHT(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) ENDIF bWaitUIShow = FALSE ENDIF BREAK CASE DARTS_MPSTATE_WAIT_POST_MENU CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side WAIT POST MENU") // Sitting in a waiting state IF DARTS_SERVER_CHECK_FLAG(serverData, DARTSERVERFLAG_MOVETOGAME) PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPState = DARTS_MPSTATE_IN_PROGRESS ENDIF BREAK CASE DARTS_MPSTATE_IN_PROGRESS // failsafe for player not being there IF NOT IS_PLAYER_SCTV(PLAYER_ID()) //Not needed as the Target is the Focus - Bug 1673437 AND GET_PLAYER_DISTANCE_FROM_LOCATION(vSpectatePos) > 2.0 SET_ENTITY_COORDS(PLAYER_PED_ID(), vSpectatePos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fSpectateHeading) IF IS_ENTITY_VISIBLE(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF CDEBUG1LN(DEBUG_DARTS, " DARTS - SET PLAYER COORDS (2) ", vSpectatePos) ELSE // failsafe for screen not fading back in IF NOT IS_PLAYER_SCTV(PLAYER_ID()) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "Had to turn player control off again in in progress") ENDIF ENDIF ENDIF IF serverData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = DARTS_MPTURN_WINNING OR serverData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]] = DARTS_MPTURN_WINNING eSpecTurnStatus = DARTS_MPTURN_WINNING ENDIF // IF (GET_GAME_TIMER() % 1000) < 50 // CDEBUG1LN(DEBUG_DARTS, "serverData.mpTurnStatus[DART_PLAYER_HOME_SERVER] = ", serverData.mpTurnStatus[DART_PLAYER_HOME_SERVER]) // ENDIF // Do everyting playing related right chea SWITCH eSpecTurnStatus CASE DARTS_MPTURN_WAITING SWITCH eSpecWaitStage CASE DARTS_MPWAIT_AIM IF playerData[iSpectatePlayerID[iSpecThower]].bDartThrown CDEBUG1LN(DEBUG_DARTS, "Current client finished WAIT - AIMING") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // grab other players dart throw info so we can throw that thang iSpecTurn = ServerData.iServerTurn COPY_DART_TO_LOCAL(MPDartGame.Darts[iSpecTurn], playerData[iSpectatePlayerID[iSpecThower]]) eSpecWaitStage = DARTS_MPWAIT_THROW ELSE IF (GET_GAME_TIMER() % 2000) < 50 CDEBUG1LN(DEBUG_DARTS, "Spectator is waiting for client to throw") CDEBUG1LN(DEBUG_DARTS, "iSpecThower = ", iSpecThower) CDEBUG1LN(DEBUG_DARTS, "iSpectatePlayerID[iSpecThower] = ", iSpectatePlayerID[iSpecThower]) CDEBUG1LN(DEBUG_DARTS, "playerData[iSpectatePlayerID[iSpecThower]].bDartThrown = ", playerData[iSpectatePlayerID[iSpecThower]].bDartThrown) ENDIF ENDIF BREAK CASE DARTS_MPWAIT_THROW CDEBUG1LN(DEBUG_DARTS, "[spec] current client is WAITING - Throwing") IF THROW_DART(MPDartGame.Darts[iSpecTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw Completed - spec side") bSpecResetDone = FALSE eSpecWaitStage = DARTS_MPWAIT_SCORE CDEBUG1LN(DEBUG_DARTS, "[spec] going to spec side score check") eSpecTurnStatus = DARTS_MPTURN_SCORE_CHECK ENDIF BREAK CASE DARTS_MPWAIT_SCORE IF (GET_GAME_TIMER() % 2000) < 50 CDEBUG1LN(DEBUG_DARTS, "[spec] going to spec side score check") ENDIF BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_SCORE_CHECK // spectate is only for sp darts, so tuning this just for that IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED) // if prints are needed DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, TRUE) ENDIF IF NOT bSpecResetDone //AND DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_TURN_CONTINUE) IF (playerData[iSpectatePlayerID[DART_PLAYER_HOME]].bResetDone OR playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].bResetDone) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec is in SCORE CHECK") eSpecWaitStage = DARTS_MPWAIT_AIM RESTART_TIMER_NOW(SpectateGateTimer) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec finished reset in SCORE CHECK") bSpecResetDone = TRUE ENDIF ELSE IF (GET_GAME_TIMER() % 2000) < 50 CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec waiting for client flag bResetDone") ENDIF ENDIF IF bSpecResetDone AND ( ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = DARTS_MPTURN_THROWING OR (ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]] = DARTS_MPTURN_THROWING AND NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER)) ) AND ( playerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPThrowStage = DARTS_MPTHROW_AIM OR (playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPThrowStage = DARTS_MPTHROW_AIM AND NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER))) AND GET_TIMER_IN_SECONDS_SAFE(SpectateGateTimer) > 1.0 IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) //serverData.bDoSwitchPlayer CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec did see server flag for switch_player") // sending the darts back to the player, resetting them // serves the same functioon as RESET_DART without deleting the object INT y REPEAT NUM_MP_DART_TURNS y RESET_DART(MPDartGame.Darts[y]) MPDartGame.Darts[y].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[spec] MPDartGame.Darts ", y, " was reset") ENDREPEAT IF iSpecLastScore[playerData[ServerData.iThrower].iOffsetPlayerID] <> ServerData.iScores[ServerData.iThrower] DARTS_ADD_SCORE(DartsSB, playerData[ServerData.iThrower].iOffsetPlayerID, ServerData.iScores[ServerData.iThrower]) ENDIF CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iThrower = ", ServerData.iThrower) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iLastScore = ", ServerData.iLastScore[ServerData.iThrower]) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iScores = ", ServerData.iScores[ServerData.iThrower]) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] iSpecLastScore = ", iSpecLastScore[playerData[ServerData.iThrower].iOffsetPlayerID]) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = ", ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]]) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]] = ", ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_AWAY]]) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] playerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPThrowStage = ", playerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPThrowStage) CDEBUG2LN(DEBUG_DARTS, "[AM_DARTS] playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPThrowStage = ", playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].eMPThrowStage) IF ServerData.mpTurnStatus[iSpectatePlayerID[DART_PLAYER_HOME]] = DARTS_MPTURN_THROWING iSpecThower = playerData[iSpectatePlayerID[DART_PLAYER_HOME]].iOffsetPlayerID CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iSpecThower is going home") ELSE iSpecThower = playerData[iSpectatePlayerID[DART_PLAYER_AWAY]].iOffsetPlayerID CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iSpecThower is going away") ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iSpecThower = ", iSpecThower) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_HIGHLIGHT(DartsSB, playerData[serverData.iWaiter].iOffsetPlayerID) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] changed highlight to player ", playerData[serverData.iWaiter].iOffsetPlayerID) ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec did not see server flag for switch_player") ENDIF CANCEL_TIMER(SpectateGateTimer) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] spec going back to waiting") eSpecTurnStatus = DARTS_MPTURN_WAITING ENDIF BREAK CASE DARTS_MPTURN_WINNING CDEBUG1LN(DEBUG_DARTS, "********** serverData.iWinner = ", serverData.iWinner) CLEAR_PRINTS() IF DARTS_SERVER_CHECK_FLAG(serverData, DARTSERVERFLAG_DO_TRANSITION) CDEBUG1LN(DEBUG_DARTS, "[spec] server said to go to transition") iSplashStage = 0 RESTART_TIMER_NOW(controlTimer) eSpecState = DARTS_MPSTATE_GAME_TRANSITION ELSE RESTART_TIMER_NOW(controlTimer) CDEBUG1LN(DEBUG_DARTS, "[spec] server said to go to game end") eSpecState = DARTS_MPSTATE_GAME_END ENDIF BREAK ENDSWITCH BREAK CASE DARTS_MPSTATE_GAME_TRANSITION SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME]))) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY]))) ENDIF SWITCH iSplashStage CASE 0 IF GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 1.5 CLEAR_HELP() //ANOTHER_GAME_CAM_MP(PLAYER_PED_ID()) ANOTHER_GAME_CAM() SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "DARTS_WINP", "", 2500, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_SB_SETS_LEGS(DartsSB, 0, serverData.iSets[iSpectatePlayerID[DART_PLAYER_HOME]], 0, serverData.iLegs[iSpectatePlayerID[DART_PLAYER_HOME]]) ELSE UPDATE_SB_SETS_LEGS(DartsSB, serverData.iSets[iSpectatePlayerID[DART_PLAYER_AWAY]], serverData.iSets[iSpectatePlayerID[DART_PLAYER_HOME]], serverData.iLegs[iSpectatePlayerID[DART_PLAYER_AWAY]], serverData.iLegs[iSpectatePlayerID[DART_PLAYER_HOME]]) ENDIF INT iWhichOutro FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF iWhichOutro = (GET_RANDOM_INT_IN_RANGE() % 3) CDEBUG1LN(DEBUG_DARTS, "iWhichOutro = ", iWhichOutro) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[0]) AND NOT IS_PED_INJURED(piPlayerClones[1]) IF serverData.iWinner = iSpectatePlayerID[DART_PLAYER_HOME] TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_AWAY], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_HOME], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ELSE TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_AWAY], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_AWAY], sFacialDictPed2, sFacialClip2[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_HOME], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF iSplashStage++ ENDIF BREAK CASE 1 IF NOT UPDATE_SHARD_BIG_MESSAGE(shardMidSizeMessage, TRUE) RESET_SHARD_BIG_MESSAGE(shardMidSizeMessage) REPEAT NUM_MP_DART_PLAYERS i DARTS_CLEAR_SCORES(DartsSB, i) ENDREPEAT REPEAT NUM_MP_DART_TURNS j RESET_DART(MPDartGame.Darts[j]) ENDREPEAT iSplashStage++ ENDIF BREAK CASE 2 CDEBUG1LN(DEBUG_DARTS, "spec going to wait post game Starting another set/leg") DARTS_GAME_CAM() IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_AWAY]) AND NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_AWAY]) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_HOME]) ENDIF ELSE IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_HOME]) ENDIF ENDIF iSplashStage = 0 eSpecState = DARTS_MPSTATE_WAIT_POST_GAME BREAK ENDSWITCH BREAK CASE DARTS_MPSTATE_GAME_END IF (GET_GAME_TIMER() % 2500) < 50 CDEBUG1LN(DEBUG_DARTS, "Reached spec side GAME END") ENDIF IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME])) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_HOME]))) IF (GET_GAME_TIMER() % 2500) < 50 CDEBUG1LN(DEBUG_DARTS, "home player succesfully set invisible") ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "home player not set invisible, participant is not active") ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY])) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSpectatePlayerID[DART_PLAYER_AWAY]))) CDEBUG1LN(DEBUG_DARTS, "away player succesfully set invisible") ELSE CDEBUG1LN(DEBUG_DARTS, "away player not set invisible, participant is not active") ENDIF ENDIF IF GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 0.75 // wait for the player to pick an option IF MPDartGame.bEndGameMessageDisplayed UPDATE_SHARD_BIG_MESSAGE(shardBigMessage) IF DID_I_JOIN_MISSION_AS_SPECTATOR() AND NOT IS_PLAYER_SCTV(PLAYER_ID()) IF HAS_NET_TIMER_STARTED(serverData.timeLeaderboardTimeOut) OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) >= 0.995) OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) // IF MAINTAIN_END_OF_MISSION_SCREEN(sEndOfMission, serverData.sServerFMMC_EOM, // GET_TIME_DIFFERENCE(GET_NETWORK_TIME(),serverData.timeLeaderboardTimeOut.timer) >= VIEW_LEADERBOARD_TIME, // FALSE, FALSE, FALSE, FALSE, FALSE, serverData.timeLeaderboardTimeOut.timer, VIEW_LEADERBOARD_TIME, "LBD_TIMEOUT", TRUE) //Go to cleanup state CDEBUG1LN(DEBUG_DARTS, "spectate voted") eSpecState = DARTS_MPSTATE_END // ELSE // //DISPLAY_DARTS_LEADERBOARD(DartsUI, DartsEndScreen, iXPGained, DartsUI.iOurScore, DartsUI.iTheirScore, iBetWinnings) // ENDIF ENDIF ENDIF // player wants another game IF PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].bDoRematch OR PlayerData[iSpectatePlayerID[DART_PLAYER_AWAY]].bDoRematch IF serverData.mpState >= DARTS_MPSTATE_SETUP INT iTemp1, iTemp2 iTemp1 = ENUM_TO_INT(DART_PLAYER_AWAY) iTemp2 = ENUM_TO_INT(DART_PLAYER_HOME) CDEBUG1LN(DEBUG_DARTS, "iTemp1 = ", iTemp1, " iTemp2 = ", iTemp2) DARTS_CLEAR_SCORES(DartsSB, iTemp1) DARTS_CLEAR_SCORES(DartsSB, iTemp2) IF DID_I_JOIN_MISSION_AS_SPECTATOR() AND NOT IS_PLAYER_SCTV(PLAYER_ID()) CDEBUG1LN(DEBUG_DARTS, "transitioning into actual game") ELSE CDEBUG1LN(DEBUG_DARTS, "spec state going to wait post game") eSpecState = DARTS_MPSTATE_WAIT_POST_GAME ENDIF ENDIF ENDIF ELSE // wait 'til we've finished rendering the player win/lost text IF NOT MPDartGame.bAnotherCamActive CLEAR_HELP() CLEAR_PRINTS() DartsUI.iOurScore += serverData.iSets[iSelfID] DartsUI.iTheirScore += serverData.iSets[iOtherID] DartsUI.sMyName = sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID] DartsUI.sTheirName = sDartsPlayerNames[PlayerData[iOtherID].iOffsetPlayerID] SET_SHARD_BIG_MESSAGE(shardBigMessage, "DARTS_WINP", "DARTS_WINSP") INT iWhichOutro FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF iWhichOutro = (GET_RANDOM_INT_IN_RANGE() % 3) CDEBUG1LN(DEBUG_DARTS, "iWhichOutro = ", iWhichOutro) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[0]) AND NOT IS_PED_INJURED(piPlayerClones[1]) IF serverData.iWinner = iSpectatePlayerID[DART_PLAYER_HOME] TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_AWAY], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_HOME], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ELSE TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_AWAY], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_AWAY], sFacialDictPed2, sFacialClip2[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_HOME], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF //ANOTHER_GAME_CAM() DartsUI.iEndDelay = GET_GAME_TIMER() PRINT_HELP("DARTS_SPECAD") MPDartGame.bAnotherCamActive = TRUE //ELIF NOT IS_CAM_INTERPOLATING(camAnotherGameMP) ELIF GET_GAME_TIMER() - DartsUI.iEndDelay > 400 MPDartGame.bEndGameMessageDisplayed = TRUE ENDIF ENDIF ENDIF BREAK CASE DARTS_MPSTATE_WAIT_POST_GAME DEBUG_MESSAGE_PERIODIC("spectate DARTS_MPSTATE_WAIT_POST_GAME", iDebugThrottle) IF (PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].bDoRematch AND PlayerData[iSpectatePlayerID[DART_PLAYER_AWAY]].bDoRematch) OR (PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].bDoRematch AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]], DARTS_CLIENTFLAG_SINGLE_PLAYER)) OR PlayerData[iSpectatePlayerID[DART_PLAYER_HOME]].eMPState = DARTS_MPSTATE_IN_PROGRESS //IF serverData.mpState = DARTS_MPSTATE_SETUP CDEBUG1LN(DEBUG_DARTS, "spectate going to sync objects") eSpecState = DARTS_MPSTATE_SYNC_OBJECTS //ENDIF ENDIF BREAK CASE DARTS_MPSTATE_TERMINATE_SPLASH IF (GET_GAME_TIMER() % 1000) < 50 CDEBUG1LN(DEBUG_DARTS, "spec is chilling in DARTS_MPSTATE_TERMINATE_SPLASH") IF DID_I_JOIN_MISSION_AS_SPECTATOR() CDEBUG1LN(DEBUG_DARTS, "still being seen as a spectator") ELSE CDEBUG1LN(DEBUG_DARTS, "no longer a spectator - this is physically impossible") ENDIF ENDIF BREAK CASE DARTS_MPSTATE_END IF HAS_NET_TIMER_STARTED(timeDartsAwardFailSafe) //RENDER_SCRIPT_CAMS(FALSE, FALSE) DARTS_SETUP_MP_QUIT_CAM() CLEANUP_BIG_MESSAGE() IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_IN(500) ENDIF CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) CDEBUG1LN(DEBUG_DARTS, "spec cleanup called in DARTS_MPSTATE_END") IF NOT g_TransitionSessionNonResetVars.sPostMissionCleanupData.bRequestLeaderBoardCam REQUEST_LEADERBOARD_CAM() ELIF IS_LEADERBOARD_CAM_READY(TRUE) REINIT_NET_TIMER(timeDartsAwardFailSafe) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) CDEBUG1LN(DEBUG_DARTS, "spec going to DARTS_MPSTATE_LEAVE") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_LEAVE ENDIF ELSE START_NET_TIMER(timeDartsAwardFailSafe) CDEBUG1LN(DEBUG_DARTS, "started failsafe net timer") ENDIF BREAK CASE DARTS_MPSTATE_LEAVE DEAL_WITH_FM_MATCH_END(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, missionScriptArgs.mdID.idVariation, PICK_INT(MPDartGame.bDartWinner, 1, 0), PICK_INT(MPDartGame.bDartWinner, 1, 2)) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) CDEBUG1LN(DEBUG_DARTS, "spec cleanup called in DARTS_MPSTATE_LEAVE") BREAK ENDSWITCH // --------------------------------------------------------------------------------------------------------------------------------- ELSE // #NORMAL GAMEPLAY HERE VVVVVVV // If we have a match end event, bail IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE() OR SHOULD_PLAYER_LEAVE_MP_MISSION(TRUE) IF PlayerData[iSelfID].eMPState < DARTS_MPSTATE_GAME_END AND serverData.mpTurnStatus[iSelfID] < DARTS_MPTURN_WINNING AND (MPDartGame.iGamesWon = 0) AND (MPDartGame.iGamesLost = 0) CDEBUG1LN(DEBUG_DARTS, "Also giving money back to the player in line 970") IF IS_DARTS_GAME_ALMOST_DONE(ServerData, PlayerData) INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(PLAYER_ID()) ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED_TIED() ENDIF CDEBUG1LN(DEBUG_DARTS, "iBetWinnings = ", iBetWinnings) IF RECEIVED_EVENT(EVENT_NETWORK_END_MATCH) bMinigamePlayerQuitFlag = TRUE ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE returned true, CLEANING UP DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF //If the mission is being told to die IF SHOULD_PLAYER_LEAVE_MP_MISSION(TRUE) IF PlayerData[iSelfID].eMPState < DARTS_MPSTATE_GAME_END AND serverData.mpTurnStatus[iSelfID] < DARTS_MPTURN_WINNING AND (MPDartGame.iGamesWon = 0) AND (MPDartGame.iGamesLost = 0) CDEBUG1LN(DEBUG_DARTS, "Also giving money back to the player in line 970") IF IS_DARTS_GAME_ALMOST_DONE(ServerData, PlayerData) INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(PLAYER_ID()) ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED_TIED() ENDIF CDEBUG1LN(DEBUG_DARTS, "iBetWinnings = ", iBetWinnings) ENDIF CDEBUG1LN(DEBUG_DARTS, "SHOULD_PLAYER_LEAVE_MP_MISSION returned true, CLEANING UP DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF IF IS_PED_INJURED(PLAYER_PED_ID()) CDEBUG1LN(DEBUG_DARTS, "IS_PED_INJURED(PLAYER_PED_ID()) returned true, CLEANING UP DARTS") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF IF ( (iNumberOfPlayers < 2 AND PlayerData[iSelfID].eMPState < DARTS_MPSTATE_GAME_END) OR (PlayerData[iOtherID].eMPState > DARTS_MPSTATE_WAIT_POST_GAME AND PlayerData[iSelfID].eMPState < DARTS_MPSTATE_GAME_END) ) AND NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF IF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END OR PlayerData[iSelfID].eMPState = DARTS_MPSTATE_WAIT_POST_GAME CDEBUG1LN(DEBUG_DARTS, "game had already ended, setting terminate reason to ENDGAME") terminateReason = DARTS_MPTERMINATEREASON_ENDGAME ELSE CDEBUG1LN(DEBUG_DARTS, "game was still in play, setting terminate reason to PLAYERLEFT") terminateReason = DARTS_MPTERMINATEREASON_PLAYERLEFT IF IS_DARTS_GAME_ALMOST_DONE(ServerData, PlayerData) INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(PLAYER_ID()) ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED_TIED() ENDIF CDEBUG1LN(DEBUG_DARTS, "iBetWinnings in 1812 is ", iBetWinnings) ENDIF BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "NETWORK_GET_NUM_PLAYERS() < 2 returned true, CLEANING UP DARTS") CDEBUG1LN(DEBUG_DARTS, "NETWORK_GET_NUM_PLAYERS() has returned: ", iNumberOfPlayers) CDEBUG1LN(DEBUG_DARTS, "AM_Darts: PlayerData[iOtherID].eMPState at this moment = ", PlayerData[iOtherID].eMPState) CDEBUG1LN(DEBUG_DARTS, "AM_Darts: PlayerData[iSelfID].eMPState at this moment = ", PlayerData[iSelfID].eMPState) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_TERMINATE_SPLASH ELSE IF (GET_GAME_TIMER() % 10000) < 50 CDEBUG1LN(DEBUG_DARTS, "AM_Darts: NETWORK_GET_NUM_PLAYERS() = ", NETWORK_GET_NUM_PLAYERS(PlayerData, TRUE)) CDEBUG1LN(DEBUG_DARTS, "AM_Darts: PlayerData[iOtherID].eMPState = ", PlayerData[iOtherID].eMPState) CDEBUG1LN(DEBUG_DARTS, "AM_Darts: PlayerData[iSelfID].eMPState = ", PlayerData[iSelfID].eMPState) CDEBUG1LN(DEBUG_DARTS, "AM_Darts: host status = ", NETWORK_IS_HOST_OF_THIS_SCRIPT()) ENDIF ENDIF // checking for new spectators IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) AND NETWORK_GET_NUM_PARTICIPANTS() = 2 // listen for spectator flag IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_I_AM_SPECTATOR) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) CDEBUG1LN(DEBUG_DARTS, "A new challenger has been sensed") DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) ENDIF ENDIF ELIF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) AND NETWORK_GET_NUM_PARTICIPANTS() < 2 CDEBUG1LN(DEBUG_DARTS, "New challenger left") DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) ENDIF #IF IS_DEBUG_BUILD TEXT_LABEL_63 sTest = "NETWORK_GET_NUM_PARTICIPANTS Num Players " sTest += CONVERT_INT_TO_STRING(NETWORK_GET_NUM_PARTICIPANTS()) TEXT_LABEL_63 sTest2 = "NETWORK_GET_NUM_SCRIPT_PARTICIPANTS Num Players " sTest2 += CONVERT_INT_TO_STRING(NETWORK_GET_NUM_SCRIPT_PARTICIPANTS("AM_Darts", NETWORK_GET_INSTANCE_ID_OF_THIS_SCRIPT())) DRAW_DEBUG_TEXT_2D(sTest, <<0.6, 0.25, 0>>) DRAW_DEBUG_TEXT_2D(sTest2, <<0.6, 0.28, 0>>) #ENDIF // IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM // IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) // IF IS_PED_RAGDOLL(PLAYER_PED_ID()) // IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) // ENDIF // BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) // CDEBUG1LN(DEBUG_DARTS, "ONE OF THE PEDS IS RAGDOLLING") // CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) // ENDIF // ENDIF // // IF DOES_ENTITY_EXIST(PlayerData[iSelfID].piOther) // IF IS_PED_RAGDOLL(PlayerData[iSelfID].piOther) // IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) // ENDIF // // BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) // CDEBUG1LN(DEBUG_DARTS, "OTHER PLAYER IS RAGDOLLING") // CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) // ENDIF // ELSE // DEBUG_MESSAGE_PERIODIC("PlayerData[iSelfID].piOther does NOT exist. what up with that?", iDebugThrottle) // ENDIF // // ENDIF IF IS_BIT_SET(MPGlobals.DartsData.iDisplayState, 5) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF PRINT_NOW("DARTS_ENEMIES", DEFAULT_GOD_TEXT_TIME, 0) BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "ENEMIES IN THE HOUSE, CLEANING UP") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF // Detecting quit flags thrown by server IF DARTS_PLAYER_PROCESS_SERVER_FLAGS(ServerData, PlayerData[iSelfID], localDartsTimer) IF IS_DARTS_GAME_ALMOST_DONE(ServerData, PlayerData) INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(PLAYER_ID()) ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED_TIED() ENDIF CDEBUG1LN(DEBUG_DARTS, "iBetWinnings = ", iBetWinnings) ENDIF // Process Events thrown from other clients //DARTS_BROADCAST_PROCESS_EVENTS(Player[iSelfID]) // TODO: this isn't currently being used all that much... not much at all. take out? // chalk scoreboard IF PlayerData[iSelfID].eMPState > DARTS_MPSTATE_SETUP DRAW_SCALEFORM_MOVIE_3D(DartsSB.siScoreBoard, DartsSB.vScoreBoardPos, DartsSB.vScoreBoardRot, DartsSB.vScoreBoardScale, DartsSB.vScoreBoardScale) ENDIF IF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_READY_UP IF NOT IS_PED_INJURED(piOtherPlayer) // NETWORK_OVERRIDE_COORDS_AND_HEADING(piOtherPlayer, DartsPlayerPos.vOpponentPos, MPDartGame.dBoard.fBoardHeading) ENDIF ENDIF IF PlayerData[iSelfID].eMPState >= DARTS_MPSTATE_THROW_OFF AND PlayerData[iSelfID].eMPState < DARTS_MPSTATE_GAME_END //DARTS_MPSTATE_TERMINATE_SPLASH IF DARTS_PLAYER_QUIT_CONTROL(PlayerData[iSelfID], DartsUI, iDebugThrottle) bMinigamePlayerQuitFlag = TRUE IF IS_DARTS_GAME_ALMOST_DONE(ServerData, PlayerData) INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED_TIED() ENDIF SET_VARS_ON_FMMC_EOM_VOTE_PASSING(ciFMMC_EOM_VOTE_STATUS_QUIT, <<0.0, 0.0, 0.0>>, contentID) DartsUI.iTheirScore++ PlayerData[iSelfID].eMPState = DARTS_MPSTATE_END ENDIF ENDIF SWITCH PlayerData[iSelfID].eMPState CASE DARTS_MPSTATE_WAIT_PRE_INIT IF ServerData.mpState > DARTS_MPSTATE_INIT IF NOT IS_PED_INJURED(PLAYER_PED_ID()) //TASK_SWAP_WEAPON(PLAYER_PED_ID(), FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM CDEBUG1LN(DEBUG_DARTS, "Darts Faded out at DARTS_MPSTATE_WAIT_PRE_INIT") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) START_DARTS_GAME_FADE_OUT() ELSE CDEBUG1LN(DEBUG_DARTS, "Darts DID NOT Fade out at DARTS_MPSTATE_WAIT_PRE_INIT") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) bAlreadyInGangHouse = TRUE ENDIF CDEBUG1LN(DEBUG_DARTS, "Weapon should be holstered and control should be off") IF NOT IS_PLAYER_SCTV(PLAYER_ID()) NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_CLEAR_TASKS | NSPC_CAN_BE_TARGETTED | NSPC_ALLOW_PLAYER_DAMAGE) ENDIF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_PRE_INIT ENDIF ENDIF BREAK CASE DARTS_MPSTATE_PRE_INIT CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side PRE INIT") IF IS_SCREEN_FADED_OUT() IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), vInitLostHideoutPos) NEW_LOAD_SCENE_START(vInitLostHideoutPos, <<-3.4831, 0.0223, 60.6925>>, 20) ENDIF CDEBUG1LN(DEBUG_DARTS, "SET_ENTITY_COORDS and NETWORK_START_LOAD_SCENE done") ENDIF CDEBUG1LN(DEBUG_DARTS, "going to _pre_init_wait") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_PRE_INIT_WAIT ELSE INIT_BOARD(MPDartGame.dBoard, Args) GET_WORLD_OFFSETS(MPDartGame.dBoard, DartsPlayerPos, DartsInitReticlePos, TRUE) IF iSelfID = DART_PLAYER_AWAY_SERVER DartsPlayerPos.vDartPlayrPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << -0.3, -2.6 + fDartBoardOriginOffset, -1.7272 >>) ELSE DartsPlayerPos.vDartPlayrPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << 0.3, -2.6 + fDartBoardOriginOffset, -1.7272 >>) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) vPlayerCurrentPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) CLEAR_SEQUENCE_TASK(siTemp) OPEN_SEQUENCE_TASK(siTemp) IF iSelfID = DART_PLAYER_AWAY_SERVER TASK_STAND_STILL(NULL, 500) ENDIF IF vPlayerCurrentPos.z > 75.2 TASK_JUMP(NULL, FALSE) ENDIF TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, DartsPlayerPos.vDartPlayrPos, PEDMOVEBLENDRATIO_WALK, 5000, 0.3) // TASK_GO_STRAIGHT_TO_COORD(NULL, DartsPlayerPos.vDartPlayrPos, PEDMOVEBLENDRATIO_WALK) TASK_ACHIEVE_HEADING(NULL, MPDartGame.dBoard.fBoardHeading) CLOSE_SEQUENCE_TASK(siTemp) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), siTemp) ENDIF CDEBUG1LN(DEBUG_DARTS, "Players tasked to get into position") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_PRE_INIT_WAIT ENDIF BREAK CASE DARTS_MPSTATE_PRE_INIT_WAIT IF NOT bAlreadyInGangHouse IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM AND NETWORK_UPDATE_LOAD_SCENE() CDEBUG1LN(DEBUG_DARTS, "NETWORK_UPDATE_LOAD_SCENE finished") SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INIT CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side PRE INIT WAIT") ELSE SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INIT CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side INIT") ENDIF ELIF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK //GET_PLAYER_DISTANCE_FROM_LOCATION(DartsPlayerPos.vDartPlayrPos) < 1.5 AND NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_IN_POSITION) CDEBUG1LN(DEBUG_DARTS, "Darts player in place") DartPlayerPosition = DART_PLAYER_IN_POSITION DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_IN_POSITION) ELIF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_IN_POSITION) AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_IN_POSITION) CDEBUG1LN(DEBUG_DARTS, "Both Darts players in place, fading out") // DO_SCREEN_FADE_OUT(500) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INIT ENDIF BREAK CASE DARTS_MPSTATE_INIT // IF (bAlreadyInGangHouse AND IS_SCREEN_FADED_OUT()) // OR NOT bAlreadyInGangHouse CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side INIT") INIT_BOARD(MPDartGame.dBoard, Args) INIT_CAM(MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading) INT k REPEAT NUM_DART_TURNS k INIT_DARTS(MPDartGame.Darts[k], 0)//iSelfID) IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM //INIT_DARTS(TutorialDarts[k], 0) ENDIF ENDREPEAT INIT_SPRITE_RETICLE() DARTS_INIT_SCOREBOARD(DartsSB, ENUM_TO_INT(DartsLocation), MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading) REQUEST_STREAMS(DartsSB) REGISTER_SCRIPT_WITH_AUDIO() //Disabling UI // SET_MP_OVERHEAD_STATS_ACTIVE(FALSE) // DISABLE_SCRIPT_HUD(HUDPART_ALL_OVERHEADS, TRUE) // DISABLE_RANK_AND_XP_BAR() // DISABLE_SCRIPT_HUD(HUDPART_RANKBAR, TRUE) DISABLE_ALL_MP_HUD() DISPLAY_RADAR(FALSE) DISABLE_CELLPHONE(TRUE) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) iSteadyShotLength = 770 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) IF NOT IS_PLAYER_SCTV(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "Had to turn player control off again in DARTS_MPSTATE_INIT") ENDIF ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "Finished Stage_init") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_STREAMING // ENDIF BREAK CASE DARTS_MPSTATE_STREAMING IF HAVE_STREAMS_LOADED(DartsSB) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SETUP CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] Finished STREAMING") ENDIF BREAK CASE DARTS_MPSTATE_SETUP CDEBUG1LN(DEBUG_DARTS, "Reached Client side SETUP") DARTS_SET_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_MATCH_MADE) // placing the players in their prospective positions IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM OR NOT bAlreadyInGangHouse GET_WORLD_OFFSETS(MPDartGame.dBoard, DartsPlayerPos, DartsInitReticlePos, TRUE) CDEBUG1LN(DEBUG_DARTS, "GET_WORLD_OFFSETS obtained in DARTS_MPSTATE_SETUP") IF NETWORK_IS_HOST_OF_THIS_SCRIPT() DartsPlayerPos.vDartPlayrPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << 0.5, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ-1 >>) DartsPlayerPos.vOpponentPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << -0.4, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ >>) ELSE DartsPlayerPos.vDartPlayrPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << -0.4, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ-1 >>) DartsPlayerPos.vOpponentPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS( MPDartGame.dBoard.vDartBoard, MPDartGame.dBoard.fBoardHeading, << 0.5, -2.4 + fDartBoardOriginOffset, fBoard_offsetZ >>) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CDEBUG1LN(DEBUG_DARTS, "my player pos = ", DartsPlayerPos.vDartPlayrPos) CDEBUG1LN(DEBUG_DARTS, "oponent pos = ", DartsPlayerPos.vOpponentPos) SET_ENTITY_COORDS(PLAYER_PED_ID(), DartsPlayerPos.vDartPlayrPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), MPDartGame.dBoard.fBoardHeading) IF IS_ENTITY_VISIBLE(PLAYER_PED_ID()) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF ENDIF IF GET_PLAYER_CURRENT_HELD_WEAPON() <> WEAPONTYPE_UNARMED //TASK_SWAP_WEAPON(PLAYER_PED_ID(), FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) CDEBUG1LN(DEBUG_DARTS, "Had to holster weapon again in DARTS_MPSTATE_SETUP") ENDIF IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) IF NOT IS_PLAYER_SCTV(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) CDEBUG1LN(DEBUG_DARTS, "Had to turn player control off again in DARTS_MPSTATE_SETUP") ENDIF ENDIF ENDIF ENDIF oiReticle = CREATE_OBJECT(modelReticleRegular, DartsInitReticlePos.vInitReticlePos, FALSE, FALSE) oiDartChallenge = CREATE_OBJECT(PROP_DART_1, DartsInitReticlePos.vInitReticlePos, FALSE, FALSE) // set minigame control scaleforms DARTS_ACTIVATE_QUIT_UI(DartsUI.uiQuitControls) DARTS_ACTIVATE_ENDGAME_UI(DartsUI.uiEndGameControls) sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID))) DartsGamerHandle[PlayerData[iSelfID].iOffsetPlayerID] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID))) sCrewTags[PlayerData[iSelfID].iOffsetPlayerID] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[PlayerData[iSelfID].iOffsetPlayerID]) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) sDartsPlayerNames[PlayerData[iOtherID].iOffsetPlayerID] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) DartsGamerHandle[PlayerData[iOtherID].iOffsetPlayerID] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) sCrewTags[PlayerData[iOtherID].iOffsetPlayerID] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[PlayerData[iOtherID].iOffsetPlayerID]) piOtherPlayer = GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) IF NOT IS_PED_INJURED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID)))) piPlayerClones[PlayerData[iOtherID].iOffsetPlayerID] = CLONE_PED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))), FALSE, FALSE) ENDIF IF NOT IS_PED_INJURED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID)))) piPlayerClones[PlayerData[iSelfID].iOffsetPlayerID] = CLONE_PED(GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID))), FALSE, FALSE) ENDIF IF IS_PED_WEARING_HIGH_HEELS(piPlayerClones[PlayerData[iSelfID].iOffsetPlayerID]) CDEBUG1LN(DEBUG_DARTS, "clone self ped is wearing high heels, taking them off") DARTS_TAKE_OFF_HIGH_HEELS(piPlayerClones[PlayerData[iSelfID].iOffsetPlayerID]) ELSE CDEBUG1LN(DEBUG_DARTS, "clone self ped is not wearing high heels") ENDIF IF IS_PED_WEARING_HIGH_HEELS(piPlayerClones[PlayerData[iOtherID].iOffsetPlayerID]) CDEBUG1LN(DEBUG_DARTS, "clone other ped is wearing high heels, taking them off") DARTS_TAKE_OFF_HIGH_HEELS(piPlayerClones[PlayerData[iOtherID].iOffsetPlayerID]) ELSE CDEBUG1LN(DEBUG_DARTS, "clone other ped is not wearing high heels") ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<1991.1589, 3045.9758, 46.2151>>) // coord out of camera view, since clones are now being used IF IS_ENTITY_VISIBLE(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF ENDIF INT iTemp1, iTemp2 iTemp1 = ENUM_TO_INT(DART_PLAYER_AWAY) iTemp2 = ENUM_TO_INT(DART_PLAYER_HOME) CDEBUG1LN(DEBUG_DARTS, "iTemp1 = ", iTemp1, " iTemp2 = ", iTemp2) CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iTemp1, " = ", sCrewTags[iTemp1]) CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iTemp2, " = ", sCrewTags[iTemp2]) DARTS_ADD_NAMES(DartsSB, sDartsPlayerNames[iTemp1], sDartsPlayerNames[iTemp2]) IF NOT IS_STRING_EMPTY(sCrewTags[iTemp1]) DARTS_ADD_SB_CREW_TAG(DartsSB, iTemp1, sCrewTags[iTemp1]) ENDIF IF NOT IS_STRING_EMPTY(sCrewTags[iTemp2]) DARTS_ADD_SB_CREW_TAG(DartsSB, iTemp2, sCrewTags[iTemp2]) ENDIF DARTS_CLEAR_SCORES(DartsSB, iTemp1) DARTS_CLEAR_SCORES(DartsSB, iTemp2) ELSE CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", PlayerData[iSelfID].iOffsetPlayerID, " = ", sCrewTags[PlayerData[iSelfID].iOffsetPlayerID]) DARTS_ADD_NAMES(DartsSB, "", sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID]) IF NOT IS_STRING_EMPTY(sCrewTags[PlayerData[iSelfID].iOffsetPlayerID]) DARTS_ADD_SB_CREW_TAG(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME), sCrewTags[PlayerData[iSelfID].iOffsetPlayerID]) ENDIF DARTS_CLEAR_SCORES(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) ENDIF CDEBUG1LN(DEBUG_DARTS, "AM_Darts.sc: g_FMMC_STRUCT.iNumberOfLegs = ", g_FMMC_STRUCT.iNumberOfLegs) CDEBUG1LN(DEBUG_DARTS, "AM_Darts.sc: g_FMMC_STRUCT.iNumberOfSets = ", g_FMMC_STRUCT.iNumberOfSets) IF g_FMMC_STRUCT.iNumberOfLegs > 0 OR g_FMMC_STRUCT.iNumberOfSets > 0 UPDATE_SB_SETS_LEGS(DartsSB, 0, 0, 0, 0) ENDIF IF bShowSplash SETUP_NEW_BIG_MESSAGE(BIG_MESSAGE_CUSTOM, "MN_DART") CDEBUG1LN(DEBUG_DARTS, "AM_Darts.sc: Big 'Darts' Message displayed") START_TIMER_NOW(controlTimer) ANOTHER_GAME_CAM_MP(PLAYER_PED_ID()) RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDIF CLEAR_AREA(Args.vDartBoard, 0.5, TRUE) REMOVE_DECALS_IN_RANGE(Args.vDartBoard, 0.5) SET_ON_JOB_INTRO(TRUE) CDEBUG1LN(DEBUG_DARTS, "Going from DARTS_MPSTATE_SETUP to DARTS_MPSTATE_READY_UP") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_READY_UP BREAK CASE DARTS_MPSTATE_READY_UP IF (IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT()) AND GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 1.0 AND bShowSplash CDEBUG1LN(DEBUG_DARTS, "[DARTS_MPSTATE_READY_UP] fade in called for") DO_SCREEN_FADE_IN(500) ENDIF IF ( NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_TUTORIAL) AND ((IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) AND GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 1.6) OR GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 20.0) ) OR NOT bShowSplash IF bShowSplash CLEANUP_BIG_MESSAGE() CANCEL_TIMER(controlTimer) ENDIF //IF IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_MPTUTORIAL_SHOWN) //IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_DARTS_SEEN_TUTORIAL) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_DONE) CDEBUG1LN(DEBUG_DARTS, "Tutorial has been seen, skipping it") CDEBUG1LN(DEBUG_DARTS, "tbh the tutorial will always get skipped") //ELSE // CDEBUG1LN(DEBUG_DARTS, "Tutorial has not been seen yet") //ENDIF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_TUTORIAL DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_TUTORIAL) ELSE IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_TUTORIAL) AND bShowSplash UPDATE_CUSTOM_BIG_MESSAGE("MN_DART") ENDIF ENDIF BREAK CASE DARTS_MPSTATE_TUTORIAL IF (DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_TUTORIAL) AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_AT_TUTORIAL)) OR (DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_TUTORIAL) AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER)) IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM AND (NOT (DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_DONE) AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_TUTORIAL_DONE)) AND NOT (DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_TUTORIAL_DONE) AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER))) IF DARTS_TUTORIAL(DartsTutorialStage, MPDartGame.dBoard, AIBrain, TurnStage, MPDartGame.Darts, TutorialTimer, PlayerData) //TurnStage, TutorialDarts, TutorialTimer, PlayerData) CDEBUG1LN(DEBUG_DARTS, "FINISHED TUTORIAL") //SET_BIT(g_iDartsTutorialFlags, gDARTS_MPTUTORIAL_SHOWN) SET_MP_BOOL_CHARACTER_STAT(MP_STAT_DARTS_SEEN_TUTORIAL, TRUE) CDEBUG1LN(DEBUG_DARTS, "Setting MP_STAT_DARTS_SEEN_TUTORIAL to true") IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) //PlayerData[iSelfID].eMPState = DARTS_MPSTATE_THROW_OFF_SETUP PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INTRO_SYNC_SETUP ELSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] setting FM Match Start just before the game starts") DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, ServerData.iMatchType) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SYNC_OBJECTS ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "TUTORIAL ALREADY SHOWN, SKIPPING") CLEAR_HELP() DARTS_GAME_CAM() IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) //PlayerData[iSelfID].eMPState = DARTS_MPSTATE_THROW_OFF_SETUP PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INTRO_SYNC_SETUP ELSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] setting FM Match Start just before the game starts") DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, ServerData.iMatchType) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SYNC_OBJECTS ENDIF ENDIF ENDIF BREAK CASE DARTS_MPSTATE_INTRO_SYNC_SETUP IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) CDEBUG1LN(DEBUG_DARTS, "doing fade in in intro sync setup") ELSE //piOpponentClone = CLONE_PED(piOtherPlayer, FALSE, FALSE) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) SET_PLAYER_INVISIBLE_LOCALLY(PLAYER_ID()) CDEBUG1LN(DEBUG_DARTS, "created clone") IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_AWAY]) AND NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) // iSceneId = CREATE_SYNCHRONIZED_SCENE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(DartsArgs.oiDartBoard, << 0.337842, -0.243051, -0.329731 >>), // << 0, 0, GET_ENTITY_HEADING(DartsArgs.oiDartBoard) - 3.783146>>) CDEBUG1LN(DEBUG_DARTS, "tasking sync scene") iSceneId = CREATE_SYNCHRONIZED_SCENE(<<1992.679, 3050.739, 47.660>>, << 0, 0, 54.000>>) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneId, "darts_ig_intro_alt1_cam", "mini@dartsintro_alt1") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_AWAY], iSceneId, "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[DART_PLAYER_HOME], iSceneId, "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy2", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_AWAY], "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy1_face", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) TASK_PLAY_ANIM(piPlayerClones[DART_PLAYER_HOME], "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy2_face", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) PLAY_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, iSceneId, "darts_ig_intro_alt1_dart","mini@dartsintro_alt1" , INSTANT_BLEND_IN ) CDEBUG1LN(DEBUG_DARTS, "going to intro sync play") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_INTRO_SYNC_PLAY ENDIF ENDIF BREAK CASE DARTS_MPSTATE_INTRO_SYNC_PLAY SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) SET_PLAYER_INVISIBLE_LOCALLY(PLAYER_ID()) IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) = 1.0 CDEBUG1LN(DEBUG_DARTS, "sync scene is done") IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_AWAY]) AND NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) DARTS_GAME_CAM() DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_AWAY]) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_HOME]) DELETE_OBJECT(oiDartChallenge) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_THROW_OFF_SETUP iSplashStage = 0 ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "sync scene is still running") ENDIF BREAK CASE DARTS_MPSTATE_THROW_OFF_SETUP IF NOT IS_TIMER_STARTED(controlTimer) SET_SHARD_BIG_MESSAGE(shardBigMessage, "DARTS_THRW_OFF", "DARTS_THRW_STR", 3000) START_TIMER_NOW(controlTimer) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF ELIF GET_TIMER_IN_SECONDS_SAFE(controlTimer) >= 3.5 //OR (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) // AND GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 1.6) //OR NOT UPDATE_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, TRUE) OR NOT UPDATE_SHARD_BIG_MESSAGE(shardBigMessage) CLEANUP_BIG_MESSAGE() CANCEL_TIMER(controlTimer) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] setting FM Match Start just before the game starts") DEAL_WITH_FM_MATCH_START(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, ServerData.iMatchType) UPDATE_HIGHLIGHT(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) DARTS_INIT_TIMERS(localDartsTimer) RESET_SHARD_BIG_MESSAGE(shardBigMessage) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_THROWOFF) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_THROW_OFF ENDIF BREAK // #THROWOFF GAMEPLAY HERE VVVVVVV CASE DARTS_MPSTATE_THROW_OFF IF DARTS_SERVER_CHECK_FLAG(ServerData, DARTSERVERFLAG_DO_THROWOFF) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF // IF DARTS_PLAYER_QUIT_CONTROL(PlayerData[iSelfID], DartsUI, iDebugThrottle) // PlayerData[iSelfID].eMPState = DARTS_MPSTATE_END // ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) IF NOT (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_WINNING) AND ( NOT playerData[iSelfID].bDartThrown = TRUE OR NOT playerData[iOtherID].bDartThrown = TRUE ) AND NOT DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) IF NOT bUITextDisplayed IF NOT (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_SCORE_CHECK) IF bShowShotClockThrowHelp AND NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLOCK_HELP) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gSHOT_CLOCK_HELP_SHOWN) PRINT_HELP("DARTS_TIOT") SET_BIT(g_iDartsTutorialFlags, gSHOT_CLOCK_HELP_SHOWN) ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLOCK_HELP, TRUE) ENDIF ENDIF DartsUI.bInstructTextTransIn = TRUE ELSE IF DartsUI.bInstructTextTransIn CLEAR_HELP() DartsUI.bInstructTextTransIn = FALSE ENDIF ENDIF ENDIF // Drawing the instuctional button UI IF ((playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM) AND (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING)) OR bWaitUIShow DARTS_MP_THROWOFF_CONTROLS_UI(DartsUI, (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING)) ENDIF ENDIF // Do everyting playing related right chea SWITCH serverData.mpTurnStatus[iSelfID] CASE DARTS_MPTURN_THROWING SWITCH playerData[iSelfID].eMPThrowStage CASE DARTS_MPTHROW_AIM //DARTS_GAME_HELP(ServerData.iServerTurn, TRUE) // IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLECK_HELP) // IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_CLOCK_HELP_SHOWN) // PRINT_HELP("DARTS_CLOCK") // SET_BIT(g_iDartsTutorialFlags, gDARTS_CLOCK_HELP_SHOWN) // ENDIF // DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLECK_HELP, TRUE) // ENDIF IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_AIM_TUT_SHOWN) PRINT_HELP("DARTS_AIM_HLP") SET_BIT(g_iDartsTutorialFlags, gDARTS_AIM_TUT_SHOWN) ELIF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_AIM_HLP") AND NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_CLOCK_HELP_SHOWN) PRINT_HELP("DARTS_CLOCK") SET_BIT(g_iDartsTutorialFlags, gDARTS_CLOCK_HELP_SHOWN) ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DARTS_DRAW_THROW_OFF_CLOCK(ServerData.DartsTimer, TRUE) ENDIF IF ServerData.DartsTimer.bNewShot CDEBUG1LN(DEBUG_DARTS, "Server timer has sensed a new shot!") ENDIF IF ServerData.DartsTimer.bTimeRunOut CDEBUG1LN(DEBUG_DARTS, "Server timer has sensed that it has run out!") ENDIF IF (NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) AND NOT IS_PAUSE_MENU_ACTIVE()) OR ServerData.DartsTimer.bTimeRunOut IF DO_AIMING(MPDartGame.Darts[serverData.iServerTurn], MPDartGame.dBoard, DartsInitReticlePos, FALSE, ServerData.DartsTimer.bTimeRunOut, TRUE) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] current client finished AIMING") IF ServerData.DartsTimer.bTimeRunOut AND NOT bShowShotClockThrowHelp bShowShotClockThrowHelp = TRUE ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // copy dart's throw info to the client so that other player can grab it CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] Copy the throwers data for dart ", 0) COPY_DART_TO_CLIENT(playerData[iSelfID], MPDartGame.Darts[serverData.iServerTurn]) IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF IF MPGlobals.DartsData.iDangerPedCount <= 0 OR NOT IS_BIT_SET(MPGlobals.DartsData.iDisplayState, 2) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] no peds in danger zone, clearing danger flag") ELSE DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] setting danger flag, peds in danger zone: ", MPGlobals.DartsData.iDangerPedCount) ENDIF playerData[iSelfID].bDartThrown = TRUE playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_THROW ENDIF ENDIF BREAK CASE DARTS_MPTHROW_THROW DEBUG_MESSAGE_PERIODIC("[AM_DARTS] current client is THROWING", iDebugThrottle) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) IF THROW_DART(MPDartGame.Darts[serverData.iServerTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw completed") playerData[iSelfID].bResetDone = FALSE playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_SCORE ENDIF ELSE IF NOT IS_TIMER_STARTED(ReThrowTimer) IF THROW_DART_AT_ENTITY(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard, << 988.1219, -99.3023, 73.8456 >>) BROADCAST_DANGER_ZONE_UPDATE(PLAYER_ID(), DARTS_DANGERZONE_DART_THROW) CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed") playerData[iSelfID].bDartThrown = FALSE playerData[iSelfID].bResetDone = FALSE RESTART_TIMER_NOW(ReThrowTimer) ENDIF ELIF GET_TIMER_IN_SECONDS(ReThrowTimer) > 1.0 OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_RETHROW_NEEDED) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed, going back to DARTS_MPTHROW_AIM - THROW SIDE") CANCEL_TIMER(ReThrowTimer) playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM ENDIF ENDIF BREAK CASE DARTS_MPTHROW_SCORE //IF PlayerData[iOtherID].eMPWaitStage >= DARTS_MPWAIT_SCORE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is SCORING") SCORE_DART(MPDartGame.Darts[serverData.iServerTurn], MPDartGame.dBoard) playerData[iSelfID].ClientDart.fLength = MPDartGame.Darts[serverData.iServerTurn].fLength CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] THROW - Client Dart ", ServerData.iServerTurn, " fLength = ", playerData[iSelfID].ClientDart.fLength) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] THROW - Local Dart ", ServerData.iServerTurn, " fLength = ", MPDartGame.Darts[ServerData.iServerTurn].fLength) playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_TURN_CHANGE //ENDIF DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to finish throwing", iDebugThrottle) BREAK CASE DARTS_MPTHROW_TURN_CHANGE IF PlayerData[iOtherID].eMPWaitStage >= DARTS_MPWAIT_TURN_CHANGE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is THROWING - TURN CHANGE") playerData[iSelfID].bDartThrown = FALSE DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) IF NOT MPDartGame.Darts[serverData.iServerTurn].bDoneScoring MPDartGame.Darts[serverData.iServerTurn].bDoneScoring = TRUE ENDIF SETTIMERA(0) ENDIF DEBUG_MESSAGE_PERIODIC("Waiting for other client to get to DARTS_MPWAIT_TURN_CHANGE", iDebugThrottle) BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_WAITING SWITCH playerData[iSelfID].eMPWaitStage CASE DARTS_MPWAIT_AIM IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DARTS_DRAW_THROW_OFF_CLOCK(ServerData.DartsTimer, FALSE) ENDIF IF NOT bWaitUIShow bWaitUIShow = TRUE ENDIF IF playerData[iOtherID].bDartThrown CDEBUG1LN(DEBUG_DARTS, "Current client finished WAIT - AIMING") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // grab other players dart throw info so we can throw that thang COPY_DART_TO_LOCAL(MPDartGame.Darts[serverData.iServerTurn], playerData[iOtherID], iOtherID) IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_THROW ELSE DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to throw", iDebugThrottle) ENDIF BREAK CASE DARTS_MPWAIT_THROW CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - Throwing") IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_DANGER_DART) IF THROW_DART(MPDartGame.Darts[serverData.iServerTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw Completed - Wait side") playerData[iSelfID].bResetDone = FALSE playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_SCORE ENDIF ELSE IF NOT IS_TIMER_STARTED(ReThrowTimer) IF THROW_DART_AT_ENTITY(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard, << 988.1219, -99.3023, 73.8456 >>) CDEBUG1LN(DEBUG_DARTS, "Danger Dart Completed - WAIT SIDE") RESTART_TIMER_NOW(ReThrowTimer) ENDIF ELIF GET_TIMER_IN_SECONDS(ReThrowTimer) > 1.0 OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_RETHROW_NEEDED) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed, going back to DARTS_MPTHROW_AIM - WAIT SIDE") CANCEL_TIMER(RethrowTimer) playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_AIM ENDIF ENDIF BREAK CASE DARTS_MPWAIT_SCORE IF PlayerData[iOtherID].eMPThrowStage >= DARTS_MPTHROW_SCORE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - SCORING") SCORE_DART(MPDartGame.Darts[serverData.iServerTurn], MPDartGame.dBoard) playerData[iSelfID].ClientDart.fLength = MPDartGame.Darts[serverData.iServerTurn].fLength CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] WAIT - Client Dart ", ServerData.iServerTurn, " fLength = ", playerData[iSelfID].ClientDart.fLength) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] WAIT - Local Dart ", ServerData.iServerTurn, " fLength = ", MPDartGame.Darts[serverData.iServerTurn].fLength) playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_TURN_CHANGE ENDIF DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to finish throwing", iDebugThrottle) BREAK CASE DARTS_MPWAIT_TURN_CHANGE IF PlayerData[iOtherID].eMPThrowStage >= DARTS_MPTHROW_TURN_CHANGE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - TURN CHANGE") DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) IF NOT MPDartGame.Darts[serverData.iServerTurn].bDoneScoring MPDartGame.Darts[serverData.iServerTurn].bDoneScoring = TRUE ENDIF SETTIMERA(0) ENDIF DEBUG_MESSAGE_PERIODIC("Waiting for other client to get to DARTS_MPTHROW_TURN_CHANGE", iDebugThrottle) BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_SCORE_CHECK IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED) IF iSelfID = serverData.iThrower // print something? ELSE // print something else? ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, TRUE) ENDIF IF NOT playerData[iSelfID].bResetDone AND ( TIMERA() > 1000 ) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is in SCORE CHECK") playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_AIM playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring = FALSE DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) CLEAR_HELP() IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) // sending the darts back to the player, resetting them // serves the same functioon as RESET_DART without deleting the object INT y REPEAT NUM_MP_DART_TURNS y //RESET_DART(MPDartGame.Darts[y]) MPDartGame.Darts[y].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", y, " was reset") ENDREPEAT IF iSelfID != serverData.iThrower bWaitUIShow = FALSE ENDIF UPDATE_HIGHLIGHT(DartsSB, playerData[serverData.iWaiter].iOffsetPlayerID) iSteadyShotsUsed = 0 ENDIF playerData[iSelfID].bResetDone = TRUE ENDIF BREAK CASE DARTS_MPTURN_WINNING IF NOT IS_TIMER_STARTED(controlTimer) CDEBUG1LN(DEBUG_DARTS, "********** serverData.iWinner = ", serverData.iWinner) CLEAR_PRINTS() CLEAR_HELP() IF (serverData.iWinner = PlayerData[iSelfID].iOffsetPlayerID) sShardPlayerName = "" sShardPlayerName += "~HUD_COLOUR_BLUE~" sShardPlayerName += sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID] sShardPlayerName += "" sShardPlayerName += "~s~" SET_SHARD_BIG_MESSAGE_WITH_PLAYER_NAME_IN_STRAPLINE(shardBigMessage, "DARTS_THRW_WIN", "DARTS_FIRST", sShardPlayerName, 3000, SHARD_MESSAGE_CENTERED, HUD_COLOUR_WHITE) //SET_SCALEFORM_BIG_MESSAGE_WITH_PLAYER_NAME_IN_STRAPLINE(DartsUI.siBigMessage, "DARTS_THRW_WIN", "DARTS_FIRST", sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID], 5000, // default, default, TRUE, MG_BIG_MESSAGE_ANIM_TIME_SLOW) PLAY_SOUND_FRONTEND(-1, "WIN", "HUD_AWARDS") ELSE sShardPlayerName = "" sShardPlayerName += "~HUD_COLOUR_RED~" sShardPlayerName += sDartsPlayerNames[PlayerData[iOtherID].iOffsetPlayerID] sShardPlayerName += "" sShardPlayerName += "~s~" SET_SHARD_BIG_MESSAGE_WITH_PLAYER_NAME_IN_STRAPLINE(shardBigMessage, "DARTS_THRW_LOS", "DARTS_FIRST", sShardPlayerName, 3000, SHARD_MESSAGE_CENTERED, HUD_COLOUR_RED) //SET_SCALEFORM_BIG_MESSAGE_WITH_PLAYER_NAME_IN_STRAPLINE(DartsUI.siBigMessage, "DARTS_THRW_LOS", "DARTS_FIRST", sDartsPlayerNames[PlayerData[iOtherID].iOffsetPlayerID], 5000, // HUD_COLOUR_RED, default, TRUE, MG_BIG_MESSAGE_ANIM_TIME_SLOW) PLAY_SOUND_FRONTEND(-1, "LOSER", "HUD_AWARDS") ENDIF //SETUP_NEW_BIG_MESSAGE(BIG_MESSAGE_CUSTOM, "DARTS_THRW_OFF", "DARTS_THRW_STR") SET_CAM_ACTIVE(camDartGame, TRUE) START_TIMER_NOW(controlTimer) ELIF GET_TIMER_IN_SECONDS_SAFE(controlTimer) >= 5.0 //OR NOT UPDATE_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, TRUE) OR NOT UPDATE_SHARD_BIG_MESSAGE(shardBigMessage, TRUE) INT y REPEAT NUM_MP_DART_TURNS y RESET_DART(MPDartGame.Darts[y]) MPDartGame.Darts[y].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", y, " was reset") ENDREPEAT CANCEL_TIMER(controlTimer) RESET_SHARD_BIG_MESSAGE(shardBigMessage) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_AT_THROWOFF) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SYNC_OBJECTS ENDIF // IF NOT MPGlobals.DartsData.bResultsDisplayed // MPGlobals.DartsData.bResultsDisplayed = TRUE // ENDIF // // MPDartGame.bDartWinner = (serverData.iWinner = iSelfID) BREAK ENDSWITCH ENDIF BREAK CASE DARTS_MPSTATE_SYNC_OBJECTS CDEBUG1LN(DEBUG_DARTS, "Client DARTS_MPSTATE_SYNC_OBJECTS") i = 0 j = 0 REPEAT NUM_MP_DART_PLAYERS i MPDartGame.iThrowsTaken[i] = 0 MPDartGame.iBullsEyesHit[i] = 0 DARTS_CLEAR_SCORES(DartsSB, i) ENDREPEAT DARTS_ADD_SCORE(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME), 301) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DARTS_ADD_SCORE(DartsSB, ENUM_TO_INT(DART_PLAYER_AWAY), 301) ENDIF REPEAT NUM_MP_DART_TURNS j RESET_DART(MPDartGame.Darts[j]) MPDartGame.Darts[j].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", j, " was reset") ENDREPEAT RESET_CLIENT_DART(PlayerData[iSelfID]) DARTS_INIT_TIMERS(localDartsTimer) playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_AIM playerData[iSelfID].bDartThrown = FALSE MPDartGame.bEndGameMessageDisplayed = FALSE MPDartGame.bWinNoise = FALSE bInWinRange = FALSE // CLEAR_AREA(Args.vDartBoard, 0.5, TRUE) // REMOVE_DECALS_IN_RANGE(Args.vDartBoard, 0.5) iSteadyShotsUsed = 0 bSteadyShotHelp = FALSE DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_FIRST_THROW, FALSE) SET_ON_JOB_INTRO(FALSE) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SYNC_COMPLETE) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SETUP_POST BREAK CASE DARTS_MPSTATE_SETUP_POST DEBUG_MESSAGE_PERIODIC("Client DARTS_MPSTATE_SETUP_POST", iDebugThrottle) IF ServerData.mpState = DARTS_MPSTATE_IN_PROGRESS PlayerData[iSelfID].bDoRematch = FALSE // TODO: implement the cam interpolation // IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() // DO_SCREEN_FADE_IN(500) // ENDIF DARTS_GAME_CAM() FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) IF SHOULD_DARTS_LEVEL_HELP_SHOW(GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDARTS), iLevelBit) CDEBUG1LN(DEBUG_DARTS, "show the level up prompt") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP, TRUE) ELSE CDEBUG1LN(DEBUG_DARTS, "no level up prompt to show") ENDIF fScaledWobble = GET_MP_WOBBLE_LEVEL(GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDARTS)) //0.076 fScaledRealWobble = GET_MP_REAL_WOBBLE_LEVEL(GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDARTS)) //0.1015 CDEBUG1LN(DEBUG_DARTS, "total darts games = ", GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDARTS)) CDEBUG1LN(DEBUG_DARTS, "scaled wobble = ", fScaledWobble) CDEBUG1LN(DEBUG_DARTS, "scaled real wobble = ", fScaledRealWobble) fWobbleFactor = fScaledWobble fRealWobFactor = fScaledRealWobble DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SYNC_COMPLETE) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_IN_PROGRESS CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] Client is proceeding to IN PROGRESS") IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DartsStats[DARTS_SCLB_STAT_NUM_MATCHES]++ ENDIF DARTS_INIT_UI(DartsUI) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_HIGHLIGHT(DartsSB, PICK_INT((serverData.iCoinFlip = 0), ENUM_TO_INT(DART_PLAYER_AWAY), ENUM_TO_INT(DART_PLAYER_HOME))) ELSE UPDATE_HIGHLIGHT(DartsSB, ENUM_TO_INT(DART_PLAYER_HOME)) ENDIF bWaitUIShow = FALSE ENDIF BREAK CASE DARTS_MPSTATE_WAIT_POST_MENU CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Client side WAIT POST MENU") // Sitting in a waiting state IF DARTS_SERVER_CHECK_FLAG(serverData, DARTSERVERFLAG_MOVETOGAME) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_IN_PROGRESS ENDIF BREAK // #REALGAME HERE VVVVVVV CASE DARTS_MPSTATE_IN_PROGRESS // failsafe for screen not fading back in IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF // IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_FIRST_THROW) // PRINT_WITH_NAME("DARTS_FIRST", sDartsPlayerNames[PICK_INT((serverData.mpTurnStatus[iSelfID]=DARTS_MPTURN_THROWING), iSelfID, iOtherID)], DEFAULT_GOD_TEXT_TIME, 0) // DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_FIRST_THROW, TRUE) // ENDIF // HANDLE_SWITCH_CAM() // making sure the dart players stay in position SWITCH DartPlayerPosition CASE DART_PLAYER_IN_POSITION IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND GET_PLAYER_DISTANCE_FROM_LOCATION(DartsPlayerPos.vDartPlayrPos) > 1.5 // #IF IS_DEBUG_BUILD // CDEBUG1LN(DEBUG_DARTS, "GET_PLAYER_DISTANCE_FROM_LOCATION(DartsPlayerPos.vDartPlayrPos) = ", GET_PLAYER_DISTANCE_FROM_LOCATION(DartsPlayerPos.vDartPlayrPos)) // #ENDIF // // CLEAR_SEQUENCE_TASK(siTemp) // OPEN_SEQUENCE_TASK(siTemp) // TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, DartsPlayerPos.vDartPlayrPos, PEDMOVEBLENDRATIO_WALK, 5000, 0.3) // TASK_ACHIEVE_HEADING(NULL, MPDartGame.dBoard.fBoardHeading) // CLOSE_SEQUENCE_TASK(siTemp) // TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), siTemp) // // CDEBUG1LN(DEBUG_DARTS, "Dart player out of position, tasked to move back") // // DartPlayerPosition = DART_PLAYER_OUT_POSITION ENDIF BREAK CASE DART_PLAYER_OUT_POSITION IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK // CDEBUG1LN(DEBUG_DARTS, "Dart player is now back in position") DartPlayerPosition = DART_PLAYER_IN_POSITION ENDIF BREAK ENDSWITCH // IF DARTS_PLAYER_QUIT_CONTROL(PlayerData[iSelfID], DartsUI, iDebugThrottle) // PlayerData[iSelfID].eMPState = DARTS_MPSTATE_END // ENDIF // Drawing the hud and the control scheme IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) // help text drawing IF NOT (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_WINNING) AND ( NOT playerData[iSelfID].bDartThrown = TRUE OR NOT playerData[iOtherID].bDartThrown = TRUE ) AND NOT DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) IF NOT bUITextDisplayed IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY) AND serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gWIN_HELP_SHOWN) PRINT_HELP("DARTS_INSTR_W") SET_BIT(g_iDartsTutorialFlags, gWIN_HELP_SHOWN) ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP, TRUE) ELIF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP) AND DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gBUST_HELP_SHOWN) PRINT_HELP("DARTS_INSTR_B") SET_BIT(g_iDartsTutorialFlags, gBUST_HELP_SHOWN) ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP, TRUE) ENDIF ENDIF IF bInWinRange AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_SHT_USE") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_FST_HLP") AND serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING // IF (serverData.iScores[iSelfID] % 2) = 0 // AND (serverData.iScores[iSelfID] = 50 OR serverData.iScores[iSelfID] < 41) // // IF serverData.iScores[iSelfID] = 50 // ELSE // CLEAR_HELP() // ENDIF // ENDIF ELIF NOT (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_SCORE_CHECK) //DEBUG_MESSAGE_PERIODIC("DARTS UI IS SHOWING REGULAR HELP", iDebugThrottle) IF bShowShotClockThrowHelp //ServerData.DartsTimer.bTimeRunOut AND NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLOCK_HELP) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_W") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_B") AND (IS_TIMER_STARTED(ServerData.DartsTimer.stShotClock) AND GET_TIMER_IN_SECONDS_SAFE(ServerData.DartsTimer.stShotClock) < 5) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gSHOT_CLOCK_HELP_SHOWN) PRINT_HELP("DARTS_TIOT") SET_BIT(g_iDartsTutorialFlags, gSHOT_CLOCK_HELP_SHOWN) CDEBUG1LN(DEBUG_DARTS, "shot clock help bit set here") ELSE CDEBUG1LN(DEBUG_DARTS, "shot clock help bit already set") ENDIF CDEBUG1LN(DEBUG_DARTS, "shot clock ui flag set") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOT_CLOCK_HELP, TRUE) ENDIF ENDIF DartsUI.bInstructTextTransIn = TRUE ELSE IF DartsUI.bInstructTextTransIn CLEAR_HELP() DartsUI.bInstructTextTransIn = FALSE ENDIF ENDIF ENDIF // Drawing the Darts Left UI element and the instructional buttons IF ((playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM) AND (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING)) OR bWaitUIShow IF NOT IS_PLAYER_SWITCH_IN_PROGRESS() AND NOT IS_TRANSITION_ACTIVE() DARTS_MP_CONTROLS_UI(DartsUI, (serverData.mpTurnStatus[iSelfID] = DARTS_MPTURN_THROWING)) ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() DARTS_DISPLAY_SPECIAL_SPLASH_MP_SHARD(DartsUI) IF bPlaySplashFX PLAY_SOUND_FRONTEND ( -1, "GOLF_NEW_RECORD", "HUD_AWARDS") bPlaySplashFX = FALSE ENDIF ENDIF ENDIF // Do everyting playing related right chea SWITCH serverData.mpTurnStatus[iSelfID] CASE DARTS_MPTURN_THROWING SWITCH playerData[iSelfID].eMPThrowStage CASE DARTS_MPTHROW_AIM playerData[iSelfID].bDartAim = TRUE // playerData[iSelfID].vReticlePos.x = spriteReticle.x // playerData[iSelfID].vReticlePos.y = spriteReticle.y IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) //DARTS_DRAW_PLAYERS_RETICLE(playerData[iSelfID].vReticlePos, iSelfID) DARTS_DRAW_SHOT_CLOCK(ServerData.DartsTimer, TRUE) //DRAW_DARTS_RETICLE_GUIDE(iSelfID, iSelfID) ENDIF DARTS_GAME_HELP(ServerData.iServerTurn, TRUE) IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP) IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_SHT_USE") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_CLOCK") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_W") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_B") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_AIM_HLP") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_STD_HLP") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_FST_HLP") PRINT_HELP("DARTS_LEVEL") SET_BIT(g_savedGlobals.sDartsData.iDartTimePlayed, iLevelBit) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP, FALSE) ENDIF ENDIF IF ServerData.DartsTimer.bNewShot CDEBUG1LN(DEBUG_DARTS, "Server timer has sensed a new shot!") ENDIF IF ServerData.DartsTimer.bTimeRunOut CDEBUG1LN(DEBUG_DARTS, "Server timer has sensed that it has run out!") ENDIF IF (NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) AND NOT IS_PAUSE_MENU_ACTIVE() AND NOT IS_PLAYER_SWITCH_IN_PROGRESS() AND NOT IS_TRANSITION_ACTIVE()) OR ServerData.DartsTimer.bTimeRunOut IF DO_AIMING(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard, DartsInitReticlePos, FALSE, ServerData.DartsTimer.bTimeRunOut) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] current client finished AIMING") IF ServerData.DartsTimer.bTimeRunOut AND NOT bShowShotClockThrowHelp bShowShotClockThrowHelp = TRUE ENDIF DartsUI.iDartsLeft-- DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // copy dart's throw info to the client so that other player can grab it CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] Copy the throwers data for dart ", ServerData.iServerTurn) COPY_DART_TO_CLIENT(playerData[iSelfID], MPDartGame.Darts[ServerData.iServerTurn]) IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF IF MPGlobals.DartsData.iDangerPedCount <= 0 OR NOT IS_BIT_SET(MPGlobals.DartsData.iDisplayState, 2) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] no peds in danger zone, clearing danger flag") ELSE DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS->DARTS_MPTHROW_AIM] setting danger flag, peds in danger zone: ", MPGlobals.DartsData.iDangerPedCount) ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DartsStats[DARTS_SCLB_STAT_DARTS_THROWN]++ ENDIF playerData[iSelfID].bDartThrown = TRUE playerData[iSelfID].bDartAim = FALSE playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_THROW ENDIF ENDIF BREAK CASE DARTS_MPTHROW_THROW DEBUG_MESSAGE_PERIODIC("[AM_DARTS] current client is THROWING", iDebugThrottle) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_DANGER_DART) IF THROW_DART(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw completed") MPDartGame.iThrowsTaken[PlayerData[iSelfID].iOffsetPlayerID]++ playerData[iSelfID].bResetDone = FALSE playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_SCORE ENDIF ELSE IF NOT IS_TIMER_STARTED(ReThrowTimer) IF THROW_DART_AT_ENTITY(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard, << 988.1219, -99.3023, 73.8456 >>) BROADCAST_DANGER_ZONE_UPDATE(PLAYER_ID(), DARTS_DANGERZONE_DART_THROW) CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed") playerData[iSelfID].bDartThrown = FALSE playerData[iSelfID].bDartAim = TRUE playerData[iSelfID].bResetDone = FALSE RESTART_TIMER_NOW(ReThrowTimer) ENDIF ELIF GET_TIMER_IN_SECONDS(ReThrowTimer) > 1.0 OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_RETHROW_NEEDED) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed, going back to DARTS_MPTHROW_AIM - THROW SIDE") CANCEL_TIMER(ReThrowTimer) playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM ENDIF ENDIF BREAK CASE DARTS_MPTHROW_SCORE // IF PlayerData[iOtherID].eMPWaitStage >= DARTS_MPWAIT_SCORE // OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is SCORING") //playerData[iSelfID].bDartThrown = FALSE SCORE_DART(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard) playerData[iSelfID].ClientDart.iHitValue = MPDartGame.Darts[ServerData.iServerTurn].iHitValue IF playerData[iSelfID].ClientDart.iHitValue = 50 MPDartGame.iBullsEyesHit[PlayerData[iSelfID].iOffsetPlayerID]++ ENDIF IF playerData[iSelfID].ClientDart.iHitMultiplier = 2 OR playerData[iSelfID].ClientDart.iHitValue = 50 playerData[iSelfID].bDoubleThrow = TRUE ELSE playerData[iSelfID].bDoubleThrow = FALSE ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] THROW - Client Dart ", ServerData.iServerTurn, " hit value = ", playerData[iSelfID].ClientDart.iHitValue) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] THROW - Local Dart ", ServerData.iServerTurn, " hit value = ", MPDartGame.Darts[ServerData.iServerTurn].iHitValue) playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_TURN_CHANGE // ENDIF DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to finish throwing", iDebugThrottle) BREAK CASE DARTS_MPTHROW_TURN_CHANGE IF PlayerData[iOtherID].eMPWaitStage >= DARTS_MPWAIT_TURN_CHANGE OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) playerData[iSelfID].bDartThrown = FALSE DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is THROWING - TURN CHANGE") CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iServerTurn = ", ServerData.iServerTurn) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iServerTurn].bDoneScoring = ", MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring) IF NOT MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring = TRUE ENDIF SETTIMERA(0) ENDIF DEBUG_MESSAGE_PERIODIC("Waiting for other client to get to DARTS_MPWAIT_TURN_CHANGE", iDebugThrottle) BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_WAITING SWITCH playerData[iSelfID].eMPWaitStage CASE DARTS_MPWAIT_AIM // uncomment if you want to draw the reticle on both machines /* IF playerData[iOtherID].bDartAim DARTS_DRAW_PLAYERS_RETICLE(playerData[iOtherID].vReticlePos, iOtherID, TRUE) DRAW_DARTS_RETICLE_GUIDE(iSelfID, iOtherID) ENDIF */ IF NOT bWaitUIShow bWaitUIShow = TRUE ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(playerData[iSelfID], DARTS_CLIENTFLAG_QUIT_ATTEMPTED) DARTS_DRAW_SHOT_CLOCK(ServerData.DartsTimer, FALSE) ENDIF IF playerData[iOtherID].bDartThrown CDEBUG1LN(DEBUG_DARTS, "Current client finished WAIT - AIMING") DartsUI.iDartsLeft-- DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, FALSE) // grab other players dart throw info so we can throw that thang COPY_DART_TO_LOCAL(MPDartGame.Darts[ServerData.iServerTurn], playerData[iOtherID], iOtherID) IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_THROW ELSE DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to throw", iDebugThrottle) ENDIF BREAK CASE DARTS_MPWAIT_THROW CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - Throwing") IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_DANGER_DART) IF THROW_DART(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard) CDEBUG1LN(DEBUG_DARTS, "Regular Throw Completed - Wait side") MPDartGame.iThrowsTaken[PlayerData[iOtherID].iOffsetPlayerID]++ playerData[iSelfID].bResetDone = FALSE playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_SCORE ENDIF ELSE IF NOT IS_TIMER_STARTED(ReThrowTimer) IF THROW_DART_AT_ENTITY(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard, << 988.1219, -99.3023, 73.8456 >>) CDEBUG1LN(DEBUG_DARTS, "Danger Dart Completed - WAIT SIDE") RESTART_TIMER_NOW(ReThrowTimer) ENDIF ELIF GET_TIMER_IN_SECONDS(ReThrowTimer) > 1.0 OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_RETHROW_NEEDED) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_RETHROW_NEEDED) ENDIF CDEBUG1LN(DEBUG_DARTS, "Danger dart throw completed, going back to DARTS_MPTHROW_AIM - WAIT SIDE") CANCEL_TIMER(RethrowTimer) playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_AIM ENDIF ENDIF BREAK CASE DARTS_MPWAIT_SCORE IF PlayerData[iOtherID].eMPThrowStage >= DARTS_MPTHROW_SCORE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - SCORING") SCORE_DART(MPDartGame.Darts[ServerData.iServerTurn], MPDartGame.dBoard) playerData[iSelfID].ClientDart.iHitValue = MPDartGame.Darts[ServerData.iServerTurn].iHitValue IF playerData[iSelfID].ClientDart.iHitValue = 50 MPDartGame.iBullsEyesHit[PlayerData[iOtherID].iOffsetPlayerID]++ ENDIF IF playerData[iSelfID].ClientDart.iHitMultiplier = 2 OR playerData[iSelfID].ClientDart.iHitValue = 50 playerData[iSelfID].bDoubleThrow = TRUE ELSE playerData[iSelfID].bDoubleThrow = FALSE ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] WAIT - Client Dart ", ServerData.iServerTurn, " hit value = ", playerData[iSelfID].ClientDart.iHitValue) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] WAIT - Local Dart ", ServerData.iServerTurn, " hit value = ", MPDartGame.Darts[ServerData.iServerTurn].iHitValue) playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_TURN_CHANGE ENDIF DEBUG_MESSAGE_PERIODIC("Current client is waiting for other client to finish throwing", iDebugThrottle) BREAK CASE DARTS_MPWAIT_TURN_CHANGE IF PlayerData[iOtherID].eMPThrowStage >= DARTS_MPTHROW_TURN_CHANGE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is WAITING - TURN CHANGE") CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iServerTurn = ", ServerData.iServerTurn) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iServerTurn].bDoneScoring = ", MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring) DARTS_SET_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) IF NOT MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring = TRUE ENDIF SETTIMERA(0) ENDIF DEBUG_MESSAGE_PERIODIC("Waiting for other client to get to DARTS_MPTHROW_TURN_CHANGE", iDebugThrottle) BREAK ENDSWITCH BREAK CASE DARTS_MPTURN_SCORE_CHECK IF ((serverData.iScores[iSelfID] < 41 AND serverData.iScores[iSelfID] > 0) AND (serverData.iScores[iSelfID] % 2 = 0)) OR serverData.iScores[iSelfID] = 50 IF NOT bInWinRange //DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_IN_WIN_RANGE) CDEBUG1LN(DEBUG_DARTS, "DARTS UIFLAG IS SETTING DARTS_UIFLAGS_IN_WIN_RANGE") //DARTS_SET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_IN_WIN_RANGE, TRUE) bInWinRange = TRUE ELSE DEBUG_MESSAGE_PERIODIC("DARTS UIFLAG IS DARTS_UIFLAGS_IN_WIN_RANGE IS ALREADY SET", iDebugThrottle) ENDIF ENDIF IF serverData.iScores[iSelfID] <= 170 AND NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY, TRUE) ENDIF IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY) AND DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY, TRUE) ENDIF IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED) CLEAR_PRINTS() CLEAR_HELP() IF iSelfID = serverData.iThrower IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_TURN_CONTINUE) CDEBUG1LN(DEBUG_DARTS, "My server score is ", ServerData.iScores[iSelfID]) CDEBUG1LN(DEBUG_DARTS, "Other server score is ", ServerData.iScores[iOtherID]) PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN", ServerData.iLastScore[iSelfID] - ServerData.iScores[iSelfID], ServerData.iScores[iSelfID], 20000, 0) //PRINT_WITH_NUMBER("DARTS_REMAINL", ServerData.iScores[iSelfID], 20000, 0) IF playerData[iSelfID].ClientDart.iHitValue = 50 DARTS_TRIGGER_SPLASH(DartsUI, DARTSSPLASH_BULLSEYE) bPlaySplashFX = TRUE ENDIF ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO) PRINT_WITH_NUMBER("DARTS_BUST_L", ServerData.iTurnscore, 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE) PRINT_WITH_NUMBER("DARTS_DOUBLE_L", playerData[iSelfID].ClientDart.iHitValue, 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT) PRINT_NOW("DARTS_ONE_PT", 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) IF playerData[iSelfID].ClientDart.iHitValue = 50 DARTS_TRIGGER_SPLASH(DartsUI, DARTSSPLASH_BULLSEYE) bPlaySplashFX = TRUE ELIF ServerData.iTurnscore = 180 DARTS_TRIGGER_SPLASH(DartsUI, DARTSSPLASH_180) bPlaySplashFX = TRUE ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) PRINT_WITH_NAME_AND_NUMBER("DARTS_SWITCH_L", sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID], ServerData.iScores[iSelfID], 5000, 0) ELSE PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN", ServerData.iLastScore[iSelfID] - ServerData.iScores[iSelfID], ServerData.iScores[iSelfID], 5000, 0) //PRINT_WITH_NUMBER("DARTS_REMAINL", ServerData.iScores[iSelfID], 5000, 0) ENDIF ENDIF ELSE IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_TURN_CONTINUE) CDEBUG1LN(DEBUG_DARTS, "My server score is ", ServerData.iScores[iSelfID]) CDEBUG1LN(DEBUG_DARTS, "Other server score is ", ServerData.iScores[iOtherID]) PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN", ServerData.iLastScore[iOtherID] - ServerData.iScores[iOtherID], ServerData.iScores[iOtherID], 20000, 0) //PRINT_WITH_NUMBER("DARTS_REMAINL", ServerData.iScores[iOtherID], 20000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO) PRINT_WITH_NUMBER("DARTS_BUST_L", ServerData.iTurnscore, 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE) PRINT_WITH_NUMBER("DARTS_DOUBLE_L", playerData[iSelfID].ClientDart.iHitValue, 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT) PRINT_NOW("DARTS_ONE_PT", 5000, 0) ELIF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) PRINT_WITH_NAME_AND_NUMBER("DARTS_SWITCH_L", GET_PLAYER_NAME(PLAYER_ID()), ServerData.iScores[iOtherID], 5000, 0) ENDIF ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_UPDATE_PRINTED, TRUE) ENDIF IF NOT playerData[iSelfID].bResetDone AND ( (DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_TURN_CONTINUE) AND TIMERA() > 1000) OR TIMERA() > 2000 ) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client is in SCORE CHECK") playerData[iSelfID].eMPWaitStage = DARTS_MPWAIT_AIM playerData[iSelfID].eMPThrowStage = DARTS_MPTHROW_AIM MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring = FALSE DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SCORING_DONE) IF iSelfID = serverData.iThrower IF playerData[iSelfID].ClientDart.iHitValue = 50 DartsStats[DARTS_SCLB_STAT_BULLS_EYES]++ CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] xp given for bullseye") iXPToGive = ROUND(BASE_BULLSEYE_XP * g_sMPTunables.fxp_tunable_darts_bullseye) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] after tuning, xp given = ", iXPToGive) iBullseyeXP += GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_SKILL, XPCATEGORY_SKILL_DARTS_BULLSEYE, iXPToGive) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iBullseyeXP is now ", iBullseyeXP) ENDIF ENDIF IF DARTS_GET_UI_FLAG(serverData.iUIFlags, DARTS_UIFLAGS_SWITCH_PLAYER) //serverData.bDoSwitchPlayer DartsUI.iDartsLeft = 3 // sending the darts back to the player, resetting them // serves the same functioon as RESET_DART without deleting the object INT y REPEAT NUM_MP_DART_TURNS y RESET_DART(MPDartGame.Darts[y]) MPDartGame.Darts[y].bDoneScoring = FALSE CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]MPDartGame.Darts ", y, " was reset") ENDREPEAT IF ServerData.iLastScore[ServerData.iThrower] <> ServerData.iScores[ServerData.iThrower] DARTS_ADD_SCORE(DartsSB, playerData[ServerData.iThrower].iOffsetPlayerID, ServerData.iScores[ServerData.iThrower]) ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]iSelfID = ", iSelfID) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]serverData.iThrower = ", serverData.iThrower) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]ServerData.iTurnscore = ", ServerData.iTurnscore) IF iSelfID = serverData.iThrower IF ServerData.iTurnscore = 180 AND NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DartsStats[DARTS_SCLB_STAT_NUM_180S]++ CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]Added 180 stat") ENDIF ELSE bWaitUIShow = FALSE ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_HIGHLIGHT(DartsSB, playerData[serverData.iWaiter].iOffsetPlayerID) ENDIF iSteadyShotsUsed = 0 ENDIF CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] current client finished reset in SCORE CHECK") playerData[iSelfID].bResetDone = TRUE ENDIF BREAK CASE DARTS_MPTURN_WINNING CDEBUG1LN(DEBUG_DARTS, "********** serverData.iWinner = ", serverData.iWinner) CLEAR_PRINTS() IF NOT MPGlobals.DartsData.bResultsDisplayed MPGlobals.DartsData.bResultsDisplayed = TRUE ENDIF // if you done won IF serverData.iWinner = iSelfID //PRINT_WITH_NUMBER_NOW("DARTS_REMAINL", 0, 5000, 1) MPDartGame.bDartWinner = TRUE MPDartGame.iGamesWon++ IF iSelfID = serverData.iThrower IF playerData[iSelfID].ClientDart.iHitValue = 50 CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] experience given for bullseye after a win") DartsStats[DARTS_SCLB_STAT_BULLS_EYES]++ iXPToGive = ROUND(BASE_BULLSEYE_XP * g_sMPTunables.fxp_tunable_darts_bullseye) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] after tuning, xp given = ", iXPToGive) iBullseyeXP += GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_SKILL, XPCATEGORY_SKILL_DARTS_BULLSEYE, iXPToGive) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iBullseyeXP is now ", iBullseyeXP) ENDIF ENDIF IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] experience given for leg win") DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON]++ iXPGained += ROUND(BASE_LEG_WIN_XP * g_sMPTunables.fxp_tunable_darts_legwon) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_legwon = ", g_sMPTunables.fxp_tunable_darts_legwon) //GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_DARTS_WIN, 50) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iXPGained is now ", iXPGained) ENDIF IF MPDartGame.iThrowsTaken[PlayerData[iSelfID].iOffsetPlayerID] <= 6 SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_FM6DARTCHKOUT, TRUE) ENDIF // if you lost... loser ELSE //PRINT_WITH_NUMBER_NOW("DARTS_REMAINL", 0, 5000, 1) MPDartGame.bDartWinner = FALSE MPDartGame.iGamesLost++ IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DartsStats[DARTS_SCLB_STAT_NUM_LEGS_LOST]++ ENDIF ENDIF RESTART_TIMER_NOW(controlTimer) IF DARTS_SERVER_CHECK_FLAG(serverData, DARTSERVERFLAG_DO_TRANSITION) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_TRANSITION ELSE CDEBUG1LN(DEBUG_DARTS, "calling trigger pre load for DARTS") TRIGGER_CELEBRATION_PRE_LOAD(sCelebrationData, TRUE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF MPDartGame.bDartWinner IF serverData.iNumLegs < 5 INCREMENT_PLAYER_PED_STAT(CHAR_MULTIPLAYER, PS_STRENGTH, 1) CPRINTLN(DEBUG_DARTS, "STRENGTH STAT INCREASED by 1 FROM DARTS") ELSE INCREMENT_PLAYER_PED_STAT(CHAR_MULTIPLAYER, PS_STRENGTH, 2) CPRINTLN(DEBUG_DARTS, "STRENGTH STAT INCREASED by 2 FROM DARTS") ENDIF INCREMENT_BY_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_AT_DARTS , 1) INCREMENT_BY_MP_INT_PLAYER_STAT(MPPLY_DARTS_TOTAL_WINS, 1) DartsStats[DARTS_SCLB_STAT_NUM_WINS]++ DartsStats[DARTS_SCLB_STAT_NUM_SETS_WON]++ ELSE DartsStats[DARTS_SCLB_STAT_NUM_LOSSES]++ DartsStats[DARTS_SCLB_STAT_NUM_SETS_LOST]++ ENDIF INCREMENT_BY_MP_INT_PLAYER_STAT(MPPLY_DARTS_TOTAL_MATCHES, 1) ENDIF DartsUI.iOurScore += serverData.iSets[iSelfID] DartsUI.iTheirScore += serverData.iSets[iOtherID] DartsUI.sMyName = sDartsPlayerNames[playerData[iSelfID].iOffsetPlayerID] DartsUI.sTheirName = sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID] IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF MPDartGame.bDartWinner CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] giving darts won XP") iXPGained += ROUND(BASE_MATCH_WIN_XP * g_sMPTunables.fxp_tunable_darts_match_win) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_match_win is ", g_sMPTunables.fxp_tunable_darts_match_win) //GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_DARTS_WIN, 250) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iXPGained is now ", iXPGained) iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(PLAYER_ID()) CDEBUG1LN(DEBUG_DARTS, "money given to me the winner") ELSE iBetWinnings = BROADCAST_BETTING_MISSION_FINISHED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) CDEBUG1LN(DEBUG_DARTS, "money given to the other guy, cuz i lost") ENDIF ENDIF IF MPDartGame.bDartWinner ENDIF IF iBetWinnings > 0 CDEBUG1LN(DEBUG_DARTS, "iBetWinnings = ", iBetWinnings) ELSE CDEBUG1LN(DEBUG_DARTS, "no bets were won") ENDIF CDEBUG1LN(DEBUG_DARTS, "g_iMyBetWinnings = ", g_iMyBetWinnings) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] giving darts match finish bonus") iXPGained += ROUND(BASE_DART_PLAY_XP * g_sMPTunables.fxp_tunable_darts_taking_part) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_taking_part = ", g_sMPTunables.fxp_tunable_darts_taking_part) //GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_DARTS_WIN, 100) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iXPGained is now ", iXPGained) SET_MP_DAILY_OBJECTIVE_COMPLETE(MP_DAILY_JOB_PLAY_DARTS) CPRINTLN(DEBUG_DARTS, "DAILY OBJECTIVE COMPLETE FOR DARTS") PlayerData[iSelfID].eMPState = DARTS_MPSTATE_GAME_END ENDIF BREAK ENDSWITCH BREAK CASE DARTS_MPSTATE_GAME_TRANSITION IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) SET_PLAYER_INVISIBLE_LOCALLY(PLAYER_ID()) ENDIF SWITCH iSplashStage CASE 0 IF GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 0.75 CLEAR_HELP() CLEAR_PRINTS() IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) UPDATE_SB_SETS_LEGS(DartsSB, 0, serverData.iSets[iSelfID], 0, serverData.iLegs[iSelfID]) ELSE IF NETWORK_IS_HOST_OF_THIS_SCRIPT() UPDATE_SB_SETS_LEGS(DartsSB, serverData.iSets[iOtherID], serverData.iSets[iSelfID], serverData.iLegs[iOtherID], serverData.iLegs[iSelfID]) ELSE UPDATE_SB_SETS_LEGS(DartsSB, serverData.iSets[iSelfID], serverData.iSets[iOtherID], serverData.iLegs[iSelfID], serverData.iLegs[iOtherID]) ENDIF ENDIF //big message here IF DARTS_SERVER_CHECK_FLAG(serverData, DARTSERVERFLAG_SET_JUST_WON) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF MPDartGame.bDartWinner DartsStats[DARTS_SCLB_STAT_NUM_SETS_WON]++ ELSE DartsStats[DARTS_SCLB_STAT_NUM_SETS_LOST]++ ENDIF ENDIF IF MPDartGame.bDartWinner IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "DARTS_WINNER", "DARTS_SETW", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_WINNER", "DARTS_SETW") ELSE SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "DARTS_WINP", "DARTS_SETW", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_WINP", "DARTS_SETW") ENDIF ELSE SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "BM_R2P_LOSS", "DARTS_SETL", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_RED) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_LOSER", "DARTS_SETL",4000, HUD_COLOUR_RED) ENDIF ELSE IF MPDartGame.bDartWinner IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "DARTS_WINNER", "DARTS_LEGW", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_WINNER", "DARTS_LEGW") ELSE SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "DARTS_WINP", "DARTS_LEGW", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_WHITE) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_WINP", "DARTS_LEGW") ENDIF ELSE SET_SHARD_BIG_MESSAGE(shardMidSizeMessage, "BM_R2P_LOSS", "DARTS_LEGL", 4000, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_RED) //SET_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, "DARTS_LOSER", "DARTS_LEGL", 4000, HUD_COLOUR_RED) ENDIF ENDIF IF MPDartGame.bDartWinner PLAY_SOUND_FRONTEND ( -1, "WIN", "HUD_AWARDS") ELSE PLAY_SOUND_FRONTEND ( -1, "LOSER", "HUD_AWARDS") ENDIF INT iWhichOutro FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF iWhichOutro = (GET_RANDOM_INT_IN_RANGE() % 3) CDEBUG1LN(DEBUG_DARTS, "iWhichOutro = ", iWhichOutro) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[0]) AND NOT IS_PED_INJURED(piPlayerClones[1]) IF MPDartGame.bDartWinner TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iSelfID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iOtherID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[playerData[iSelfID].iOffsetPlayerID], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ELSE TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iOtherID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iSelfID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[playerData[iSelfID].iOffsetPlayerID], sFacialDictPed2, sFacialClip2[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_SYNCHRONIZED_SCENE (PLAYER_PED_ID(), iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(PLAYER_PED_ID(), sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF iSplashStage++ ENDIF BREAK CASE 1 //IF NOT UPDATE_SCALEFORM_MIDSIZED_MESSAGE(DartsUI.siMidMessage, TRUE) IF NOT UPDATE_SHARD_BIG_MESSAGE(shardMidSizeMessage, TRUE) RESET_SHARD_BIG_MESSAGE(shardMidSizeMessage) REPEAT NUM_MP_DART_PLAYERS i DARTS_CLEAR_SCORES(DartsSB, i) ENDREPEAT REPEAT NUM_MP_DART_TURNS j RESET_DART(MPDartGame.Darts[j]) ENDREPEAT iSplashStage++ ENDIF BREAK CASE 2 IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_AWAY]) AND NOT IS_PED_INJURED(piPlayerClones[DART_PLAYER_HOME]) DARTS_GAME_CAM() DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_AWAY]) CLEAR_PED_TASKS (piPlayerClones[DART_PLAYER_HOME]) ENDIF ELSE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) DARTS_GAME_CAM() DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (PLAYER_PED_ID()) ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "Starting another set/leg") PlayerData[iSelfID].bDoRematch = TRUE KILL_MINIGAME_MISSION_TRACKER() iSplashStage = 0 PlayerData[iSelfID].eMPState = DARTS_MPSTATE_WAIT_POST_GAME BREAK ENDSWITCH BREAK CASE DARTS_MPSTATE_GAME_END //DARTS_UI_RETVAL DartsUIRetVal JOB_WIN_STATUS eJobWinStatus DEBUG_MESSAGE_PERIODIC("Reached Client side GAME END", iDebugThrottle) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NETWORK_IS_PARTICIPANT_ACTIVE( INT_TO_PARTICIPANTINDEX(iOtherID) ) SET_PLAYER_INVISIBLE_LOCALLY(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) ENDIF SET_PLAYER_INVISIBLE_LOCALLY(PLAYER_ID()) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 0.75 // wait for the player to pick an option IF (PlayerData[iOtherID].eMPState >= DARTS_MPSTATE_GAME_END) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) // wait 'til we've finished rendering the player win/lost text IF NOT MPDartGame.bAnotherCamActive CLEAR_HELP() CLEAR_PRINTS() #IF IS_DEBUG_BUILD IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_LOSERD) MPDartGame.bDartWinner = TRUE ELIF DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_LOSERD) MPDartGame.bDartWinner = FALSE ENDIF #ENDIF INT iWhichOutro FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF iWhichOutro = 2 //(GET_RANDOM_INT_IN_RANGE() % 3) DO NOT CHECK THIS IN CDEBUG1LN(DEBUG_DARTS, "iWhichOutro = ", iWhichOutro) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF NOT IS_PED_INJURED(piPlayerClones[0]) AND NOT IS_PED_INJURED(piPlayerClones[1]) IF MPDartGame.bDartWinner PLAY_CELEB_WIN_POST_FX() TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iSelfID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iOtherID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[playerData[iSelfID].iOffsetPlayerID], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ELSE PLAY_CELEB_LOSE_POST_FX() TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iOtherID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piPlayerClones[playerData[iSelfID].iOffsetPlayerID], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piPlayerClones[playerData[iSelfID].iOffsetPlayerID], sFacialDictPed2, sFacialClip2[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) PLAY_CELEB_WIN_POST_FX() TASK_SYNCHRONIZED_SCENE (PLAYER_PED_ID(), iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(PLAYER_PED_ID(), sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING) ENDIF ENDIF MPDartGame.bAnotherCamActive = TRUE ELSE IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) >= 0.995) OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) // IF DOES_CAM_EXIST(camDartsSync) // DESTROY_CAM(camDartsSync) // // IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) // IF NOT IS_PED_INJURED(piPlayerClones[0]) // AND NOT IS_PED_INJURED(piPlayerClones[1]) // CLEAR_PED_TASKS_IMMEDIATELY(piPlayerClones[0]) // CLEAR_PED_TASKS_IMMEDIATELY(piPlayerClones[1]) // FORCE_PED_AI_AND_ANIMATION_UPDATE(piPlayerClones[0]) // FORCE_PED_AI_AND_ANIMATION_UPDATE(piPlayerClones[1]) // ENDIF // ELSE // IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) // FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) // ENDIF // ENDIF // ENDIF // // DARTS_SETUP_MP_QUIT_CAM() // //ANOTHER_GAME_BACKSIDE() ENDIF ENDIF ENDIF IF iBullseyeXP > 0 CDEBUG1LN(DEBUG_DARTS, "iBullseyeXP = ", iBullseyeXP) ENDIF IF MPDartGame.bDartWinner eJobWinStatus = JOB_STATUS_WIN winningPlayer = PLAYER_ID() ELSE eJobWinStatus = JOB_STATUS_LOSE winningPlayer = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID)) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(controlTimer) > 2.15 IF HAS_GENERIC_CELEBRATION_FINISHED(sCelebrationData, camEndScreen, "XPT_DARTS", XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_DARTS_WIN, iXPGained, eJobWinStatus, g_iMyBetWinnings, eGenericMGStage, winningPlayer, TRUE, 0, 0, TRUE, FALSE) //DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON], DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON] + DartsStats[DARTS_SCLB_STAT_NUM_LEGS_LOST], TRUE) // IF NOT g_TransitionSessionNonResetVars.sPostMissionCleanupData.bRequestLeaderBoardCam // REQUEST_LEADERBOARD_CAM() // //RENDER_SCRIPT_CAMS(FALSE, FALSE) // // ELIF IS_LEADERBOARD_CAM_READY(TRUE) IF NOT IS_TIMER_STARTED(endDelay) RESTART_TIMER_NOW(endDelay) // IF DOES_CAM_EXIST(camDartsSync) // DESTROY_CAM(camDartsSync) // // IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) // IF NOT IS_PED_INJURED(piPlayerClones[0]) // AND NOT IS_PED_INJURED(piPlayerClones[1]) // CLEAR_PED_TASKS_IMMEDIATELY(piPlayerClones[0]) // CLEAR_PED_TASKS_IMMEDIATELY(piPlayerClones[1]) // FORCE_PED_AI_AND_ANIMATION_UPDATE(piPlayerClones[0]) // FORCE_PED_AI_AND_ANIMATION_UPDATE(piPlayerClones[1]) // ENDIF // ELSE // IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) // FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) // ENDIF // ENDIF // ENDIF // // DARTS_SETUP_MP_QUIT_CAM() IF MPDartGame.bDartWinner ANIMPOSTFX_STOP("MP_Celeb_Win") //ANIMPOSTFX_PLAY("MP_Celeb_Win_Out", 0, TRUE) ELSE ANIMPOSTFX_STOP("MP_Celeb_Lose") //ANIMPOSTFX_PLAY("MP_Celeb_Lose_Out", 0, TRUE) ENDIF ELIF GET_TIMER_IN_SECONDS(endDelay) > 0.1 ENDIF IF SET_SKYSWOOP_UP(TRUE, TRUE, FALSE) IF MPDartGame.bEndGameMessageDisplayed #IF IS_DEBUG_BUILD IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_LOSERD) CDEBUG1LN(DEBUG_DARTS, "Win / Lose debug flags cleared up") DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_WINNERD) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_LOSERD) ENDIF #ENDIF // IF NETWORK_IS_HOST_OF_THIS_SCRIPT() // IF NOT HAS_NET_TIMER_STARTED(serverData.timeLeaderboardTimeOut) // START_NET_TIMER(serverData.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, serverData.sServerFMMC_EOM, FMMC_TYPE_MG_DARTS, 0) // ENDIF // IF HAS_NET_TIMER_STARTED(serverData.timeLeaderboardTimeOut) // IF MAINTAIN_END_OF_MISSION_SCREEN(sEndOfMission, serverData.sServerFMMC_EOM, // GET_TIME_DIFFERENCE(GET_NETWORK_TIME(),serverData.timeLeaderboardTimeOut.timer) >= VIEW_LEADERBOARD_TIME, // FALSE, FALSE, FALSE, FALSE, FALSE, serverData.timeLeaderboardTimeOut.timer, VIEW_LEADERBOARD_TIME, "LBD_TIMEOUT", TRUE) //Go to cleanup state CDEBUG1LN(DEBUG_DARTS, "Client chose to quit") CDEBUG1LN(DEBUG_DARTS, "my betting Wins = ", iBetWinnings) SET_VARS_ON_FMMC_EOM_VOTE_PASSING(ciFMMC_EOM_VOTE_STATUS_CONTINUE, <<0.0, 0.0, 0.0>>, contentID) CLEAR_PRINTS() PlayerData[iSelfID].bDoQuit = TRUE PlayerData[iSelfID].eMPState = DARTS_MPSTATE_END // ELSE // CDEBUG1LN(DEBUG_DARTS, "still voting") // //DISPLAY_DARTS_LEADERBOARD(DartsUI, DartsEndScreen, iXPGained, DartsUI.iOurScore, DartsUI.iTheirScore, iBetWinnings) // ENDIF // ENDIF ELSE IF (PlayerData[iOtherID].eMPState >= DARTS_MPSTATE_GAME_END) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) #IF IS_DEBUG_BUILD IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_LOSERD) MPDartGame.bDartWinner = TRUE ELIF DARTS_CHECK_CLIENT_FLAG(PlayerData[iOtherID], DARTS_CLIENTFLAG_WINNERD) OR DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_LOSERD) MPDartGame.bDartWinner = FALSE ENDIF #ENDIF MPDartGame.bEndGameMessageDisplayed = TRUE ENDIF ENDIF ENDIF ENDIF IF sCelebrationData.eCurrentStage = CELEBRATION_STAGE_PLAYING AND HAS_NET_TIMER_EXPIRED(sCelebrationData.sCelebrationTimer, (CELEBRATION_SCREEN_STAT_DISPLAY_TIME/2) - 750) IF NOT bPhaseGrabbed //SET_SKYFREEZE_FROZEN() CDEBUG1LN(DEBUG_DARTS, "g_sMPTunables.xpMultiplier = ", g_sMPTunables.xpMultiplier) CDEBUG1LN(DEBUG_DARTS, "LOBBY_AUTO_MULTIPLAYER_FREEMODE() = ", LOBBY_AUTO_MULTIPLAYER_FREEMODE()) CDEBUG1LN(DEBUG_DARTS, "GET_SKYFREEZE_STAGE() = ", GET_SKYFREEZE_STAGE()) CDEBUG1LN(DEBUG_DARTS, "IS_PAUSE_MENU_ACTIVE() = ", IS_PAUSE_MENU_ACTIVE()) IF GET_SKYFREEZE_STAGE() = SKYFREEZE_NONE SET_SKYFREEZE_STAGE(SKYFREEZE_FROZEN) ENDIF TOGGLE_RENDERPHASES(FALSE) CDEBUG1LN(DEBUG_DARTS, "rendering toggled") bPhaseGrabbed = TRUE ENDIF ENDIF ENDIF ENDIF BREAK CASE DARTS_MPSTATE_WAIT_POST_GAME DEBUG_MESSAGE_PERIODIC("CLIENT DARTS_MPSTATE_WAIT_POST_GAME", iDebugThrottle) IF (PlayerData[iSelfID].bDoRematch AND PlayerData[iOtherID].bDoRematch) OR (PlayerData[iSelfID].bDoRematch AND DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER)) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PlayerData[iSelfID].piOther) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF // TODO: add audio for playing again IF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) sDartsPlayerNames[PlayerData[iSelfID].iOffsetPlayerID] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID))) DartsGamerHandle[PlayerData[iSelfID].iOffsetPlayerID] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID))) sCrewTags[PlayerData[iSelfID].iOffsetPlayerID] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[PlayerData[iSelfID].iOffsetPlayerID]) sDartsPlayerNames[PlayerData[iOtherID].iOffsetPlayerID] = GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) DartsGamerHandle[PlayerData[iOtherID].iOffsetPlayerID] = GET_GAMER_HANDLE_PLAYER(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) sCrewTags[PlayerData[iOtherID].iOffsetPlayerID] = GET_PLAYER_CLAN_TAG(DartsGamerHandle[PlayerData[iOtherID].iOffsetPlayerID]) piOtherPlayer = GET_PLAYER_PED(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID))) INT iTemp1, iTemp2 iTemp1 = ENUM_TO_INT(DART_PLAYER_AWAY) iTemp2 = ENUM_TO_INT(DART_PLAYER_HOME) CDEBUG1LN(DEBUG_DARTS, "iTemp1 = ", iTemp1, " iTemp2 = ", iTemp2) CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iTemp1, " = ", sCrewTags[iTemp1]) CDEBUG1LN(DEBUG_DARTS, "sCrewTags ", iTemp2, " = ", sCrewTags[iTemp2]) DARTS_ADD_NAMES(DartsSB, sDartsPlayerNames[iTemp1], sDartsPlayerNames[iTemp2]) IF NOT IS_STRING_EMPTY(sCrewTags[iTemp1]) DARTS_ADD_SB_CREW_TAG(DartsSB, iTemp1, sCrewTags[iTemp1]) ENDIF IF NOT IS_STRING_EMPTY(sCrewTags[iTemp2]) DARTS_ADD_SB_CREW_TAG(DartsSB, iTemp2, sCrewTags[iTemp2]) ENDIF DARTS_CLEAR_SCORES(DartsSB, iTemp1) DARTS_CLEAR_SCORES(DartsSB, iTemp2) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DARTS_CLEAR_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_NEW_CHALLENGER) ENDIF CLEAR_HELP() CLEANUP_BIG_MESSAGE() IF (serverData.mpState = DARTS_MPSTATE_SETUP) PlayerData[iSelfID].eMPState = DARTS_MPSTATE_SYNC_OBJECTS ENDIF ENDIF // other player wants to quit IF PlayerData[iOtherID].bDoQuit KILL_MINIGAME_MISSION_TRACKER() CLEAR_PRINTS() CLEANUP_BIG_MESSAGE() PlayerData[iSelfID].eMPState = DARTS_MPSTATE_TERMINATE_SPLASH ENDIF BREAK CASE DARTS_MPSTATE_TERMINATE_SPLASH DEBUG_MESSAGE_PERIODIC("Reached Client side TERMINATE SPLASH", iDebugThrottle) IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM IF HAS_NET_TIMER_STARTED(timeDartsAwardFailSafe) //RENDER_SCRIPT_CAMS(FALSE, FALSE) DARTS_SETUP_MP_QUIT_CAM() IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_IN(500) ENDIF IF NOT g_TransitionSessionNonResetVars.sPostMissionCleanupData.bRequestLeaderBoardCam REQUEST_LEADERBOARD_CAM() ELIF IS_LEADERBOARD_CAM_READY(TRUE) REINIT_NET_TIMER(timeDartsAwardFailSafe) CLEAR_PRINTS() CLEAR_HELP() SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) IF MPGlobals.DartsData.bResultsDisplayed MPGlobals.DartsData.bResultsDisplayed = FALSE ENDIF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_LEAVE IF (terminateReason = DARTS_MPTERMINATEREASON_PLAYERLEFT) SET_SHARD_BIG_MESSAGE(shardBigMessage, "DARTS_WINNER", "DARTS_OPP_LFT", (AWARD_FAILSAFE/2), SHARD_MESSAGE_CENTERED, HUD_COLOUR_WHITE) INIT_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext, FALSE, FALSE, FALSE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "CMRC_CONT", FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) leaveState = DARTS_MPLEAVESTATE_BIG_MESSAGE SET_VARS_ON_FMMC_EOM_VOTE_PASSING(ciFMMC_EOM_VOTE_STATUS_CONTINUE, <<0.0, 0.0, 0.0>>, contentID) ELSE IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[DART_PLAYER_HOME_SERVER], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF IS_STRING_NULL(sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID]) PRINT_NOW("DARTS_OPP_LFT", DEFAULT_GOD_TEXT_TIME, 0) ELSE CDEBUG1LN(DEBUG_DARTS, "Other player name (ln 2950) = ", sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID]) PRINT_WITH_NAME("DARTS_PLYR_LFT", sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID], DEFAULT_GOD_TEXT_TIME, 0) ENDIF ENDIF leaveState = DARTS_MPLEAVESTATE_LEADERBOARD ENDIF ENDIF ELSE START_NET_TIMER(timeDartsAwardFailSafe) ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "Other player name (ln 2962) = ", sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID]) PRINT_WITH_NAME("DARTS_PLYR_LFT", sDartsPlayerNames[playerData[iOtherID].iOffsetPlayerID], DEFAULT_GOD_TEXT_TIME, 0) CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) ENDIF BREAK CASE DARTS_MPSTATE_END IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM IF HAS_NET_TIMER_STARTED(timeDartsAwardFailSafe) //RENDER_SCRIPT_CAMS(FALSE, FALSE) DARTS_SETUP_MP_QUIT_CAM() CLEANUP_BIG_MESSAGE() IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_IN(500) ENDIF // IF NOT g_TransitionSessionNonResetVars.sPostMissionCleanupData.bRequestLeaderBoardCam // REQUEST_LEADERBOARD_CAM() // ELIF IS_LEADERBOARD_CAM_READY(TRUE) IF SET_SKYSWOOP_UP(TRUE) REINIT_NET_TIMER(timeDartsAwardFailSafe) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) IF MPGlobals.DartsData.bResultsDisplayed MPGlobals.DartsData.bResultsDisplayed = FALSE ENDIF PlayerData[iSelfID].eMPState = DARTS_MPSTATE_LEAVE // ENDIF leaveState = DARTS_MPLEAVESTATE_LEADERBOARD ENDIF ELSE START_NET_TIMER(timeDartsAwardFailSafe) ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "CLIENT STATE: DARTS_MPSTATE_END") CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI, TRUE, FALSE, TRUE) ENDIF BREAK CASE DARTS_MPSTATE_LEAVE SWITCH leaveState CASE DARTS_MPLEAVESTATE_BIG_MESSAGE IF NOT UPDATE_SHARD_BIG_MESSAGE(shardBigMessage, TRUE) OR HAS_NET_TIMER_EXPIRED(timeDartsAwardFailSafe, AWARD_FAILSAFE/2) CLEANUP_BIG_MESSAGE() CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] timeDartsAwardFailSafe = ", GET_NET_TIMER_DIFFERENCE_WITH_CURRENT_TIME(timeDartsAwardFailSafe)) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] giving participation XP after an early quit") iXPToGive = ROUND(BASE_DART_PLAY_XP * g_sMPTunables.fxp_tunable_darts_taking_part) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_bullseye = ", g_sMPTunables.fxp_tunable_darts_bullseye) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_legwon = ", g_sMPTunables.fxp_tunable_darts_legwon) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_match_win = ", g_sMPTunables.fxp_tunable_darts_match_win) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] g_sMPTunables.fxp_tunable_darts_taking_part = ", g_sMPTunables.fxp_tunable_darts_taking_part) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iXPToGive = ", iXPToGive) iXPGained += GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_DARTS", XPTYPE_COMPLETE, XPCATEGORY_COMPLETE_DARTS_WIN, iXPToGive) CDEBUG1LN(DEBUG_DARTS, "[DARTSXP] iXPGained is now ", iXPGained) DartsUI.iOurScore++ leaveState = DARTS_MPLEAVESTATE_SWOOP_UP ELSE IF NOT NETWORK_TEXT_CHAT_IS_TYPING() UPDATE_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext) ENDIF ENDIF BREAK CASE DARTS_MPLEAVESTATE_SWOOP_UP IF SET_SKYSWOOP_UP(TRUE) leaveState = DARTS_MPLEAVESTATE_LEADERBOARD ENDIF BREAK CASE DARTS_MPLEAVESTATE_LEADERBOARD // IF DISPLAY_DARTS_LEADERBOARD(DartsUI, DartsEndScreen, iXPGained, DartsUI.iOurScore, DartsUI.iTheirScore, iBetWinnings) // OR HAS_NET_TIMER_EXPIRED(timeDartsAwardFailSafe, AWARD_FAILSAFE) DEAL_WITH_FM_MATCH_END(FMMC_TYPE_MG_DARTS, ServerData.iMatchHistoryID, missionScriptArgs.mdID.idVariation, PICK_INT(MPDartGame.bDartWinner, 1, 0), PICK_INT(MPDartGame.bDartWinner, 1, 2)) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) CLEANUP_MP_DARTS_GAME(MPDartGame, DartsUI) // ENDIF BREAK ENDSWITCH BREAK ENDSWITCH ENDIF // Server state machine IF NETWORK_IS_HOST_OF_THIS_SCRIPT() // General Update SWITCH ServerData.mpState CASE DARTS_MPSTATE_INIT CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] has reached Server side INIT") // wait for another participant IF iNumberOfPlayers >= 2 // server side init stuff HERE IF DART_GET_OTHER_PLAYERS_ID(PlayerData, DART_PLAYER_AWAY_SERVER) = 2 DART_PLAYER_HOME_SERVER = PARTICIPANT_ID_TO_INT() CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] Server says:") CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] DART_PLAYER_HOME_SERVER = ", DART_PLAYER_HOME_SERVER) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] DART_PLAYER_AWAY_SERVER = ", DART_PLAYER_AWAY_SERVER) ServerData.mpState = DARTS_MPSTATE_THROW_OFF_SETUP ENDIF ELIF DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) DART_PLAYER_HOME_SERVER = PARTICIPANT_ID_TO_INT() ServerData.mpState = DARTS_MPSTATE_SETUP ENDIF BREAK CASE DARTS_MPSTATE_THROW_OFF_SETUP DEBUG_MESSAGE_PERIODIC("Reached Server side THROW_OFF_SETUP", iDebugThrottle) IF IS_BIT_SET(PlayerData[iOtherID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_AT_THROWOFF)) AND IS_BIT_SET(PlayerData[iSelfID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_AT_THROWOFF)) DARTS_SERVER_THROW_OFF_SETUP(ServerData) ServerData.mpState = DARTS_MPSTATE_THROW_OFF ENDIF BREAK CASE DARTS_MPSTATE_THROW_OFF //DARTS_SERVER_UPDATE_RUN_CONDITIONS(ServerData, terminateReason, PlayerData) DARTS_SERVER_THROW_OFF_UPDATE(ServerData, PlayerData, MPDartGame.Darts[ServerData.iServerTurn]) BREAK CASE DARTS_MPSTATE_SETUP DEBUG_MESSAGE_PERIODIC("Reached Server side SETUP", iDebugThrottle) IF (IS_BIT_SET(PlayerData[iOtherID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_SYNC_COMPLETE)) AND IS_BIT_SET(PlayerData[iSelfID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_SYNC_COMPLETE))) OR (IS_BIT_SET(PlayerData[iSelfID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_SYNC_COMPLETE)) AND IS_BIT_SET(PlayerData[iSelfID].iClientFlags, ENUM_TO_INT(DARTS_CLIENTFLAG_SINGLE_PLAYER))) DARTS_SERVER_GAME_SETUP(ServerData, DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER), iSelfID) // deactivate floating board help BROADCAST_DARTS_BOARD_ACTIVATE(PLAYER_ID(), FALSE) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) // broadcast match info to all players broadcastIndex = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iSelfID)) BROADCAST_DARTS_UPDATE(broadcastIndex, NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iOtherID)), ServerData.iScores[DART_PLAYER_AWAY_SERVER], ServerData.iScores[DART_PLAYER_HOME_SERVER], GET_PLAYER_TEAM(broadcastIndex), TRUE) ENDIF ServerData.mpState = DARTS_MPSTATE_IN_PROGRESS CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS]Server is proceeding to IN PROGRESS") ENDIF BREAK CASE DARTS_MPSTATE_IN_PROGRESS //DARTS_SERVER_UPDATE_RUN_CONDITIONS(ServerData, terminateReason, PlayerData) IF NOT DARTS_CHECK_CLIENT_FLAG(PlayerData[iSelfID], DARTS_CLIENTFLAG_SINGLE_PLAYER) IF (GET_GAME_TIMER() % 5000) < 50 CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] ServerData.iServerTurn = ", ServerData.iServerTurn) CDEBUG1LN(DEBUG_DARTS, "[AM_DARTS] iServerTurn.bDoneScoring = ", MPDartGame.Darts[ServerData.iServerTurn].bDoneScoring) ENDIF DARTS_SERVER_UPDATE_GAME(ServerData, PlayerData, MPDartGame.Darts[ServerData.iServerTurn]) ELSE DARTS_SERVER_UPDATE_SINGLE_PLAYER_GAME(ServerData, PlayerData, MPDartGame.Darts[ServerData.iServerTurn]) ENDIF BREAK ENDSWITCH ENDIF ENDWHILE ENDSCRIPT