//╒═════════════════════════════════════════════════════════════════════════════╕ //│ Author: Ben Rollinson + Luke Austin Date: 12/12/14 │ //╞═════════════════════════════════════════════════════════════════════════════╡ //│ │ //│ Animals Private Header │ //│ │ //│ Useful general functionality for managing playing as an animal. │ //│ │ //╘═════════════════════════════════════════════════════════════════════════════╛ USING "globals.sch" USING "ambient_globals.sch" USING "rage_builtins.sch" USING "commands_pad.sch" USING "commands_player.sch" USING "commands_graphics.sch" USING "commands_misc.sch" USING "commands_camera.sch" USING "commands_hud.sch" USING "commands_audio.sch" USING "commands_event.sch" USING "commands_stats.sch" USING "animals_private.sch" USING "candidate_public.sch" USING "player_ped_public.sch" USING "shop_public.sch" USING "snapshot_private.sch" USING "randomChar_public.sch" USING "cheat_controller_public.sch" USING "vehicle_gen_public.sch" USING "taxi_functions.sch" USING "common_packages.sch" USING "scrap_common.sch" USING "clothes_shop_private.sch" STRUCT AnimalSoundData TEXT_LABEL_63 strBank TEXT_LABEL_31 strSound TEXT_LABEL_15 strBarkBank TEXT_LABEL_63 strBarkSound ENDSTRUCT STRUCT AnimalAnimationData STRING strDict STRING strAnim STRING strCamAnim STRING strIdleDict STRING strIdleAnim TEXT_LABEL_63 strBarkDict TEXT_LABEL_15 strBarkAnim ENDSTRUCT FUNC BOOL Is_Model_A_Playable_Animal(MODEL_NAMES eModel) SWITCH eModel CASE A_C_BOAR CASE A_C_CAT_01 CASE A_C_COW CASE A_C_COYOTE CASE A_C_DEER CASE A_C_HUSKY CASE A_C_MTLION CASE A_C_PIG CASE A_C_POODLE CASE A_C_PUG CASE A_C_RABBIT_01 CASE A_C_RETRIEVER CASE A_C_ROTTWEILER CASE A_C_SHEPHERD CASE A_C_WESTY CASE A_C_CHICKENHAWK CASE A_C_CORMORANT CASE A_C_CROW CASE A_C_HEN CASE A_C_PIGEON CASE A_C_SEAGULL CASE A_C_DOLPHIN CASE A_C_FISH CASE A_C_KILLERWHALE CASE A_C_SHARKHAMMER CASE A_C_SHARKTIGER CASE A_C_STINGRAY CASE IG_ORLEANS RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL Is_Model_A_Flying_Animal(MODEL_NAMES eModel) SWITCH eModel CASE A_C_CHICKENHAWK CASE A_C_CORMORANT CASE A_C_CROW CASE A_C_HEN CASE A_C_PIGEON CASE A_C_SEAGULL RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL Can_Player_Model_Enter_Water(BOOL bOrleans = TRUE) SWITCH GET_PLAYER_MODEL() CASE A_C_DOLPHIN CASE A_C_FISH CASE A_C_KILLERWHALE CASE A_C_SHARKHAMMER CASE A_C_SHARKTIGER CASE A_C_STINGRAY RETURN TRUE CASE IG_ORLEANS RETURN bOrleans BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL Is_Player_Model_Out_Of_Water() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF NOT IS_ENTITY_IN_WATER(PLAYER_PED_ID()) IF Can_Player_Model_Enter_Water(FALSE) //(fish) ped not in water IF g_iAnimalWaterTimer = -1 g_iAnimalWaterTimer = GET_GAME_TIMER() + 3000 ELIF GET_GAME_TIMER() > g_iAnimalWaterTimer RETURN TRUE ENDIF ENDIF ELSE g_iAnimalWaterTimer = -1 ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL Is_Player_Model_Too_Deep_In_Water(INT &crushDepthTimer) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_ENTITY_IN_WATER(PLAYER_PED_ID()) IF NOT Can_Player_Model_Enter_Water() FLOAT fWaterHeight VECTOR vHeadCoords = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0,0,0>>) //Probe from a little above the head height so that if the animal is under water we still get valid results. vHeadCoords.z += 0.75 IF TEST_VERTICAL_PROBE_AGAINST_ALL_WATER(vHeadCoords, SCRIPT_INCLUDE_OBJECT|SCRIPT_INCLUDE_GLASS|SCRIPT_INCLUDE_RIVER, fWaterHeight) = SCRIPT_WATER_TEST_RESULT_WATER CDEBUG2LN(DEBUG_ANIMAL_MODE, "Relative water height to head: ", vHeadCoords.z - fWaterHeight - 0.75, ".") FLOAT limit = -0.32 //B* - 2044883 IF GET_PLAYER_MODEL() = A_C_HEN CDEBUG2LN(DEBUG_ANIMAL_MODE, "We're a hen") limit = -0.24 ENDIF IF (vHeadCoords.z - fWaterHeight - 0.75) < limit RETURN TRUE ENDIF ENDIF ENDIF //B*-2185923, kill sasquatch if too deep VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerPos.z <= -150.0 IF GET_PLAYER_MODEL() = IG_ORLEANS INT health = GET_ENTITY_HEALTH(PLAYER_PED_ID()) IF health < 500 RETURN TRUE ELSE IF GET_GAME_TIMER() > crushDepthTimer+2000 SET_ENTITY_HEALTH(PLAYER_PED_ID(),health-500) crushDepthTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF //B*-2186997, killboxes for small animals in waterfalls IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()),<<-1031.0200, -399.0387, 37.4325>>) < 40.0 IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<-1027.6340, -397.8321, 38.1158>>,<<-1026.0916, -397.0680, 37.5389>>,1.5) RETURN TRUE ENDIF IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<-1033.1865, -400.7195, 38.1248>>,<<-1034.7971, -401.5790, 37.6024>>,1.5) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL Should_Animal_Mode_Exit(INT &crushDepthTimer) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) //Is the player too deep in water when they can't swim? IF Is_Player_Model_Too_Deep_In_Water(crushDepthTimer) CPRINTLN(DEBUG_ANIMAL_MODE, "Exit condition fired. The player is in water and the model has no swim animations.") RETURN TRUE ENDIF //Is the player on land when they can only swim? IF Is_Player_Model_Out_Of_Water() CPRINTLN(DEBUG_ANIMAL_MODE, "Exit condition fired. The player is out of water and the model has no walk animations.") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC Activate_Animal_Restricted_State(MODEL_NAMES eAnimalModel, BOOL bHideHud = TRUE, BOOL shockingEvent = TRUE) CPRINTLN(DEBUG_ANIMAL_MODE, "Activating animal restricted mode.") IF NOT Is_Model_A_Playable_Animal(eAnimalModel) CPRINTLN(DEBUG_ANIMAL_MODE, "Tried to activate restricted animal state for an invalid model.") SCRIPT_ASSERT("Tried to activate restricted animal state for an invalid model. Exiting.") EXIT ENDIF IF bHideHud DISPLAY_RADAR(FALSE) IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) THEFEED_PAUSE() ENDIF ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) REMOVE_PED_HELMET(PLAYER_PED_ID(), FALSE) IF eAnimalModel != IG_ORLEANS SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) REMOVE_PED_HELMET(PLAYER_PED_ID(), FALSE) SET_ENTITY_MAX_HEALTH(PLAYER_PED_ID(), 200) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 200) ELSE SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_PlayerIsWeird, TRUE) SET_PLAYER_MELEE_WEAPON_DAMAGE_MODIFIER(PLAYER_ID(), 100.0) SET_PED_MAX_HEALTH(PLAYER_PED_ID(), 5000) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 5000) ENDIF SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_CanBeArrested, FALSE) IF shockingEvent // Shocking animals. SWITCH eAnimalModel CASE A_C_MTLION CASE A_C_BOAR CASE A_C_COW CASE A_C_COYOTE CASE IG_ORLEANS CPRINTLN(DEBUG_ANIMAL_MODE, "Adding shocking event for animal.") g_iAnimalShockingEvent = ADD_SHOCKING_EVENT_FOR_ENTITY(EVENT_SHOCKING_DANGEROUS_ANIMAL, PLAYER_PED_ID(),0) IF g_iAnimalShockingEvent = 0 CPRINTLN(DEBUG_ANIMAL_MODE, "Failed to add shocking event.") ENDIF BREAK ENDSWITCH ENDIF ENDIF SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE) g_bBlockShopRoberies = TRUE g_bForceNoCableCar = TRUE DISABLE_TAXI_HAILING(TRUE) //stop stunt jumps SET_STUNT_JUMPS_CAN_TRIGGER(FALSE) //calm water WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(0) WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(0) WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(0) WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(0) WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(0) WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(0) WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(0) WATER_OVERRIDE_SET_RIPPLEBUMPINESS(0) WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(0) WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(0) WATER_OVERRIDE_SET_RIPPLEDISTURB(0) WATER_OVERRIDE_SET_STRENGTH(0.1) //Disable all non-humanoid cheats IF eAnimalModel != IG_ORLEANS DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, TRUE) DISABLE_CHEAT(CHEAT_TYPE_SLIDEY_CARS, TRUE) DISABLE_CHEAT(CHEAT_TYPE_FAST_RUN, TRUE) DISABLE_CHEAT(CHEAT_TYPE_FAST_SWIM, TRUE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, TRUE) DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, TRUE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_HEALTH_ARMOR, TRUE) DISABLE_CHEAT(CHEAT_TYPE_SPECIAL_ABILITY_RECHARGE, TRUE) DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE) DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_PARACHUTE, TRUE) DISABLE_CHEAT(CHEAT_TYPE_BANG_BANG, TRUE) DISABLE_CHEAT(CHEAT_TYPE_FLAMING_BULLETS, TRUE) DISABLE_CHEAT(CHEAT_TYPE_EXPLOSIVE_MELEE, TRUE) DISABLE_CHEAT(CHEAT_TYPE_0_GRAVITY, TRUE) DISABLE_CHEAT(CHEAT_TYPE_INVINCIBILITY, TRUE) DISABLE_CHEAT(CHEAT_TYPE_SLOWMO, TRUE) DISABLE_CHEAT(CHEAT_TYPE_SKYFALL, TRUE) DISABLE_CHEAT(CHEAT_TYPE_DRUNK, TRUE) DISABLE_CHEAT(CHEAT_TYPE_AIM_SLOWMO, TRUE) DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, TRUE) ENDIF ALLOW_DIALOGUE_IN_WATER(TRUE) //Added by Steve T. for TRC bug 2463721 - We can't accept invites whilst an animal as we have no phone access. CPRINTLN(DEBUG_ANIMAL_MODE, "Blocked network invites after transitioning into animal form.") NETWORK_BLOCK_INVITES(TRUE) ENDPROC PROC Manage_Wanted_Level(int &wantedTimer) IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 1 IF wantedTimer = -1 wantedTimer = GET_GAME_TIMER() ELIF GET_GAME_TIMER() > wantedTimer + 20000 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) wantedTimer = -1 ENDIF ELSE wantedTimer = -1 ENDIF ENDPROC PROC Update_Animal_Restricted_State(MODEL_NAMES eAnimalModel, INT &wantedTimer, BOOL bHideHud = TRUE) Manage_Wanted_Level(wantedTimer) IF NOT Is_Model_A_Playable_Animal(eAnimalModel) CPRINTLN(DEBUG_ANIMAL_MODE, "Tried to update restricted animal state for an invalid model.") SCRIPT_ASSERT("Tried to update restricted animal state for an invalid model. Exiting.") EXIT ENDIF IF bHideHud IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) THEFEED_HIDE_THIS_FRAME() ENDIF HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableSecondaryAnimationTasks, TRUE) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, TRUE) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableDropDowns, TRUE) ENDIF //Flying animals use the jump input to land. IF (NOT Is_Model_A_Flying_Animal(eAnimalModel) OR eAnimalModel = A_C_HEN) AND eAnimalModel != IG_ORLEANS DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) ENDIF IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL) ENDIF DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_INTERACTION_MENU) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PHONE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ARREST) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK) //Sasquatch ignores these blocks. IF eAnimalModel != IG_ORLEANS DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ACCURATE_AIM) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DIVE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_THROW_GRENADE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CINEMATIC_SLOWMO) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_HUD_SPECIAL) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DROP_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DROP_AMMO) ELSE DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE() SET_PLAYER_CAN_USE_COVER(player_id(),FALSE) ENDIF //Don't allow first person or 3rd person near view modes while //in animal form. There is too much camera clipping. IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON OR GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_THIRD_PERSON_NEAR SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON) ENDIF IF IS_PLAYER_PLAYING(PLAYER_ID()) RESET_PLAYER_STAMINA(PLAYER_ID()) ENDIF //Don't allow autosaving once animal mode is active. g_sAutosaveData.bFlushAutosaves = TRUE ENDPROC PROC Deactivate_Animal_Restricted_State() CPRINTLN(DEBUG_ANIMAL_MODE, "Deactivating animal restricted mode.") IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_CanBeArrested, TRUE) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 200) ENDIF SET_PED_MAX_HEALTH(PLAYER_PED_ID(), 200) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_PlayerIsWeird, FALSE) SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(PLAYER_ID(), 1.0) SET_SWIM_MULTIPLIER_FOR_PLAYER(PLAYER_ID(), 1.0) SET_PLAYER_MELEE_WEAPON_DAMAGE_MODIFIER(PLAYER_ID(), 1.0) SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) g_bBlockShopRoberies = FALSE g_bForceNoCableCar = FALSE DISABLE_TAXI_HAILING(FALSE) DISPLAY_RADAR(TRUE) IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) THEFEED_RESUME() ENDIF SET_PLAYER_CAN_USE_COVER(player_id(),TRUE) //Enable stunt jumps SET_STUNT_JUMPS_CAN_TRIGGER(TRUE) //Reset water WATER_OVERRIDE_SET_STRENGTH(0) DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE) DISABLE_CHEAT(CHEAT_TYPE_SLIDEY_CARS, FALSE) DISABLE_CHEAT(CHEAT_TYPE_FAST_RUN, FALSE) DISABLE_CHEAT(CHEAT_TYPE_FAST_SWIM, FALSE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE) DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, FALSE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_HEALTH_ARMOR, FALSE) DISABLE_CHEAT(CHEAT_TYPE_SPECIAL_ABILITY_RECHARGE, FALSE) DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE) DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE) DISABLE_CHEAT(CHEAT_TYPE_GIVE_PARACHUTE, FALSE) DISABLE_CHEAT(CHEAT_TYPE_BANG_BANG, FALSE) DISABLE_CHEAT(CHEAT_TYPE_FLAMING_BULLETS, FALSE) DISABLE_CHEAT(CHEAT_TYPE_EXPLOSIVE_MELEE, FALSE) DISABLE_CHEAT(CHEAT_TYPE_0_GRAVITY, FALSE) DISABLE_CHEAT(CHEAT_TYPE_INVINCIBILITY, FALSE) DISABLE_CHEAT(CHEAT_TYPE_SLOWMO, FALSE) DISABLE_CHEAT(CHEAT_TYPE_SKYFALL, FALSE) DISABLE_CHEAT(CHEAT_TYPE_DRUNK, FALSE) DISABLE_CHEAT(CHEAT_TYPE_AIM_SLOWMO, FALSE) DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, FALSE) //allow autosaving once animal mode is complete. g_sAutosaveData.bFlushAutosaves = FALSE IF g_iAnimalShockingEvent != 0 REMOVE_SHOCKING_EVENT(g_iAnimalShockingEvent) ENDIF ALLOW_DIALOGUE_IN_WATER(FALSE) //Added by Steve T. for TRC bug 2463721 - We can't accept invites whilst an animal as we have no phone access. After deactivation of animal state, re-enable network invites. CPRINTLN(DEBUG_ANIMAL_MODE, "Re-enabled network invites after deactivating restricted animal state.") NETWORK_BLOCK_INVITES(FALSE) ENDPROC PROC Get_Pickup_Type_Bark_Anim_Data(TEXT_LABEL_63 &strBarkDict, TEXT_LABEL_15 &strBarkAnim, MODEL_NAMES animalModel) SWITCH animalModel CASE A_C_BOAR strBarkDict = "" BREAK CASE A_C_CAT_01 strBarkDict = "" BREAK CASE A_C_COW strBarkDict = "" BREAK CASE A_C_COYOTE strBarkDict = "" BREAK CASE A_C_DEER strBarkDict = "" BREAK CASE A_C_HUSKY strBarkDict = "facials@creatures@retriever@bark" BREAK CASE A_C_MTLION strBarkDict = "" BREAK CASE A_C_PIG strBarkDict = "" BREAK CASE A_C_POODLE strBarkDict = "facials@creatures@pug@bark" BREAK CASE A_C_PUG strBarkDict = "facials@creatures@pug@bark" BREAK CASE A_C_RABBIT_01 strBarkDict = "" BREAK CASE A_C_RETRIEVER strBarkDict = "facials@creatures@retriever@bark" BREAK CASE A_C_ROTTWEILER strBarkDict = "facials@creatures@rottweile@bark" BREAK CASE A_C_SHEPHERD strBarkDict = "facials@creatures@retriever@bark" BREAK CASE A_C_WESTY strBarkDict = "facials@creatures@pug@bark" BREAK CASE A_C_CHICKENHAWK strBarkDict = "" BREAK CASE A_C_CORMORANT strBarkDict = "" BREAK CASE A_C_CROW strBarkDict = "" BREAK CASE A_C_HEN strBarkDict = "" BREAK CASE A_C_PIGEON strBarkDict = "" BREAK CASE A_C_SEAGULL strBarkDict = "" BREAK CASE A_C_DOLPHIN strBarkDict = "" BREAK CASE A_C_FISH strBarkDict = "" BREAK CASE A_C_KILLERWHALE strBarkDict = "" BREAK CASE A_C_SHARKHAMMER strBarkDict = "" BREAK CASE A_C_SHARKTIGER strBarkDict = "" BREAK CASE A_C_STINGRAY strBarkDict = "" BREAK CASE IG_ORLEANS strBarkDict = "" BREAK DEFAULT SCRIPT_ASSERT("Get_Pickup_Type_Bark_Anim_Data: Invalid animal enum passed.") BREAK ENDSWITCH IF NOT IS_STRING_NULL_OR_EMPTY(strBarkDict) strBarkAnim = "bark_facial" ENDIF CPRINTLN(DEBUG_ANIMAL_MODE,"Selected Bark_Anim animation data. Dict:", strBarkDict, " Anim:", strBarkAnim, ".") ENDPROC PROC Get_Pickup_Sound_Data(AnimalSoundData &sData, MODEL_NAMES animalModel) SWITCH animalModel CASE A_C_BOAR sData.strBank = "PEYOTE_ATTRACT_BOAR" sData.strSound = "BOAR" sData.strBarkSound = "EXCITED" BREAK CASE A_C_CAT_01 sData.strBank = "PEYOTE_ATTRACT_CAT" sData.strSound = "CAT" sData.strBarkSound = "CAT_MEOW" BREAK CASE A_C_COW sData.strBank = "PEYOTE_ATTRACT_COW" sData.strSound = "COW" sData.strBarkSound = "" BREAK //Cow moo's with attack, disable context bark CASE A_C_COYOTE sData.strBank = "PEYOTE_ATTRACT_COYOTE" sData.strSound = "COYOTE" sData.strBarkSound = "BARK" BREAK CASE A_C_DEER sData.strBank = "PEYOTE_ATTRACT_DEER" sData.strSound = "DEER" sData.strBarkSound = "CALL" BREAK CASE A_C_HUSKY sData.strBank = "PEYOTE_ATTRACT_HUSKY" sData.strSound = "HUSKY" sData.strBarkSound = "BARK" BREAK CASE A_C_MTLION sData.strBank = "PEYOTE_ATTRACT_MTLION" sData.strSound = "MTLION" sData.strBarkSound = "ROAR" BREAK CASE A_C_PIG sData.strBank = "PEYOTE_ATTRACT_PIG" sData.strSound = "PIG" sData.strBarkSound = "EXCITED" BREAK CASE A_C_POODLE sData.strBank = "PEYOTE_ATTRACT_SMALL_DOG" sData.strSound = "SMALL_DOG" sData.strBarkSound = "BARK" BREAK CASE A_C_PUG sData.strBank = "PEYOTE_ATTRACT_SMALL_DOG" sData.strSound = "SMALL_DOG" sData.strBarkSound = "BARK" BREAK CASE A_C_RABBIT_01 sData.strBank = "PEYOTE_ATTRACT_RABBIT" sData.strSound = "RABBIT" sData.strBarkSound = "RABBIT_SCREAM" BREAK CASE A_C_RETRIEVER sData.strBank = "PEYOTE_ATTRACT_RETRIEVER" sData.strSound = "RETRIEVER" sData.strBarkSound = "BARK" BREAK CASE A_C_ROTTWEILER sData.strBank = "PEYOTE_ATTRACT_ROTTWEILER" sData.strSound = "ROTTWEILER" sData.strBarkSound = "BARK" BREAK CASE A_C_SHEPHERD sData.strBank = "PEYOTE_ATTRACT_SHEPHERD" sData.strSound = "SHEPHERD" sData.strBarkSound = "BARK" BREAK CASE A_C_WESTY sData.strBank = "PEYOTE_ATTRACT_SMALL_DOG" sData.strSound = "SMALL_DOG" sData.strBarkSound = "BARK" BREAK CASE A_C_CHICKENHAWK sData.strBank = "PEYOTE_ATTRACT_CHICKENHAWK" sData.strSound = "CHICKENHAWK" sData.strBarkSound = "SCREECH" BREAK CASE A_C_CORMORANT sData.strBank = "PEYOTE_ATTRACT_CORMORANT" sData.strSound = "CORMORANT" sData.strBarkSound = "CALL" BREAK CASE A_C_CROW sData.strBank = "PEYOTE_ATTRACT_CROW" sData.strSound = "CROW" sData.strBarkSound = "FLIGHT" BREAK CASE A_C_HEN sData.strBank = "PEYOTE_ATTRACT_HEN" sData.strSound = "HEN" sData.strBarkSound = "SQUAWK" BREAK CASE A_C_PIGEON sData.strBank = "PEYOTE_ATTRACT_PIGEON" sData.strSound = "PIGEON" sData.strBarkSound = "COO" BREAK CASE A_C_SEAGULL sData.strBank = "PEYOTE_ATTRACT_SEAGULL" sData.strSound = "SEAGULL" sData.strBarkSound = "CALL" BREAK CASE A_C_DOLPHIN sData.strBank = "PEYOTE_ATTRACT_DOLPHIN" sData.strSound = "DOLPHIN" sData.strBarkSound = "DOLPHIN_CALL" BREAK CASE A_C_FISH sData.strBank = "PEYOTE_ATTRACT_SEA_CREATURE" sData.strSound = "SEA_CREATURE" BREAK CASE A_C_KILLERWHALE sData.strBank = "PEYOTE_ATTRACT_SEA_CREATURE" sData.strSound = "SEA_CREATURE" sData.strBarkSound = "WHALE_CALL" BREAK CASE A_C_SHARKHAMMER sData.strBank = "PEYOTE_ATTRACT_SEA_CREATURE" sData.strSound = "SEA_CREATURE" BREAK CASE A_C_SHARKTIGER sData.strBank = "PEYOTE_ATTRACT_SEA_CREATURE" sData.strSound = "SEA_CREATURE" BREAK CASE A_C_STINGRAY sData.strBank = "PEYOTE_ATTRACT_SEA_CREATURE" sData.strSound = "SEA_CREATURE" BREAK CASE IG_ORLEANS sData.strBank = "PEYOTE_ATTRACT_SASQUATCH" sData.strSound = "SASQUATCH" sData.strBarkBank = "SAS_BANK_01" sData.strBarkSound = "PEYOTE_PLAYER_SECRET_VOCAL_MASTER" BREAK DEFAULT SCRIPT_ASSERT("Get_Pickup_Sound_Data: Invalid pickup enum passed.") BREAK ENDSWITCH CPRINTLN(DEBUG_ANIMAL_MODE,"Selected pickup sound data. Bank:", sData.strBank, " Sound:", sData.strSound, ".") ENDPROC PROC Play_Animal_Sound(STRING strBarkDict, STRING strBarkAnim, INT &barkTimer, enumCharacterList eLastPlayerCharacter, INT &iBarkSoundID, STRING strBarkSound) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_ANIMAL_VOCALIZATION_PLAYING(PLAYER_PED_ID()) AND (IS_STRING_NULL_OR_EMPTY(strBarkDict) OR NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(),strBarkDict, strBarkAnim)) AND GET_GAME_TIMER() > barkTimer AND NOT IS_PED_INJURED(PLAYER_PED_ID()) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) SWITCH GET_ENTITY_MODEL(player_ped_ID()) CASE A_C_FISH CASE A_C_SHARKHAMMER CASE A_C_SHARKTIGER CASE A_C_STINGRAY CPRINTLN(DEBUG_ANIMAL_MODE, "Play Fish Bark") SWITCH eLastPlayerCharacter CASE CHAR_MICHAEL PLAY_AMBIENT_SPEECH_FROM_POSITION_NATIVE("DROWNING", "WAVELOAD_PAIN_MICHAEL", <<0.0, 0.0, 0.0>>, "SPEECH_PARAMS_FORCE_FRONTEND") BREAK CASE CHAR_FRANKLIN PLAY_AMBIENT_SPEECH_FROM_POSITION_NATIVE("DROWNING", "WAVELOAD_PAIN_FRANKLIN", <<0.0, 0.0, 0.0>>, "SPEECH_PARAMS_FORCE_FRONTEND") BREAK CASE CHAR_TREVOR PLAY_AMBIENT_SPEECH_FROM_POSITION_NATIVE("DROWNING", "WAVELOAD_PAIN_TREVOR", <<0.0, 0.0, 0.0>>, "SPEECH_PARAMS_FORCE_FRONTEND") BREAK DEFAULT PLAY_AMBIENT_SPEECH_FROM_POSITION_NATIVE("DROWNING", "WAVELOAD_PAIN_MICHAEL", <<0.0, 0.0, 0.0>>, "SPEECH_PARAMS_FORCE_FRONTEND") BREAK ENDSWITCH BREAK CASE IG_ORLEANS CPRINTLN(DEBUG_ANIMAL_MODE, "Play SAS Bark") IF iBarkSoundID = -1 iBarkSoundID = GET_SOUND_ID() ENDIF PLAY_SOUND_FROM_ENTITY(iBarkSoundID, strBarkSound, PLAYER_PED_ID()) BREAK DEFAULT CPRINTLN(DEBUG_ANIMAL_MODE, "Play Default Bark") IF NOT IS_STRING_NULL_OR_EMPTY(strBarkSound) PLAY_ANIMAL_VOCALIZATION(PLAYER_PED_ID(), AUD_ANIMAL_NONE, strBarkSound) ENDIF BREAK ENDSWITCH STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) IF NOT IS_STRING_NULL_OR_EMPTY(strBarkDict) TASK_PLAY_ANIM(PLAYER_PED_ID(), strBarkDict, strBarkAnim,DEFAULT,SLOW_BLEND_OUT,DEFAULT,AF_SECONDARY) barkTimer = GET_GAME_TIMER() + 500 ENDIF ENDIF ENDPROC