//╒═════════════════════════════════════════════════════════════════════════════╕ //│ Author: Adam Westwood Date: 22/01/14 │ //╞═════════════════════════════════════════════════════════════════════════════╡ //│ │ //│ Heist Bags │ //│ │ //│ Controls minigame and determines the fullness level of a heist bag │ //| │ //│ │ //╘═════════════════════════════════════════════════════════════════════════════╛ //if u use the original prop_gold_trolly_full. //I have added: //Prop_Gold_Trolly_Half_Full //Prop_Gold_Trolly_Empty // //and if u use the original PROP_CASH_CRATE_01 //I have added: //Prop_Cash_Crate_Half_full //Prop_Cash_Crate_Empty // //assetes added for next build // //CJ USING "timer_public.sch" USING "rage_builtins.sch" USING "globals.sch" USING "commands_audio.sch" USING "commands_camera.sch" USING "commands_clock.sch" USING "commands_debug.sch" USING "commands_fire.sch" USING "commands_graphics.sch" USING "commands_hud.sch" USING "commands_misc.sch" USING "commands_object.sch" USING "commands_pad.sch" USING "commands_ped.sch" USING "commands_player.sch" USING "commands_script.sch" USING "commands_streaming.sch" USING "commands_task.sch" USING "commands_vehicle.sch" USING "commands_interiors.sch" USING "net_include.sch" USING "model_enums.sch" USING "script_player.sch" USING "script_misc.sch" USING "selector_public.sch" USING "timer_public.sch" USING "LineActivation.sch" #IF IS_DEBUG_BUILD USING "shared_debug.sch" USING "script_debug.sch" #ENDIF CONST_INT CASH_GRAB_BS_CASH_BAGGED 0 CONST_INT CASH_GRAB_BS_BAG_REMOVED 1 CONST_INT CASH_GRAB_BS_GRAB_ANIM_STOPPED 2 CONST_INT CASH_GRAB_BS_MINIGAME_COMPLETED 3 CONST_INT CASH_GRAB_BS_ANIM_EVENTS_STARTED 4 CONST_INT CASH_GRAB_BS_USE_HIGH_HEELS_ANIMS 5 CONST_INT CASH_GRAB_BS_WALK_TASK_GIVEN_EARLY 6 CONST_INT CASH_GRAB_BS_SKIP_WALK_AND_DO_INTRO 7 CONST_INT CASH_GRAB_BS_BAG_PROP_LOCALLY_VISIBLE 8 ENUM HEIST_BAG_STATE HBS_NONE, HBS_DUFFLE_BAG_EMPTY, HBS_DUFFLE_BAG_FULL, HBS_DUFFLE_BAG_EMPTY_FOR_BODY_ARMOUR, HBS_DUFFLE_BAG_FULL_FOR_BODY_ARMOUR, HBS_SPORTS_BAG_EMPTY, HBS_SPORTS_BAG_FULL, HBS_SPORTS_BAG_EMPTY_FOR_BODY_ARMOUR, HBS_SPORTS_BAG_FULL_FOR_BODY_ARMOUR ENDENUM ENUM HEIST_BAG_GRAB_STATE HBGS_NONE, HBGS_APPROACH, HBGS_INTRO_ANIM, HBGS_IDLE_ANIM, HBGS_GRAB_ANIM, HBGS_EXIT_ANIM ENDENUM ENUM HEIST_BAG_TYPE HBT_DUFFLE_BAG, HBT_SPORTS_BAG ENDENUM ENUM CASH_TYPE CT_GOLD, CT_PAPER ENDENUM ENUM GRAB_DIFFICULTY GD_EASY, GD_MEDIUM, GD_HARD ENDENUM STRUCT PLAYER_HEIST_BAG HEIST_BAG_STATE e_heist_bag_state = HBS_NONE FLOAT fAmountInBag ENDSTRUCT STRUCT S_CASH_GRAB_DATA HEIST_BAG_GRAB_STATE eState GRAB_DIFFICULTY eDifficulty CAMERA_INDEX cameraIndex INT iCashGrabOngoingInteractionIndex = -1 INT iGrabAmount INT iBonusCashPiles INT iTotalCashPiles INT iBonusCashPilesGrabbed INT iPlayerSceneID INT iTrolleySceneID INT iBaseCashPileValue INT iBonusCashPileValue INT iBitSet FLOAT fGrabPhase FLOAT fGrabSpeed FLOAT fMaxGrabSpeed VECTOR vCamStartPos VECTOR vCamPointPos FLOAT fCamRotOffset FLOAT fDesiredCamRotOffset FLOAT fCamHeightOffset FLOAT fDesiredCamHeightOffset FLOAT fMissionDifficultyModifier STRING sBagAnimDict ENDSTRUCT #IF IS_DEBUG_BUILD DEBUGONLY FUNC STRING GET_HEIST_BAG_GRAB_STATE(S_CASH_GRAB_DATA &data) SWITCH data.eState CASE HBGS_NONE RETURN "HBGS_NONE" BREAK CASE HBGS_APPROACH RETURN "HBGS_APPROACH" BREAK CASE HBGS_INTRO_ANIM RETURN "HBGS_INTRO_ANIM" BREAK CASE HBGS_IDLE_ANIM RETURN "HBGS_IDLE_ANIM" BREAK CASE HBGS_GRAB_ANIM RETURN "HBGS_GRAB_ANIM" BREAK CASE HBGS_EXIT_ANIM RETURN "HBGS_EXIT_ANIM" BREAK ENDSWITCH RETURN "" ENDFUNC DEBUGONLY FUNC STRING GET_HEIST_BAG_GRAB_DIFFICULTY(S_CASH_GRAB_DATA &data) SWITCH data.eDifficulty CASE GD_EASY RETURN "GD_EASY" BREAK CASE GD_MEDIUM RETURN "GD_MEDIUM" BREAK CASE GD_HARD RETURN "GD_HARD" BREAK ENDSWITCH RETURN "" ENDFUNC #ENDIF FUNC BOOL IS_CASH_TROLLEY(MODEL_NAMES mnToCheck) RETURN mnToCheck = HEI_PROP_HEI_CASH_TROLLY_01 OR mnToCheck = CH_PROP_CASH_LOW_TROLLY_01A OR mnToCheck = CH_PROP_CH_CASH_TROLLY_01A OR mnToCheck = CH_PROP_CH_CASH_TROLLY_01B OR mnToCheck = CH_PROP_CH_CASH_TROLLY_01C OR mnToCheck = CH_PROP_CASH_LOW_TROLLY_01B OR mnToCheck = CH_PROP_CASH_LOW_TROLLY_01C ENDFUNC FUNC BOOL IS_LOW_CASH_TROLLEY(MODEL_NAMES mnToCheck) RETURN mnToCheck = CH_PROP_CASH_LOW_TROLLY_01A OR mnToCheck = CH_PROP_CASH_LOW_TROLLY_01B OR mnToCheck = CH_PROP_CASH_LOW_TROLLY_01C ENDFUNC FUNC BOOL IS_DIAMOND_TROLLEY(MODEL_NAMES mnToCheck) RETURN mnToCheck = CH_PROP_DIAMOND_TROLLY_01A OR mnToCheck = CH_PROP_DIAMOND_TROLLY_01B OR mnToCheck = CH_PROP_DIAMOND_TROLLY_01C ENDFUNC FUNC BOOL IS_GOLD_TROLLEY(MODEL_NAMES mnToCheck) RETURN mnToCheck = PROP_GOLD_TROLLY_FULL OR mnToCheck = CH_PROP_GOLD_TROLLY_01A OR mnToCheck = CH_PROP_GOLD_TROLLY_01B OR mnToCheck = CH_PROP_GOLD_TROLLY_01C ENDFUNC FUNC BOOL IS_COKE_TROLLEY(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) ENDFUNC FUNC BOOL IS_PAINTING(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01a")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01b")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01c")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01d")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01e")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01f")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01g")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01h")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01i")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("CH_prop_vault_painting_01j")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01a")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01b")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01c")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01d")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01e")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01f")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01g")) OR mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Painting_01h")) ENDFUNC FUNC BOOL IS_CASH_PILE(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Cash_Stack_01a")) ENDFUNC FUNC BOOL IS_COKE_PILE(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Coke_Stack_01a")) ENDFUNC FUNC BOOL IS_WEED_PILE(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Weed_Stack_01a")) ENDFUNC FUNC BOOL IS_GOLD_PILE(MODEL_NAMES mnToCheck) RETURN mnToCheck = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Gold_Stack_01a")) ENDFUNC FUNC BOOL IS_LOOT_PILE(MODEL_NAMES mnToCheck) RETURN IS_CASH_PILE(mnToCheck) OR IS_COKE_PILE(mnToCheck) OR IS_WEED_PILE(mnToCheck) ENDFUNC FUNC BOOL IS_GRAB_PILE(MODEL_NAMES mnToCheck) RETURN IS_LOOT_PILE(mnToCheck) OR IS_GOLD_PILE(mnToCheck) ENDFUNC /// PURPOSE: /// Get the name of the animation dictionary for heist bag minigame depending on the mission prop's model. /// PARAMS: /// tempObj - Mission prop object that the grab minigame animations are played for. /// RETURNS: /// The name of the animation dictionary specific for the mission prop. FUNC STRING GET_HEIST_BAG_MINIGAME_ANIM_DICT(OBJECT_INDEX tempObj, BOOL bUseHighHeelsAnims) IF DOES_ENTITY_EXIST(tempObj) MODEL_NAMES mnObj = GET_ENTITY_MODEL(tempObj) IF GET_ENTITY_MODEL(tempObj) = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) OR IS_DIAMOND_TROLLEY(mnObj) OR IS_CASH_TROLLEY(mnObj) OR IS_GOLD_TROLLEY(mnObj) IF bUseHighHeelsAnims RETURN "anim@heists@ornate_bank@grab_cash_heels" ELSE RETURN "anim@heists@ornate_bank@grab_cash" ENDIF ENDIF IF IS_PAINTING(mnObj) RETURN "ANIM_HEIST@HS3F@IG11_STEAL_PAINTING@MALE@" ENDIF IF IS_LOOT_PILE(mnObj) IF bUseHighHeelsAnims RETURN "ANIM@SCRIPTED@PLAYER@MISSION@TUN_TABLE_GRAB@CASH@HEELED@" ELSE RETURN "ANIM@SCRIPTED@PLAYER@MISSION@TUN_TABLE_GRAB@CASH@" ENDIF ENDIF IF IS_GOLD_PILE(mnObj) IF bUseHighHeelsAnims RETURN "ANIM@SCRIPTED@PLAYER@MISSION@TUN_TABLE_GRAB@GOLD@HEELED@" ELSE RETURN "ANIM@SCRIPTED@PLAYER@MISSION@TUN_TABLE_GRAB@GOLD@" ENDIF ENDIF SWITCH mnObj CASE HEI_PROP_HEI_CASH_TROLLY_01 IF bUseHighHeelsAnims RETURN "anim@heists@ornate_bank@grab_cash_heels" ELSE RETURN "anim@heists@ornate_bank@grab_cash" ENDIF BREAK CASE PROP_GOLD_TROLLY_FULL RETURN "anim@heists@ornate_bank@ig_4_grab_gold" BREAK DEFAULT RETURN "anim@heists@money_grab@duffel" BREAK ENDSWITCH ENDIF RETURN "" ENDFUNC PROC REQUEST_HEIST_BAG_ASSETS(MODEL_NAMES mnBag = HEI_P_M_BAG_VAR22_ARM_S) REQUEST_MODEL(mnBag) ENDPROC /// PURPOSE: /// Checks if heist bag assets have loaded. /// RETURNS: /// Returns true if heist bag assets have loaded, false otherwise. FUNC BOOL HAVE_HEIST_BAG_ASSETS_LOADED(MODEL_NAMES mnBag = HEI_P_M_BAG_VAR22_ARM_S) RETURN HAS_MODEL_LOADED(mnBag) ENDFUNC /// PURPOSE: /// Request audio bank for heist bag minigame depending on the mission prop's model. /// PARAMS: /// tempObj - Mission prop object that the grab minigame uses. PROC REQUEST_HEIST_BAG_MINIGAME_AUDIO_BANK(OBJECT_INDEX tempObj) IF IS_PAINTING(GET_ENTITY_MODEL(tempObj)) EXIT ENDIF IF DOES_ENTITY_EXIST(tempObj) SWITCH GET_ENTITY_MODEL(tempObj) CASE HEI_PROP_HEI_CASH_TROLLY_01 // don't request any audio bank BREAK CASE PROP_GOLD_TROLLY_FULL REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_STASH_SWAG") BREAK DEFAULT REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_STASH_SWAG") BREAK ENDSWITCH ENDIF ENDPROC PROC RELEASE_HEIST_BAG_MINIGAME_AUDIO_BANK() RELEASE_NAMED_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_STASH_SWAG") PRINTLN("RELEASE_HEIST_BAG_MINIGAME_AUDIO_BANK - Releasing audio bank") ENDPROC FUNC BOOL HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(OBJECT_INDEX tempObj) IF DOES_ENTITY_EXIST(tempObj) SWITCH GET_ENTITY_MODEL(tempObj) CASE HEI_PROP_HEI_CASH_TROLLY_01 RETURN TRUE BREAK CASE PROP_GOLD_TROLLY_FULL RETURN REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_STASH_SWAG") BREAK DEFAULT RETURN REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_STASH_SWAG") BREAK ENDSWITCH IF GET_ENTITY_MODEL(tempObj) = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC REQUEST_HEIST_BAG_MINIGAME_ASSETS(OBJECT_INDEX tempObj, BOOL bUseHighHeelsAnims, MODEL_NAMES mnBag = HEI_P_M_BAG_VAR22_ARM_S) //request models REQUEST_MODEL(mnBag) MODEL_NAMES mnObj = GET_ENTITY_MODEL(tempObj) IF mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) OR mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Coke_Stack_01a")) REQUEST_MODEL(INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_pile"))) ELIF IS_DIAMOND_TROLLEY(mnObj) REQUEST_MODEL(ch_Prop_Vault_Dimaondbox_01a) ELIF IS_GOLD_TROLLEY(mnObj) OR mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Gold_Stack_01a")) REQUEST_MODEL(CH_PROP_GOLD_BAR_01A) ELIF mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Weed_Stack_01a")) REQUEST_MODEL(hei_prop_heist_weed_block_01b) ELSE REQUEST_MODEL(HEI_PROP_HEIST_CASH_PILE) ENDIF //request animation dictionaries REQUEST_ANIM_DICT(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) //request audio banks REQUEST_HEIST_BAG_MINIGAME_AUDIO_BANK(tempObj) ENDPROC FUNC BOOL HAVE_HEIST_BAG_MINIGAME_ASSETS_LOADED(OBJECT_INDEX tempObj, BOOL bUseHighHeelsAnims, MODEL_NAMES mnBag = HEI_P_M_BAG_VAR22_ARM_S) MODEL_NAMES mnObj = GET_ENTITY_MODEL(tempObj) IF mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) OR mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Coke_Stack_01a")) IF HAS_MODEL_LOADED(mnBag) AND HAS_MODEL_LOADED(INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_pile"))) AND HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(tempObj) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RETURN TRUE ENDIF ELIF IS_DIAMOND_TROLLEY(mnObj) IF HAS_MODEL_LOADED(mnBag) AND HAS_MODEL_LOADED(INT_TO_ENUM(MODEL_NAMES, HASH("ch_Prop_Vault_Dimaondbox_01a"))) AND HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(tempObj) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RETURN TRUE ENDIF ELIF IS_GOLD_TROLLEY(mnObj) OR mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Gold_Stack_01a")) IF HAS_MODEL_LOADED(mnBag) AND HAS_MODEL_LOADED(CH_PROP_GOLD_BAR_01A) AND HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(tempObj) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RETURN TRUE ENDIF ELIF IS_PAINTING(mnObj) IF HAS_MODEL_LOADED(mnBag) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) PRINTLN("[ML] Bag and anim dict for bag loaded") RETURN TRUE ENDIF ELIF mnObj = INT_TO_ENUM(MODEL_NAMES, HASH("h4_Prop_h4_Weed_Stack_01a")) IF HAS_MODEL_LOADED(mnBag) AND HAS_MODEL_LOADED(hei_prop_heist_weed_block_01b) AND HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(tempObj) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RETURN TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBag) AND HAS_MODEL_LOADED(HEI_PROP_HEIST_CASH_PILE) AND HAS_HEIST_BAG_MINIGAME_AUDIO_BANK_LOADED(tempObj) AND HAS_ANIM_DICT_LOADED(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC CLEANUP_HEIST_BAG_MINIGAME_ASSETS(OBJECT_INDEX tempObj, BOOL bUseHighHeelsAnims, MODEL_NAMES mnBag = HEI_P_M_BAG_VAR22_ARM_S) //remove models SET_MODEL_AS_NO_LONGER_NEEDED(mnBag) IF GET_ENTITY_MODEL(tempObj) = INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_trolly")) SET_MODEL_AS_NO_LONGER_NEEDED(INT_TO_ENUM(MODEL_NAMES, HASH("imp_prop_impexp_coke_pile"))) ELIF IS_DIAMOND_TROLLEY(GET_ENTITY_MODEL(tempObj)) SET_MODEL_AS_NO_LONGER_NEEDED(INT_TO_ENUM(MODEL_NAMES, HASH("ch_Prop_Vault_Dimaondbox_01a"))) ELIF IS_GOLD_TROLLEY(GET_ENTITY_MODEL(tempObj)) SET_MODEL_AS_NO_LONGER_NEEDED(CH_PROP_GOLD_BAR_01A) ELSE SET_MODEL_AS_NO_LONGER_NEEDED(HEI_PROP_HEIST_CASH_PILE) ENDIF //request animation dictionaries REMOVE_ANIM_DICT(GET_HEIST_BAG_MINIGAME_ANIM_DICT(tempObj, bUseHighHeelsAnims)) RELEASE_HEIST_BAG_MINIGAME_AUDIO_BANK() ENDPROC FUNC BOOL IS_PED_PLAYING_ANY_CASH_GRAB_ANIM(PED_INDEX PedIndex) IF NOT IS_PED_INJURED(PedIndex) IF IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash", "intro") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash", "grab_idle") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash", "grab") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash", "exit") //high heels version of anims OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash_heels", "intro") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash_heels", "grab_idle") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash_heels", "grab") OR IS_ENTITY_PLAYING_ANIM(PedIndex, "anim@heists@ornate_bank@grab_cash_heels", "exit") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC RESET_CASH_GRAB_MINIGAME_DATA(S_CASH_GRAB_DATA &data) data.fGrabSpeed = 1.0 data.fMaxGrabSpeed = 1.0 data.eState = HBGS_NONE data.iCashGrabOngoingInteractionIndex = -1 CLEAR_BIT(data.iBitSet, CASH_GRAB_BS_MINIGAME_COMPLETED) CLEAR_BIT(data.iBitSet, CASH_GRAB_BS_USE_HIGH_HEELS_ANIMS) ENDPROC PROC RESET_CASH_GRAB_SPEED(S_CASH_GRAB_DATA &data) data.fGrabSpeed = 1.0 data.fMaxGrabSpeed = 1.0 ENDPROC PROC CONVERGE_VALUE(FLOAT &fCurrentValue, FLOAT fDesiredValue, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE) IF fCurrentValue != fDesiredValue FLOAT fConvergeAmountThisFrame = fAmountToConverge IF bAdjustForFramerate fConvergeAmountThisFrame = 0.0 +@ (fAmountToConverge * 30.0) ENDIF IF fCurrentValue - fDesiredValue > fConvergeAmountThisFrame fCurrentValue -= fConvergeAmountThisFrame ELIF fCurrentValue - fDesiredValue < -fConvergeAmountThisFrame fCurrentValue += fConvergeAmountThisFrame ELSE fCurrentValue = fDesiredValue ENDIF ENDIF ENDPROC PROC UPDATE_CASH_GRAB_SPEED(S_CASH_GRAB_DATA &data, FLOAT fMinSpeed = 0.75, FLOAT fMaxSpeed = 1.50) //increase the max speed when player presses the button IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) SWITCH data.eDifficulty CASE GD_EASY data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.100) , fMinSpeed, fMaxSpeed) BREAK CASE GD_MEDIUM data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.090) , fMinSpeed, fMaxSpeed) BREAK CASE GD_HARD data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.080) , fMinSpeed, fMaxSpeed) BREAK ENDSWITCH ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) SWITCH data.eDifficulty CASE GD_EASY data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.100) , fMinSpeed, fMaxSpeed) BREAK CASE GD_MEDIUM data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.090) , fMinSpeed, fMaxSpeed) BREAK CASE GD_HARD data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed +(0.080) , fMinSpeed, fMaxSpeed) BREAK ENDSWITCH ENDIF ENDIF //make the max speed always decrease and clamp it between min and max speed values SWITCH data.eDifficulty CASE GD_EASY data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed -@(0.010 * 30) , fMinSpeed, fMaxSpeed) BREAK CASE GD_MEDIUM data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed -@(0.0125 * 30) , fMinSpeed, fMaxSpeed) BREAK CASE GD_HARD data.fMaxGrabSpeed = CLAMP(data.fMaxGrabSpeed -@(0.0135 * 30) , fMinSpeed, fMaxSpeed) BREAK ENDSWITCH //make the current speed achieve the max speed CONVERGE_VALUE(data.fGrabSpeed , data.fMaxGrabSpeed , 0.02, TRUE) //clamp the current speed between min and max speed values data.fGrabSpeed = CLAMP(data.fGrabSpeed , fMinSpeed, fMaxSpeed) ENDPROC FUNC STRING GET_ANIM_EVENT_NAME_FROM_INT(INT iValue) STRING sAnimEventName SWITCH iValue CASE 1 sAnimEventName = "one" BREAK CASE 2 sAnimEventName = "two" BREAK CASE 3 sAnimEventName = "three" BREAK CASE 4 sAnimEventName = "four" BREAK CASE 5 sAnimEventName = "five" BREAK CASE 6 sAnimEventName = "six" BREAK CASE 7 sAnimEventName = "seven" BREAK CASE 8 sAnimEventName = "eight" BREAK CASE 9 sAnimEventName = "nine" BREAK CASE 10 sAnimEventName = "ten" BREAK CASE 11 sAnimEventName = "eleven" BREAK CASE 12 sAnimEventName = "tweleve" BREAK CASE 13 sAnimEventName = "thirteen" BREAK CASE 14 sAnimEventName = "fourteen" BREAK CASE 15 sAnimEventName = "fifteen" BREAK CASE 16 sAnimEventName = "sixteen" BREAK CASE 17 sAnimEventName = "seventeen" BREAK CASE 18 sAnimEventName = "eighteen" BREAK CASE 19 sAnimEventName = "nineteen" BREAK CASE 20 sAnimEventName = "twenty" BREAK CASE 21 sAnimEventName = "twentyone" BREAK CASE 22 sAnimEventName = "twentytwo" BREAK CASE 23 sAnimEventName = "twentythree" BREAK CASE 24 sAnimEventName = "twentyfour" BREAK CASE 25 sAnimEventName = "twentyfive" BREAK CASE 26 sAnimEventName = "twentysix" BREAK CASE 27 sAnimEventName = "twentyseven" BREAK CASE 28 sAnimEventName = "twentyeight" BREAK CASE 29 sAnimEventName = "twentynine" BREAK CASE 30 sAnimEventName = "thirty" BREAK CASE 31 sAnimEventName = "thirtyone" BREAK CASE 32 sAnimEventName = "thirtytwo" BREAK CASE 33 sAnimEventName = "thirtythree" BREAK CASE 34 sAnimEventName = "thirtyfour" BREAK CASE 35 sAnimEventName = "thirtyfive" BREAK CASE 36 sAnimEventName = "thirtysix" BREAK CASE 37 sAnimEventName = "thirtyseven" BREAK CASE 38 sAnimEventName = "thirtyeight" BREAK CASE 39 sAnimEventName = "thirtynine" BREAK CASE 40 sAnimEventName = "forty" BREAK CASE 41 sAnimEventName = "fortyone" BREAK CASE 42 sAnimEventName = "fortytwo" BREAK CASE 43 sAnimEventName = "fortythree" BREAK CASE 44 sAnimEventName = "fortyfour" BREAK CASE 45 sAnimEventName = "fortyfive" BREAK ENDSWITCH RETURN sAnimEventName ENDFUNC FUNC FLOAT GET_ANIMATION_RESUMPTION_PHASE_FROM_INT(INT iValue) FLOAT fResumePhase SWITCH iValue CASE 1 fResumePhase = 0.022253 BREAK CASE 2 fResumePhase = 0.043811 BREAK CASE 3 fResumePhase = 0.061196 BREAK CASE 4 fResumePhase = 0.084145 BREAK CASE 5 fResumePhase = 0.102225 BREAK CASE 6 fResumePhase = 0.118915 BREAK CASE 7 fResumePhase = 0.138387 BREAK CASE 8 fResumePhase = 0.156467 BREAK CASE 9 fResumePhase = 0.182197 BREAK CASE 10 fResumePhase = 0.202364 BREAK CASE 11 fResumePhase = 0.226704 BREAK CASE 12 fResumePhase = 0.249652 BREAK CASE 13 fResumePhase = 0.270515 BREAK CASE 14 fResumePhase = 0.292768 BREAK CASE 15 fResumePhase = 0.315021 BREAK CASE 16 fResumePhase = 0.342142 BREAK CASE 17 fResumePhase = 0.363700 BREAK CASE 18 fResumePhase = 0.385257 BREAK CASE 19 fResumePhase = 0.406120 BREAK CASE 20 fResumePhase = 0.426287 BREAK CASE 21 fResumePhase = 0.454798 BREAK CASE 22 fResumePhase = 0.476356 BREAK CASE 23 fResumePhase = 0.503477 BREAK CASE 24 fResumePhase = 0.524339 BREAK CASE 25 fResumePhase = 0.541725 BREAK CASE 26 fResumePhase = 0.565369 BREAK CASE 27 fResumePhase = 0.586926 BREAK CASE 28 fResumePhase = 0.611961 BREAK CASE 29 fResumePhase = 0.634910 BREAK CASE 30 fResumePhase = 0.655772 BREAK CASE 31 fResumePhase = 0.678025 BREAK CASE 32 fResumePhase = 0.698192 BREAK CASE 33 fResumePhase = 0.719750 BREAK CASE 34 fResumePhase = 0.738526 BREAK CASE 35 fResumePhase = 0.760779 BREAK CASE 36 fResumePhase = 0.781641 BREAK CASE 37 fResumePhase = 0.812239 BREAK CASE 38 fResumePhase = 0.830320 BREAK CASE 39 fResumePhase = 0.853268 BREAK CASE 40 fResumePhase = 0.886648 BREAK CASE 41 fResumePhase = 0.913769 BREAK CASE 42 fResumePhase = 0.934631 BREAK CASE 43 fResumePhase = 0.953408 BREAK CASE 44 fResumePhase = 0.975661 BREAK CASE 45 fResumePhase = 1.000000 BREAK ENDSWITCH RETURN fResumePhase ENDFUNC //SPECIAL 2 //1,2,3,4,5,6,7,8,9 //no bag - 3,8,9 FUNC BOOL IS_PLAYER_WEARING_VISIBLE_BODY_ARMOUR() PED_COMP_NAME_ENUM ePedComp INT iCompNum IF NOT IS_PED_INJURED(PLAYER_PED_ID()) ePedComp = GET_PED_COMP_ITEM_CURRENT_MP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2) ENDIF iCompNum = ENUM_TO_INT(ePedComp) IF iCompNum = 1 OR iCompNum = 2 OR iCompNum = 4 OR iCompNum = 5 OR iCompNum = 6 OR iCompNum = 7 OR iCompNum = 8 OR iCompNum = 9 RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC INT GET_PLAYER_BAG_TYPE( PED_INDEX playerPed ) PED_COMP_NAME_ENUM ePedComp IF NOT IS_PED_INJURED( playerPed ) ePedComp = GET_PED_COMP_ITEM_CURRENT_MP( playerPed, COMP_TYPE_HAND ) ENDIF RETURN ENUM_TO_INT( ePedComp ) ENDFUNC FUNC BOOL DOES_PLAYER_HAVE_A_BAG( PED_INDEX playerPed ) IF GET_PLAYER_BAG_TYPE( playerPed ) = 9 OR GET_PLAYER_BAG_TYPE( playerPed ) = 10 OR GET_PLAYER_BAG_TYPE( playerPed ) = 11 OR GET_PLAYER_BAG_TYPE( playerPed ) = 12 OR GET_PLAYER_BAG_TYPE( playerPed ) = 13 OR GET_PLAYER_BAG_TYPE( playerPed ) = 14 OR GET_PLAYER_BAG_TYPE( playerPed ) = 15 OR GET_PLAYER_BAG_TYPE( playerPed ) = 16 RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC REMOVE_PLAYER_BAG() //IF DOES_PLAYER_HAVE_A_BAG( PLAYER_PED_ID() ) SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 0, 0) //ENDIF ENDPROC //MP_M_FREEMODE_01 //MP_F_FREEMODE_01 PROC FILL_PLAYERS_HEIST_BAG() //Duffel Bag Empty //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 9, 0) IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 9 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 10, 0) ENDIF //Duffel Bag Empty player with armour //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 11, 0) IF IS_PLAYER_WEARING_VISIBLE_BODY_ARMOUR() IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 11 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 12, 0) ENDIF ENDIF //Sports Bag Empty //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 14, 0) IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 13 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 14, 0) ENDIF //Sports Bag Empty player with armour //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 15, 0) IF IS_PLAYER_WEARING_VISIBLE_BODY_ARMOUR() IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 15 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 16, 0) ENDIF ENDIF ENDPROC PROC GIVE_PLAYER_COMPONENT_BAG() //Sports Bag Empty player with armour //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 15, 0) IF IS_PLAYER_WEARING_VISIBLE_BODY_ARMOUR() SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 16, 0) ELSE SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 14, 0) ENDIF ENDPROC PROC TOGGLE_PLAYER_HEIST_BAG(BOOL bShowBag) IF bShowBag IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 13 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 14, 0) ENDIF //Sports Bag Empty player with armour //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 15, 0) IF IS_PLAYER_WEARING_VISIBLE_BODY_ARMOUR() IF GET_PLAYER_BAG_TYPE( PLAYER_PED_ID() ) = 15 SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 16, 0) ENDIF ENDIF ELSE SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAND, 0, 0) ENDIF ENDPROC FUNC BOOL NEW_CREATE_BAG_OBJECTS(NETWORK_INDEX niThisBagIndex, NETWORK_INDEX niThisStrapIndex) REQUEST_MODEL(P_LD_Heist_Bag_S_1) REQUEST_MODEL(P_CSH_Strap_01_S) IF HAS_MODEL_LOADED(P_LD_Heist_Bag_S_1) AND HAS_MODEL_LOADED(P_CSH_Strap_01_S) IF CAN_REGISTER_MISSION_OBJECTS(2) RESERVE_NETWORK_MISSION_OBJECTS(GET_NUM_RESERVED_MISSION_OBJECTS(FALSE) + 2) IF NOT NETWORK_DOES_NETWORK_ID_EXIST(niThisBagIndex) IF CREATE_NET_OBJ(niThisBagIndex,P_LD_Heist_Bag_S_1,GET_ENTITY_COORDS(PLAYER_PED_ID())) SET_ENTITY_INVINCIBLE(NET_TO_OBJ(niThisBagIndex), TRUE) ENDIF ELSE IF NOT NETWORK_DOES_NETWORK_ID_EXIST(niThisStrapIndex) IF CREATE_NET_OBJ(niThisStrapIndex,P_CSH_Strap_01_S,GET_ENTITY_COORDS(PLAYER_PED_ID())) SET_ENTITY_INVINCIBLE(NET_TO_OBJ(niThisStrapIndex), TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(P_CSH_Strap_01_S) SET_MODEL_AS_NO_LONGER_NEEDED(P_LD_Heist_Bag_S_1) RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC //INT iGrabTimer FUNC BOOL MANAGE_GRAB_TIMER(INT&start_time, INT time) INT current_time current_time = GET_GAME_TIMER() IF ((current_time - start_time) > time) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL MANAGE_THIS_TIMER(INT&start_time, INT time) INT current_time current_time = GET_GAME_TIMER() IF ((current_time - start_time) > time) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// FORCE_QUIT_FAIL_CASH_GRAB_MINIGAME_KEEP_DATA (pass in your own grab data struct) /// NOTES: Force the termination of the hacking minigame and cause the player to fail but preserves variable data. /// PURPOSE: /// Force the termination of the hacking minigame and cause the player to fail. /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No Returns /// PROC FORCE_QUIT_FAIL_CASH_GRAB_MINIGAME_KEEP_DATA(S_CASH_GRAB_DATA &cash_grab_data) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),TRUE) IF IS_MINIGAME_IN_PROGRESS() SET_MINIGAME_IN_PROGRESS(FALSE) ENDIF CLEAR_HELP() SET_PLAYER_CONTROL(PLAYER_ID(),TRUE) DISABLE_CELLPHONE(FALSE) DISABLE_SCRIPT_HUD_THIS_FRAME_RESET() RESET_CASH_GRAB_MINIGAME_DATA(cash_grab_data) ENDPROC PROC FORCE_QUIT_PASS_CASH_GRAB_MINIGAME_KEEP_DATA(S_CASH_GRAB_DATA &cash_grab_data) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),TRUE) IF IS_MINIGAME_IN_PROGRESS() SET_MINIGAME_IN_PROGRESS(FALSE) ENDIF CLEAR_HELP() SET_PLAYER_CONTROL(PLAYER_ID(),TRUE) CLEAR_PED_TASKS(PLAYER_PED_ID()) DISABLE_CELLPHONE(FALSE) DISABLE_SCRIPT_HUD_THIS_FRAME_RESET() RESET_CASH_GRAB_MINIGAME_DATA(cash_grab_data) ENDPROC FUNC BOOL HAS_PLAYER_BEAT_CASH_GRAB(S_CASH_GRAB_DATA &cash_grab_data,BOOL bAndForceQuit = FALSE) IF IS_BIT_SET(cash_grab_data.iBitSet, CASH_GRAB_BS_MINIGAME_COMPLETED) IF bAndForceQuit FORCE_QUIT_PASS_CASH_GRAB_MINIGAME_KEEP_DATA(cash_grab_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PED_ROUGHLY_FACING_THIS_DIRECTION(PED_INDEX ped, FLOAT idealHeading, FLOAT acceptableRange = 30.0) FLOAT upperLimit, lowerLimit upperLimit = idealHeading + (acceptableRange/2) IF upperLimit > 360 upperLimit -= 360.0 ENDIF lowerLimit = idealHeading - (acceptableRange/2) IF lowerLimit < 0 lowerLimit += 360.0 ENDIF IF NOT IS_PED_INJURED(ped) IF upperLimit > lowerLimit IF GET_ENTITY_HEADING(ped) < upperLimit AND GET_ENTITY_HEADING(ped) > lowerLimit RETURN TRUE ELSE RETURN FALSE ENDIF ELSE IF GET_ENTITY_HEADING(ped) < upperLimit OR GET_ENTITY_HEADING(ped) > lowerLimit RETURN TRUE ELSE RETURN FALSE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_GRAB_OBJECT_CASH(OBJECT_INDEX tempGrabObj) IF GET_ENTITY_MODEL(tempGrabObj) = PROP_CASH_CRATE_01 OR GET_ENTITY_MODEL(tempGrabObj) = PROP_CASH_TROLLY OR GET_ENTITY_MODEL(tempGrabObj) = HEI_PROP_HEI_CASH_TROLLY_01 OR GET_ENTITY_MODEL(tempGrabObj) = HEI_PROP_HEI_CASH_TROLLY_02 OR GET_ENTITY_MODEL(tempGrabObj) = HEI_PROP_HEI_CASH_TROLLY_03 OR GET_ENTITY_MODEL(tempGrabObj) = INT_TO_ENUM(MODEL_NAMES, HASH("ch_Prop_Ch_Cash_Trolly_01A")) OR GET_ENTITY_MODEL(tempGrabObj) = INT_TO_ENUM(MODEL_NAMES, HASH("ch_Prop_Ch_Cash_Trolly_01B")) OR GET_ENTITY_MODEL(tempGrabObj) = INT_TO_ENUM(MODEL_NAMES, HASH("ch_Prop_Ch_Cash_Trolly_01C")) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC CLEANUP_CASH_GRAB_SCRIPTED_CAMERA(S_CASH_GRAB_DATA &data) IF DOES_CAM_EXIST(data.cameraIndex) DESTROY_CAM(data.cameraIndex) ENDIF DISPLAY_HUD(TRUE) DISPLAY_RADAR(TRUE) RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDPROC PROC SET_PED_PROOFS_FOR_MINIGAME(PED_INDEX PedIndex) IF NOT IS_FAKE_MULTIPLAYER_MODE_SET() IF NOT IS_PED_INJURED(PedIndex) SET_ENTITY_PROOFS(PedIndex, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE) ENDIF ENDIF ENDPROC PROC CLEAR_PED_PROOFS_FOR_MINIGAME(PED_INDEX PedIndex) IF NOT IS_FAKE_MULTIPLAYER_MODE_SET() IF NOT IS_PED_INJURED(PedIndex) SET_ENTITY_PROOFS(PedIndex, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF ENDIF ENDPROC