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

637 lines
29 KiB
Scheme
Executable File

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