// ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // 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