Files
gtav-src/script/dev_ng/singleplayer/scripts/stats/achievement_controller.sc
T
2025-09-29 00:52:08 +02:00

1254 lines
45 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// *****************************************************************************************
// *****************************************************************************************
//
// SCRIPT NAME : achievement_controller.sc
// AUTHOR : Aaron Gandaa
//
// *****************************************************************************************
// *****************************************************************************************
//----------------------
// INCLUDES
//----------------------
USING "rage_builtins.sch"
USING "globals.sch"
USING "achievement_public.sch"
USING "battlebuddy_public.sch"
USING "timer_public.sch"
USING "gunclub_shop_private.sch"
//----------------------
// VARIABLES
//----------------------
//INT iTotalMoneySpent = 0
INT iThreeManArmyState = 0
INT iNextPollCheckTime = 0
INT iNextMapPollCheckTime = 0
//INT iLastTotalMoneySpent = 0
//INT iLastAwardCounter = 0
STRUCTTIMER tThreeManArmyTimer
INT iNextPollDelay = 1000
INT iNextMapPollDelay = 3333
FLOAT fThreeManTimerValue = 0.0
BOOL bForceRunMapCheck = falsE
INT iLastBitsetCheatsUsedThisSession = 0
INT iPollCheck = 0
STRUCTTIMER ach26MPCheckTimer
BOOL bWaitForAwardsToFinish = TRUE
BOOL bForceAchievementSCSSync
BOOL bAllMPAchievementSynced = FALSE
//----------------------
// DEBUG VARIABLES
//----------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID m_WidgetGroup
BOOL bQuitScript = FALSE
BOOL bShowDebug = FALSE
BOOL bHaveImportantStatsLoaded = FALSE
BOOL bHasFreemodeAwardProcessingFinished = FALSE
BOOL bHasFreemodeMigrationFinished = FALSE
BOOL bTestShark = FALSE
BOOL bAchievementTest = FALSE
BOOL bAllAchievementTest = FALSE
INT iAchievementTest = 1
BOOL bUpdateAchievementList
BOOL bPrintCarDimensions
BOOL bVerbose
BOOL bCheckShitSkipReplay
BOOL bAllowDebugWidgetUpdate = FALSE
BOOL bDumpHeistAchievementInfo = FALSE
BOOL bTestHeistAchievementInfo = FALSE
INT iHeistAchievementInfoSlider = 0
FLOAT fDebugPrintHoursForNewPersp = 0
BOOL bDumpAchievementQueueToTTY
BOOL bTestSCSAchievement
BOOL bDebugForceAchievementSCSSync
BOOL bACHDebugDirectorModeCheck
FLOAT fDebugAchievementQueueTime
#ENDIF
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Setups Debug Widgets
PROC SETUP_ACHIEVEMENT_DEBUG_WIDGETS()
INT i
TEXT_LABEL str
m_WidgetGroup = START_WIDGET_GROUP("Achievement Controller")
ADD_WIDGET_BOOL("Quit Script", bQuitScript)
ADD_WIDGET_BOOL("Allow Debug Widget Update", bAllowDebugWidgetUpdate)
ADD_WIDGET_BOOL("Achievement Test", bAchievementTest)
ADD_WIDGET_INT_SLIDER("Achievement", iAchievementTest, 1, ENUM_TO_INT(ACHIEVEMENT_COUNT) - 1, 1)
ADD_WIDGET_BOOL("Check List", bUpdateAchievementList)
ADD_WIDGET_BOOL("Have MP Important Stats Loaded", bHaveImportantStatsLoaded)
ADD_WIDGET_BOOL("Has Award Processing Finished", bHasFreemodeAwardProcessingFinished)
ADD_WIDGET_BOOL("Has Save Migration Finished", bHasFreemodeMigrationFinished)
ADD_WIDGET_BOOL("bAllMPAchievementSynced", bAllMPAchievementSynced)
ADD_WIDGET_BOOL("Wait For Awards to Finish", bWaitForAwardsToFinish)
ADD_WIDGET_BOOL("Read SCS Achievement", bTestSCSAchievement)
ADD_WIDGET_BOOL("Force Sync SCS Achievement", bDebugForceAchievementSCSSync)
START_WIDGET_GROUP("Achievement Queue Debug")
ADD_WIDGET_BOOL("Use Queue", q_mAchievementQueue.bIsRunning)
ADD_WIDGET_BOOL("Dump Achievement Queue", bDumpAchievementQueueToTTY)
ADD_WIDGET_BOOL("Is Director Mode Running", bACHDebugDirectorModeCheck)
ADD_WIDGET_FLOAT_READ_ONLY("Queue Time", fDebugAchievementQueueTime)
ADD_WIDGET_FLOAT_READ_ONLY("Real Queue Time", q_mAchievementQueue.fQueueTimer)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Achievement Debug")
ADD_WIDGET_BOOL("Draw Debug", bShowDebug)
ADD_WIDGET_BOOL("Disable Cable Cars", g_bForceNoCableCar)
ADD_WIDGET_BOOL("Disable Ambient UFO", g_bForceNoAmbientUFO)
ADD_WIDGET_BOOL("Test Shark", bTestShark)
ADD_WIDGET_BOOL("Have we shit skip", g_bShitskipAccepted)
ADD_WIDGET_BOOL("Have we shit skip ever", bCheckShitSkipReplay)
ADD_WIDGET_BOOL("Print Car Dimensions", bPrintCarDimensions)
ADD_WIDGET_BOOL("All Achievement Test", bAllAchievementTest)
ADD_WIDGET_FLOAT_READ_ONLY("3 Man Army Time", fThreeManTimerValue)
ADD_WIDGET_FLOAT_READ_ONLY("Perspective", fDebugPrintHoursForNewPersp)
ADD_WIDGET_INT_READ_ONLY("Profit", g_savedGlobals.sFinanceData.iProfitLoss)
ADD_WIDGET_INT_READ_ONLY("Run Like The Wind", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedBounty.iTimePassedSoFar)
ADD_WIDGET_INT_SLIDER("Gold Medal Counter", g_savedGlobals.sFlowCustom.iMissionGolds, 0, 100, 1)
ADD_WIDGET_BOOL("Run Previous", MPGlobalsAmbience.playerBounty.bBountyFromPreviousSession)
ADD_WIDGET_INT_SLIDER("Poll Time", iNextPollDelay, 1, 100000, 1000)
ADD_WIDGET_INT_SLIDER("Map Poll Time", iNextMapPollDelay, 1, 100000, 1000)
ADD_WIDGET_INT_READ_ONLY("Replay Bits", g_iRepeatPlayBits)
ADD_WIDGET_INT_READ_ONLY("Poll Check", iPollCheck)
ADD_WIDGET_INT_READ_ONLY("Cheat Bit Set", g_iBitsetCheatsUsedThisSession)
ADD_WIDGET_INT_READ_ONLY("Old Cheat Bit Set", iLastBitsetCheatsUsedThisSession)
ADD_WIDGET_BOOL("Force Run Map Check", bForceRunMapCheck)
//ADD_WIDGET_INT_READ_ONLY("Money Spent", iTotalMoneySpent)
//ADD_WIDGET_BOOL("Mission Title Blocked", g_bMissionTitleBlocked)
ADD_WIDGET_BOOL("Verbose", bVerbose)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Heist Achievements")
ADD_WIDGET_BOOL("Dump Heist ACH Info", bDumpHeistAchievementInfo)
ADD_WIDGET_BOOL("Test Heist ACH Info", bTestHeistAchievementInfo)
ADD_WIDGET_INT_SLIDER("Info Slider", iHeistAchievementInfoSlider, 0, ENUM_TO_INT(MAX_HEISTACHCHK_ID), 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Multi Disipliced")
START_WIDGET_GROUP("Triathalon")
i = 0
REPEAT ENUM_TO_INT(NUM_TRIATHLON_RACES) i
str = "Race "
str += i
ADD_WIDGET_INT_READ_ONLY(str, g_savedGlobals.sTriathlonData.iBestRank[INT_TO_ENUM(TRIATHLON_RACE_INDEX, i)])
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Off Road")
i = 0
REPEAT ENUM_TO_INT(NUM_OFFROAD_RACES) i
str = "Race "
str += i
ADD_WIDGET_INT_READ_ONLY(str, g_savedGlobals.sOffroadData.iRaceBestPlaces[INT_TO_ENUM(OFFROAD_RACE_INDEX, i)])
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Removes Debug Widgets
PROC CLEANUP_ACHIEVEMENT_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup)
DELETE_WIDGET_GROUP(m_WidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// SCRIPT FUNCTIONS
//----------------------
/// PURPOSE:
/// Script Cleanup
PROC SCRIPT_CLEANUP()
#IF IS_DEBUG_BUILD
CLEANUP_ACHIEVEMENT_DEBUG_WIDGETS()
#ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
FUNC INT COUNT_ACTIVE_BATTLE_BUDDIES()
INT count = 0
PED_INDEX ped
ped = GET_BATTLEBUDDY_PED(CHAR_TREVOR)
IF IS_BATTLEBUDDY_AVAILABLE(ped, FALSE) OR IS_BIT_SET(g_bitfieldFriendFlags, ENUM_TO_INT(CHAR_TREVOR))
count ++
ENDIF
ped = GET_BATTLEBUDDY_PED(CHAR_FRANKLIN)
IF IS_BATTLEBUDDY_AVAILABLE(ped, FALSE) OR IS_BIT_SET(g_bitfieldFriendFlags, ENUM_TO_INT(CHAR_FRANKLIN))
count ++
ENDIF
ped = GET_BATTLEBUDDY_PED(CHAR_MICHAEL)
IF IS_BATTLEBUDDY_AVAILABLE(ped, FALSE) OR IS_BIT_SET(g_bitfieldFriendFlags, ENUM_TO_INT(CHAR_MICHAEL))
count ++
ENDIF
RETURN count
ENDFUNC
FUNC BOOL IS_ENTITY_OK(PED_INDEX ped)
IF NOT DOES_ENTITY_EXIST(ped)
RETURN FALSE
ENDIF
RETURN NOT IS_ENTITY_DEAD(peD)
ENDFUNC
PROC UPDATE_ACHIEVEMENT_OUT_OF_YOUR_DEPTH()
ENTITY_INDEX deathEntity
PED_INDEX deathPed
IS_ENTITY_DEAD(PLAYER_PED_ID()) // to stop an assert.
IF NOT IS_ENTITY_IN_WATER(PLAYER_PED_ID())
EXIT
ENDIF
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "creatures@shark@move", "attack_player")
AWARD_ACHIEVEMENT(ACH22) // Out Of Your Depth
EXIT
ENDIF
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
deathEntity = GET_PED_SOURCE_OF_DEATH(PLAYER_PED_ID())
IF IS_ENTITY_A_PED(deathEntity)
deathPed = GET_PED_INDEX_FROM_ENTITY_INDEX(deathEntity)
IF IS_ENTITY_OK(deathPed)
IF (GET_ENTITY_MODEL(deathPed) = A_C_SHARKTIGER)
AWARD_ACHIEVEMENT(ACH22) // Out Of Your Depth
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_ACHIEVEMENT_THREE_MAN_ARMY()
SWITCH (iThreeManArmyState)
CASE 0 // start timing
fThreeManTimerValue = 0
IF NOT DOES_ENTITY_EXIST(PLAYER_PED_ID())
EXIT
ENDIF
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
EXIT
ENDIF
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) >= 3) AND (GET_MISSION_FLAG() = FALSE)
IF (COUNT_ACTIVE_BATTLE_BUDDIES() = 2)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Started Tracking Achievement: ACH21 - Three Man Army")
RESTART_TIMER_NOW(tThreeManArmyTimer)
iThreeManArmyState ++
ENDIF
ENDIF
BREAK
CASE 1
IF (IS_PLAYER_PED_SWITCH_IN_PROGRESS() OR IS_PLAYER_SWITCH_IN_PROGRESS())
EXIT
ENDIF
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Stopped Tracking Achievement: ACH21 - Three Man Army - Wanted Rating Less Than 5")
CANCEL_TIMER(tThreeManArmyTimer)
iThreeManArmyState = 0
EXIT
ENDIF
IF (GET_MISSION_FLAG() = TRUE)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Stopped Tracking Achievement: ACH21 - Three Man Army - We're on a mission")
CANCEL_TIMER(tThreeManArmyTimer)
iThreeManArmyState = 0
EXIT
ENDIF
IF (COUNT_ACTIVE_BATTLE_BUDDIES() < 2)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Stopped Tracking Achievement: ACH21 - Three Man Army - Not Enough Battle Buddies")
CANCEL_TIMER(tThreeManArmyTimer)
iThreeManArmyState = 0
EXIT
ENDIF
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Stopped Tracking Achievement: ACH21 - Three Man Army - Player is Dead")
CANCEL_TIMER(tThreeManArmyTimer)
iThreeManArmyState = 0
EXIT
ENDIF
fThreeManTimerValue = GET_TIMER_IN_SECONDS_SAFE(tThreeManArmyTimer)
// 300 seconds is 5 minutes
IF fThreeManTimerValue >= ACH21_SURVIVE_TIME
AWARD_ACHIEVEMENT(ACH21) // Three man Army
PAUSE_TIMER(tThreeManArmyTimer)
iThreeManArmyState ++
ENDIF
BREAK
CASE 2
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Stopped Tracking Achievement: ACH21 - Three Man Army - Achievement Unlocked")
iThreeManArmyState ++
BREAK
ENDSWITCH
ENDPROC
PROC DUMP_ACHIEVEMENT_LIST_TO_TTY()
INT i
INT cnt = ENUM_TO_INT(ACHIEVEMENT_COUNT)
CPRINTLN(DEBUG_ACHIEVEMENT, "---------- ACHIEVEMENT LIST -----------")
FOR i=1 TO (cnt-1)
IF HAS_ACHIEVEMENT_BEEN_PASSED(i)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Achievement #:", i, " ", DEBUG_GET_ACHIEVEMENT_TITLE_FROM_INT(i))
ENDIF
ENDFOR
CPRINTLN(DEBUG_ACHIEVEMENT, "---------------------------------------")
ENDPROC
//PURPOSE:
// Retrieve status about social club achievement availability.
//RETURNS:
// Returns TRUE if the status SUCCEEDED.
//NOTES:
// (status == -1) - INVALID status request to read achievements has not even started.
// (status == 0) - Read SUCCEEDED information is available.
// (status == 1) - Read is PENDING, in progress.
// (status == 2) - Read FAILED.
// (status == 3) - Read CANCELED.
//
// If the Status is FAILED/CANCELED you can call SC_ACHIEVEMENT_SYNCHRONIZE once to restart everything
// but make sure the player is online and has ROS credentials.
//
PROC DUMP_SCS_ACHIEVEMENT_STATUS_TO_TTY()
INT i
INT cnt = ENUM_TO_INT(ACHIEVEMENT_COUNT)
BOOL ok
INT iAchStatus
CPRINTLN(DEBUG_ACHIEVEMENT, "---------- SCS ACHIEVEMENT LIST -----------")
ok = SC_ACHIEVEMENT_INFO_STATUS(iAchStatus)
SWITCH (iAchStatus)
CASE -1 // INVALID
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SC_ACHIEVEMENT_INFO_STATUS:INVALID - OK CHECK:", ok)
BREAK
CASE 0 // SUCCEDED
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SC_ACHIEVEMENT_INFO_STATUS:SUCCEDED - OK CHECK:", ok)
BREAK
CASE 1 // PENDING
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SC_ACHIEVEMENT_INFO_STATUS:PENDING - OK CHECK:", ok)
BREAK
CASE 2 // FAILED.
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SC_ACHIEVEMENT_INFO_STATUS:FAILED - OK CHECK:", ok)
BREAK
CASE 3 // CANCELED
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SC_ACHIEVEMENT_INFO_STATUS:CANCELED - OK CHECK:", ok)
BREAK
ENDSWITCH
IF (iAchStatus = 0) AND (ok)
FOR i=1 TO (cnt-1)
IF SC_HAS_ACHIEVEMENT_BEEN_PASSED(i)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: SCS Achievement #:", i, " ", DEBUG_GET_ACHIEVEMENT_TITLE_FROM_INT(i))
ENDIF
ENDFOR
ENDIF
CPRINTLN(DEBUG_ACHIEVEMENT, "---------------------------------------")
ENDPROC
//----------------------
// SCRIPT FUNCTIONS
//----------------------
/// PURPOSE:
/// Populates the list of available repeat play misisons for selected mission type
FUNC INT COUNT_STORY_GOLD_MEDALS(BOOL tty = FALSE)
INT iMissionDataIndex
INT iCount
INT iMedal
INT iTotalStats = 0
INT iPassedStats = 0
INT iStatIndex
FLOAT fPercentage
ENUM_MISSION_STATS eMissionStat
#IF IS_DEBUG_BUILD
TEXT_LABEL_7 txtMissionName
#ENDIF
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
CPRINTLN(DEBUG_ACHIEVEMENT, "Story Mission Medal Check")
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
ENDIF
REPEAT COUNT_OF(g_savedGlobals.sFlow.missionSavedData) iMissionDataIndex
IF (g_savedGlobals.sFlow.missionSavedData[iMissionDataIndex].iCompletionOrder != -1) AND IsMissionRepeatable(iMissionDataIndex, CP_GROUP_MISSIONS)
iTotalStats = 0
iPassedStats = 0
INT overrideMedal = -1
// count
REPEAT GetRepeatPlayMissionStatCount(iMissionDataIndex, CP_GROUP_MISSIONS) iStatIndex
eMissionStat = GetRepeatPlayMissionStat(iMissionDataIndex, CP_GROUP_MISSIONS, iStatIndex)
IF NOT g_MissionStatTrackingPrototypes[eMissionStat].bHidden
IF GET_MISSION_STAT_PASS_STATUS(eMissionStat) =1
++iPassedStats
ENDIF
SWITCH eMissionStat
CASE ASS1_MIRROR_MEDAL
CASE ASS2_MIRROR_MEDAL
CASE ASS4_MIRROR_MEDAL
CASE ASS3_MIRROR_MEDAL
CASE ASS5_MIRROR_MEDAL
overrideMedal = GET_MISSION_STAT_FRIENDLY_VALUE(eMissionStat)
//Give bronze medal in case of shitskip
if overrideMedal >= HIGHEST_INT
overrideMedal = 1
endif
BREAK
ENDSWITCH
++iTotalStats
ENDIF
ENDREPEAT
fPercentage = GET_MISSION_STAT_PERCENTAGE(iPassedStats, iTotalStats)
iMedal = GET_STAT_MEDAL_VALUE(fPercentage)
IF overrideMedal > -1
iMedal = overrideMedal
ENDIF
IF (fPercentage >= 100.0) OR (iMedal = 3)
iCount ++
#IF IS_DEBUG_BUILD
IF (tty)
txtMissionName = GetRepeatPlayMissionName(iMissionDataIndex, CP_GROUP_MISSIONS)
CPRINTLN(DEBUG_ACHIEVEMENT, "Mission: ", txtMissionName, " Gold Count:", iCount)
ENDIF
#ENDIF
ENDIF
ENDIF
ENDREPEAT
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
CPRINTLN(DEBUG_ACHIEVEMENT, "Final Count:", iCount)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
ENDIF
RETURN iCount
ENDFUNC
/// PURPOSE:
/// Populates the list of available repeat play misisons for selected mission type
FUNC INT COUNT_RC_GOLD_MEDALS(BOOL tty = FALSE)
INT iMissionDataIndex
INT iCount
INT iMedal
INT iTotalStats = 0
INT iPassedStats = 0
INT iStatIndex
FLOAT fPercentage
ENUM_MISSION_STATS eMissionStat
#IF IS_DEBUG_BUILD
TEXT_LABEL_7 txtMissionName
#ENDIF
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
CPRINTLN(DEBUG_ACHIEVEMENT, "RC Mission Medal Check")
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
ENDIF
REPEAT COUNT_OF(g_savedGlobals.sRandomChars.savedRC) iMissionDataIndex
IF (g_savedGlobals.sRandomChars.savedRC[iMissionDataIndex].iCompletionOrder != -1) AND IsMissionRepeatable(iMissionDataIndex, CP_GROUP_RANDOMCHARS)
iTotalStats = 0
iPassedStats = 0
// count
REPEAT GetRepeatPlayMissionStatCount(iMissionDataIndex, CP_GROUP_RANDOMCHARS) iStatIndex
eMissionStat = GetRepeatPlayMissionStat(iMissionDataIndex, CP_GROUP_RANDOMCHARS, iStatIndex)
IF NOT g_MissionStatTrackingPrototypes[eMissionStat].bHidden
IF GET_MISSION_STAT_PASS_STATUS(eMissionStat) =1
++iPassedStats
ENDIF
++iTotalStats
ENDIF
ENDREPEAT
fPercentage = GET_MISSION_STAT_PERCENTAGE(iPassedStats, iTotalStats)
iMedal = GET_STAT_MEDAL_VALUE(fPercentage)
IF (iMissionDataIndex >= ENUM_TO_INT(RC_RAMPAGE_1)) AND (iMissionDataIndex <= ENUM_TO_INT(RC_RAMPAGE_5))
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
CPRINTLN(DEBUG_ACHIEVEMENT, "Override For Rampage")
ENDIF
iMedal = g_savedGlobals.sRampageData.playerData[iMissionDataIndex - ENUM_TO_INT(RC_RAMPAGE_1)].iMedalIndex
fPercentage = 0
ENDIF
IF (fPercentage >= 100.0) OR (iMedal = 3)
iCount ++
#IF IS_DEBUG_BUILD
IF (tty)
txtMissionName = GetRepeatPlayMissionName(iMissionDataIndex, CP_GROUP_RANDOMCHARS)
CPRINTLN(DEBUG_ACHIEVEMENT, "Mission: ", txtMissionName, " Gold Count:", iCount)
ENDIF
#ENDIF
ENDIF
ENDIF
ENDREPEAT
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
CPRINTLN(DEBUG_ACHIEVEMENT, "Final Count:", iCount)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
ENDIF
RETURN iCount
ENDFUNC
FUNC INT COUNT_SOLID_GOLD_MEDALS(BOOL tty = FALSE)
INT iCount = COUNT_STORY_GOLD_MEDALS(tty) + COUNT_RC_GOLD_MEDALS(tty)
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
CPRINTLN(DEBUG_ACHIEVEMENT, "Total Count:", iCount)
CPRINTLN(DEBUG_ACHIEVEMENT, "----------------------")
ENDIF
RETURN iCount
ENDFUNC
PROC UPDATE_POLLED_ACHIEVEMENTS(BOOL tty = FALSE)
IF (g_bInMultiplayer)
/* NEED TO REMOVE ACHIEVEMENTS FOR ONLINE BETA
#IF USE_TU_CHANGES
EXIT
#ENDIF
*/
IF (tty)
CHECK_FRANKIE_SAYS_ACHIEVEMENT(tty)
ENDIF
//CHECK_ACHIEVEMENT_AWARD_JUNKIE(tty)
CHECK_AMERICAN_DREAM_ACHIEVEMENT(tty)
CHECK_NUMERO_UNO_ACHIEVEMENT(tty)
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: ACH41 - Award Junkie - Active Char Award Counter:", GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_PLAT_AWARD_COUNT), " of ", ACH41_AWARDS_NEEDED)
CPRINTLN(DEBUG_ACHIEVEMENT, " ")
//CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH44 - Got Away With Murder - Bounties:", GET_MP_INT_CHARACTER_AWARD(MP_AWARD_FMKILLBOUNTY), " of ", ACH44_BOUNTIESKILLED)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH36 - Unnatural Selection - Waves:", GET_MP_INT_CHARACTER_AWARD (MP_AWARD_FMHORDWAVESSURVIVE), " of ", ACH36_WAVESSURVIVED)
#IF IS_DEBUG_BUILD
GAMER_HANDLE hdle = GET_GAMER_HANDLE_PLAYER(PLAYER_ID())
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH46 - Crew Cut - Is Player In Clan:", IS_LOCAL_PLAYER_IN_ACTIVE_CLAN(), " Member Count:", GET_PLAYER_CLAN_MEMBER_COUNT(hdle))
#ENDIF
ENDIF
ENDIF
CHECK_THATS_A_LOT_OF_CHEDDAR_ACHIEVEMENT(tty)
CHECK_MULTI_DISCIPLINED_ACHIEVEMENT(tty)
CHECK_SHOW_OFF_ACHIEVEMENT()
// First Person Achievement
CHECK_A_NEW_PERSPECTIVE_ACHIEVEMENT()
#IF IS_DEBUG_BUILD
fDebugPrintHoursForNewPersp = DEBUG_GET_HOURS_FOR_A_NEW_PERSPECTIVE_ACHIEVEMENT()
#ENDIF
IF (tty)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH19 - Show Off - Stunt Jumps:", GET_NUM_SUCCESSFUL_STUNT_JUMPS(), " of ", ACH19_STUNTJUMPS)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH50 - San Andreas Sightseer:", GET_MINIMAP_FOW_DISCOVERY_RATIO())
IF IS_TIMER_STARTED(tThreeManArmyTimer)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - ACH21 - Three Man Army Timer: ", GET_TIMER_IN_SECONDS(tThreeManArmyTimer))
ENDIF
ENDIF
ENDPROC
PROC CHECK_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT(PED_INDEX ped)
INT i
PED_WEAPONS_STRUCT weaponStruct
IF HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH26))
EXIT
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_MP_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT - START - TIME:", GET_TIMER_IN_SECONDS(ach26MPCheckTimer))
#ENDIF
GET_PED_WEAPONS(ped, weaponStruct)
// check standard weapons
i = 0
REPEAT COUNT_OF(weaponStruct.sWeaponInfo) i
IF IS_PEDS_WEAPON_FULLY_MODDED(ped, weaponStruct.sWeaponInfo[i].eWeaponType)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_MP_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT - ACHIEVEMENT UNLOCKED")
#ENDIF
AWARD_ACHIEVEMENT(ACH26)
EXIT
ENDIF
ENDREPEAT
// check dlc weapons
i = 0
REPEAT COUNT_OF(weaponStruct.sDLCWeaponInfo) i
IF IS_PEDS_WEAPON_FULLY_MODDED(ped, weaponStruct.sDLCWeaponInfo[i].eWeaponType)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_MP_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT - ACHIEVEMENT UNLOCKED")
#ENDIF
AWARD_ACHIEVEMENT(ACH26)
EXIT
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_MP_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT - NO WEAPONS FULLY MODDED - TIME:", GET_TIMER_IN_SECONDS(ach26MPCheckTimer))
#ENDIF
ENDPROC
PROC CHECK_ALL_QUEUED_MP_ACHIEVEMENTS_NO_SOCIAL()
INT iValue
// Off the Plane (ACH30)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH30))
IF HAS_FM_RACE_TUT_BEEN_DONE()
#IF FEATURE_GEN9_STANDALONE OR TRUE #ENDIF
AWARD_ACHIEVEMENT(ACH30)
ENDIF
ENDIF
// Pimp my side arm (ACH26)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH26))
IF GET_TIMER_IN_SECONDS(ach26MPCheckTimer) > 5.0
CHECK_HAS_PED_ATTAINED_PIMP_MY_SIDEARM_ACHIEVEMENT(PLAYER_PED_ID())
RESTART_TIMER_NOW(ach26MPCheckTimer)
ENDIF
ENDIF
// Three-Bit Gangster (ACH31) - Making Moves (ACH32) - Above The Law (ACH33)
iValue = GET_FM_RANK_FROM_XP_VALUE(GET_STAT_CHARACTER_FM_XP())
IF (iValue >= 100)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH33))
AWARD_ACHIEVEMENT(ACH33)
ENDIF
ENDIF
IF (iValue >= 50)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH32))
AWARD_ACHIEVEMENT(ACH32)
ENDIF
ENDIF
IF (iValue >= 25)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH31))
AWARD_ACHIEVEMENT(ACH31)
ENDIF
ENDIF
// Numero Uno (ACH34)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH34))
CHECK_NUMERO_UNO_ACHIEVEMENT()
ENDIF
// Midnight Club (ACH35)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH35))
IF (GET_MP_INT_PLAYER_STAT(MPPLY_TOTAL_CUSTOM_RACES_WON) >= ACH35_CUSTOM_RACES_WON)
AWARD_ACHIEVEMENT(ACH35) // midnight club veteran
ENDIF
ENDIF
// Unnatural Selection (ACH36)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH36))
IF GET_MP_INT_CHARACTER_AWARD (MP_AWARD_FMHORDWAVESSURVIVE) >= ACH36_WAVESSURVIVED
AWARD_ACHIEVEMENT(ACH36)
ENDIF
ENDIF
// THERE IS NO ACH37
// Backseat Driver (ACH38)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH38))
IF (GET_MP_INT_CHARACTER_AWARD (MP_AWARD_FMRALLYWONNAV) > 0)
AWARD_ACHIEVEMENT(ACH38)
ENDIF
ENDIF
// Run Like The Wind (ACH39)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH39))
IF IS_BIT_SET(MPGlobalsAmbience.BountySaveCheck.iBS,BOUNTY_SAVE_CHECK_BS_SURVIVED)
AWARD_ACHIEVEMENT(ACH39)
ENDIF
ENDIF
// WE CAN'T CHECK ACH40 - THIS WILL HAPPEN WHEN IT HAPPENS
// Decorated - ACH41
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH41))
IF (GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_PLAT_AWARD_COUNT) >= ACH41_AWARDS_NEEDED)
AWARD_ACHIEVEMENT(ACH41) // Decorated
ENDIF
ENDIF
// THERE IS NO ACH42
// Stick up Kid - ACH43
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH43))
IF (GET_MP_INT_CHARACTER_AWARD (MP_AWARD_HOLD_UP_SHOPS) >= ACH43_HOLDUPSNEEDED)
AWARD_ACHIEVEMENT(ACH43) // Empty The Register
ENDIF
ENDIF
// THERE IS NO ACH44
// Enjoy Your Stay - ACH45
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH45))
CHECK_FRANKIE_SAYS_ACHIEVEMENT(FALSE) // NO TTY
ENDIF
// WE CAN'T CHECK ACH46 - THIS WILL HAVE TO OCCUR WHEN IT HAPPENS
// WE CAN'T CHECK ACH47 - THIS WILL HAVE TO OCCUR WHEN IT HAPPENS
// Dialling Digits - ACH48
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH48))
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_HELISTRIKES)
AWARD_ACHIEVEMENT(ACH48)
ENDIF
ENDIF
// American Dream - ACH49
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH49))
CHECK_AMERICAN_DREAM_ACHIEVEMENT()
ENDIF
#IF IS_DEBUG_BUILD
/* removed heist achievements for NG sub - ACHIEVEMENTS_ENUM is now of out sync with last gen so we need to protect against auto migration
// Be Prepared - ACH51
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH51))
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_HEIST_AWARD_DONE_PREP)
AWARD_ACHIEVEMENT(ACH51)
ENDIF
ENDIF
// check for achievement ach_52 - In the name of science - Human Labs Clear
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH52))
IF (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_1_L) > 0) OR (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_1_M) > 0)
AWARD_ACHIEVEMENT(ACH52)
ENDIF
ENDIF
// check for achievement ach_53 - Dead Presidents - Pacific Standard Clear
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH53))
IF (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_0_L) > 0) OR (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_0_M) > 0)
AWARD_ACHIEVEMENT(ACH53)
ENDIF
ENDIF
// check for achievement ach_54 - Parole Day - Prison Break Clear
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH54))
IF (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_2_L) > 0) OR (GET_MP_INT_CHARACTER_STAT(MP_STAT_HEIST_SAVED_STRAND_2_M) > 0)
AWARD_ACHIEVEMENT(ACH54)
ENDIF
ENDIF
// Shot Caller - ACH55
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH55))
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_HEIST_AWARD_BOUGHT_IN)
AWARD_ACHIEVEMENT(ACH55)
ENDIF
ENDIF
// Four Way - ACH56
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH56))
IF GET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_SPLIT_HEIST_TAKE_EVENLY)
AWARD_ACHIEVEMENT(ACH56) // Four Way
ENDIF
ENDIF
// WE CAN'T CHECK ACH57 - THIS WILL HAVE TO OCCUR WHEN IT HAPPENS
// WE CAN'T CHECK ACH58 - THIS WILL HAVE TO OCCUR WHEN IT HAPPENS
// Valuable Asset - ACH59
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_GOLD_MEDAL_HEISTS) >= 5) AND NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH59))
AWARD_ACHIEVEMENT(ACH59)
ENDIF
// Mastermind - ACH59
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_WIN_GOLD_MEDAL_HEISTS) >= 25) AND NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH60))
AWARD_ACHIEVEMENT(ACH60)
ENDIF
*/
#ENDIF
ENDPROC
PROC CHECK_ALL_QUEUED_MP_ACHIEVEMENTS_SOCIAL()
INT i
// check standard achievements
FOR i = ENUM_TO_INT(ACH00) TO ENUM_TO_INT(ACH49)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(i)
IF SC_HAS_ACHIEVEMENT_BEEN_PASSED(i)
AWARD_ACHIEVEMENT(INT_TO_ENUM(ACHIEVEMENT_ENUM, i))
ENDIF
ENDIF
ENDFOR
// check heist achievements
FOR i = ENUM_TO_INT(ACHH1) TO ENUM_TO_INT(ACHH10)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(i)
IF SC_HAS_ACHIEVEMENT_BEEN_PASSED(i)
AWARD_ACHIEVEMENT(INT_TO_ENUM(ACHIEVEMENT_ENUM, i))
ENDIF
ENDIF
ENDFOR
// check gang ops achievements
FOR i = ENUM_TO_INT(ACHGO1) TO ENUM_TO_INT(ACHGO8)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(i)
IF SC_HAS_ACHIEVEMENT_BEEN_PASSED(i)
AWARD_ACHIEVEMENT(INT_TO_ENUM(ACHIEVEMENT_ENUM, i))
ENDIF
ENDIF
ENDFOR
ENDPROC
PROC CHECK_ALL_QUEUED_MP_ACHIEVEMENTS()
// don't do this unless we are in mp and the queue is running
IF NOT IS_ACHIEVEMENT_QUEUE_RUNNING(q_mAchievementQueue)
EXIT
ENDIF
IF NOT g_bInMultiplayer
// this is to reset the sync check if we leave MP
IF (bAllMPAchievementSynced)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_ALL_QUEUED_MP_ACHIEVEMENTS - PLAYER HAS LEFT MP - RESETTING bAllMPAchievementSynced FLAG")
bAllMPAchievementSynced = FALSE
ENDIF
EXIT
ENDIF
IF NOT HAS_IMPORTANT_STATS_LOADED()
EXIT
ENDIF
IF (bWaitForAwardsToFinish)
IF NOT IS_FREEMODE_PROLOGUE_PROFILE_SETTINGS_PASSED(PSFP_FINISHED_PROCESSING_TRANSFER_SAVE_MPAWARDS)
//CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_ALL_QUEUED_MP_ACHIEVEMENTS - SAVE MP AWARD TRANSFER IS NOT FINISHED YET")
EXIT
ENDIF
IF NOT IS_FREEMODE_PROLOGUE_PROFILE_SETTINGS_PASSED(PSFP_PLAYER_FINISHED_TRANSFER_SAVES)
//CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - CHECK_ALL_QUEUED_MP_ACHIEVEMENTS - SAVE TRANSFER IS NOT FINISHED YET")
EXIT
ENDIF
ENDIF
IF (bAllMPAchievementSynced)
EXIT
ENDIF
BOOL ok
INT iAchStatus
// (status == -1) - INVALID status request to read achievements has not even started.
// (status == 0) - Read SUCCEEDED information is available.
// (status == 1) - Read is PENDING, in progress.
// (status == 2) - Read FAILED.
// (status == 3) - Read CANCELED.
ok = SC_ACHIEVEMENT_INFO_STATUS(iAchStatus)
IF (iAchStatus = -1) AND (bForceAchievementSCSSync = FALSE)
//CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - FORCE SYNC ACHIEVEMENT SYCNHRONIZE")
//SC_ACHIEVEMENT_SYNCHRONIZE()
//bForceAchievementSCSSync = TRUE
ENDIF
IF (ok) AND (iAchStatus = 0)
CHECK_ALL_QUEUED_MP_ACHIEVEMENTS_SOCIAL()
bAllMPAchievementSynced = TRUE
ELSE
CHECK_ALL_QUEUED_MP_ACHIEVEMENTS_NO_SOCIAL()
ENDIF
ENDPROC
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
PROC UPDATE_ACHIEVEMENT_DEBUG_WIDGETS()
INT i
bCheckShitSkipReplay = IS_BIT_SET(g_replay.iReplayBits, ENUM_TO_INT(RB_DID_WE_EVER_SHITSKIP))
bHaveImportantStatsLoaded = HAS_IMPORTANT_STATS_LOADED()
bHasFreemodeAwardProcessingFinished = IS_FREEMODE_PROLOGUE_PROFILE_SETTINGS_PASSED(PSFP_FINISHED_PROCESSING_TRANSFER_SAVE_MPAWARDS)
bHasFreemodeMigrationFinished = IS_FREEMODE_PROLOGUE_PROFILE_SETTINGS_PASSED(PSFP_PLAYER_FINISHED_TRANSFER_SAVES)
bACHDebugDirectorModeCheck = IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
fDebugAchievementQueueTime = ACHIEVEMENT_QUEUE_TIME
IF (bAchievementTest)
AWARD_ACHIEVEMENT_BY_INT(iAchievementTest)
bDumpAchievementQueueToTTY = TRUE
bAchievementTest = FALSE
ENDIF
IF (bAllAchievementTest)
REPEAT ENUM_TO_INT(ACHIEVEMENT_COUNT) i
IF (i > 0)
AWARD_ACHIEVEMENT_BY_INT(i)
ENDIF
ENDREPEAT
bAllAchievementTest = FALSE
ENDIF
IF (bDumpHeistAchievementInfo)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - DUMP HEIST ACHIEVEMENT INFO")
i = 0
REPEAT ENUM_TO_INT(MAX_HEISTACHCHK_ID) i
CPRINTLN(DEBUG_ACHIEVEMENT, " ", GET_STRING_FROM_HEIST_ACHIEVEMENT_ID(INT_TO_ENUM(eHeistACHCheckID, i)), " IS SET:", IS_HEIST_ACHIEVEMENT_ID_SET(INT_TO_ENUM(eHeistACHCheckID, i)))
ENDREPEAT
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - DUMP HEIST ACHIEVEMENT INFO - END")
bDumpHeistAchievementInfo = FALSE
ENDIF
IF (bTestHeistAchievementInfo)
SET_HEIST_ACHIEVEMENT_ID(INT_TO_ENUM(eHeistACHCheckID, iHeistAchievementInfoSlider))
bTestHeistAchievementInfo = FALSE
ENDIF
IF (bDumpAchievementQueueToTTY)
DUMP_ACHIEVEMENT_QUEUE_TO_TTY(q_mAchievementQueue)
bDumpAchievementQueueToTTY = FALSE
ENDIF
IF (bUpdateAchievementList)
DUMP_ACHIEVEMENT_LIST_TO_TTY()
bUpdateAchievementList = FALSE
ENDIF
IF (bDebugForceAchievementSCSSync)
SC_ACHIEVEMENT_SYNCHRONIZE()
bDebugForceAchievementSCSSync = FALSE
ENDIF
IF (bTestSCSAchievement)
DUMP_SCS_ACHIEVEMENT_STATUS_TO_TTY()
bTestSCSAchievement = FALSE
ENDIF
IF NOT bAllowDebugWidgetUpdate
EXIT
ENDIF
IF (bTestShark)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-8000, 0, 0>>)
bTestShark = FALSE
ENDIF
IF (bVerbose)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - VERBOSE OUTPUT START!!!")
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - Have Important Stats Loaded:", HAS_IMPORTANT_STATS_LOADED())
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - Repeat Play Bits:", g_iRepeatPlayBits)
UPDATE_POLLED_ACHIEVEMENTS(TRUE)
PRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - VERBOSE OUTPUT END!!!")
COUNT_SOLID_GOLD_MEDALS(TRUE)
bVerbose = FALSE
ENDIF
IF (bPrintCarDimensions)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VECTOR vMin, vMax
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())), vMin, vMax)
CPRINTLN(DEBUG_AMBIENT, "----------CAR DUMP DATA -----------")
CPRINTLN(DEBUG_AMBIENT, "MODEL:", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
CPRINTLN(DEBUG_AMBIENT, "MIN:", vMin, " MAX:", vMax)
CPRINTLN(DEBUG_AMBIENT, "L:", ABSF(vMax.y - vMin.y), " W:", ABSF(vMax.x - vMin.x), " H:", ABSF(vMax.z - vMin.z))
CPRINTLN(DEBUG_AMBIENT, "---------- CAR DUMP END -----------")
ENDIF
bPrintCarDimensions = FALSE
ENDIF
IF (bUpdateAchievementList)
CPRINTLN(DEBUG_ACHIEVEMENT, "---------- ACHIEVEMENT LIST -----------")
//CPRINTLN(DEBUG_ACHIEVEMENT, "PLATINUM ", HAS_ACHIEVEMENT_BEEN_PASSED(00))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH00 - Welcome to Los Santos ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH00)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH01 - Who Needs Enemies? ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH01)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH02 - A Fair Days Pay ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH02)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH03 - The Not So Shallow Grave ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH03)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH04 - To Live Or Die In Los Santos ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH04)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH05 - Diamond Hard ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH05)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH06 - Subversive ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH06)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH42 - Blitzed ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH42)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH07 - Small Town, Big Job ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH07)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH08 - The Government Gimps ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH08)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH09 - The Big One! ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH09)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Solid Gold, Baby! ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH10)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH11 - Career Criminal ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH11)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH12 - Alls Fare In Love And War ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH12)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH13 - TP Industries Arms Race ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH13)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH14 - Multi-disciplined ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH14)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH15 - From Beyond The Stars ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH15)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH16 - A Mystery, Solved ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH16)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH17 - Nuclear Waste ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH17)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH18 - Blast From The Past ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH18)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH19 - Show Off ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH19)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH20 - Kifflom! ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH20)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH21 - Three Man Army ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH21)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH22 - Out Of Your Depth ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH22)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH23 - Altruist Acolyte ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH23)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH24 - A Lot Of Cheddar ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH24)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH25 - Trading Pure Alpha ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH25)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH26 - Pimp My Sidearm ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH26)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH27 - Wanted: Alive Or Alive ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH27)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH28 - Los Santos Customs ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH28)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH29 - Close Shave ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH29)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH30 - Off The Plane ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH30)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH31 - All Set ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH31)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH32 - Making Moves ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH32)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH33 - Above The Law ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH33)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH34 - Top Dawg ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH34)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH35 - Midnight Club Veteran ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH35)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH36 - Unnatural Selection ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH36)))
//CPRINTLN(DEBUG_ACHIEVEMENT, "ACH37 - Gang Banged ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH37)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH38 - I Got You ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH38)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH39 - Dogged ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH39)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH40 - Never Saw It Coming ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH40)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH41 - Award Junkie ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH41)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH43 - Empty The Register ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH43)))
//CPRINTLN(DEBUG_ACHIEVEMENT, "ACH44 - Got Away With Murder ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH44)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH45 - Frankie Says ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH45)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH46 - Crew Cut ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH46)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH47 - Full Refund ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH47)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH48 - Phone A Friend ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH48)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH49 - American Dream ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH49)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACH50 - San Andreas Sightseer ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH50)))
#IF USE_TU_CHANGES
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH1 - Be Prepared ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH1)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH2 - In the Name of Science ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH2)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH3 - Dead Presidents ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH3)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH4 - Parole Day ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH4)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH5 - Shot Caller ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH5)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH6 - Four Way ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH6)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH7 - Live a Little ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH7)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH8 - Can't Touch This ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH8)))
//CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH9 - Valuable Asset ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH9)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHH10 - Mastermind ", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHH10)))
//New Heists 2 achievements
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO1 - Getting Started", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO1)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO2 - The IAA Job", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO2)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO3 - The Submarine Job", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO3)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO4 - The Missile Silo Job", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO4)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO5 - A World Worth Saving", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO5)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO6 - Orbital Obliteration", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO6)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO7 - Elitist", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO7)))
CPRINTLN(DEBUG_ACHIEVEMENT, "ACHGO8 - Masterminds", HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACHGO8)))
#ENDIF
CPRINTLN(DEBUG_ACHIEVEMENT, "---------------------------------------")
bUpdateAchievementList = FALSE
ENDIF
ENDPROC
#ENDIF
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Starting Achievement Controller - DEV NG - B*2228556 VERSION")
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
// This script needs to cleanup only when run the magdemo
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_MAGDEMO))
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Achievement Controller has been forced to cleanup (MAGDEMO)")
TERMINATE_THIS_THREAD()
ENDIF
// setup timers
iNextPollCheckTime = GET_GAME_TIMER()
iLastBitsetCheatsUsedThisSession = 0
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT]: Achievement Total:", COUNT_ACHIEVEMENTS())
//CPRINTLN(DEBUG_ACHIEVEMENT, " TotalMoneySpent:", iTotalMoneySpent)
#IF IS_DEBUG_BUILD
SETUP_ACHIEVEMENT_DEBUG_WIDGETS()
bVerbose = TRUE
#ENDIF
DUMMY_REFERENCE_INT(iPollCheck)
DUMP_ACHIEVEMENT_LIST_TO_TTY()
RESET_ACHIEVEMENT_QUEUE(q_mAchievementQueue)
SET_ACHIEVEMENT_QUEUE_RUNNING(q_mAchievementQueue)
RESTART_TIMER_NOW(ach26MPCheckTimer)
WHILE (TRUE)
IF (g_iBitsetCheatsUsedThisSession <> iLastBitsetCheatsUsedThisSession)
IF (iLastBitsetCheatsUsedThisSession = 0) AND (g_iBitsetCheatsUsedThisSession != 0)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - A cheat has been activated")
// B*1585269
IF IS_PS3_VERSION()
OR IS_PLAYSTATION_PLATFORM()
PRINT_HELP("CHEAT_TROPHIE")
ELSE
PRINT_HELP("CHEAT_ACHIEVE")
ENDIF
ENDIF
IF (iLastBitsetCheatsUsedThisSession != 0) AND (g_iBitsetCheatsUsedThisSession = 0)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - Cheats have been reset")
ENDIF
ENDIF
iLastBitsetCheatsUsedThisSession = g_iBitsetCheatsUsedThisSession
#IF IS_DEBUG_BUILD
UPDATE_ACHIEVEMENT_DEBUG_WIDGETS()
IF (bQuitScript)
SCRIPT_CLEANUP()
ENDIF
#ENDIF
//B* 2217854: Disable achievements in Director mode
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH21))
UPDATE_ACHIEVEMENT_THREE_MAN_ARMY()
ENDIF
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH22))
UPDATE_ACHIEVEMENT_OUT_OF_YOUR_DEPTH()
ENDIF
// Count Solid Gold Baby Achievement
IF (g_bCheckSolidGoldBabyAchievement)
CPRINTLN(DEBUG_ACHIEVEMENT, "[ACHIEVEMENT] - A RC or Story Mission has ended check gold")
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH10))
INT iMedals = COUNT_SOLID_GOLD_MEDALS(TRUE)
IF iMedals>0
SET_ACHIEVEMENT_PROGRESS_SAFE(ENUM_TO_INT(ACH10),iMedals)
STAT_SET_INT(NUM_GOLD_MEDALS_OBTAINED,iMedals)
ENDIF
IF ( iMedals >= ACH10_GOLDS_NEEDED)
AWARD_ACHIEVEMENT(ACH10) // Solid Gold Baby
ENDIF
ENDIF
g_bCheckSolidGoldBabyAchievement = FALSE
ENDIF
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
iPollCheck ++
IF (GET_GAME_TIMER() > iNextPollCheckTime)
UPDATE_POLLED_ACHIEVEMENTS()
iNextPollCheckTime = GET_GAME_TIMER() + iNextPollDelay
ENDIF
IF (GET_GAME_TIMER() > iNextMapPollCheckTime)
IF NOT HAS_ACHIEVEMENT_BEEN_PASSED(ENUM_TO_INT(ACH50)) OR (bForceRunMapCheck = true)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_PROLOGUE)
CHECK_SAN_ANDREAS_SIGHTSEER_ACHIEVEMENT()
ENDIF
ENDIF
iNextMapPollCheckTime = GET_GAME_TIMER() + iNextMapPollDelay
ENDIF
ENDIF
ENDIF
UPDATE_ACHIEVEMENT_QUEUE(q_mAchievementQueue)
CHECK_ALL_QUEUED_MP_ACHIEVEMENTS()
ELSE
UPDATE_ACHIEVEMENT_QUEUE(q_mAchievementQueue)
CHECK_ALL_QUEUED_MP_ACHIEVEMENTS()
ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT