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

1300 lines
42 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : blip_controller.sch
// AUTHOR : Ak
// DESCRIPTION : The manager script for the global blip data.
// Changes to the data are made with the procs in
// blip_control_public.sch
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_hud.sch"
USING "commands_misc.sch"
USING "selector_public.sch"
USING "blip_control_public.sch"
USING "blip_ambient.sch"
USING "candidate_public.sch"
BOOL bInExile = FALSE
BOOL bInExileLastTick = FALSE
BOOL bFlashAlt
#IF IS_DEBUG_BUILD
BOOL d_BlipCtrl_bWidgetCreate = FALSE
BOOL d_BlipCtrl_bWidgetsCreated = FALSE
BOOL d_BlipCtrl_bWidgetModeActive = FALSE
// Kenneth R.
// Widget values have been moved to blip_globals.sch to stop thread stack overflow.
#ENDIF
PROC Script_Cleanup()
TERMINATE_THIS_THREAD()
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_CREATE_WIDGETS()
IF d_BlipCtrl_bWidgetsCreated
EXIT
ENDIF
// Initialise widgets.
START_WIDGET_GROUP("Static blips")
ADD_WIDGET_BOOL("ACTIVATE DEBUG WIDGETS",d_BlipCtrl_bWidgetModeActive)
START_WIDGET_GROUP("Teleports")
INT i
REPEAT STATIC_BLIP_NAME_DUMMY_FINAL i
ADD_WIDGET_BOOL(DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i),d_BlipCtrl_bWidgetBools[i])
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Status")
// Add widget group for static blip status information.
REPEAT STATIC_BLIP_NAME_DUMMY_FINAL i
START_WIDGET_GROUP(DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i))
// STATIC_BLIP_SETTING_ACTIVE
ADD_WIDGET_BOOL("Blip Active",d_BlipCtrl_bWidgetBoolActive[i])
// STATIC_BLIP_SETTING_HIDE_INSIDE
ADD_WIDGET_BOOL("Hidden indoors",d_BlipCtrl_bWidgetBoolHiddenInside[i])
// STATIC_BLIP_SETTING_HIDE_OUTSIDE
ADD_WIDGET_BOOL("Hidden outside",d_BlipCtrl_bWidgetBoolHiddenOutside[i])
// STATIC_BLIP_SETTING_FLASH_ON_ACTIVE
ADD_WIDGET_BOOL("Flash when activated",d_BlipCtrl_bWidgetBoolFlashOnActive[i])
// STATIC_BLIP_SETTING_HAS_FLASHED
ADD_WIDGET_BOOL("Has flashed",d_BlipCtrl_bWidgetBoolHasFlashed[i])
// STATIC_BLIP_SETTING_APPEAR_FRONT
ADD_WIDGET_BOOL("Appear on front end map",d_BlipCtrl_bWidgetBoolAppearFront[i])
// STATIC_BLIP_SETTING_RADAR_SHORT
ADD_WIDGET_BOOL("Appear on radar short range",d_BlipCtrl_bWidgetBoolRadarShort[i])
// STATIC_BLIP_SETTING_RADAR_LONG
ADD_WIDGET_BOOL("Appear on radar long range",d_BlipCtrl_bWidgetBoolRadarLong[i])
// STATIC_BLIP_SETTING_HIDE_ON_MISSION
ADD_WIDGET_BOOL("Hide during mission",d_BlipCtrl_bWidgetBoolHideOnMission[i])
// STATIC_BLIP_SETTING_ZONE_SPECIFIC
ADD_WIDGET_BOOL("Zone specific",d_BlipCtrl_bWidgetBoolZoneSpecific[i])
// STATIC_BLIP_SETTING_DISCOVERABLE
ADD_WIDGET_BOOL("Discoverable blip",d_BlipCtrl_bWidgetBoolDiscoverable[i])
// STATIC_BLIP_SETTING_DISCOVERED
ADD_WIDGET_BOOL("Static blip has been discovered",d_BlipCtrl_bWidgetBoolDiscovered[i])
// STATIC_BLIP_ACTIVATION_STATE_PREPOST_MISSION
ADD_WIDGET_BOOL("Active supressed due to mission",d_BlipCtrl_bWidgetBoolSupressedDueToMission[i])
// STATIC_BLIP_SETTING_CHARACTER_SPECIFIC
ADD_WIDGET_BOOL("Char specific",d_BlipCtrl_bWidgetBoolCharSpecific[i])
// STATIC_BLIP_SETTING_OTHER_CHARACTER_SPECIFIC
ADD_WIDGET_BOOL("Other char specific",d_BlipCtrl_bWidgetBoolSecondaryCharSpecific[i])
// STATIC_BLIP_IGNORES_CHAR_SPECIFIC_MODE_BOOL
ADD_WIDGET_BOOL("Ignores char specific mode",d_BlipCtrl_bWidgetBoolUniversal[i])
// STATIC_BLIP_SETTING_NO_LONG_RANGE_ON_MISSION
ADD_WIDGET_BOOL("Not long range during mission",d_BlipCtrl_bWidgetBoolNotLongRangeDuringMission[i])
// STATIC_BLIP_SETTING_TIME_SPECIFIC
ADD_WIDGET_BOOL("Time specific",d_BlipCtrl_bWidgetBoolTimeSpecific[i])
//STATIC_BLIP_SETTING_ON_WANTED_HIDE
ADD_WIDGET_BOOL("Hide On Wanted",d_BlipCtrl_bWidgetBoolOnWantedHide[i])
//STATIC_BLIP_SETTING_HIDE_ON_RANDOM_EVENT
ADD_WIDGET_BOOL("Hide On Random Event",d_BlipCtrl_bWidgetBoolHideOnRandomEvent[i])
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
d_BlipCtrl_bWidgetsCreated = TRUE
ENDPROC
#ENDIF
PROC CONFIGURE_STATIC_BLIP(BLIP_INDEX bi,INT i)
enumCharacterList cchar = GET_CURRENT_PLAYER_PED_ENUM()
SET_BLIP_EXTENDED_HEIGHT_THRESHOLD(bi,TRUE)
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOW_LOWEST)
SET_BLIP_COLOUR(bi, GET_STATIC_BLIP_COLOUR(INT_TO_ENUM(STATIC_BLIP_NAME_ENUM,i)))
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_MISSION
OR g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_RANDOMCHAR
SWITCH cchar
CASE CHAR_MICHAEL
SET_BLIP_COLOUR(bi, BLIP_COLOUR_MICHAEL)
BREAK
CASE CHAR_FRANKLIN
SET_BLIP_COLOUR(bi, BLIP_COLOUR_FRANKLIN)
BREAK
CASE CHAR_TREVOR
SET_BLIP_COLOUR(bi, BLIP_COLOUR_TREVOR)
BREAK
ENDSWITCH
ENDIF
// This causes area blips to disappear
IF NOT IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_AREA_BLIP)
SET_BLIP_SCALE(bi, 1.0)
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(g_GameBlips[i].txtBlipName)
IF DOES_TEXT_LABEL_EXIST(g_GameBlips[i].txtBlipName)
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG1LN(DEBUG_BLIP, "Set name of blip: ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " to ", g_GameBlips[i].txtBlipName)
CPRINTLN(DEBUG_BLIP," // ")
ENDIF
#ENDIF
SET_BLIP_NAME_FROM_TEXT_FILE(bi, g_GameBlips[i].txtBlipName)
ENDIF
ENDIF
// Does the blip appear on the map screen?
BOOL bOnMap = IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_APPEAR_FRONT)
// Does the blip appear on the radar when its in range?
BOOL bShortRadar = IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_RADAR_SHORT)
// Does the blip appear on the radar edges when at long range?
BOOL bLongRadar = IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_RADAR_LONG)
// All true = DISPLAY_BOTH
// Finally if the override flag is set then go with short if on mission
BOOL bLongOverrideOnMission = FALSE
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
bLongOverrideOnMission = IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_NO_LONG_RANGE_ON_MISSION)
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_SYSTEM, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " no long range state on mission.")
ENDIF
#ENDIF
ENDIF
IF bLongRadar AND (NOT bLongOverrideOnMission)
SET_BLIP_AS_SHORT_RANGE(bi,FALSE)
ELSE
SET_BLIP_AS_SHORT_RANGE(bi,TRUE)
ENDIF
IF bShortRadar AND bOnMap
//show both
SET_BLIP_DISPLAY(bi,DISPLAY_BOTH)
ELSE
IF bShortRadar
//shortradar but not map
SET_BLIP_DISPLAY(bi,DISPLAY_RADAR_ONLY)
ENDIF
IF bOnMap
//on map but not short radar
SET_BLIP_DISPLAY(bi,DISPLAY_MAP)
ENDIF
ENDIF
SWITCH g_GameBlips[i].eCategory
CASE STATIC_BLIP_CATEGORY_SHOP // note cars and ammunation will get changed below as well due to 1458983
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOW_LOWEST)
SET_BLIP_HIGH_DETAIL(bi,FALSE)
BREAK
CASE STATIC_BLIP_CATEGORY_MINIGAME
CASE STATIC_BLIP_CATEGORY_AMBIENT
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOW_LOWEST)//This enum name sucks. Thanks Dp
SET_BLIP_HIGH_DETAIL(bi,FALSE)
BREAK
CASE STATIC_BLIP_CATEGORY_SAVEHOUSE
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOW)
SET_BLIP_HIGH_DETAIL(bi,TRUE)
BREAK
CASE STATIC_BLIP_CATEGORY_PROPERTY
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOWEST)
SET_BLIP_CATEGORY(bi,BLIP_CATEGORY_PROPERTY)
SET_BLIP_HIGH_DETAIL(bi,FALSE)
BREAK
CASE STATIC_BLIP_CATEGORY_MISSION
CASE STATIC_BLIP_CATEGORY_RANDOMCHAR
SET_BLIP_HIGH_DETAIL(bi,TRUE)
// Ensure story missions and RCM's are given the correct priority
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_MISSION
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_HIGH)
ELSE
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_MED)
ENDIF
// If is char specific and owner not active then make 50% scale
// otherwise normal scale
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_CHARACTER_SPECIFIC)
IF NOT IS_STATIC_BLIP_OWNERS_ACTIVE(INT_TO_ENUM(STATIC_BLIP_NAME_ENUM,i))
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_AREA_BLIP)
// Don't display area blips when an invalid character
SET_BLIP_ALPHA(bi, 0)
ELSE
//SET_BLIP_COLOUR(bi ,BLIP_COLOUR_INACTIVE_MISSION)
IF g_GameBlips[i].eVisibleOnlyToChar = CHAR_MICHAEL
SET_BLIP_COLOUR(bi, BLIP_COLOUR_MICHAEL)
endif
IF g_GameBlips[i].eVisibleOnlyToChar = CHAR_FRANKLIN
SET_BLIP_COLOUR(bi, BLIP_COLOUR_FRANKLIN)
endif
IF g_GameBlips[i].eVisibleOnlyToChar = CHAR_TREVOR
SET_BLIP_COLOUR(bi, BLIP_COLOUR_TREVOR)
endif
//SET_BLIP_ALPHA(bi, 122)
// RCM blips should appear behind and be short range.
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_RANDOMCHAR
SET_BLIP_AS_SHORT_RANGE(bi, IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_RADAR_SHORT)) //P.D. fix for bug 1454314
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_LOW)
SET_BLIP_AS_SHORT_RANGE(bi, TRUE)
SET_BLIP_HIDDEN_ON_LEGEND(bi, TRUE)
SET_BLIP_SCALE(bi, 0.77)
Else
SET_BLIP_SCALE(bi, 0.72)
endif
ENDIF
ELSE
// Restore area blip - we set alpha to zero when invalid character
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_AREA_BLIP)
SET_BLIP_ALPHA(bi, 128)
ENDIF
// Ensure RCM blip isn't hidden on legend when not greyed out
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_RANDOMCHAR
SET_BLIP_HIDDEN_ON_LEGEND(bi, FALSE)
ENDIF
ENDIF
ENDIF
BREAK
DEFAULT
SET_BLIP_PRIORITY(bi,BLIPPRIORITY_MED)
BREAK
ENDSWITCH
//AMMUNATION AND MOD SHOP BLIP SPECIFIC SETTINGS // 1458983
SWITCH INT_TO_ENUM(STATIC_BLIP_NAME_ENUM,i)
CASE STATIC_BLIP_SHOP_GUN_01_DT // Weapons - Downtown
CASE STATIC_BLIP_SHOP_GUN_02_SS // Weapons - Sandy Shores
CASE STATIC_BLIP_SHOP_GUN_03_HW // Weapons - Vinewood
CASE STATIC_BLIP_SHOP_GUN_04_ELS // Weapons - East Los Santos
CASE STATIC_BLIP_SHOP_GUN_05_PB // Weapons - Paleto Bay
CASE STATIC_BLIP_SHOP_GUN_06_LS // Weapons - Little Seoul
CASE STATIC_BLIP_SHOP_GUN_07_MW // Weapons - Morningwood
CASE STATIC_BLIP_SHOP_GUN_08_CS // Weapons - Countryside
CASE STATIC_BLIP_SHOP_GUN_09_GOH // Weapons - Great Ocean Highway
CASE STATIC_BLIP_SHOP_GUN_10_VWH // Weapons - Vinewood Hills
CASE STATIC_BLIP_SHOP_GUN_11_ID1 // Weapons - Cypress Flats
SET_BLIP_HIGH_DETAIL(bi,TRUE)
BREAK
ENDSWITCH
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)//g_GameBlips[i].bMultiCoordAndSprite
SWITCH cchar
CASE CHAR_FRANKLIN
CASE CHAR_MICHAEL
CASE CHAR_TREVOR
SET_BLIP_COORDS(g_GameBlips[i].biBlip,g_GameBlips[i].vCoords[cchar])
BREAK
ENDSWITCH
ENDIF
// Should the blip show hover info. Can't set this on all blips by default as having this flagged on
// causes the scale and location name to disappear which looks strange on blips that have no info
// to display. #1146770
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_SHOW_MAP_HOVER_INFO)
SET_BLIP_AS_MISSION_CREATOR_BLIP(bi, TRUE)
ELSE
SET_BLIP_AS_MISSION_CREATOR_BLIP(bi, FALSE)
ENDIF
//blip tick effect
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_TICKED)
SHOW_TICK_ON_BLIP(bi, TRUE)
ELSE
SHOW_TICK_ON_BLIP(bi, FALSE)
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_DISPLAY_AS_INACTIVE)
SET_BLIP_COLOUR(bi ,BLIP_COLOUR_INACTIVE_MISSION)
ENDIF
ENDPROC
INT htime = 0
FUNC BOOL TIME_CHANGED_SINCE_LAST_CALL()//only interested in hours
IF g_OnMissionState != MISSION_TYPE_OFF_MISSION
RETURN FALSE // no time of day blips on mission
ENDIF
IF GET_CLOCK_HOURS() != htime
htime = GET_CLOCK_HOURS()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
INT iWantedLev = 0
FUNC BOOL IS_PLAYER_WANTED_CHANGED_SINCE_LAST_CALL()
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) != iWantedLev
iWantedLev = GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX())
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
BOOL bOutside = TRUE
INTERIOR_INSTANCE_INDEX last = NULL
FUNC BOOL DID_INTERIOR_CHANGE_SINCE_LAST_CALL()
IF IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
RETURN FALSE
ENDIF
INTERIOR_INSTANCE_INDEX current = GET_INTERIOR_FROM_ENTITY(GET_PLAYER_PED(GET_PLAYER_INDEX()))
IF last != current
last = current
CDEBUG2LN(debug_blip,"DID_INTERIOR_CHANGE_SINCE_LAST_CALL: Interior changed to outside? ", current = NULL)
IF current = NULL
OR IS_INTERIOR_A_TUNNEL(current) //Don't consider tunnels as "inside" interiors
bOutside = TRUE
ELSE
bOutside = FALSE
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DID_MISSION_STATE_CHANGE_SINCE_LAST_CALL()
BOOL ret = g_bBlipSystemMissionStateChange
g_bBlipSystemMissionStateChange = FALSE
IF ret
CDEBUG1LN(DEBUG_SYSTEM, "Blip system detected a mission state change.")
ENDIF
RETURN ret
ENDFUNC
BOOL bAmbState = FALSE
FUNC BOOL DID_AMBIENT_STATE_CHANGE_SINCE_LAST_CALL()
IF bAmbState != IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
bAmbState = IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL BLIP_WANTED_CHECK()
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) != 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC TURN_ON_CARWASH_FAIRGROUND_CABLE_CAR_BLIPS()
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) = TRUE
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CARWASH_LONG, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CARWASH_SHORT, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CABLECAR_BOTTOM, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CABLECAR_TOP, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_FGROUND_BIGWHEEL, TRUE)
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_AMBIENT_FGROUND_BIGWHEEL)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_FGROUND_RCOASTER, TRUE)
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_AMBIENT_FGROUND_RCOASTER)
ENDIF
ENDPROC
PROC TURN_ON_CINEMA_BLIPS()
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) = TRUE
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_ACTIVITY_CINEMA_VINEWOOD, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_ACTIVITY_CINEMA_DOWNTOWN, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_ACTIVITY_CINEMA_MORNINGWOOD, TRUE)
ENDIF
ENDPROC
INT iClosestSaveHouse = -1
INT iLoggedActiveSaveHouseBlips = 0
INT WatchedSaveHouses[MAX_WATCHED_SAVEHOUSES]
PROC SAVEHOUSE_BLIP_CREATED(INT id)
IF iLoggedActiveSaveHouseBlips = MAX_WATCHED_SAVEHOUSES
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_SYSTEM, "The following safehouse blips were being watched at the time of the assert")
INT l = 0
REPEAT MAX_WATCHED_SAVEHOUSES l
CDEBUG1LN(DEBUG_SYSTEM, "Blip number ", l ," : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(WatchedSaveHouses[l]), ".")
ENDREPEAT
SCRIPT_ASSERT("blip_controller watching too many savehouses at once!")
#ENDIF
EXIT
ENDIF
INT i = 0
INT freeIndex = -1
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_BLIP,"passed id is ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(id))
#ENDIF
REPEAT iLoggedActiveSaveHouseBlips i
IF WatchedSaveHouses[i] = id
CPRINTLN(DEBUG_BLIP,"Savehouse already being watched.")
EXIT
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_BLIP,"starting loop through WatchedSaveHouses")
#ENDIF
REPEAT MAX_WATCHED_SAVEHOUSES i
#IF IS_DEBUG_BUILD
IF WatchedSaveHouses[i] = -1
CDEBUG1LN(DEBUG_BLIP,"WatchedSaveHouses[", i,"] is empty")
ELSE
CDEBUG1LN(DEBUG_BLIP,"WatchedSaveHouses[", i,"] is ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(WatchedSaveHouses[i]))
ENDIF
#ENDIF
IF WatchedSaveHouses[i] = -1
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_BLIP,"first free space found at ", i, " setting to ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(id))
#ENDIF
freeIndex = i
i = MAX_WATCHED_SAVEHOUSES
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_BLIP,"end of loop through WatchedSaveHouses")
#ENDIF
WatchedSaveHouses[freeIndex] = id
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_BLIP,DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(WatchedSaveHouses[freeIndex]), " added to watched savehouses")
#ENDIF
++iLoggedActiveSaveHouseBlips
ENDPROC
PROC SAVEHOUSE_BLIP_REMOVED(INT id)
IF iLoggedActiveSaveHouseBlips < 1
SCRIPT_ASSERT("blip_controller trying to remove a savehouse watch when list is empty!!")
EXIT
ENDIF
INT i = 0
REPEAT MAX_WATCHED_SAVEHOUSES i
IF(WatchedSaveHouses[i] = id)
--iLoggedActiveSaveHouseBlips
WatchedSaveHouses[i] = -1
IF id = iClosestSaveHouse
iClosestSaveHouse = -1
ENDIF
EXIT
ENDIF
ENDREPEAT
ENDPROC
// Keep the nearest safehouse blip long range and the others short range.
PROC DO_SAVEHOUSE_BLIP_PROXIMITY_CHECK()
IF IS_PLAYER_DEAD(GET_PLAYER_INDEX())
EXIT
ENDIF
VECTOR vp = GET_PLAYER_COORDS(GET_PLAYER_INDEX())
INT iClosest = -1
FLOAT fCloseDist = 1000000.0
INT i = 0
REPEAT MAX_WATCHED_SAVEHOUSES i
IF WatchedSaveHouses[i] != -1
IF DOES_BLIP_EXIST(g_GameBlips[WatchedSaveHouses[i]].biBlip)
FLOAT dist = GET_DISTANCE_BETWEEN_COORDS(vp, GET_BLIP_COORDS(g_GameBlips[WatchedSaveHouses[i]].biBlip))
IF(dist < fCloseDist)
fCloseDist = dist
iClosest = i
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF iClosestSaveHouse = iClosest
EXIT
ENDIF
iClosestSaveHouse = iClosest
IF iClosest = -1
EXIT
ENDIF
REPEAT MAX_WATCHED_SAVEHOUSES i
IF WatchedSaveHouses[i] != -1
IF i = iClosest
IF DOES_BLIP_EXIST(g_GameBlips[WatchedSaveHouses[i]].biBlip)
CDEBUG2LN(DEBUG_BLIP,"Savehouse blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(WatchedSaveHouses[i]), " being set long range as it is the closest.")
SET_STATIC_BLIP_LONG_RANGE(INT_TO_ENUM(STATIC_BLIP_NAME_ENUM, WatchedSaveHouses[i]))
ENDIF
ELSE
IF DOES_BLIP_EXIST(g_GameBlips[WatchedSaveHouses[i]].biBlip)
CDEBUG2LN(DEBUG_BLIP,"Savehouse blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(WatchedSaveHouses[i]), " being set short range as it is not the closest.")
SET_STATIC_BLIP_SHORT_RANGE(INT_TO_ENUM(STATIC_BLIP_NAME_ENUM, WatchedSaveHouses[i]))
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
//Manage the blip active state of one safehouse blip per frame.
PROC UPDATE_SAFEHOUSE_BLIPS_DISPLAYING()
INT iSafeHouseIndex
REPEAT NUMBER_OF_ACTIVE_SAVEHOUSE_LOCATIONS iSafeHouseIndex
Update_Savehouse_Respawn_Blip(INT_TO_ENUM(SAVEHOUSE_NAME_ENUM, iSafeHouseIndex))
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Checks whether to activate/deactivate the world blip for Chop
PROC DO_CHOP_SAFEHOUSE_BLIP_CHECK()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_CHOP_THE_DOG_UNLOCKED)
// Assert guard
IF IS_PLAYER_PLAYING(PLAYER_ID()) // B*1406239
// Franklin is at Vinewood Hills
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_FRANKLIN_MOVED_TO_HILLS_APARTMENT)
// Ensure Franklin's aunt house is clear
IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(STATIC_BLIP_AMBIENT_CHOP_SC)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CHOP_SC, FALSE)
ENDIF
// Enable Vinewood Hills blip
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(STATIC_BLIP_AMBIENT_CHOP_VH)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("chop")) = 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<19.30, 528.24, 169.63>>) > 50
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CHOP_VH, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
// Clear Vinewood Hills - although in theory this shouldn't be possible unless debug warping back in flow
IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(STATIC_BLIP_AMBIENT_CHOP_VH)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CHOP_VH, FALSE)
ENDIF
// Enable aunt's house Hills blip
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(STATIC_BLIP_AMBIENT_CHOP_SC)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("chop")) = 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-11.15, -1425.56, 29.67>>) > 50
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_AMBIENT_CHOP_SC, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
CONST_INT MINIMAP_MAX_BLIPS 150
enumCharacterList lastchar
enumCharacterList currchar
BOOL bCharChanged = FALSE
BOOL bPrologueModeChanged = FALSE
BOOL bTimeChanged = FALSE
BOOL bWantedChanged = FALSE
BOOL bMissionStateChanged = FALSE
BOOL bAmbientStateChange = FALSE
BOOL bOnPrologueMode = FALSE
BOOL bInExileChanged = FALSE
BOOL bInteriorChanged = FALSE
FUNC BOOL CHECK_FOR_CHANGE()
BOOL somethingNewChanged = FALSE
IF TIME_CHANGED_SINCE_LAST_CALL()
IF !bTimeChanged
bTimeChanged = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: time changed.")
ENDIF
ENDIF
IF IS_PLAYER_WANTED_CHANGED_SINCE_LAST_CALL()
IF !bWantedChanged
bWantedChanged = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: wanted changed.")
ENDIF
ENDIF
IF DID_MISSION_STATE_CHANGE_SINCE_LAST_CALL()
IF !bMissionStateChanged
bMissionStateChanged = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: mission state changed.")
ENDIF
ENDIF
IF DID_AMBIENT_STATE_CHANGE_SINCE_LAST_CALL()
IF !bAmbientStateChange
bAmbientStateChange = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: ambient state changed.")
ENDIF
ENDIF
bPrologueModeChanged = FALSE
IF g_BlipSystemPrologueMode != bOnPrologueMode
bOnPrologueMode = g_BlipSystemPrologueMode
IF !bPrologueModeChanged
bPrologueModeChanged = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: prologue mode changed.")
ENDIF
ENDIF
IF DID_INTERIOR_CHANGE_SINCE_LAST_CALL()
IF !bInteriorChanged
bInteriorChanged = TRUE
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: interior changed.")
ENDIF
ENDIF
currchar = GET_CURRENT_PLAYER_PED_ENUM()
IF currchar != lastchar
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: char changed.")
lastchar = currchar
bCharChanged = TRUE
somethingNewChanged = TRUE
ENDIF
bInExileLastTick = bInExile
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MICHAEL_TREVOR_EXILE_STARTED)
bInExile = TRUE
ENDIF
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED)
bInExile = FALSE
ENDIF
IF bInExile != bInExileLastTick
IF !bInExileChanged
somethingNewChanged = TRUE
CPRINTLN(DEBUG_BLIP,"CHECK_FOR_CHANGE: exile mode changed.")
ENDIF
bInExileChanged = TRUE
ENDIF
RETURN somethingNewChanged
ENDFUNC
PROC RESET_CHANGE()
bCharChanged = FALSE
bPrologueModeChanged = FALSE
bTimeChanged = FALSE
bWantedChanged = FALSE
bMissionStateChanged = FALSE
bAmbientStateChange = FALSE
bOnPrologueMode = FALSE
bInExileChanged = FALSE
bInteriorChanged = FALSE
ENDPROC
FUNC BOOL CHECK_BLIP_CHANGE_SETTINGS(INT i)
// Check for things that could wake up this blip
IF bWantedChanged AND IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ON_WANTED_HIDE)
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from WANTED LEVEL")
RETURN TRUE
ENDIF
IF bMissionStateChanged
AND (IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_ON_MISSION)
OR IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_NO_LONG_RANGE_ON_MISSION)
OR IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MISSION_LEVEL_EXCLUSIVE))
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from MISSION STATE CHANGED")
RETURN TRUE
ENDIF
IF bAmbientStateChange AND IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_ON_RANDOM_EVENT)
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from HIDE ON RANDOM EVENT")
RETURN TRUE
ENDIF
IF bCharChanged
AND (IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_OTHER_CHARACTER_SPECIFIC)
OR IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_CHARACTER_SPECIFIC)
OR IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE))
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ",DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from CHAR CHANGED")
RETURN TRUE
ENDIF
IF bPrologueModeChanged
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from PROLOGUE MODE CHANGED")
RETURN TRUE
ENDIF
IF bInExileChanged
AND (IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_BLIP_SETTING_HIDE_IN_EXILE))
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from HIDE IN EXILE")
RETURN TRUE
ENDIF
IF bInteriorChanged
AND (IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_HIDE_INSIDE)
OR IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_HIDE_OUTSIDE))
OR g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_SAVEHOUSE
SET_BIT(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_STATUS_CHANGED)
CDEBUG3LN(DEBUG_BLIP,"Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i)," changed status from HIDE IN/OUTSIDE")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
SCRIPT
// This script needs to cleanup only when the game moves from SP to MP
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP))
CPRINTLN(DEBUG_BLIP,"...blip_controller.sc has been forced to cleanup (SP to MP)")
Script_Cleanup()
ENDIF
//1459074
INT ij
STATIC_BLIP_NAME_ENUM eBlip
FOR ij = 0 TO NUMBER_OF_SHOPS-1
IF IS_SHOP_AVAILABLE_IN_SINGLEPLAYER((INT_TO_ENUM(SHOP_NAME_ENUM, ij)))
eBlip = GET_SHOP_BLIP_ENUM((INT_TO_ENUM(SHOP_NAME_ENUM, ij)))
SET_STATIC_BLIP_NAME(eBlip, GET_SHOP_BLIP_NAME((INT_TO_ENUM(SHOP_NAME_ENUM, ij))))
ENDIF
ENDFOR
//#1415245
SET_STATIC_BLIP_HIDE_IN_EXTERIOR(STATIC_BLIP_MINIGAME_SHOOTING_RANGE1, TRUE)
SET_STATIC_BLIP_HIDE_IN_EXTERIOR(STATIC_BLIP_MINIGAME_SHOOTING_RANGE2, TRUE)
g_bBlipSystemRefreshDetector = TRUE
WHILE g_bBlipSystemStartupLeash // Wait until startup positioning is done before processing.
IF (GET_GAME_TIMER() % 250) = 0
CPRINTLN(DEBUG_BLIP,"blip controller leashed. Waiting to be unleashed.")
ENDIF
#IF IS_DEBUG_BUILD
IF g_flowUnsaved.bUpdatingGameflow
g_bBlipSystemStartupLeash = FALSE
CPRINTLN(DEBUG_BLIP,"blip controller leash skipped due to g_flowUnsaved.bUpdatingGameflow ")
ENDIF
#ENDIF
WAIT(0)
ENDWHILE
INT i = 0
REPEAT MAX_WATCHED_SAVEHOUSES i
WatchedSaveHouses[i] = -1
ENDREPEAT
#IF IS_DEBUG_BUILD
// Initialise widgets.
START_WIDGET_GROUP("Static blips switch")
ADD_WIDGET_BOOL("CREATE DEBUG WIDGETS", d_BlipCtrl_bWidgetCreate)
STOP_WIDGET_GROUP()
#ENDIF
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
// Prime all the blips for processing.
i = 0
REPEAT g_iTotalStaticBlips i
SET_BIT(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_STATUS_CHANGED)
ENDREPEAT
bOnPrologueMode = g_BlipSystemPrologueMode
BOOL ChangeLastPass = FALSE
TURN_ON_CARWASH_FAIRGROUND_CABLE_CAR_BLIPS()
TURN_ON_CINEMA_BLIPS()
WHILE TRUE
IF !ChangeLastPass
RESET_CHANGE()
ENDIF
ChangeLastPass = CHECK_FOR_CHANGE()
IF ChangeLastPass
g_bBlipSystemRefreshDetector = TRUE
ENDIF
// Wake up and update any blips that need updating.
INT Updated = 0
INT Changed = 0
i = 0
IF g_bBlipSystemRefreshDetector
TURN_ON_CARWASH_FAIRGROUND_CABLE_CAR_BLIPS()
TURN_ON_CINEMA_BLIPS()
INT iUpdateLimiter = 0
REPEAT g_iTotalStaticBlips i
BOOL bChanged = IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_STATUS_CHANGED)
IF !bChanged
IF CHECK_BLIP_CHANGE_SETTINGS(i)
// Increment changed to trigger the wait check.
++Changed
bChanged = TRUE
ENDIF
ENDIF
++Updated
IF bChanged
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " being updated.")
// Do status update for this blip.
INT iSuppressionVotes = 0
INT iSuppressionChecks = 0
// Auto suppress if we're in Prologue mode.
IF g_BlipSystemPrologueMode
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " prologue suppress.")
++iSuppressionVotes
++iSuppressionChecks
// Otherwise do normal suppression checks.
ELSE
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ON_WANTED_HIDE)
IF BLIP_WANTED_CHECK()
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " wanted suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_INSIDE)
IF !bOutside
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " inside suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_OUTSIDE)
IF bOutside
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " outside suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_ON_MISSION)
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION)
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " hide on mission suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MISSION_LEVEL_EXCLUSIVE)
IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(g_GameBlips[i].launchLevel)
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " hide on mission - NEW LAUNCH LEVEL VERSION - suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_HIDE_ON_RANDOM_EVENT)
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_EVENT)
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " random event suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_CHARACTER_SPECIFIC)
IF g_GameBlips[i].eCategory != STATIC_BLIP_CATEGORY_MISSION // Mission and RCM blips have special fade rules
AND g_GameBlips[i].eCategory != STATIC_BLIP_CATEGORY_RANDOMCHAR
IF NOT IS_STATIC_BLIP_OWNERS_ACTIVE(INT_TO_ENUM(STATIC_BLIP_NAME_ENUM,i))
++iSuppressionVotes
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " owner not active suppress.")
ENDIF
#ENDIF
ENDIF
++iSuppressionChecks
ENDIF
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
SWITCH currchar
CASE CHAR_FRANKLIN
CASE CHAR_MICHAEL
CASE CHAR_TREVOR
// Valid chars, don't suppress.
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " invalid multichar suppress.")
ENDIF
#ENDIF
++iSuppressionVotes // This blip cannot exist if the player is invalid.
BREAK
ENDSWITCH
++iSuppressionChecks
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_BLIP_SETTING_HIDE_IN_EXILE)
IF bInExile
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " invalid multichar suppress.")
ENDIF
#ENDIF
++iSuppressionVotes
ENDIF
++iSuppressionChecks
ENDIF
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_SAVEHOUSE
UPDATE_SAFEHOUSE_BLIPS_DISPLAYING()
ENDIF
ENDIF
IF (iSuppressionChecks > 0)
IF iSuppressionVotes > 0
CLEAR_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVE)
ELSE
// Check its not only now becoming unsuppressed.
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVATED_EXTERNALLY)
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " no longer suppressed.")
ENDIF
#ENDIF
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVE)
ENDIF
ENDIF
ELSE
// Nothing wants to suppress this blip at all.
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " has nothing suppressing it this update.")
ENDIF
#ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVATED_EXTERNALLY)
SET_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVE)
ENDIF
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_ACTIVE)
AND IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_VISIBILITY)
BOOL doSaveHouseCheck = FALSE
IF NOT DOES_BLIP_EXIST(g_GameBlips[i].biBlip)
WHILE NOT (GET_NUMBER_OF_ACTIVE_BLIPS() < MINIMAP_MAX_BLIPS) // due to 584048
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CPRINTLN(DEBUG_BLIP,"!!!!!!!!!!!!!\n\nBlip controller is stalled while NOT(GET_NUMBER_OF_ACTIVE_BLIPS() < MINIMAP_MAX_BLIPS), checking again in 2 seconds\n\n!!!!!!!!!!!!!!!")
ENDIF
#ENDIF
WAIT(2000)
ENDWHILE
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
SWITCH currchar
CASE CHAR_FRANKLIN
CASE CHAR_MICHAEL
CASE CHAR_TREVOR
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG1LN(DEBUG_BLIP, "Blip ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " created for ", GET_CHARSHEET_DISPLAY_STRING_FROM_CHARSHEET(currchar), " at ", g_GameBlips[i].vCoords[currchar],".")
ENDIF
#ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_AREA_BLIP)
g_GameBlips[i].biBlip = ADD_BLIP_FOR_RADIUS(g_GameBlips[i].vCoords[0], g_GameBlips[i].fRadius)
SET_BLIP_ALPHA(g_GameBlips[i].biBlip , 128)
SHOW_HEIGHT_ON_BLIP(g_GameBlips[i].biBlip , FALSE)
ELSE
g_GameBlips[i].biBlip = ADD_BLIP_FOR_COORD(g_GameBlips[i].vCoords[currchar])
SET_BLIP_SPRITE(g_GameBlips[i].biBlip, g_GameBlips[i].eSprite[currchar])
ENDIF
BREAK
DEFAULT
SCRIPT_ASSERT("Multichar blip didn't find a legal player char!")
g_GameBlips[i].biBlip = ADD_BLIP_FOR_COORD(<<1,2,3>>)
BREAK
ENDSWITCH
ELSE
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_AREA_BLIP)
g_GameBlips[i].biBlip = ADD_BLIP_FOR_RADIUS(g_GameBlips[i].vCoords[0], g_GameBlips[i].fRadius)
SET_BLIP_ALPHA(g_GameBlips[i].biBlip, 128)
SHOW_HEIGHT_ON_BLIP(g_GameBlips[i].biBlip , FALSE)
ELSE
g_GameBlips[i].biBlip = ADD_BLIP_FOR_COORD(g_GameBlips[i].vCoords[0])
SET_BLIP_SPRITE(g_GameBlips[i].biBlip, g_GameBlips[i].eSprite[0])
// Rob - 2118989 - display dollar sign indicator on business properties for sale
/*
IF g_GameBlips[i].eSprite[0] = RADAR_TRACE_BUSINESS
SHOW_FOR_SALE_ICON_ON_BLIP(g_GameBlips[i].biBlip, FALSE)
ELIF g_GameBlips[i].eSprite[0] = RADAR_TRACE_BUSINESS_FOR_SALE
SHOW_FOR_SALE_ICON_ON_BLIP(g_GameBlips[i].biBlip, TRUE)
ENDIF
*/
ENDIF
ENDIF
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_SAVEHOUSE
doSaveHouseCheck = TRUE
ENDIF
// Do blip settings post creation.
ELSE
// Otherwise make sure the position is correct anyway
IF IS_BIT_SET(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
SWITCH currchar
CASE CHAR_FRANKLIN
CASE CHAR_MICHAEL
CASE CHAR_TREVOR
SET_BLIP_COORDS(g_GameBlips[i].biBlip, g_GameBlips[i].vCoords[currchar])
CPRINTLN(DEBUG_BLIP,"blip_controller: Setting multicoord position ", currchar, "for blip ",DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i))
BREAK
DEFAULT
SCRIPT_ASSERT("Multichar blip position set didn't find a legal player char!")
BREAK
ENDSWITCH
ELSE
SET_BLIP_COORDS(g_GameBlips[i].biBlip, g_GameBlips[i].vCoords[0])
ENDIF
IF IS_BIT_SET(g_GameBlips[i].iSetting, STATIC_BLIP_SETTING_WILL_FLASH_ON_NEXT_ACTIVE)
IF bFlashAlt
SET_BLIP_FLASHES(g_GameBlips[i].biBlip,TRUE )
bFlashAlt = FALSE
ELSE
SET_BLIP_FLASHES_ALTERNATE(g_GameBlips[i].biBlip,TRUE)
bFlashAlt = TRUE
ENDIF
SET_BLIP_FLASH_TIMER(g_GameBlips[i].biBlip,10000)
CLEAR_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_WILL_FLASH_ON_NEXT_ACTIVE)
ELSE
SET_BLIP_FLASHES(g_GameBlips[i].biBlip,FALSE )
ENDIF
ENDIF
CONFIGURE_STATIC_BLIP(g_GameBlips[i].biBlip,i)
IF doSaveHouseCheck
SAVEHOUSE_BLIP_CREATED(i)
ENDIF
++Changed
ELSE
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " attempting remove.")
ENDIF
#ENDIF
IF DOES_BLIP_EXIST(g_GameBlips[i].biBlip)
// Remove it
#IF IS_DEBUG_BUILD
IF !g_bSuppressBlipDebug
CDEBUG3LN(DEBUG_BLIP, "Blip status ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(i), " removed.")
ENDIF
#ENDIF
REMOVE_BLIP(g_GameBlips[i].biBlip)
++Changed
IF g_GameBlips[i].eCategory = STATIC_BLIP_CATEGORY_SAVEHOUSE
SAVEHOUSE_BLIP_REMOVED(i)
ENDIF
ENDIF
g_GameBlips[i].biBlip = NULL
ENDIF
ENDIF
CLEAR_BIT(g_GameBlips[i].iSetting,STATIC_BLIP_SETTING_STATUS_CHANGED)
INT doUpdate = 30
IF IS_SCREEN_FADED_OUT()
doUpdate = 250
ENDIF
IF Changed > doUpdate // increased to 33 for 1400251
WAIT(0)
Changed = 0
ENDIF
IF Updated / 20 > iUpdateLimiter
iUpdateLimiter = Updated / 20
CDEBUG2LN(debug_blip,"Delaying due to updates ", Updated, " limiter ",iUpdateLimiter)
WAIT(0)
ENDIF
ENDREPEAT
ENDIF
// If there was an update mid update, then do another run through to make sure the list is settled
#IF IS_DEBUG_BUILD
IF g_bBlipChangeDuringUpdate
CPRINTLN(DEBUG_BLIP,"Blip controller: change detected during update. Continuing to update blips")
ENDIF
#ENDIF
g_bBlipSystemRefreshDetector = g_bBlipChangeDuringUpdate
g_bBlipChangeDuringUpdate = FALSE
IF Updated = 0
DO_SAVEHOUSE_BLIP_PROXIMITY_CHECK()
// Handle turning Chop's blip on and off.
DO_CHOP_SAFEHOUSE_BLIP_CHECK()
WAIT(500)
#IF IS_DEBUG_BUILD
WHILE g_flowUnsaved.bUpdatingGameflow
CDEBUG1LN(DEBUG_BLIP, "blip_controller hibernating for 250 ms while g_flowUnsaved.bUpdatingGameflow = true")
WAIT(250)
ENDWHILE
#ENDIF
currchar = GET_CURRENT_PLAYER_PED_ENUM() // Make sure current character is still correct.
ENDIF
ENDWHILE
ENDSCRIPT