From fc751545d1a1fe6ecd9ff96ab182410fd38455fe Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Sun, 21 Jul 2024 18:41:08 +0330 Subject: [PATCH 01/12] chore: Added BZ FMOD events --- .../Documentation/resources/BZ-FMODEvents.txt | 2972 +++++++++++++++++ 1 file changed, 2972 insertions(+) create mode 100644 Nautilus/Documentation/resources/BZ-FMODEvents.txt diff --git a/Nautilus/Documentation/resources/BZ-FMODEvents.txt b/Nautilus/Documentation/resources/BZ-FMODEvents.txt new file mode 100644 index 000000000..d001148d4 --- /dev/null +++ b/Nautilus/Documentation/resources/BZ-FMODEvents.txt @@ -0,0 +1,2972 @@ +event:/bz/base/base_amb +event:/bz/base/base_door/in_from_sea +event:/bz/base/base_door/out_to_sea +event:/bz/base/external_fabricator_open +event:/bz/base/external_fabricator_open +event:/bz/base/hatch_door/open_from_sea +event:/bz/base/hatch_door/open_to_sea +event:/bz/base/storage/close +event:/bz/base/storage/open +event:/bz/cinematic/act_01/asteroid_impact +event:/bz/cinematic/act_01/cieling +event:/bz/cinematic/act_01/crash_landing +event:/bz/cinematic/act_01/crashed_ship_alarm +event:/bz/cinematic/act_01/crashed_ship_explosion +event:/bz/cinematic/act_01/door_open +event:/bz/cinematic/act_01/first_input_shuttle_on +event:/bz/cinematic/act_01/meteor +event:/bz/cinematic/act_01/post_crash +event:/bz/cinematic/act_01/post_crash +event:/bz/cinematic/act_01/starting_ship_amb +event:/bz/cinematic/act_02/lightsout +event:/bz/cinematic/act_02/sanctuarycave_cubecrumble +event:/bz/cinematic/act_03/alanbodytransfer +event:/bz/cinematic/act_03/pdaupload +event:/bz/cinematic/act_05/platform/06_platform_indoor_amb_loop +event:/bz/cinematic/act_05/platform/07_platform_outdoor_amb_loop +event:/bz/cinematic/act_05/platform/08_platform_alan_intros_controls +event:/bz/cinematic/act_05/platform/10_platform_alan_zoom_to_console +event:/bz/cinematic/act_05/platform/11_platform_break_ice_loop +event:/bz/cinematic/act_05/platform/12_platform_button_press +event:/bz/cinematic/act_05/platform/13a_platform_gate +event:/bz/cinematic/act_05/platform/13b_platform_gate_amb_loop +event:/bz/cinematic/act_05/platform/13c_platform_breakice_complete +event:/bz/cinematic/act_05/platform/13c_platform_gate_amb_electricity_flash +event:/bz/cinematic/act_05/platform/13j_platform_pillar_amb_loop +event:/bz/cinematic/act_05/platform/13l_platform_alan_terminal_interact_loop +event:/bz/cinematic/act_05/platform/14_platform_zoom_02 +event:/bz/cinematic/act_05/platform/15_platform_ship_construct +event:/bz/cinematic/act_05/platform/15a_platform_ship construct button press +event:/bz/cinematic/act_05/platform/16_platform_beamlight_loop +event:/bz/cinematic/act_05/platform/17_platform_beamup +event:/bz/cinematic/act_05/platform/18_platform_get_alan_arms +event:/bz/cinematic/act_05/platform/19_platform_pillar_repair_01 +event:/bz/cinematic/act_05/platform/19_platform_pillar_repair_02 +event:/bz/cinematic/act_05/platform/19_platform_unequip_alan_arms +event:/bz/cinematic/act_05/platform/20_platform_ice_blast +event:/bz/cinematic/act_05/platform/alans_arms_equipped/13_platform_alanarms_equipped_jump +event:/bz/cinematic/act_05/platform/alans_arms_equipped/13_platform_alanarms_equipped_land +event:/bz/cinematic/act_05/platform/alans_arms_equipped/13_platform_alanarms_equipped_movement_loop +event:/bz/cinematic/act_05/power_room/01_power_room_amb_loop +event:/bz/cinematic/act_05/power_room/02_power_room_operating_loop +event:/bz/cinematic/act_05/power_room/03a_02_power_room_alan_jumps_to_hallway +event:/bz/cinematic/act_05/power_room/03a_power_room_entrance +event:/bz/cinematic/act_05/power_room/03b_power_room_alan_exits +event:/bz/cinematic/act_05/power_room/04_power_room_device_loop +event:/bz/cinematic/act_05/power_room/05_power_room_portal_amb_loop +event:/bz/cinematic/act_05/power_room/05a_portal_conversation_cinematic +event:/bz/cinematic/act_05/power_room/05a_power_room_alan_enters_portal +event:/bz/cinematic/act_05/power_room/05b_power_room_portal_enter +event:/bz/cinematic/act_05/ship/18_ship_amb_loop +event:/bz/cinematic/act_05/ship/19_ship_flyoff +event:/bz/cinematic/act_iv +event:/bz/cinematic/marge_A +event:/bz/cinematic/marge_B +event:/bz/cinematic/marge_B_snowstalker_chewing +event:/bz/cinematic/marge_B_snowstalker_walk_laydown +event:/bz/cinematic/marge_C +event:/bz/cinematic/precursorfabricator_01 +event:/bz/cinematic/precursorfabricator_02 +event:/bz/cinematic/sanctuarycave_cube +event:/bz/creature/alan/arm_lower_left_loop +event:/bz/creature/alan/arm_lower_right +event:/bz/creature/alan/arm_upper_left +event:/bz/creature/alan/arm_upper_right +event:/bz/creature/alan/footsteps_front +event:/bz/creature/alan/footsteps_rear +event:/bz/creature/alan/look_anim_loop +event:/bz/creature/alan/look_anim_oneshot +event:/bz/creature/alan/look_oneshots +event:/bz/creature/alan/operate_loop +event:/bz/creature/alan/shift_anim +event:/bz/creature/alan/teleport_end +event:/bz/creature/alan/teleport_start +event:/bz/creature/arctic_ray/death +event:/bz/creature/arctic_ray/flinch +event:/bz/creature/arctic_ray/idle +event:/bz/creature/arctic_ray/swimming +event:/bz/creature/arctic_ray/twist +event:/bz/creature/arrowray/death +event:/bz/creature/arrowray/flinch +event:/bz/creature/brinewing/attack +event:/bz/creature/brinewing/death +event:/bz/creature/brinewing/eat +event:/bz/creature/brinewing/flinch +event:/bz/creature/brinewing/freeze_call +event:/bz/creature/brinewing/freeze_loop +event:/bz/creature/brinewing/ice_break +event:/bz/creature/brinewing/ready_atk +event:/bz/creature/brinewing/suckup +event:/bz/creature/brinewing/swimming +event:/bz/creature/bruteshark/bite +event:/bz/creature/bruteshark/chase_bite +event:/bz/creature/bruteshark/chase_loop +event:/bz/creature/bruteshark/death +event:/bz/creature/bruteshark/distant_call +event:/bz/creature/bruteshark/flinch +event:/bz/creature/bruteshark/idle +event:/bz/creature/bruteshark/roar +event:/bz/creature/bruteshark/swim_fast +event:/bz/creature/bruteshark/swim_slow +event:/bz/creature/bruteshark/swimming +event:/bz/creature/chelicerate/aggro +event:/bz/creature/chelicerate/bite +event:/bz/creature/chelicerate/chase_loop +event:/bz/creature/chelicerate/chase_oneshots +event:/bz/creature/chelicerate/cinematic_exoattack_loop +event:/bz/creature/chelicerate/cinematic_exoattack_loop_end +event:/bz/creature/chelicerate/cinematic_exoattack_loop_start +event:/bz/creature/chelicerate/cinematic_seatruck_attack +event:/bz/creature/chelicerate/cinematic_seatruck_attackloop_end +event:/bz/creature/chelicerate/cinematic_seatruck_attackloop_loop +event:/bz/creature/chelicerate/cinematic_seatruck_attackloop_start +event:/bz/creature/chelicerate/cinematic_solo_attack +event:/bz/creature/chelicerate/distant_call +event:/bz/creature/chelicerate/enter_area_roar +event:/bz/creature/chelicerate/roar +event:/bz/creature/chelicerate/swim +event:/bz/creature/discus_fish/swim_loop +event:/bz/creature/general/tinyfish_water_leap_in +event:/bz/creature/general/tinyfish_water_leap_out +event:/bz/creature/glow_whale/attach +event:/bz/creature/glow_whale/breach_in +event:/bz/creature/glow_whale/breach_out +event:/bz/creature/glow_whale/call +event:/bz/creature/glow_whale/eye_interraction +event:/bz/creature/glow_whale/gulp +event:/bz/creature/glow_whale/surface_breath +event:/bz/creature/glow_whale/surface_swim_loop +event:/bz/creature/glow_whale/swimming +event:/bz/creature/hidden_croc/alert +event:/bz/creature/hidden_croc/bite +event:/bz/creature/hidden_croc/chase_loop +event:/bz/creature/hidden_croc/chase_oneshots +event:/bz/creature/hidden_croc/death +event:/bz/creature/hidden_croc/distant_call +event:/bz/creature/hidden_croc/flinch +event:/bz/creature/hidden_croc/roar +event:/bz/creature/hidden_croc/swim_fast +event:/bz/creature/hidden_croc/swim_slow +event:/bz/creature/hidden_croc/swimming +event:/bz/creature/hoopfish/amb_loop +event:/bz/creature/iceworm/cinematic/jaws_kill +event:/bz/creature/iceworm/cinematic/playing_with_food +event:/bz/creature/iceworm/cinematic/swipe +event:/bz/creature/iceworm/death +event:/bz/creature/iceworm/dive +event:/bz/creature/iceworm/emerge +event:/bz/creature/iceworm/flinch +event:/bz/creature/iceworm/idle_exhale +event:/bz/creature/iceworm/idle_inhale +event:/bz/creature/iceworm/jump_long +event:/bz/creature/iceworm/jump_short +event:/bz/creature/iceworm/new/attack_dive +event:/bz/creature/iceworm/new/attack_fling +event:/bz/creature/iceworm/new/attack_snowstalker +event:/bz/creature/iceworm/new/attack_spear +event:/bz/creature/iceworm/new/attack_swipe +event:/bz/creature/iceworm/new/attack_whip +event:/bz/creature/iceworm/new/breach +event:/bz/creature/iceworm/new/breach_mid +event:/bz/creature/iceworm/new/breach_tail +event:/bz/creature/iceworm/new/close_shake +event:/bz/creature/iceworm/new/emerge +event:/bz/creature/iceworm/new/emerge_lead_in +event:/bz/creature/iceworm/new/move_ice_breaking_loop +event:/bz/creature/iceworm/new/move_under_ice_loop +event:/bz/creature/iceworm/new/passby_loop +event:/bz/creature/iceworm/new/pre_trigger_loop +event:/bz/creature/iceworm/new/roar +event:/bz/creature/iceworm/new/vo_atk_start_roar +event:/bz/creature/iceworm/new/vo_disappear +event:/bz/creature/iceworm/new/vo_hunting +event:/bz/creature/iceworm/poke_long +event:/bz/creature/iceworm/poke_short +event:/bz/creature/iceworm/roar +event:/bz/creature/iceworm/spear_cut +event:/bz/creature/iceworm/spear_retract +event:/bz/creature/iceworm/spear_stuck +event:/bz/creature/iceworm/swipe +event:/bz/creature/iceworm/tunnel_loop +event:/bz/creature/iceworm/whip +event:/bz/creature/jellyfish/presence_loop +event:/bz/creature/jellyfish/swim_oneshot +event:/bz/creature/lillypaddler/death +event:/bz/creature/lillypaddler/flinch +event:/bz/creature/lillypaddler/playeraffected +event:/bz/creature/lillypaddler/pose_to_swim +event:/bz/creature/lillypaddler/ride_hurt +event:/bz/creature/lillypaddler/ride_loop +event:/bz/creature/lillypaddler/ride_swim_anim +event:/bz/creature/lillypaddler/swim_to_pose +event:/bz/creature/lillypaddler/swimming +event:/bz/creature/lillypaddler/trippy_loop +event:/bz/creature/nootfish/death +event:/bz/creature/nootfish/eat +event:/bz/creature/nootfish/flinch +event:/bz/creature/penguin_adult/barrel_roll +event:/bz/creature/penguin_adult/call +event:/bz/creature/penguin_adult/catch_fish +event:/bz/creature/penguin_adult/death +event:/bz/creature/penguin_adult/death_land +event:/bz/creature/penguin_adult/death_underwater +event:/bz/creature/penguin_adult/dive_deep +event:/bz/creature/penguin_adult/dive_shallow +event:/bz/creature/penguin_adult/dive_up +event:/bz/creature/penguin_adult/dive_up_short +event:/bz/creature/penguin_adult/eye_blink +event:/bz/creature/penguin_adult/flinch +event:/bz/creature/penguin_adult/flinch_land +event:/bz/creature/penguin_adult/flinch_sea +event:/bz/creature/penguin_adult/foot_ice +event:/bz/creature/penguin_adult/foot_slow_walk +event:/bz/creature/penguin_adult/foot_snow +event:/bz/creature/penguin_adult/footstep +event:/bz/creature/penguin_adult/hop_landing +event:/bz/creature/penguin_adult/idle_underwater_a +event:/bz/creature/penguin_adult/idle_underwater_b +event:/bz/creature/penguin_adult/land_get_up +event:/bz/creature/penguin_adult/skweak +event:/bz/creature/penguin_adult/swim_fast +event:/bz/creature/penguin_adult/swim_glide +event:/bz/creature/penguin_adult/swim_normal +event:/bz/creature/penguin_adult/swimming +event:/bz/creature/penguin_adult/turn_left +event:/bz/creature/penguin_adult/turn_right +event:/bz/creature/penguin_adult/waddle_voice +event:/bz/creature/penguin_baby/barrel_roll +event:/bz/creature/penguin_baby/call +event:/bz/creature/penguin_baby/capture +event:/bz/creature/penguin_baby/death +event:/bz/creature/penguin_baby/flinch +event:/bz/creature/penguin_baby/footstep +event:/bz/creature/penguin_baby/hold/equip_above_surface +event:/bz/creature/penguin_baby/hold/equip_below_surface +event:/bz/creature/penguin_baby/hold/eye_blink +event:/bz/creature/penguin_baby/hold/release_above_surface +event:/bz/creature/penguin_baby/hold/release_below_surface +event:/bz/creature/penguin_baby/hold/sneeze_above_surface +event:/bz/creature/penguin_baby/hold/sneeze_below_surface +event:/bz/creature/penguin_baby/hold/unequip_above_surface +event:/bz/creature/penguin_baby/hold/unequip_below_surface +event:/bz/creature/penguin_baby/hop +event:/bz/creature/penguin_baby/jump_to_land +event:/bz/creature/penguin_baby/jump_to_water +event:/bz/creature/penguin_baby/shudder +event:/bz/creature/penguin_baby/slip_to_swim +event:/bz/creature/penguin_baby/swim_glide +event:/bz/creature/penguin_baby/swimming +event:/bz/creature/penguin_baby/trip +event:/bz/creature/pinnacarid/bite +event:/bz/creature/pinnacarid/death +event:/bz/creature/pinnacarid/distant_call +event:/bz/creature/pinnacarid/dive +event:/bz/creature/pinnacarid/emerge +event:/bz/creature/pinnacarid/flinch +event:/bz/creature/pinnacarid/hop_fast +event:/bz/creature/pinnacarid/hop_slow +event:/bz/creature/pinnacarid/push +event:/bz/creature/pinnacarid/ride_hurt +event:/bz/creature/pinnacarid/ride_loop +event:/bz/creature/pinnacarid/ride_swim_anim +event:/bz/creature/pinnacarid/sit_up +event:/bz/creature/pinnacarid/slide_on_land +event:/bz/creature/pinnacarid/swimming +event:/bz/creature/rock_puncher/attack +event:/bz/creature/rock_puncher/chase_loop +event:/bz/creature/rock_puncher/chase_oneshots +event:/bz/creature/rock_puncher/death_long +event:/bz/creature/rock_puncher/death_short +event:/bz/creature/rock_puncher/flinch_big +event:/bz/creature/rock_puncher/flinch_small +event:/bz/creature/rock_puncher/footsteps_left_legs +event:/bz/creature/rock_puncher/footsteps_right_legs +event:/bz/creature/rock_puncher/jump +event:/bz/creature/rock_puncher/land +event:/bz/creature/rock_puncher/movement_squish_loop +event:/bz/creature/seamonkey/death +event:/bz/creature/seamonkey/flare +event:/bz/creature/seamonkey/flinch +event:/bz/creature/seamonkey/gift +event:/bz/creature/seamonkey/gimme +event:/bz/creature/seamonkey/see_shiny +event:/bz/creature/seamonkey/steal_01 +event:/bz/creature/seamonkey/steal_02 +event:/bz/creature/seamonkey/swim +event:/bz/creature/seamonkey/taunt +event:/bz/creature/seamonkey_baby/death +event:/bz/creature/seamonkey_baby/flinch +event:/bz/creature/seamonkey_baby/hold +event:/bz/creature/seamonkey_baby/idle +event:/bz/creature/seamonkey_baby/swim +event:/bz/creature/shadow_leviathan/aggro_roar +event:/bz/creature/shadow_leviathan/attack +event:/bz/creature/shadow_leviathan/chase_loop +event:/bz/creature/shadow_leviathan/chase_oneshots +event:/bz/creature/shadow_leviathan/cinematic_exoattack_loop +event:/bz/creature/shadow_leviathan/cinematic_exoattack_loop_end +event:/bz/creature/shadow_leviathan/cinematic_exoattack_loop_start +event:/bz/creature/shadow_leviathan/cinematic_seatruck_attackloop_end +event:/bz/creature/shadow_leviathan/cinematic_seatruck_attackloop_loop +event:/bz/creature/shadow_leviathan/cinematic_seatruck_attackloop_start +event:/bz/creature/shadow_leviathan/cinematic_solo_attack +event:/bz/creature/shadow_leviathan/distant_call +event:/bz/creature/shadow_leviathan/enter_vicinity +event:/bz/creature/shadow_leviathan/post_kill_roar +event:/bz/creature/shadow_leviathan/swim_attacking_growl +event:/bz/creature/shadow_leviathan/swim_fast +event:/bz/creature/shadow_leviathan/swim_patrol +event:/bz/creature/snowstalker/aggro +event:/bz/creature/snowstalker/attack_bear +event:/bz/creature/snowstalker/attack_leap +event:/bz/creature/snowstalker/attack_water +event:/bz/creature/snowstalker/breach +event:/bz/creature/snowstalker/chase_loop +event:/bz/creature/snowstalker/chase_oneshots +event:/bz/creature/snowstalker/chill +event:/bz/creature/snowstalker/cinematic/player_attack +event:/bz/creature/snowstalker/cinematic/player_death +event:/bz/creature/snowstalker/cinematic/player_escape +event:/bz/creature/snowstalker/cinematic/player_roll_2D +event:/bz/creature/snowstalker/cinematic/player_roll_3D +event:/bz/creature/snowstalker/cinematic/snowstalker_feed +event:/bz/creature/snowstalker/death_land +event:/bz/creature/snowstalker/death_water +event:/bz/creature/snowstalker/distant_calls +event:/bz/creature/snowstalker/dry_fur +event:/bz/creature/snowstalker/flinch_land +event:/bz/creature/snowstalker/flinch_water +event:/bz/creature/snowstalker/foot_run +event:/bz/creature/snowstalker/foot_walk +event:/bz/creature/snowstalker/jump _to_land +event:/bz/creature/snowstalker/jump_to_water +event:/bz/creature/snowstalker/roar_land +event:/bz/creature/snowstalker/run_loop +event:/bz/creature/snowstalker/standup_end +event:/bz/creature/snowstalker/standup_howl +event:/bz/creature/snowstalker/standup_sniff +event:/bz/creature/snowstalker/standup_start +event:/bz/creature/snowstalker/swim +event:/bz/creature/snowstalker/threaten +event:/bz/creature/snowstalker/turn +event:/bz/creature/snowstalker_baby/breach +event:/bz/creature/snowstalker_baby/chill +event:/bz/creature/snowstalker_baby/cinematic/jumpback +event:/bz/creature/snowstalker_baby/cinematic/offer_fruit +event:/bz/creature/snowstalker_baby/cinematic/pet +event:/bz/creature/snowstalker_baby/cinematic/yawn +event:/bz/creature/snowstalker_baby/climb_to_land +event:/bz/creature/snowstalker_baby/death_land +event:/bz/creature/snowstalker_baby/death_water +event:/bz/creature/snowstalker_baby/dry_fur +event:/bz/creature/snowstalker_baby/flinch_land +event:/bz/creature/snowstalker_baby/flinch_water +event:/bz/creature/snowstalker_baby/foot_walk +event:/bz/creature/snowstalker_baby/growl_loop +event:/bz/creature/snowstalker_baby/jump _to_land +event:/bz/creature/snowstalker_baby/jump_to_water +event:/bz/creature/snowstalker_baby/run_loop +event:/bz/creature/snowstalker_baby/snore +event:/bz/creature/snowstalker_baby/standup_end +event:/bz/creature/snowstalker_baby/standup_howl +event:/bz/creature/snowstalker_baby/standup_sniff +event:/bz/creature/snowstalker_baby/standup_start +event:/bz/creature/snowstalker_baby/swim +event:/bz/creature/snowstalker_baby/turn +event:/bz/creature/spikeytrap/attack_enter +event:/bz/creature/spikeytrap/attack_exit +event:/bz/creature/spikeytrap/bury +event:/bz/creature/spikeytrap/cinematic_eat +event:/bz/creature/spikeytrap/cinematic_escape +event:/bz/creature/spikeytrap/eat_prey +event:/bz/creature/spikeytrap/idle_loop +event:/bz/creature/spikeytrap/latch_onto_player +event:/bz/creature/spikeytrap/let_go_player +event:/bz/creature/spikeytrap/munch +event:/bz/creature/spikeytrap/pull_player +event:/bz/creature/spikeytrap/reel +event:/bz/creature/spikeytrap/unbury +event:/bz/creature/spinner/attack +event:/bz/creature/spinner/death +event:/bz/creature/spinner/flinch +event:/bz/creature/spinner/swimming +event:/bz/creature/squidshark/bite +event:/bz/creature/squidshark/bite_long +event:/bz/creature/squidshark/chase_loop +event:/bz/creature/squidshark/chase_oneshots +event:/bz/creature/squidshark/cinematic_death +event:/bz/creature/squidshark/cinematic_escape +event:/bz/creature/squidshark/death +event:/bz/creature/squidshark/distant_call +event:/bz/creature/squidshark/flinch +event:/bz/creature/squidshark/idle +event:/bz/creature/squidshark/roar +event:/bz/creature/squidshark/swim_angry +event:/bz/creature/squidshark/swim_angry_loop +event:/bz/creature/symbiote_fish/bite +event:/bz/creature/symbiote_fish/death +event:/bz/creature/symbiote_fish/flinch +event:/bz/creature/symbiote_fish/swimming +event:/bz/creature/titanhole_fish/swim +event:/bz/creature/triops/death +event:/bz/creature/triops/flinch +event:/bz/creature/trivalve/death +event:/bz/creature/trivalve/dive +event:/bz/creature/trivalve/emerge +event:/bz/creature/trivalve/feed +event:/bz/creature/trivalve/feed_scared +event:/bz/creature/trivalve/flinch +event:/bz/creature/trivalve/hide +event:/bz/creature/trivalve/loop_upright +event:/bz/creature/trivalve/loop_upsidedown +event:/bz/creature/trivalve/peekaboo +event:/bz/creature/trivalve/pet +event:/bz/creature/trivalve/roll_loop +event:/bz/creature/trivalve/scuttle_fast_loop +event:/bz/creature/trivalve/scuttle_slow_front +event:/bz/creature/trivalve/scuttle_slow_rear +event:/bz/creature/trivalve/swim_down_to_up +event:/bz/creature/trivalve/swim_up_to_down +event:/bz/creature/trivalve/swimming +event:/bz/creature/trivalve/tickle +event:/bz/creature/trivalve/wave +event:/bz/creature/trivalve/wave_fall +event:/bz/env/amb/arctic_caldera +event:/bz/env/amb/arctic_surface +event:/bz/env/amb/crashed_ship +event:/bz/env/amb/crashed_ship_scatterers/os_creaks +event:/bz/env/amb/crystal_cache +event:/bz/env/amb/crystal_caves +event:/bz/env/amb/crystal_caves_scatterers/kaiju (2) +event:/bz/env/amb/deep_lily_cache +event:/bz/env/amb/deep_purple_vents_venting_loop +event:/bz/env/amb/deep_purplevents_amb +event:/bz/env/amb/distant meteor_scatterer/distant_meteorimpact +event:/bz/env/amb/distant meteor_scatterer/distant_meteorimpact +event:/bz/env/amb/distant meteor_scatterer/distant_meteorpassby +event:/bz/env/amb/distant meteor_scatterer/distant_meteorpassby +event:/bz/env/amb/east_arctic +event:/bz/env/amb/fabricator_base +event:/bz/env/amb/fabricator_base_purpletank +event:/bz/env/amb/fabricator_base_tank_loop +event:/bz/env/amb/fabricator_bodypart_appear +event:/bz/env/amb/fabricator_exterior +event:/bz/env/amb/fabricator_tanks_close +event:/bz/env/amb/frozen_creature_amb +event:/bz/env/amb/frozen_creature_cure +event:/bz/env/amb/frozen_creature_scatterers/kaiju +event:/bz/env/amb/frozen_creature_scatterers/kaiju +event:/bz/env/amb/frozen_creature_scatterers/os +event:/bz/env/amb/frozen_creature_scatterers/os +event:/bz/env/amb/frozen_ice_cave +event:/bz/env/amb/frozen_icecave_refs/frozenicecave_oneshots_0 +event:/bz/env/amb/frozen_icecave_refs/frozenicecave_oneshots_100 +event:/bz/env/amb/frozen_icecave_refs/frozenicecave_oneshots_175 +event:/bz/env/amb/frozen_icecave_refs/kaiju +event:/bz/env/amb/glacial_basin_bunker_loop +event:/bz/env/amb/glacial_basin_dark_cave_loop +event:/bz/env/amb/ice_cave +event:/bz/env/amb/ice_cave_alien_loop +event:/bz/env/amb/ice_cave_refs/os_crunch +event:/bz/env/amb/ice_cave_refs/os_crunch +event:/bz/env/amb/ice_cave_refs/os_rumble +event:/bz/env/amb/ice_cave_refs/os_rumble +event:/bz/env/amb/ice_worm_lair +event:/bz/env/amb/iceberg_interior_loop +event:/bz/env/amb/iceworm_lair_scatterers/glacier_creaks +event:/bz/env/amb/intro_mothership_scatterers/os_all +event:/bz/env/amb/intro_mothership_scatterers/os_all +event:/bz/env/amb/ive_worm_lair_footsteps +event:/bz/env/amb/kelp_caves +event:/bz/env/amb/lilly_pads +event:/bz/env/amb/lilypads_scatterers/kaiju +event:/bz/env/amb/lilypads_scatterers/kaiju +event:/bz/env/amb/lilypads_scatterers/os_0 +event:/bz/env/amb/lilypads_scatterers/os_0 +event:/bz/env/amb/lilypads_scatterers/os_100 +event:/bz/env/amb/lilypads_scatterers/os_100 +event:/bz/env/amb/lilypads_scatterers/os_175 +event:/bz/env/amb/lilypads_scatterers/os_175 +event:/bz/env/amb/marg_base_exterior +event:/bz/env/amb/marg_exterior/kaiju +event:/bz/env/amb/marg_exterior/os +event:/bz/env/amb/marge_base +event:/bz/env/amb/marge_base/faucet_loop +event:/bz/env/amb/marge_base/fridge_loop +event:/bz/env/amb/marge_base/shower_loop +event:/bz/env/amb/marge_base/stove_loop +event:/bz/env/amb/marge_base/toilet_close +event:/bz/env/amb/marge_base/toilet_open +event:/bz/env/amb/mining_site +event:/bz/env/amb/mining_site_scatterers/os_above +event:/bz/env/amb/mining_site_scatterers/os_below +event:/bz/env/amb/normal_cave +event:/bz/env/amb/normal_cave +event:/bz/env/amb/purple_vents +event:/bz/env/amb/purple_vents_explosion +event:/bz/env/amb/purple_vents_venting +event:/bz/env/amb/sanctuary +event:/bz/env/amb/sanctuary_cube +event:/bz/env/amb/sanctuary_platform +event:/bz/env/amb/sanctuary_sparks +event:/bz/env/amb/sanctuary_waterfall +event:/bz/env/amb/snowfox_base +event:/bz/env/amb/snowfox_base_scatterers/os_all +event:/bz/env/amb/startingbase_alarm +event:/bz/env/amb/startingbase_aquarium +event:/bz/env/amb/startingbase_base +event:/bz/env/amb/startingbase_comp_a +event:/bz/env/amb/startingbase_comp_c +event:/bz/env/amb/startingbase_greenhouse +event:/bz/env/amb/startingbase_greenhouse_speakers +event:/bz/env/amb/startingbase_jevovidle +event:/bz/env/amb/startingbase_lab +event:/bz/env/amb/startingbase_nosignal_monitor +event:/bz/env/amb/startingbase_storageunit +event:/bz/env/amb/startingbase_tube +event:/bz/env/amb/startingbase_tv +event:/bz/env/amb/startingbase_vendingmachine +event:/bz/env/amb/startingbase_waterbottler +event:/bz/env/amb/thermal_zone +event:/bz/env/amb/thermal_zone_volcano_loop +event:/bz/env/amb/tree_spires +event:/bz/env/amb/twisty_bridges +event:/bz/env/amb/twisty_bridges +event:/bz/env/amb/twisty_scatterers/os_0 +event:/bz/env/amb/twisty_scatterers/os_0 +event:/bz/env/amb/twisty_scatterers/os_100 +event:/bz/env/amb/twisty_scatterers/os_100 +event:/bz/env/amb/twisty_scatterers/os_175 +event:/bz/env/amb/twisty_scatterers/os_175 +event:/bz/env/amb/vent_garden +event:/bz/env/amb/vent_garden_bubbles_loop +event:/bz/env/amb/vent_garden_canal +event:/bz/env/amb/vent_garden_feelers_loop +event:/bz/env/amb/vent_garden_inner +event:/bz/env/amb/vent_garden_mouth_close +event:/bz/env/amb/vent_garden_mouth_open +event:/bz/env/amb/vent_garden_outer +event:/bz/env/amb/vent_garden_sucking_loop +event:/bz/env/bridge/button_push +event:/bz/env/bridge/extend +event:/bz/env/bridge/insert +event:/bz/env/bridge/maintenance_close +event:/bz/env/bridge/retract +event:/bz/env/buildings/radiotower_climbdown_left +event:/bz/env/buildings/radiotower_climbdown_right +event:/bz/env/buildings/radiotower_climbup +event:/bz/env/buildings/radiotower_hacked +event:/bz/env/buildings/radiotower_hacked_idle_loop +event:/bz/env/buildings/radiotower_hacked_idle_loop_DEBUG +event:/bz/env/buildings/radiotower_hacked_idle_loop_v2 +event:/bz/env/buildings/radiotower_hacked_small_movement +event:/bz/env/buildings/radiotower_hacked_v2 +event:/bz/env/buildings/radiotower_insert_TOM +event:/bz/env/buildings/radiotower_loop +event:/bz/env/buildings/radiotower_powerdown +event:/bz/env/buildings/radiotower_powerdown_v2 +event:/bz/env/buildings/radiotower_reboot +event:/bz/env/buildings/radiotower_reboot_v2 +event:/bz/env/buildings/radiotower_repaired +event:/bz/env/buildings/radiotower_scan_idle_loop +event:/bz/env/gen/arctic_surface_ice_break +event:/bz/env/gen/arctic_surface_lightning_strike +event:/bz/env/gen/cave_flower/caveflower_breathe +event:/bz/env/gen/cave_flower/caveflower_loop +event:/bz/env/gen/closelightning_explosion +event:/bz/env/gen/closelightning_strike +event:/bz/env/gen/crevasse_amb +event:/bz/env/gen/deep_lily_fountain +event:/bz/env/gen/glacier_creak_loop +event:/bz/env/gen/glacier_creak_scatterer +event:/bz/env/gen/glowplant_spore_loop +event:/bz/env/gen/greenhouse/greenhouse_room_amb +event:/bz/env/gen/greenhouse/greenhouse_speaker_loop +event:/bz/env/gen/greenhouse/snowstalker_growl_loop +event:/bz/env/gen/greenhouse/snowstalker_growl_to_idle +event:/bz/env/gen/greenhouse/snowstalker_growl_to_sleep +event:/bz/env/gen/greenhouse/snowstalker_sleep_to_growl +event:/bz/env/gen/greenhouse/snowstalker_snore_loop +event:/bz/env/gen/hail +event:/bz/env/gen/hail_os +event:/bz/env/gen/ice_bubble_open +event:/bz/env/gen/ice_bubble_single +event:/bz/env/gen/icechunk_impact_earth +event:/bz/env/gen/icechunk_impact_player +event:/bz/env/gen/icechunk_rip +event:/bz/env/gen/icicles_break +event:/bz/env/gen/icicles_land +event:/bz/env/gen/intro_avalanche +event:/bz/env/gen/intro_avalanche_beamfall +event:/bz/env/gen/intro_towercollapse +event:/bz/env/gen/jeffries_door +event:/bz/env/gen/meteor_hit_inside_cave +event:/bz/env/gen/meteor_impact +event:/bz/env/gen/meteor_impact_water +event:/bz/env/gen/meteor_shower_loop +event:/bz/env/gen/meteor_whoosh +event:/bz/env/gen/meteorstorm_ship_launch +event:/bz/env/gen/sparking_wire +event:/bz/env/gen/steam_crevice_loop +event:/bz/env/gen/steamvent/loop +event:/bz/env/gen/steamvent/on +event:/bz/env/gen/thermal_flower/close +event:/bz/env/gen/thermal_flower/heat_loop +event:/bz/env/gen/thermal_flower/move_loop +event:/bz/env/gen/thermal_flower/open +event:/bz/env/gen/waterfall_tiny +event:/bz/env/gen/waterfalls +event:/bz/env/gen/whiteout +event:/bz/env/gen/wind +event:/bz/env/ice_cave_rock_crumble +event:/bz/env/sanctuary/forcefield_loop +event:/bz/env/sanctuary/forcefield_off +event:/bz/env/sanctuary/forcefield_on +event:/bz/env/sanctuary/sos_beep +event:/bz/env/title_screen/title_amb +event:/bz/env/title_screen/title_penguin_skweak +event:/bz/flora/alien_tablet/tablet_loop +event:/bz/flora/alien_tablet/tablet_on +event:/bz/flora/hot_springs +event:/bz/flora/hot_springs_jumpin +event:/bz/flora/hot_springs_jumpout +event:/bz/flora/oxygen_plant +event:/bz/music/alan_body_construction +event:/bz/music/arctic_peeper +event:/bz/music/arctic_spires +event:/bz/music/cause_unknown +event:/bz/music/caverns +event:/bz/music/chasm +event:/bz/music/cinematic/endgame/endgame_credits +event:/bz/music/cinematic/endgame/endgame_music_part01 +event:/bz/music/cinematic/endgame/endgame_music_part02 +event:/bz/music/cinematic/endgame/endgame_music_part03 +event:/bz/music/cinematic/endgame/endgame_music_part04 +event:/bz/music/cinematic/sanctuary/sanctuary_cave_music +event:/bz/music/cinematic/sanctuary/sanctuary_cinematic_music +event:/bz/music/crash_landing +event:/bz/music/creep +event:/bz/music/crystal_caves +event:/bz/music/cure_stinger +event:/bz/music/deep_ambient_a +event:/bz/music/deep_lily_pads +event:/bz/music/deep_twisty_bridges +event:/bz/music/deep_twisty_bridges_temp +event:/bz/music/disturbed +event:/bz/music/enter_phi_stinger +event:/bz/music/falling_through_the_ice +event:/bz/music/flowers +event:/bz/music/frozen_leviathan +event:/bz/music/frozen_river +event:/bz/music/gen_shallows +event:/bz/music/glacial_basin +event:/bz/music/glacial_trees +event:/bz/music/glitch +event:/bz/music/haze +event:/bz/music/iceberg_a +event:/bz/music/jellyfish +event:/bz/music/kelp_caves +event:/bz/music/light_rays +event:/bz/music/lily_pads +event:/bz/music/limestone +event:/bz/music/lithium +event:/bz/music/lurking +event:/bz/music/magnetite +event:/bz/music/marbled_anemone +event:/bz/music/marge_base_exterior +event:/bz/music/mineral_deposits +event:/bz/music/mining_site +event:/bz/music/mission_complete +event:/bz/music/mus_marge_cinematic_a +event:/bz/music/mus_marge_cinematic_b +event:/bz/music/mus_silence_120 +event:/bz/music/mus_silence_180 +event:/bz/music/mus_silence_20 +event:/bz/music/mus_silence_30 +event:/bz/music/mus_silence_50 +event:/bz/music/mus_silence_80 +event:/bz/music/necklace_stinger +event:/bz/music/new_blueprint_stinger +event:/bz/music/night +event:/bz/music/permafrost +event:/bz/music/phi_robotics +event:/bz/music/purple_vents +event:/bz/music/reflect +event:/bz/music/relics +event:/bz/music/safe_cave_01 +event:/bz/music/safe_cave_02 +event:/bz/music/salt_water +event:/bz/music/seabed +event:/bz/music/singing_sea +event:/bz/music/spectre +event:/bz/music/spy_penguin +event:/bz/music/tension +event:/bz/music/terror_from_the_deep +event:/bz/music/the_dark +event:/bz/music/the_hidden +event:/bz/music/thermals +event:/bz/music/tree_spires +event:/bz/music/twisty_bridges +event:/bz/music/twisty_bridges_temp +event:/bz/music/vocals +event:/bz/music/waves +event:/bz/music/welcome_to_4546B +event:/bz/PDA/story/hint_crystalcavern_leviathan +event:/bz/PDA/story/hint_deep_purple_vents +event:/bz/PDA/story/hint_east_iceberg_caldera +event:/bz/PDA/story/hint_east_iceberg_interior +event:/bz/PDA/story/hint_mega_island +event:/bz/PDA/story/hint_shipwreck_01 +event:/bz/PDA/story/hint_shipwreck_02 +event:/bz/PDA/story/hint_thermalspires_crevice +event:/bz/PDA/story/hint_treespires_biome +event:/bz/PDA/story/hint_treespires_crevice +event:/bz/PDA/story/hint_treespires_tree +event:/bz/PDA/story/hint_west_iceberg_interior +event:/bz/PDA/story/hint_west_kelpcave +event:/bz/PDA/story/log_glacialbasinbeacon +event:/bz/PDA/story/log_pda_alan_sos +event:/bz/PDA/warning_blips/food_critical_blip +event:/bz/PDA/warning_blips/hypothermia_imminent_blip +event:/bz/PDA/warning_blips/invalid_construction_blip +event:/bz/PDA/warning_blips/oxygen_critical_blip +event:/bz/PDA/warning_blips/water_critical_blip +event:/bz/PDA/warning_dangerous_weather +event:/bz/PDA/warning_hypothermia +event:/bz/PDA/world/log_delta_island_beacon +event:/bz/PDA/world/log_pda_airbladder +event:/bz/PDA/world/log_pda_alreadyhaveblueprint +event:/bz/PDA/world/log_pda_aromatherapylamp +event:/bz/PDA/world/log_pda_batterycharger +event:/bz/PDA/world/log_pda_beacon +event:/bz/PDA/world/log_pda_boostertank +event:/bz/PDA/world/log_pda_builder +event:/bz/PDA/world/log_pda_coffeemachine +event:/bz/PDA/world/log_pda_coldsuit +event:/bz/PDA/world/log_pda_controlroom +event:/bz/PDA/world/log_pda_enteringvoid +event:/bz/PDA/world/log_pda_executivetoy +event:/bz/PDA/world/log_pda_exosuit +event:/bz/PDA/world/log_pda_flare +event:/bz/PDA/world/log_pda_fruitsalad +event:/bz/PDA/world/log_pda_growbed +event:/bz/PDA/world/log_pda_headlamp +event:/bz/PDA/world/log_pda_hoverpad +event:/bz/PDA/world/log_pda_ioncube +event:/bz/PDA/world/log_pda_jukebox +event:/bz/PDA/world/log_pda_marg_postjump +event:/bz/PDA/world/log_pda_mineraldetector +event:/bz/PDA/world/log_pda_motivationalposter +event:/bz/PDA/world/log_pda_outpostzero +event:/bz/PDA/world/log_pda_oxygentank +event:/bz/PDA/world/log_pda_pathfinder +event:/bz/PDA/world/log_pda_purificationtablet +event:/bz/PDA/world/log_pda_rebreather +event:/bz/PDA/world/log_pda_recyclotron +event:/bz/PDA/world/log_pda_ribbonplant +event:/bz/PDA/world/log_pda_scannerroom +event:/bz/PDA/world/log_pda_seaglide +event:/bz/PDA/world/log_pda_seatruck +event:/bz/PDA/world/log_pda_sleepermodule +event:/bz/PDA/world/log_pda_spypengling +event:/bz/PDA/world/log_pda_teleportationmodule +event:/bz/PDA/world/log_pda_tethertool +event:/bz/PDA/world/log_pda_thermos +event:/bz/PDA/world/log_pda_thumper +event:/bz/PDA/world/log_pda_waterpark +event:/bz/PDA/world/log_seatruck_hint +event:/bz/PDA/world/log_vesper_earlycachesignal +event:/bz/PDA/world/on_build_essentials +event:/bz/PDA/world/on_pickup_builder +event:/bz/Player/body_impact +event:/bz/Player/bodytemp +event:/bz/Player/breathe_cold +event:/bz/Player/breathing +event:/bz/Player/burn_damage +event:/bz/Player/death +event:/bz/Player/dream_loop +event:/bz/Player/drink +event:/bz/Player/drink +event:/bz/Player/drowning +event:/bz/Player/eat +event:/bz/Player/emerge_horizontal +event:/bz/Player/emote/clasped/clasped_vo +event:/bz/Player/emote/clasped/loop +event:/bz/Player/emote/cover_eyes/cover_eyes_vo +event:/bz/Player/emote/cover_eyes/loop +event:/bz/Player/emote/creature_ride_vo +event:/bz/Player/emote/downpour/downpour_vo +event:/bz/Player/emote/downpour/loop +event:/bz/Player/emote/grossed_out_vo +event:/bz/Player/emote/hands_cupped/hands_cupped_breathing_vo +event:/bz/Player/emote/hands_cupped/loop +event:/bz/Player/emote/hungry_vo +event:/bz/Player/emote/iceworm_cine_breach_vo +event:/bz/Player/emote/lightning/foley +event:/bz/Player/emote/lightning/lightning_vo +event:/bz/Player/emote/rubbing/hand_rub_in +event:/bz/Player/emote/rubbing/hand_rub_out +event:/bz/Player/emote/rubbing/loop +event:/bz/Player/emote/rubbing/rubbing_vo +event:/bz/Player/emote/seamonkey_taunt_vo +event:/bz/Player/emote/snowball_throw_vo +event:/bz/Player/emote/snowball_throw_vo +event:/bz/Player/emote/snowstalkerbaby_jumpback_vo +event:/bz/Player/emote/snowstalkerbaby_offerfruit_vo +event:/bz/Player/emote/snowstalkerbaby_pet_vo +event:/bz/Player/emote/trivalve_feed_scared_vo +event:/bz/Player/emote/trivalve_feed_vo +event:/bz/Player/emote/trivalve_peekaboo_vo +event:/bz/Player/emote/trivalve_pet_vo +event:/bz/Player/emote/trivalve_wave_vo +event:/bz/Player/emote/warming/loop +event:/bz/Player/emote/warming/warming_vo +event:/bz/Player/first_use/air_bladder +event:/bz/Player/first_use/flashlight +event:/bz/Player/first_use/frolo_necklace +event:/bz/Player/first_use/knife +event:/bz/Player/first_use/metal_detector +event:/bz/Player/first_use/repulsion_cannon +event:/bz/Player/first_use/scanner +event:/bz/Player/first_use/spy_penguin +event:/bz/Player/footstep +event:/bz/Player/footstep_dirt +event:/bz/Player/footstep_ice +event:/bz/Player/footstep_metal +event:/bz/Player/footstep_snow +event:/bz/Player/footstep_snow_dismount +event:/bz/Player/hey +event:/bz/Player/hurt_impact_attack +event:/bz/Player/hurt_impact_landing +event:/bz/Player/hypothermia +event:/bz/Player/intro_01 +event:/bz/Player/intro_02 +event:/bz/Player/jump +event:/bz/Player/ladder/climbdown_off +event:/bz/Player/ladder/climbdown_on +event:/bz/Player/ladder/climbup_off +event:/bz/Player/ladder/climbup_on +event:/bz/Player/ladder/ladder_step +event:/bz/Player/ladder/monopool_ladder_down +event:/bz/Player/ladder/monopool_ladder_up +event:/bz/Player/land +event:/bz/Player/pain +event:/bz/Player/pain_no_tank +event:/bz/Player/pain_no_tank_light +event:/bz/Player/pain_surface +event:/bz/Player/pickup_brain +event:/bz/Player/pickup_cat_picture_firsttime +event:/bz/Player/pickup_sams_picture_firsttime +event:/bz/Player/puke +event:/bz/Player/puke_underwater +event:/bz/Player/shiver_emote +event:/bz/Player/submerge_horizontal +event:/bz/Player/surface +event:/bz/Player/surface_no_air +event:/bz/Player/veg_swim +event:/bz/Player/warming_emote +event:/bz/tools/air_bladder/equip +event:/bz/tools/air_bladder/equip_fill_air +event:/bz/tools/air_bladder/put_away +event:/bz/tools/air_bladder/use +event:/bz/tools/aromatherapy_lamp/aromatherapy_click_off +event:/bz/tools/aromatherapy_lamp/aromatherapy_loop +event:/bz/tools/beacon_land/deploy +event:/bz/tools/beacon_land/loop +event:/bz/tools/build_tool/deconstruct +event:/bz/tools/extractor/get_another_sample +event:/bz/tools/extractor/get_sample +event:/bz/tools/extractor_computer/amb_loop +event:/bz/tools/extractor_computer/extraction_complete +event:/bz/tools/extractor_computer/initiate_extraction +event:/bz/tools/gel_sack/gel_sack_use +event:/bz/tools/gen_drop/alientech +event:/bz/tools/gen_drop/brain +event:/bz/tools/gen_drop/ceramic +event:/bz/tools/gen_drop/cloth +event:/bz/tools/gen_drop/dry +event:/bz/tools/gen_drop/egg +event:/bz/tools/gen_drop/food +event:/bz/tools/gen_drop/glass +event:/bz/tools/gen_drop/liquid +event:/bz/tools/gen_drop/metal +event:/bz/tools/gen_drop/paper +event:/bz/tools/gen_drop/plant +event:/bz/tools/gen_drop/plastic +event:/bz/tools/gen_drop/rock +event:/bz/tools/gen_drop/seed +event:/bz/tools/gen_drop/tech +event:/bz/tools/gen_drop/weapon +event:/bz/tools/gen_drop/wet +event:/bz/tools/gen_insert/alientech +event:/bz/tools/gen_insert/ceramic +event:/bz/tools/gen_insert/cloth +event:/bz/tools/gen_insert/dry +event:/bz/tools/gen_insert/egg +event:/bz/tools/gen_insert/glass +event:/bz/tools/gen_insert/liquid +event:/bz/tools/gen_insert/meat +event:/bz/tools/gen_insert/metal +event:/bz/tools/gen_insert/paper +event:/bz/tools/gen_insert/plant +event:/bz/tools/gen_insert/plastic +event:/bz/tools/gen_insert/rock +event:/bz/tools/gen_insert/seed +event:/bz/tools/gen_insert/tech +event:/bz/tools/gen_insert/wet +event:/bz/tools/gen_pickup/alientech +event:/bz/tools/gen_pickup/arm_foley +event:/bz/tools/gen_pickup/ceramic +event:/bz/tools/gen_pickup/cloth +event:/bz/tools/gen_pickup/dry +event:/bz/tools/gen_pickup/egg +event:/bz/tools/gen_pickup/food +event:/bz/tools/gen_pickup/glass +event:/bz/tools/gen_pickup/liquid +event:/bz/tools/gen_pickup/metal +event:/bz/tools/gen_pickup/paper +event:/bz/tools/gen_pickup/plastic +event:/bz/tools/gen_pickup/rock +event:/bz/tools/gen_pickup/seed +event:/bz/tools/gen_pickup/tech +event:/bz/tools/gen_pickup/weapon +event:/bz/tools/gen_pickup/wet +event:/bz/tools/hoverpad/arm_down +event:/bz/tools/hoverpad/arm_up +event:/bz/tools/hoverpad/build_finish +event:/bz/tools/hoverpad/build_loop +event:/bz/tools/hoverpad/build_start +event:/bz/tools/hoverpad/left_servo_loop +event:/bz/tools/hoverpad/park +event:/bz/tools/hoverpad/right_servo_loop +event:/bz/tools/hoverpad/rotate_bike_ready +event:/bz/tools/hoverpad/rotate_end +event:/bz/tools/hoverpad/rotate_loop +event:/bz/tools/hoverpad/rotate_start +event:/bz/tools/hoverpad/unpark_left +event:/bz/tools/hoverpad/unpark_right +event:/bz/tools/knife/equip +event:/bz/tools/knife/impact +event:/bz/tools/knife/put_away +event:/bz/tools/knife/swing +event:/bz/tools/knife/swing_underwater +event:/bz/tools/metal_detector/bash +event:/bz/tools/metal_detector/battery_swap +event:/bz/tools/metal_detector/beep +event:/bz/tools/metal_detector/button +event:/bz/tools/metal_detector/deploy +event:/bz/tools/metal_detector/holster +event:/bz/tools/metal_detector/scan_loop +event:/bz/tools/music_disk/aquired +event:/bz/tools/pendulum/pendulum_hit +event:/bz/tools/pendulum/pendulum_turn_off +event:/bz/tools/pendulum/pendulum_turn_on +event:/bz/tools/quantum_locker/bash +event:/bz/tools/quantum_locker/close +event:/bz/tools/quantum_locker/deploy +event:/bz/tools/quantum_locker/equip +event:/bz/tools/quantum_locker/hover_loop +event:/bz/tools/quantum_locker/open +event:/bz/tools/quantum_locker/steam +event:/bz/tools/quantum_locker/unequip +event:/bz/tools/recyclotron/break_down +event:/bz/tools/recyclotron/close +event:/bz/tools/recyclotron/open +event:/bz/tools/repair_tool/use_loop_gen +event:/bz/tools/repair_tool/use_loop_repairing +event:/bz/tools/rocket/launch +event:/bz/tools/rocket/launch +event:/bz/tools/rocket/launch_button +event:/bz/tools/rocket/repair_complete +event:/bz/tools/rocket/repair_progress +event:/bz/tools/rocket/side_close +event:/bz/tools/rocket/side_open +event:/bz/tools/rocket/storage_load +event:/bz/tools/rocket/storage_open +event:/bz/tools/seamoth/equip +event:/bz/tools/seamoth/put_away +event:/bz/tools/snowball/impact +event:/bz/tools/snowball/pickup +event:/bz/tools/snowball/throw +event:/bz/tools/spypenguin/border_off +event:/bz/tools/spypenguin/border_on +event:/bz/tools/spypenguin/camera_error +event:/bz/tools/spypenguin/camera_movement_loop +event:/bz/tools/spypenguin/catch_fail +event:/bz/tools/spypenguin/catch_success +event:/bz/tools/spypenguin/deploy +event:/bz/tools/spypenguin/deploy_camera +event:/bz/tools/spypenguin/equip +event:/bz/tools/spypenguin/first_use +event:/bz/tools/spypenguin/grab +event:/bz/tools/spypenguin/hint_loop +event:/bz/tools/spypenguin/idle loop +event:/bz/tools/spypenguin/movement_loop +event:/bz/tools/spypenguin/punch +event:/bz/tools/spypenguin/retract_camera +event:/bz/tools/spypenguin/rotation_loop +event:/bz/tools/spypenguin/self_destruct +event:/bz/tools/spypenguin/take_picture +event:/bz/tools/spypenguin/unequip +event:/bz/tools/spypenguin/vo_camera +event:/bz/tools/spypenguin/vo_destruct +event:/bz/tools/spypenguin/vo_enter +event:/bz/tools/spypenguin/vo_exit +event:/bz/tools/spypenguin/vo_horn +event:/bz/tools/spypenguin/vo_love +event:/bz/tools/spypenguin/vo_maxstorage +event:/bz/tools/spypenguin/vo_picture +event:/bz/tools/spypenguin/vo_rebuilt +event:/bz/tools/spypenguin/vo_selfdestruct +event:/bz/tools/spypenguin/vo_wall +event:/bz/tools/suit_booster/use_loop +event:/bz/tools/supply_drop/appear +event:/bz/tools/supply_drop/drop_loop +event:/bz/tools/supply_drop/hit_seafloor +event:/bz/tools/thermos/bash +event:/bz/tools/thermos/cap_on +event:/bz/tools/thermos/drink +event:/bz/tools/thermos/equip +event:/bz/tools/thermos/unequip +event:/bz/tools/thermos/unequip_no_cap +event:/bz/tools/thumper/device_deploy +event:/bz/tools/thumper/equip +event:/bz/tools/thumper/loop +event:/bz/tools/thumper/pickup +event:/bz/tools/thumper/player_deploy +event:/bz/tools/thumper/thump +event:/bz/tools/thumper/unequip +event:/bz/tools/tool_powered_down +event:/bz/tools/ui/pickup_alientech +event:/bz/tools/ui/pickup_brain +event:/bz/tools/ui/pickup_ceramic +event:/bz/tools/ui/pickup_cloth +event:/bz/tools/ui/pickup_dry +event:/bz/tools/ui/pickup_egg +event:/bz/tools/ui/pickup_food +event:/bz/tools/ui/pickup_glass +event:/bz/tools/ui/pickup_liquid +event:/bz/tools/ui/pickup_metal +event:/bz/tools/ui/pickup_paper +event:/bz/tools/ui/pickup_plant +event:/bz/tools/ui/pickup_plastic +event:/bz/tools/ui/pickup_rock +event:/bz/tools/ui/pickup_seed +event:/bz/tools/ui/pickup_tech +event:/bz/tools/ui/pickup_weapon +event:/bz/tools/ui/pickup_wet +event:/bz/tools/ui/put_down +event:/bz/ui/action_prompt +event:/bz/ui/alan/data_entry_unlock +event:/bz/ui/alan/ring_loop +event:/bz/ui/alan/slide_window_away +event:/bz/ui/blueprint_unlocked +event:/bz/ui/data_entry/slide_window_away +event:/bz/ui/data_entry/unlock +event:/bz/ui/encyclopedia_unlock +event:/bz/ui/gen_click +event:/bz/ui/intro_alarmclock +event:/bz/ui/item_error +event:/bz/ui/journal_unlocked +event:/bz/ui/loading_screen +event:/bz/ui/options_screen/apply +event:/bz/ui/options_screen/checkmark_off +event:/bz/ui/options_screen/checkmark_on +event:/bz/ui/options_screen/slider_click_off +event:/bz/ui/options_screen/slider_click_on +event:/bz/ui/options_screen/slider_move_down +event:/bz/ui/options_screen/slider_move_up +event:/bz/ui/pause_screen/click_back +event:/bz/ui/pause_screen/click_forward +event:/bz/ui/pause_screen/click_quit +event:/bz/ui/pause_screen/mouseover +event:/bz/ui/pause_screen/pause_enter +event:/bz/ui/pause_screen/pause_exit +event:/bz/ui/pause_screen/quit_to_desktop +event:/bz/ui/pda/blueprint_toggle_all +event:/bz/ui/pda/blueprint_toggle_off +event:/bz/ui/pda/blueprint_toggle_on +event:/bz/ui/pda/entry_open +event:/bz/ui/pda/entry_open +event:/bz/ui/pda/mouseover +event:/bz/ui/pda/mouseover +event:/bz/ui/pda/pda_pause_snapshot +event:/bz/ui/pda/sidebar_close +event:/bz/ui/pda/sidebar_close +event:/bz/ui/pda/sidebar_open +event:/bz/ui/pda/sidebar_open +event:/bz/ui/pda/sos_3x +event:/bz/ui/pda/sos_6x +event:/bz/ui/pda/tab_top +event:/bz/ui/pda/tab_top +event:/bz/ui/phone_call/answer +event:/bz/ui/phone_call/ring_loop +event:/bz/ui/screen_crack_hurt +event:/bz/ui/story_unlocked +event:/bz/vehicles/gen/pack +event:/bz/vehicles/hoverbike/boost +event:/bz/vehicles/hoverbike/creak +event:/bz/vehicles/hoverbike/dismount +event:/bz/vehicles/hoverbike/engine +event:/bz/vehicles/hoverbike/explode +event:/bz/vehicles/hoverbike/fall +event:/bz/vehicles/hoverbike/fall_get_up +event:/bz/vehicles/hoverbike/fall_land +event:/bz/vehicles/hoverbike/fall_launch +event:/bz/vehicles/hoverbike/idle +event:/bz/vehicles/hoverbike/impact +event:/bz/vehicles/hoverbike/jump +event:/bz/vehicles/hoverbike/land +event:/bz/vehicles/hoverbike/light_off +event:/bz/vehicles/hoverbike/light_on +event:/bz/vehicles/hoverbike/mount +event:/bz/vehicles/hoverbike/power_off +event:/bz/vehicles/hoverbike/remote_activate +event:/bz/vehicles/hoverbike/remote_deactivate +event:/bz/vehicles/hoverbike/remote_equip +event:/bz/vehicles/hoverbike/remote_unequip +event:/bz/vehicles/hoverbike/spark +event:/bz/vehicles/hoverbike/spark_damage_long +event:/bz/vehicles/hoverbike/spark_damage_short +event:/bz/vehicles/hoverbike/sparks +event:/bz/vehicles/hoverbike/turn +event:/bz/vehicles/hoverbike/unpack_from_hand +event:/bz/vehicles/hoverbike/unpack_from_inventory +event:/bz/vehicles/hoverbike/upgrade_access +event:/bz/vehicles/hoverbike/upgrade_add +event:/bz/vehicles/hoverbike/wind +event:/bz/vehicles/prawnsuit/access_upgrades +event:/bz/vehicles/prawnsuit/boost_loop +event:/bz/vehicles/prawnsuit/breach +event:/bz/vehicles/prawnsuit/close_upgrades +event:/bz/vehicles/prawnsuit/exit +event:/bz/vehicles/prawnsuit/impact +event:/bz/vehicles/prawnsuit/land +event:/bz/vehicles/prawnsuit/storage_close +event:/bz/vehicles/prawnsuit/storage_open +event:/bz/vehicles/prawnsuit/submerge +event:/bz/vehicles/seatruck/afterburner +event:/bz/vehicles/seatruck/dismount +event:/bz/vehicles/seatruck/dock +event:/bz/vehicles/seatruck/engine +event:/bz/vehicles/seatruck/exosuit/attach +event:/bz/vehicles/seatruck/exosuit/computerpad_down +event:/bz/vehicles/seatruck/exosuit/computerpad_up +event:/bz/vehicles/seatruck/exosuit/detatch +event:/bz/vehicles/seatruck/exosuit/enter +event:/bz/vehicles/seatruck/exosuit/exit +event:/bz/vehicles/seatruck/exosuit/exo_turn_loop +event:/bz/vehicles/seatruck/exosuit/ladder_climb +event:/bz/vehicles/seatruck/exosuit/ladder_grab +event:/bz/vehicles/seatruck/explode +event:/bz/vehicles/seatruck/get_up +event:/bz/vehicles/seatruck/grab_outside +event:/bz/vehicles/seatruck/impact +event:/bz/vehicles/seatruck/install_upgrade +event:/bz/vehicles/seatruck/joystick_movement +event:/bz/vehicles/seatruck/jump_from_water +event:/bz/vehicles/seatruck/jump_into_water +event:/bz/vehicles/seatruck/ladder_climb +event:/bz/vehicles/seatruck/ladder_grab +event:/bz/vehicles/seatruck/left_button_click +event:/bz/vehicles/seatruck/left_lever_movement +event:/bz/vehicles/seatruck/let_go +event:/bz/vehicles/seatruck/leverpull_down +event:/bz/vehicles/seatruck/leverpull_up +event:/bz/vehicles/seatruck/light_off +event:/bz/vehicles/seatruck/light_on +event:/bz/vehicles/seatruck/monopool_charge_end +event:/bz/vehicles/seatruck/monopool_charge_loop +event:/bz/vehicles/seatruck/monopool_charge_start +event:/bz/vehicles/seatruck/monopool_dock +event:/bz/vehicles/seatruck/monopool_undock_left +event:/bz/vehicles/seatruck/monopool_undock_right +event:/bz/vehicles/seatruck/mount +event:/bz/vehicles/seatruck/new_dock_dock +event:/bz/vehicles/seatruck/new_dock_undock +event:/bz/vehicles/seatruck/pilot +event:/bz/vehicles/seatruck/sit_down +event:/bz/vehicles/seatruck/sleepermodule/close +event:/bz/vehicles/seatruck/sleepermodule/get_in +event:/bz/vehicles/seatruck/sleepermodule/get_out +event:/bz/vehicles/seatruck/sleepermodule/open +event:/bz/vehicles/seatruck/surface +event:/bz/vehicles/seatruck/teleport/activate +event:/bz/vehicles/seatruck/teleport/cannot_use +event:/bz/vehicles/seatruck/teleport/end +event:/bz/vehicles/seatruck/teleport/equip +event:/bz/vehicles/seatruck/teleport/loop +event:/bz/vehicles/seatruck/teleport/place_crystal +event:/bz/vehicles/seatruck/teleport/put_away +event:/bz/vehicles/seatruck/undock +event:/bz/vehicles/seatruck/unpilot +event:/bz/vo/alan/bodytransfer/log_alan_bodytransfer +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_01 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_02 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_02b +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_02c +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_03 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_04 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_05 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_06 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_07 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_08 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_09 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_10 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_11 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_12 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_13 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_14 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_15 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_16 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_17 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_18 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_19 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_20 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_21 +event:/bz/vo/alan/bodytransfer/log_comment_bodytransfer_22 +event:/bz/vo/alan/log_alan_bodybuilt +event:/bz/vo/alan/log_alan_bodyscan_posttransfer +event:/bz/vo/alan/log_alan_bunker +event:/bz/vo/alan/log_alan_creaturesite01 +event:/bz/vo/alan/log_alan_creaturesite02 +event:/bz/vo/alan/log_alan_creaturesite03 +event:/bz/vo/alan/log_alan_creaturesite05 +event:/bz/vo/alan/log_alan_creaturesite06 +event:/bz/vo/alan/log_alan_finishsam_hint +event:/bz/vo/alan/log_alan_inside_outpost0 +event:/bz/vo/alan/log_alan_outside_outpost0 +event:/bz/vo/alan/log_alan_sam_outpost0 +event:/bz/vo/alan/log_alan_sam_phi_work +event:/bz/vo/alan/log_call_alan_alterrafeels +event:/bz/vo/alan/log_call_alan_body_1_clue_01 +event:/bz/vo/alan/log_call_alan_body_1_clue_02_01 +event:/bz/vo/alan/log_call_alan_body_2_clue_01_01 +event:/bz/vo/alan/log_call_alan_body_2_clue_01_01alt +event:/bz/vo/alan/log_call_alan_body_2_clue_02_01 +event:/bz/vo/alan/log_call_alan_body_3_clue_01_01 +event:/bz/vo/alan/log_call_alan_body_3_clue_02_01 +event:/bz/vo/alan/log_call_alan_body_firstfound_01 +event:/bz/vo/alan/log_call_alan_body_organ +event:/bz/vo/alan/log_call_alan_body_skeleton +event:/bz/vo/alan/log_call_alan_body_skeleton_alt +event:/bz/vo/alan/log_call_alan_body_tissue +event:/bz/vo/alan/log_call_alan_body_tissue_alt +event:/bz/vo/alan/log_call_alan_bodyfound_1 +event:/bz/vo/alan/log_call_alan_bodyfound_2 +event:/bz/vo/alan/log_call_alan_bodyfound_3 +event:/bz/vo/alan/log_call_alan_bodyfound_3_nofab +event:/bz/vo/alan/log_call_alan_bodyfound_3_yesfab +event:/bz/vo/alan/log_call_alan_destroyedlab +event:/bz/vo/alan/log_call_alan_heal_frolo +event:/bz/vo/alan/log_call_alan_meet +event:/bz/vo/alan/log_call_alan_meetmarg +event:/bz/vo/alan/log_call_alan_monkeygift +event:/bz/vo/alan/log_call_alan_monkeygiftrock +event:/bz/vo/alan/log_call_alan_precursoratrifact_found1 +event:/bz/vo/alan/log_call_alan_precursoratrifact_found2 +event:/bz/vo/alan/log_call_alan_precursoratrifact_found3 +event:/bz/vo/alan/log_call_alan_precursoratrifact_found4 +event:/bz/vo/alan/log_call_alan_sam_excavation +event:/bz/vo/alan/log_call_alan_sam_outpost0 +event:/bz/vo/alan/log_call_alan_sam_phi +event:/bz/vo/alan/log_call_body_request_01 +event:/bz/vo/alan/log_comment_artifactsignal_1 +event:/bz/vo/alan/log_comment_artifactsignal_2 +event:/bz/vo/alan/log_comment_artifactsignal_3 +event:/bz/vo/alan/log_comment_artifactsignal_4 +event:/bz/vo/alan/log_comment_artifactsignal_5 +event:/bz/vo/alan/log_comment_artifactsignal_6 +event:/bz/vo/alan/log_comment_aside_approachphasegate +event:/bz/vo/alan/log_comment_aside_hatchedtrivalve +event:/bz/vo/alan/log_comment_aside_jukeboxmusic +event:/bz/vo/alan/log_comment_aside_koppaminingsite_ruby +event:/bz/vo/alan/log_comment_aside_lilypaddler +event:/bz/vo/alan/log_comment_aside_metalsalvage +event:/bz/vo/alan/log_comment_aside_phiteleporter +event:/bz/vo/alan/log_comment_aside_quartz +event:/bz/vo/alan/log_comment_aside_rockgrub +event:/bz/vo/alan/log_comment_aside_silver +event:/bz/vo/alan/log_comment_aside_sleepwithalan +event:/bz/vo/alan/log_comment_bodybuilt_01 +event:/bz/vo/alan/log_comment_bodybuilt_02 +event:/bz/vo/alan/log_comment_bodybuilt_03 +event:/bz/vo/alan/log_comment_bodybuilt_04 +event:/bz/vo/alan/log_comment_bodybuilt_05 +event:/bz/vo/alan/log_comment_bodybuilt_06 +event:/bz/vo/alan/log_comment_bodybuilt_07 +event:/bz/vo/alan/log_comment_bodyfabricatorready +event:/bz/vo/alan/log_comment_bodyfacility_01 +event:/bz/vo/alan/log_comment_bodyfacility_allscans +event:/bz/vo/alan/log_comment_bodyfacility_buildingingredients_01 +event:/bz/vo/alan/log_comment_bodyfacility_clue_01 +event:/bz/vo/alan/log_comment_bodyfacility_needscans +event:/bz/vo/alan/log_comment_bodyfacility_return +event:/bz/vo/alan/log_comment_bodyscan_comment +event:/bz/vo/alan/log_comment_bodyscan_posttransfer_01 +event:/bz/vo/alan/log_comment_bodyscan_posttransfer_02 +event:/bz/vo/alan/log_comment_bodyscan_posttransfer_03 +event:/bz/vo/alan/log_comment_bodyscan_posttransfer_04 +event:/bz/vo/alan/log_comment_bodytransfer_pre_01 +event:/bz/vo/alan/log_comment_bodytransfer_pre_02 +event:/bz/vo/alan/log_comment_bridge +event:/bz/vo/alan/log_comment_build_1 +event:/bz/vo/alan/log_comment_build_2 +event:/bz/vo/alan/log_comment_build_3 +event:/bz/vo/alan/log_comment_bunker_phiexcavation_02 +event:/bz/vo/alan/log_comment_destroyed_lab +event:/bz/vo/alan/log_comment_emmanuelspace_01 +event:/bz/vo/alan/log_comment_inside_stationdelta_01 +event:/bz/vo/alan/log_comment_interact_posttransfer_01 +event:/bz/vo/alan/log_comment_lil_outpost0 +event:/bz/vo/alan/log_comment_meetmarg +event:/bz/vo/alan/log_comment_phiexcavation_01 +event:/bz/vo/alan/log_comment_radiotower_fixed_01 +event:/bz/vo/alan/log_comment_sam_phi_enter_01 +event:/bz/vo/alan/log_comment_sam_phi_personal_01 +event:/bz/vo/alan/log_comment_visitartifact_1 +event:/bz/vo/alan/log_comment_visitartifact_2 +event:/bz/vo/alan/log_comment_visitartifact_3_01 +event:/bz/vo/alan/log_comment_visitartifact_4_01 +event:/bz/vo/alan/log_comment_visitartifact_5_01 +event:/bz/vo/alan/log_comment_visitartifact_6_01 +event:/bz/vo/alan/log_comment_visitartifact_7_01 +event:/bz/vo/alan/log_comment_visitartifact_8_01 +event:/bz/vo/alan/log_comment_visitartifact_finished_01 +event:/bz/vo/alan/log_comment_visitartifact_hintarcticspires_01 +event:/bz/vo/alan/log_comment_visitartifact_hintcrystalcaverns_01 +event:/bz/vo/alan/log_comment_visitartifact_hintdeeplily_01 +event:/bz/vo/alan/log_creaturesite01 +event:/bz/vo/alan/log_creaturesite02 +event:/bz/vo/alan/log_creaturesite03 +event:/bz/vo/alan/log_creaturesite05 +event:/bz/vo/alan/log_creaturesite06 +event:/bz/vo/alan/log_robin_antidote +event:/bz/vo/alan/log_robin_antidoteknowing +event:/bz/vo/alan/log_robin_bunker +event:/bz/vo/alan/log_robin_finishsam_hint +event:/bz/vo/alan/log_robin_inside_outpost0 +event:/bz/vo/alan/log_robin_outside_outpost0 +event:/bz/vo/alan/log_robin_sam_outpost0 +event:/bz/vo/alan/log_voicemail_alan_alterrafeels +event:/bz/vo/alan/log_voicemail_alan_bodyfound_1 +event:/bz/vo/alan/log_voicemail_alan_bodyfound_2 +event:/bz/vo/alan/log_voicemail_alan_bodyfound_3_nofab +event:/bz/vo/alan/log_voicemail_alan_bodyfound_3_yesfab +event:/bz/vo/alan/log_voicemail_alan_destroyedlab +event:/bz/vo/alan/log_voicemail_alan_heal_frolo +event:/bz/vo/alan/log_voicemail_alan_meet +event:/bz/vo/alan/log_voicemail_alan_meetmarg +event:/bz/vo/alan/log_voicemail_alan_monkeygift +event:/bz/vo/alan/log_voicemail_alan_monkeygiftrock +event:/bz/vo/alan/log_voicemail_alan_precursorartifact_found3 +event:/bz/vo/alan/log_voicemail_alan_precursorartifact_found4 +event:/bz/vo/alan/log_voicemail_alan_precursoratrifact_found1 +event:/bz/vo/alan/log_voicemail_alan_precursoratrifact_found2 +event:/bz/vo/alan/log_voicemail_alan_sam_excavation +event:/bz/vo/alan/log_voicemail_alan_sam_outpost0 +event:/bz/vo/alan/log_voicemail_alan_sam_phi +event:/bz/vo/alterra/ency_alterra_rocketisland_sanctuaryhint1 +event:/bz/vo/alterra/encydesc_alexisreport_samdeath +event:/bz/vo/alterra/encydesc_alienresearchnotes +event:/bz/vo/alterra/encydesc_alterra_alexis_report +event:/bz/vo/alterra/encydesc_alterra_danielle_enzyme_report +event:/bz/vo/alterra/encydesc_alterra_delta_game +event:/bz/vo/alterra/encydesc_alterra_emmanuel_messagehome +event:/bz/vo/alterra/encydesc_alterra_emmanuel_staffmemo +event:/bz/vo/alterra/encydesc_alterra_fred_texthome +event:/bz/vo/alterra/encydesc_alterra_glacialbasin_sanctuaryhint1 +event:/bz/vo/alterra/encydesc_alterra_mining +event:/bz/vo/alterra/encydesc_alterra_parvan_family +event:/bz/vo/alterra/encydesc_alterra_parvan_gamenight +event:/bz/vo/alterra/encydesc_alterrabaseclue +event:/bz/vo/alterra/encydesc_floatingtechsite_pda +event:/bz/vo/alterra/encydesc_jeremiah_birds +event:/bz/vo/alterra/encydesc_jeremiah_shipwreck +event:/bz/vo/alterra/encydesc_lil_conversation_kids +event:/bz/vo/alterra/encydesc_parvan_patrolnotes +event:/bz/vo/alterra/encydesc_precursorpsychology +event:/bz/vo/alterra/encydesc_pregame_lil_warning +event:/bz/vo/alterra/encydesc_prop_samnecklace +event:/bz/vo/alterra/encydesc_seamonkey_complaint +event:/bz/vo/alterra/encydesc_seatruckdock1 +event:/bz/vo/alterra/encydesc_seatruckfragments_1 +event:/bz/vo/alterra/encydesc_seatruckfragments_2 +event:/bz/vo/alterra/encydesc_seatruckfragments_3 +event:/bz/vo/cinematic/alan_body_facility/clue_01 +event:/bz/vo/cinematic/end/p1_0100 +event:/bz/vo/cinematic/end/p1_0200 +event:/bz/vo/cinematic/end/p1_0300 +event:/bz/vo/cinematic/end/p1_0400 +event:/bz/vo/cinematic/end/p1_0500 +event:/bz/vo/cinematic/end/p1_0600 +event:/bz/vo/cinematic/end/p1_0700 +event:/bz/vo/cinematic/end/p1_0800 +event:/bz/vo/cinematic/end/p2_0100 +event:/bz/vo/cinematic/end/p2_0200 +event:/bz/vo/cinematic/end/p2_0300 +event:/bz/vo/cinematic/end/p2_0400 +event:/bz/vo/cinematic/end/p2_0500 +event:/bz/vo/cinematic/end/p2_0600 +event:/bz/vo/cinematic/end/p2_0700 +event:/bz/vo/cinematic/end/p2_0750 +event:/bz/vo/cinematic/end/p2_0800 +event:/bz/vo/cinematic/end/p2_0900 +event:/bz/vo/cinematic/end/p3_0100 +event:/bz/vo/cinematic/end/p3_0200 +event:/bz/vo/cinematic/end/p4_0100 +event:/bz/vo/cinematic/end/p4_0200 +event:/bz/vo/cinematic/end/p4_0300 +event:/bz/vo/cinematic/end/p4_0400 +event:/bz/vo/cinematic/end/p4_0500 +event:/bz/vo/cinematic/end/p4_0600 +event:/bz/vo/cinematic/end/p4_0700 +event:/bz/vo/cinematic/end/p4_0800 +event:/bz/vo/cinematic/end/p4_0900 +event:/bz/vo/cinematic/end/p7_0100 +event:/bz/vo/cinematic/end/p7_0200 +event:/bz/vo/cinematic/end/p7_0300 +event:/bz/vo/cinematic/end/p7_0400 +event:/bz/vo/cinematic/end/p7_0500 +event:/bz/vo/cinematic/intro/crashed_ship_welcome_vo +event:/bz/vo/cinematic/intro/hangar_01 +event:/bz/vo/cinematic/intro/hangar_0100 +event:/bz/vo/cinematic/intro/hangar_02 +event:/bz/vo/cinematic/intro/hangar_0200 +event:/bz/vo/cinematic/intro/hangar_0200_alt +event:/bz/vo/cinematic/intro/hangar_0300 +event:/bz/vo/cinematic/intro/hangar_0300_alt +event:/bz/vo/cinematic/intro/hangar_0400 +event:/bz/vo/cinematic/intro/hangar_0500 +event:/bz/vo/cinematic/intro/hangar_0600 +event:/bz/vo/cinematic/intro/hangar_0700 +event:/bz/vo/cinematic/intro/log_cine_intro_crashed +event:/bz/vo/cinematic/intro/log_cine_intro_hangar +event:/bz/vo/cinematic/intro/log_cine_intro_storm +event:/bz/vo/cinematic/intro/storm_02 +event:/bz/vo/cinematic/intro/storm_03 +event:/bz/vo/cinematic/intro/storm_05 +event:/bz/vo/cinematic/intro/storm_06 +event:/bz/vo/cinematic/intro/storm_07 +event:/bz/vo/cinematic/intro/storm_08 +event:/bz/vo/cinematic/marg_01/log_cine_marg1_rocket +event:/bz/vo/cinematic/marg_01/rocket_01 +event:/bz/vo/cinematic/marg_01/rocket_02 +event:/bz/vo/cinematic/marg_01/rocket_03 +event:/bz/vo/cinematic/marg_01/rocket_04 +event:/bz/vo/cinematic/marg_01/rocket_05 +event:/bz/vo/cinematic/marg_01/rocket_06 +event:/bz/vo/cinematic/marg_01/rocket_07 +event:/bz/vo/cinematic/marg_02/base_01 +event:/bz/vo/cinematic/marg_02/base_01_alt +event:/bz/vo/cinematic/marg_02/base_02 +event:/bz/vo/cinematic/marg_02/base_03 +event:/bz/vo/cinematic/marg_02/base_04 +event:/bz/vo/cinematic/marg_02/base_05 +event:/bz/vo/cinematic/marg_02/base_06 +event:/bz/vo/cinematic/marg_02/base_07 +event:/bz/vo/cinematic/marg_02/log_cine_marg2_base +event:/bz/vo/cinematic/marg_03/basereturn_01 +event:/bz/vo/cinematic/marg_03/basereturn_02 +event:/bz/vo/cinematic/marg_03/basereturn_03 +event:/bz/vo/cinematic/marg_03/basereturn_03_alt +event:/bz/vo/cinematic/marg_03/basereturn_04 +event:/bz/vo/cinematic/marg_03/basereturn_05 +event:/bz/vo/cinematic/marg_03/basereturn_06 +event:/bz/vo/cinematic/marg_03/basereturn_07 +event:/bz/vo/cinematic/marg_03/basereturn_07_alt +event:/bz/vo/cinematic/marg_03/log_cine_marg3_basereturn +event:/bz/vo/cinematic/meet_al/component_01 +event:/bz/vo/cinematic/meet_al/component_02 +event:/bz/vo/cinematic/meet_al/component_03 +event:/bz/vo/cinematic/meet_al/component_04 +event:/bz/vo/cinematic/meet_al/component_05 +event:/bz/vo/cinematic/meet_al/component_06 +event:/bz/vo/cinematic/meet_al/component_07 +event:/bz/vo/cinematic/meet_al/component_07_b +event:/bz/vo/cinematic/meet_al/component_08 +event:/bz/vo/cinematic/meet_al/component_09 +event:/bz/vo/cinematic/meet_al/component_10 +event:/bz/vo/cinematic/meet_al/component_11 +event:/bz/vo/cinematic/meet_al/component_12 +event:/bz/vo/cinematic/meet_al/component_14 +event:/bz/vo/cinematic/meet_al/component_16 +event:/bz/vo/cinematic/meet_al/component_17 +event:/bz/vo/cinematic/meet_al/entersanctuary +event:/bz/vo/cinematic/meet_al/forcefieldsdown +event:/bz/vo/cinematic/meet_al/log_cine_meetal_p3_mainchamber +event:/bz/vo/cinematic/meet_al/log_cine_meetal_p4_transfer +event:/bz/vo/cinematic/meet_al/log_cine_meetal_p5_component +event:/bz/vo/cinematic/meet_al/mainchamber +event:/bz/vo/cinematic/meet_al/mainchamber_01 +event:/bz/vo/cinematic/meet_al/mainchamber_02 +event:/bz/vo/cinematic/meet_al/mainchamber_03 +event:/bz/vo/cinematic/meet_al/mainchamber_04 +event:/bz/vo/cinematic/meet_al/mainchamber_05 +event:/bz/vo/cinematic/meet_al/transfer_01 +event:/bz/vo/cinematic/meet_al/transfer_02 +event:/bz/vo/cinematic/meet_al/transfer_03 +event:/bz/vo/cinematic/meet_al/transfer_04 +event:/bz/vo/cinematic/meet_al/transfer_05 +event:/bz/vo/cinematic/meet_al/transfer_06 +event:/bz/vo/crashed_ship/encydesc_mercury_diana_01 +event:/bz/vo/crashed_ship/encydesc_mercury_diana_02 +event:/bz/vo/crashed_ship/encydesc_mercury_diana_03 +event:/bz/vo/crashed_ship/encydesc_mercury_elliot_01 +event:/bz/vo/crashed_ship/encydesc_mercury_elliot_02 +event:/bz/vo/crashed_ship/encydesc_mercury_stefanos_01 +event:/bz/vo/crashed_ship/encydesc_mercury_stefanos_02 +event:/bz/vo/crashed_ship/encydesc_mercury_yasmine_01 +event:/bz/vo/crashed_ship/encydesc_mercury_yasmine_02 +event:/bz/vo/journals_robin/encydesc_journal_alan_download +event:/bz/vo/journals_robin/encydesc_journal_alan_history +event:/bz/vo/journals_robin/encydesc_journal_alan_monkeygift +event:/bz/vo/journals_robin/encydesc_journal_alan_monkeygiftrock +event:/bz/vo/journals_robin/encydesc_journal_alan_sam_outpost0 +event:/bz/vo/journals_robin/encydesc_journal_alan_sanctuary_sos_knowsarchitects +event:/bz/vo/journals_robin/encydesc_journal_alan_sanctuary_sos_noarchitects +event:/bz/vo/journals_robin/encydesc_journal_alan_sanctuary_sos_onesarchitectsite +event:/bz/vo/journals_robin/encydesc_journal_destroyedlab +event:/bz/vo/journals_robin/encydesc_journal_intro_crashed +event:/bz/vo/journals_robin/encydesc_journal_intro_depart +event:/bz/vo/journals_robin/encydesc_journal_intro_pod +event:/bz/vo/journals_robin/encydesc_journal_meetmarge +event:/bz/vo/journals_robin/encydesc_journal_monkeymeet +event:/bz/vo/journals_robin/encydesc_journal_robin_alterrafeels +event:/bz/vo/journals_robin/encydesc_journal_robin_heal_frolo +event:/bz/vo/journals_robin/encydesc_journal_robin_sam_excavation +event:/bz/vo/journals_robin/encydesc_journal_samphi +event:/bz/vo/journals_robin/encydesc_robin_journal_fins +event:/bz/vo/journals_robin/encydesc_robin_journal_mineral +event:/bz/vo/journals_robin/encydesc_robin_journal_scanner +event:/bz/vo/journals_robin/log_close_lilmessage +event:/bz/vo/journals_robin/log_journal_alan_download +event:/bz/vo/journals_robin/log_journal_alan_history +event:/bz/vo/journals_robin/log_journal_alan_monkeygift +event:/bz/vo/journals_robin/log_journal_alan_sanctuary_sos_combined +event:/bz/vo/journals_robin/log_journal_alan_sanctuary_sos_noarchitects +event:/bz/vo/journals_robin/log_journal_intro_crashed +event:/bz/vo/journals_robin/log_journal_intro_pod +event:/bz/vo/journals_robin/log_journal_marg_spypenglingbits +event:/bz/vo/journals_robin/log_journal_marg_spypenglingdata +event:/bz/vo/journals_robin/log_journal_meetmarg +event:/bz/vo/journals_robin/log_journal_monkeymeet +event:/bz/vo/journals_robin/log_journal_robin_heal_frolo +event:/bz/vo/journals_robin/log_robin_caveslair +event:/bz/vo/journals_robin/log_robin_deltaislandbeacon +event:/bz/vo/journals_robin/log_robin_destroyedlab +event:/bz/vo/journals_robin/log_robin_foundsamdanipicture +event:/bz/vo/journals_robin/log_robin_journal_fins +event:/bz/vo/journals_robin/log_robin_journal_mineral +event:/bz/vo/journals_robin/log_robin_journal_scanner +event:/bz/vo/journals_robin/log_robin_lil_outpost0 +event:/bz/vo/journals_robin/log_robin_map +event:/bz/vo/journals_robin/log_robin_margunknown +event:/bz/vo/journals_robin/log_robin_potatoandrobin +event:/bz/vo/journals_robin/log_robin_potatoportrait +event:/bz/vo/journals_robin/log_robin_radiotower +event:/bz/vo/journals_robin/log_robin_radiotower_fixed +event:/bz/vo/journals_robin/log_robin_radiotower_scans +event:/bz/vo/journals_robin/log_robin_radiotower_success +event:/bz/vo/journals_robin/log_robin_radiotower_tom +event:/bz/vo/journals_robin/log_robin_sam_necklace +event:/bz/vo/journals_robin/log_robin_sam_phi_work +event:/bz/vo/journals_robin/log_robin_shavingkit +event:/bz/vo/journals_robin/log_robin_staffmemo +event:/bz/vo/journals_robin/log_robin_startcold +event:/bz/vo/journals_robin/log_sanctuary_position_triangulated +event:/bz/vo/marg_comms/encydesc_gardening +event:/bz/vo/marg_comms/encydesc_marg_memoir_01 +event:/bz/vo/marg_comms/encydesc_marg_memoir_02 +event:/bz/vo/marg_comms/encydesc_marg_memoir_03 +event:/bz/vo/marg_comms/encydesc_marg_sam_chat +event:/bz/vo/marg_comms/log_call_marg_hackedradiotower +event:/bz/vo/marg_comms/log_maida_baseapproach +event:/bz/vo/marg_comms/log_maida_baseapproach_alt +event:/bz/vo/marg_comms/log_marg_base_goaway +event:/bz/vo/marg_comms/log_marg_deltaisland_goaway +event:/bz/vo/marg_comms/log_marg_inbase_greetrobin +event:/bz/vo/marg_comms/log_marg_scanresponse +event:/bz/vo/marg_comms/log_voicemail_marg_hackedradiotower +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_catpics +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_catpics_alt +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_fight +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_fight_alt +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_silence +event:/bz/vo/pregame/encydesc_pregame_hidden_sam_silence_alt +event:/bz/vo/pregame/encydesc_pregame_hidden_trouble +event:/bz/vo/pregame/encydesc_pregame_hidden_trouble_alt +event:/bz/vo/pregame/encydesc_pregame_sam_leaving +event:/bz/vo/pregame/encydesc_pregame_sam_leaving_alt +event:/bz/vo/sam/encydesc_alterra_dansam_evidence +event:/bz/vo/sam/encydesc_alterra_fredsam_curse +event:/bz/vo/sam/encydesc_alterra_glacialbasin_sanctuaryhint2 +event:/bz/vo/sam/encydesc_alterra_sam_phigamenight +event:/bz/vo/sam/encydesc_alterra_samdanielle_happy +event:/bz/vo/sam/encydesc_alterra_vinhsam_evidence +event:/bz/vo/sam/encydesc_alterra_zetasam_evidence +event:/bz/vo/sam/encydesc_colleagueslastpda +event:/bz/vo/sam/encydesc_sam_journal_lasthopes +event:/bz/vo/sam/encydesc_sam_organizing_conversation +event:/bz/vo/sam/encydesc_spypenguin_fragment +event:/bz/vo/sam/encydesc_spypenguin_fur +event:/bz/vo/sam/encydesc_spypenguin_sidestory +event:/creature/andi/1 +event:/creature/andi/2 +event:/creature/andi/a +event:/creature/andi/b +event:/creature/andi/c +event:/creature/andi/start +event:/creature/andi/stop +event:/creature/bird_small/flap +event:/creature/bird_small/idle +event:/creature/biter/bite_1 +event:/creature/biter/idle_1 +event:/creature/bleeder/attach_loop +event:/creature/bleeder/detach +event:/creature/bleeder/idle +event:/creature/bleeder/pain +event:/creature/bleeder/punch +event:/creature/blood_kelp_biter/bite +event:/creature/blood_kelp_biter/idle +event:/creature/bloodcrawler/attack +event:/creature/bloodcrawler/idle +event:/creature/boneshark/bite +event:/creature/boneshark/idle +event:/creature/boneshark/roar +event:/creature/crabsnake/alert +event:/creature/crabsnake/attack +event:/creature/crabsnake/attack_cine +event:/creature/crabsnake/idle_swim +event:/creature/crabsquid/attack +event:/creature/crabsquid/charge +event:/creature/crabsquid/emp +event:/creature/crabsquid/idle +event:/creature/crash/angry_loop +event:/creature/crash/attack +event:/creature/crash/die +event:/creature/crash/idle +event:/creature/crash/inflate +event:/creature/crash/open_pod +event:/creature/crawler/attack +event:/creature/crawler/idle +event:/creature/crawler/jump +event:/creature/cute_fish/command_follow +event:/creature/cute_fish/command_stay +event:/creature/cute_fish/death +event:/creature/cute_fish/flinch +event:/creature/cute_fish/idle +event:/creature/cute_fish/interact_feed +event:/creature/cute_fish/interact_hifive +event:/creature/cute_fish/interact_magic +event:/creature/cute_fish/interact_petting +event:/creature/cute_fish/say_bye +event:/creature/cute_fish/tease_1 +event:/creature/cute_fish/tease_2 +event:/creature/enzyme_cure +event:/creature/enzyme_treatment +event:/creature/garry/idle +event:/creature/gasopod/death +event:/creature/gasopod/idle +event:/creature/gasopod/pain +event:/creature/gasopod/pod_burst +event:/creature/gasopod/pod_release +event:/creature/ghostleviathan/bite +event:/creature/ghostleviathan/charge +event:/creature/ghostleviathan/idle +event:/creature/ghostray/idle +event:/creature/glowray/sing +event:/creature/jumper/idle +event:/creature/larva/attach +event:/creature/larva/idle +event:/creature/larva/pain +event:/creature/lavalizard/bite +event:/creature/lavalizard/charge +event:/creature/lavalizard/lava_dive +event:/creature/lavalizard/roar +event:/creature/lavalizard/spit +event:/creature/lavalizard/spit_hit +event:/creature/lavalizard/wound +event:/creature/magistrate/cin_baby_interact +event:/creature/magistrate/cin_emp_appear +event:/creature/magistrate/cin_emp_sand_clear +event:/creature/magistrate/cin_landing +event:/creature/magistrate/encounter_1 +event:/creature/magistrate/encounter_2 +event:/creature/magistrate/encounter_3 +event:/creature/magistrate/encounter_4 +event:/creature/magistrate/enzyme_ball_drop +event:/creature/magistrate/enzyme_spray +event:/creature/magistrate/face_loop +event:/creature/magistrate/idle +event:/creature/magistrate/roar +event:/creature/magistrate/say_hello +event:/creature/magistrate/speak +event:/creature/magistrate/swimloop +event:/creature/magistrate/telepathy_1 +event:/creature/magistrate/telepathy_2 +event:/creature/magistrate/telepathy_3 +event:/creature/mesmer/attack +event:/creature/mesmer/idle +event:/creature/mesmer/mesmerize_end +event:/creature/mesmer/mesmerize_loop +event:/creature/mesmer/mesmerize_start +event:/creature/oculus/idle +event:/creature/peeper/chirp +event:/creature/ray/sing +event:/creature/reaper/attack_player +event:/creature/reaper/attack_player_bite +event:/creature/reaper/attack_player_claw +event:/creature/reaper/attack_seamoth +event:/creature/reaper/idle +event:/creature/reefback/idle +event:/creature/robocrawler/attack +event:/creature/robocrawler/idle +event:/creature/robocrawler/jump +event:/creature/sandshark/alert +event:/creature/sandshark/attack +event:/creature/sandshark/bite +event:/creature/sandshark/burrow +event:/creature/sandshark/death +event:/creature/sandshark/idle +event:/creature/sandshark/move_sand +event:/creature/sandshark/pain +event:/creature/seadragon/attack_mech_cin +event:/creature/seadragon/attack_player_bite +event:/creature/seadragon/attack_player_claw +event:/creature/seadragon/fireattack_loop +event:/creature/seadragon/idle +event:/creature/shocker/bite +event:/creature/shocker/idle_loop +event:/creature/shocker/shock +event:/creature/spike_plant/player_hit +event:/creature/spike_plant/shoot +event:/creature/spine_eel/bite +event:/creature/spine_eel/idle +event:/creature/spine_eel/roar +event:/creature/tred/attack_down +event:/creature/tred/attack_down_nostomp +event:/creature/tred/attack_swing +event:/creature/tred/idle +event:/creature/tred/shit_fall +event:/creature/tred/shit_from_ass +event:/creature/tred/shit_sequence +event:/creature/tred/shit_sequence_2 +event:/creature/tred/step +event:/creature/tred/stomp +event:/creature/trident/bite +event:/creature/trident/charge +event:/creature/trident/death +event:/creature/trident/roar +event:/creature/trident/tooth_break +event:/creature/trident/wound +event:/creature/warper/idle +event:/creature/warper/portal_close +event:/creature/warper/portal_open +event:/creature/warper/swipe +event:/env/antechamber_lights_on +event:/env/antechamber_pillar_down +event:/env/antechamber_pillar_up +event:/env/antechamber_scan_end +event:/env/antechamber_scan_loop +event:/env/antechamber_scan_start +event:/env/arctic_wind_ambience +event:/env/aurora_sparks_loop +event:/env/background/arctic_background +event:/env/background/blood_kelp_background +event:/env/background/crash_zone +event:/env/background/debris_fall +event:/env/background/debris_fall_fire +event:/env/background/dunes_background +event:/env/background/fire +event:/env/background/floating_islands_background +event:/env/background/floating_islands_background +event:/env/background/generator_room +event:/env/background/grandreef_background +event:/env/background/grasy_background +event:/env/background/jellyshroom_caves +event:/env/background/kelp_background +event:/env/background/koosh_background +event:/env/background/lava_background +event:/env/background/lava_river_loop +event:/env/background/lost_river_background +event:/env/background/lostriverbase_background +event:/env/background/mountain_cave +event:/env/background/mountain_underwater +event:/env/background/mushroom_background +event:/env/background/prec_aquarium +event:/env/background/prec_base_background +event:/env/background/prec_base_background +event:/env/background/prec_cave_loop +event:/env/background/prec_generator_room_ambience +event:/env/background/reef_background +event:/env/background/shake +event:/env/background/ship_ambience +event:/env/background/ship_explode +event:/env/background/ship_explode_2 +event:/env/background/shockwave +event:/env/background/small_explode +event:/env/background/sparse_reef_background +event:/env/background/surface_generic_background +event:/env/background/tredpath +event:/env/background/twisty_bridges_background +event:/env/background/underislands_background +event:/env/background/vent_loop +event:/env/background/wreak ambience +event:/env/background/wreak_ambience_big +event:/env/break_coral +event:/env/bubble_pop +event:/env/bubble_pop_player +event:/env/close_underwater_door +event:/env/creature_teleport +event:/env/damage/acid_loop +event:/env/damage/cold_loop +event:/env/damage/heat_loop +event:/env/damage/pressure_loop +event:/env/damage/shock +event:/env/geyser_erupt +event:/env/green_artifact_loop +event:/env/gun_return +event:/env/gun_turn +event:/env/incubator_egg_hatch +event:/env/incubator_powerup +event:/env/input_number +event:/env/intro_alarm_klaxon +event:/env/jukebox +event:/env/keypad_correct +event:/env/keypad_door_open +event:/env/keypad_wrong +event:/env/koosh_ball_death +event:/env/koosh_ball_spores +event:/env/music/antechamber_music +event:/env/music/arctic_background_music +event:/env/music/aurora_reveal +event:/env/music/blood_kelp_background_music +event:/env/music/crash_zone_music +event:/env/music/death_music +event:/env/music/dunes_background_music +event:/env/music/exo_room_music +event:/env/music/firefighting_music +event:/env/music/floating_islands_background_music +event:/env/music/generator_room_music +event:/env/music/grandreef_background_music +event:/env/music/grasy_background (2)_music +event:/env/music/grasy_background_music +event:/env/music/hatch_music +event:/env/music/jellyshroom_caves_music +event:/env/music/kelp_background_music +event:/env/music/koosh_background_music +event:/env/music/lava_background_music +event:/env/music/lost_river_background_music +event:/env/music/lost_river_ghost_tree +event:/env/music/lostriver_tree +event:/env/music/lostriverbase_background_music +event:/env/music/mountain_underwater_music +event:/env/music/mushroom_background_music +event:/env/music/prec_aquarium_music +event:/env/music/prec_base_background_music +event:/env/music/prec_cave_music +event:/env/music/reef_background_music +event:/env/music/ship_ambience_music +event:/env/music/sparse_reef_background_music +event:/env/music/tredpath_music +event:/env/music/twisty_bridges_background_music +event:/env/music/underislands_background_music +event:/env/music/wreak ambience_music +event:/env/music/wreak_ambience_big_music +event:/env/music/wreak_ambience_big_music +event:/env/music/zen_music +event:/env/open_underwater_door +event:/env/pink_artifact_loop +event:/env/pipe_room_pipes_loop +event:/env/plant_cut +event:/env/power_teleporter +event:/env/prec_artifact_loop +event:/env/prec_foce_field_deactivate +event:/env/prec_forcefield_loop +event:/env/prec_light_on +event:/env/prec_light_on_2 +event:/env/prec_pillar_down +event:/env/prec_pillar_up +event:/env/prec_vent_enter +event:/env/prec_vent_exit +event:/env/prec_vent_loop +event:/env/shroom_in +event:/env/shroom_out +event:/env/slime_killed +event:/env/slime_stick +event:/env/splash +event:/env/teleporter_on_loop +event:/env/use_teleporter_use_loop +event:/env/weather +event:/featherfish/death +event:/featherfish/flinch +event:/featherfish/swimming +event:/hover_bike/hoverbike_impact_solid_hard +event:/hover_bike/hoverbike_impact_solid_medium +event:/hover_bike/hoverbike_impact_solid_soft +event:/hover_bike/hoverbike_loop +event:/hover_bike/hoverbike_loop_rpm +event:/hover_bike/hoverbike_rev_up +event:/hover_bike/hoverbike_stop +event:/interface/hover +event:/interface/new_recipe +event:/interface/off_long +event:/interface/on_glitchy +event:/interface/on_long +event:/interface/option_tweek +event:/interface/ping +event:/interface/placeholder +event:/interface/select +event:/interface/text_type +event:/jukebox/deep_twisty_bridges +event:/jukebox/glacial_basin +event:/jukebox/jukebox_deepblue +event:/jukebox/jukebox_deepdive +event:/jukebox/jukebox_diepeacefully +event:/jukebox/jukebox_divingintoodeep +event:/jukebox/jukebox_dontholdyourbreath +event:/jukebox/jukebox_one +event:/jukebox/jukebox_riteofthedeep +event:/jukebox/jukebox_slowburn +event:/jukebox/jukebox_subnauticstimulus +event:/jukebox/jukebox_survive +event:/jukebox/jukebox_takethedive +event:/jukebox/terror_from_the_deep +event:/jukebox/title_screen +event:/jukebox/tree_spires +event:/jukebox/twisty_bridges +event:/loot/break_breakable +event:/loot/databox/box_open +event:/loot/floater/floater_hold_loop +event:/loot/floater/floater_pickup +event:/loot/floater/floater_place +event:/loot/hit_breakable +event:/loot/loot_locker_open +event:/loot/new_PDA_data +event:/loot/pickup_advancedwiringkit +event:/loot/pickup_aluminumoxide +event:/loot/pickup_battery +event:/loot/pickup_bigwaterbottle +event:/loot/pickup_bleach +event:/loot/pickup_computerchip +event:/loot/pickup_copper +event:/loot/pickup_default +event:/loot/pickup_diamond +event:/loot/pickup_disinfectedwater +event:/loot/pickup_egg +event:/loot/pickup_filteredwater +event:/loot/pickup_fins +event:/loot/pickup_fish +event:/loot/pickup_glass +event:/loot/pickup_gold +event:/loot/pickup_lead +event:/loot/pickup_lithium +event:/loot/pickup_lubricant +event:/loot/pickup_magnesium +event:/loot/pickup_magnetite +event:/loot/pickup_organic +event:/loot/pickup_powercell +event:/loot/pickup_precursorioncrystal +event:/loot/pickup_quartz +event:/loot/pickup_reactorrod +event:/loot/pickup_salt +event:/loot/pickup_scrapmetal +event:/loot/pickup_seatreaderpoop +event:/loot/pickup_silver +event:/loot/pickup_suit +event:/loot/pickup_tank +event:/loot/pickup_titanium +event:/loot/pickup_uraninitecrystal +event:/loot/pickup_uranium +event:/loot/pickup_wiringkit +event:/loot/prec_crystal_loop +event:/main_menu/credits_music +event:/main_menu/intro +event:/main_menu/intro_background +event:/main_menu/intro_cin +event:/main_menu/intro_cin_music +event:/main_menu/menu_background +event:/main_menu/music +event:/main_menu/music_remaster +event:/main_menu/unmute_all +event:/player/Access_denied +event:/player/Access_granted +event:/player/AdviseSelfScan +event:/player/batterly_low +event:/player/blast_off +event:/player/blood_loss +event:/player/breathing +event:/player/bubbles +event:/player/change_mission +event:/player/cold_damage +event:/player/coughing +event:/player/cube terminal_close +event:/player/cube terminal_open +event:/player/cube terminal_use +event:/player/damage +event:/player/data_terminal_use +event:/player/depth_100 +event:/player/depth_200 +event:/player/drink +event:/player/drink_stillsuit +event:/player/eat +event:/player/elevator_down +event:/player/elevator_up +event:/player/end_freedive +event:/player/enzyme_cure +event:/player/enzyme_cure +event:/player/enzyme_cure_pda +event:/player/food_critical +event:/player/food_low +event:/player/food_very_low +event:/player/footstep_dirt +event:/player/footstep_dirt_sprint +event:/player/footstep_grass +event:/player/footstep_grass_sprint +event:/player/footstep_ice +event:/player/footstep_ice_sprint +event:/player/footstep_metal +event:/player/footstep_metal_sprint +event:/player/footstep_precursor_base +event:/player/footstep_rocket +event:/player/footstep_snow +event:/player/footstep_snow_sprint +event:/player/generic_emergency +event:/player/generic_warning +event:/player/goal_airsack +event:/player/goal_BiomeKelpForest +event:/player/goal_BiomeKelpForest2 +event:/player/goal_BiomePrecursorGunUpper +event:/player/goal_BiomePrecursorGunUpper2 +event:/player/goal_BiomePrecursorGunUpper3 +event:/player/goal_BiomePrecursorGunUpper4 +event:/player/goal_Bladderfish +event:/player/goal_CookedPeeper +event:/player/goal_Copper +event:/player/goal_danger +event:/player/goal_Fins +event:/player/goal_Intro1 +event:/player/goal_Knife +event:/player/goal_lifepod1 +event:/player/goal_lifepod2 +event:/player/goal_lifepod3 +event:/player/goal_PDALoading +event:/player/goal_Scanner +event:/player/gun_disabled +event:/player/gun_disabled_pda +event:/player/gun_door_open +event:/player/gun_door_sick +event:/player/gunterminal_access_denied +event:/player/gunterminal_access_granted +event:/player/gunterminal_close +event:/player/gunterminal_first_use +event:/player/gunterminal_open_loop +event:/player/gunterminal_use +event:/player/gunterminal_use_healed +event:/player/hand_infection_cin +event:/player/hatch_eggs +event:/player/heat_damage +event:/player/hungry_damage +event:/player/infection_heal_cin +event:/player/infection_scan_advise +event:/player/infection_scan_advise_full +event:/player/invalid_construction +event:/player/inventory_secured +event:/player/jump +event:/player/key terminal_close +event:/player/key terminal_open +event:/player/key_terminal_use +event:/player/main_brief +event:/player/mapped +event:/player/new_creature +event:/player/new_objective_added +event:/player/new_tech +event:/player/nighttime +event:/player/open_pda +event:/player/oxygen_10 +event:/player/oxygen_10_sec +event:/player/oxygen_25 +event:/player/oxygen_30_sec +event:/player/oxygen_50 +event:/player/Pain +event:/player/Pain_no_tank +event:/player/Pain_no_tank_light +event:/player/Pain_over_time +event:/player/Pain_surface +event:/player/Precursor_Gun_ControlRoom +event:/player/Precursor_Gun_DisableDenied +event:/player/Precursor_Gun_LostRiverHint +event:/player/Precursor_Gun_LostRiverHint2 +event:/player/Precursor_LostRiverBase_Log_1 +event:/player/Precursor_LostRiverBase_Log_2 +event:/player/Precursor_LostRiverBase_Log_4 +event:/player/Precursor_LostRiverBase_Log_5 +event:/player/Precursor_LostRiverBase_Log_6 +event:/player/Precursor_LostRiverBase_Log_7 +event:/player/Precursor_LostRiverBase_Log3 +event:/player/Puke +event:/player/Puke_underwater +event:/player/radiation +event:/player/radiation_fix +event:/player/radiation_remaining +event:/player/scan_planet +event:/player/selfScan1 +event:/player/selfScan2 +event:/player/selfScan3 +event:/player/selfScan3b +event:/player/selfScan4 +event:/player/selfScan5 +event:/player/sick_reveal +event:/player/signal_upload +event:/player/single_breath +event:/player/start_freedive +event:/player/start_freedive_splash +event:/player/step +event:/player/stillsuit_equipped +event:/player/story/Deepgrandreef +event:/player/story/ending_zinger +event:/player/story/Goal_BaseWindow +event:/player/story/Goal_Bench +event:/player/story/Goal_BiomeBloodKelp +event:/player/story/Goal_BiomeBloodKelp2 +event:/player/story/Goal_BiomeCrashedShip +event:/player/story/Goal_BiomeCrashZone +event:/player/story/Goal_BiomeDeepGrandReef +event:/player/story/Goal_BiomeDeepGrandReef2 +event:/player/story/Goal_BiomeDunes +event:/player/story/Goal_BiomeFloatingIsland +event:/player/story/Goal_BiomeGrassyPlateaus +event:/player/story/Goal_BiomeJellyCave +event:/player/story/Goal_BiomeJellyCave2 +event:/player/story/Goal_BiomeKelpForestCave +event:/player/story/Goal_BiomeKooshZone +event:/player/story/Goal_BiomeLostRiver +event:/player/story/Goal_BiomeMountainCave +event:/player/story/Goal_BiomeMountains +event:/player/story/Goal_BiomeMushroomForest +event:/player/story/Goal_BiomeMushroomForestCave +event:/player/story/Goal_BiomeSafeShallowsCave +event:/player/story/Goal_BiomeSeaTreaderPath +event:/player/story/Goal_BiomeSparseReef +event:/player/story/Goal_BiomeUnderwaterIslands +event:/player/story/Goal_BiomeVoid +event:/player/story/Goal_Bioreactor +event:/player/story/Goal_Bleach +event:/player/story/Goal_Builder +event:/player/story/Goal_CookedGarryfish +event:/player/story/Goal_CookedHoverfish +event:/player/story/Goal_Cyclops +event:/player/story/Goal_Diamond +event:/player/story/Goal_Exo +event:/player/story/Goal_FarmingTray +event:/player/story/Goal_JellyCaveEntrance +event:/player/story/Goal_LostRiverEntrance +event:/player/story/Goal_Lubricant +event:/player/story/Goal_Moonpool +event:/player/story/Goal_NuclearReactor +event:/player/story/Goal_Observatory +event:/player/story/Goal_PurifiedWater +event:/player/story/Goal_RadSuit +event:/player/story/Goal_Room +event:/player/story/Goal_Seaglide +event:/player/story/Goal_Seamoth +event:/player/story/Goal_SecondarySystems +event:/player/story/Goal_Silver +event:/player/story/Goal_StasisRifle +event:/player/story/Goal_UnlockRadSuit +event:/player/story/Goal_WaterPark +event:/player/story/OvereatingWarning +event:/player/story/PDASunbeamDestroyEventOutOfRange +event:/player/story/Precursor_Gun_DataDownload1 +event:/player/story/Precursor_Gun_DataDownload2 +event:/player/story/Precursor_Gun_Disabled +event:/player/story/Precursor_LavaCastle_Log1 +event:/player/story/Precursor_LavaCastle_Log2 +event:/player/story/Precursor_LavaCastle_Log3 +event:/player/story/Precursor_LavaCastle_Log4 +event:/player/story/Precursor_Prison_Antechamber_Log1 +event:/player/story/Precursor_Prison_Aquarium_EnvironmentLog1 +event:/player/story/Precursor_Prison_Aquarium_EnvironmentLog2 +event:/player/story/Precursor_Prison_Aquarium_EnvironmentLog3 +event:/player/story/Precursor_Prison_Aquarium_EnvironmentLog4 +event:/player/story/Precursor_Prison_Aquarium_EnvironmentLog5 +event:/player/story/Precursor_Prison_ExteriorLog1 +event:/player/story/Precursor_Prison_MoonPool_Log1 +event:/player/story/RadioCaptainsQuartersCode +event:/player/story/RadioGrassy25NoSignalAlt +event:/player/story/RadioKelp28NoSignalAlt +event:/player/story/RadioMushroom24NoSignalAlt +event:/player/story/RadioPrecursor1 +event:/player/story/RadioRadiationSuitNoSignalAlt +event:/player/story/RadioShallows22NoSignalAlt +event:/player/story/RadioWarper1 +event:/player/story/RadioWarper2 +event:/player/story/Rocket_ReadyGunStillActive +event:/player/story/Story_RadioWarning +event:/player/story/VO/Ency_DeepPDA1 +event:/player/story/VO/Ency_DeepPDA2 +event:/player/story/VO/Ency_DeepPDA3 +event:/player/story/VO/Ency_DeepPDA4 +event:/player/story/VO/Ency_InnerBiomeWreckLore7 +event:/player/story/VO/Ency_IslandsPDABase1a +event:/player/story/VO/Ency_IslandsPDABase1bDesk +event:/player/story/VO/Ency_IslandsPDABase1Desk +event:/player/story/VO/Ency_IslandsPDABase1Interior +event:/player/story/VO/Ency_IslandsPDAExterior +event:/player/story/VO/Ency_JellyPDABrokenCorridor +event:/player/story/VO/Ency_JellyPDAExterior +event:/player/story/VO/Ency_JellyPDAObservatory +event:/player/story/VO/Ency_JellyPDARoom1Desk +event:/player/story/VO/Ency_JellyPDARoom1Locker +event:/player/story/VO/Ency_JellyPDARoom2Desk +event:/player/story/VO/Ency_JellyPDARoom2Locker +event:/player/story/VO/Ency_Lifepod1 +event:/player/story/VO/Ency_Lifepod2 +event:/player/story/VO/Ency_Lifepod3 +event:/player/story/VO/Ency_Lifepod4 +event:/player/story/VO/Ency_LifepodCrashZone1 +event:/player/story/VO/Ency_LifepodCrashZone2 +event:/player/story/VO/Ency_LifepodDecoy +event:/player/story/VO/Ency_LifepodKeenDialog +event:/player/story/VO/Ency_LifepodRandom +event:/player/story/VO/Ency_LifepodSeaglide +event:/player/story/VO/Ency_OuterBiomeWreckLore9 +event:/player/story/VO/Ency_RendezvousFloatingIsland +event:/player/story/VO/log_Precursor_1 +event:/player/story/VO/log_Vesper_1 +event:/player/story/VO/log_Vesper_2 +event:/player/story/VO/log_Vesper_5 +event:/player/story/VO/PDA_EmergencyMode +event:/player/story/VO/RadioBloodKelp29 +event:/player/story/VO/RadioGrassy21 +event:/player/story/VO/RadioGrassy25 +event:/player/story/VO/RadioKelp28 +event:/player/story/VO/RadioMushroom24 +event:/player/story/VO/RadioRadiationSuit (female) +event:/player/story/VO/RadioRadiationSuit (male) +event:/player/story/VO/RadioSecondOfficer +event:/player/story/VO/RadioShallows22 +event:/player/sunbeam_destroy +event:/player/sunbeam_rescue +event:/player/surface +event:/player/surface_no_air +event:/player/surface_tank +event:/player/swim_surface +event:/player/swim_underwater +event:/player/thirsty_damage +event:/player/use_first_aid +event:/player/vitals_ok +event:/player/vomit +event:/player/water_critical +event:/player/water_low +event:/player/water_very_low +event:/sub/base/AI_nopower +event:/sub/base/base_background +event:/sub/base/base_background +event:/sub/base/bioreactor_death +event:/sub/base/bioreactor_hatch_close +event:/sub/base/bioreactor_hatch_open +event:/sub/base/bioreactor_working_loop +event:/sub/base/bulkhead_close_back +event:/sub/base/bulkhead_close_front +event:/sub/base/bulkhead_open_back +event:/sub/base/bulkhead_open_front +event:/sub/base/chargers/battery_charger_close +event:/sub/base/chargers/battery_charger_open +event:/sub/base/chargers/cell_charger_close +event:/sub/base/chargers/cell_charger_open +event:/sub/base/chargers/charge_loop +event:/sub/base/coffeemachine_idle +event:/sub/base/door_close +event:/sub/base/door_open +event:/sub/base/enter_hatch +event:/sub/base/enter_seamoth_left +event:/sub/base/enter_seamoth_right +event:/sub/base/exit_hatch +event:/sub/base/hull_breach +event:/sub/base/hull_decrease +event:/sub/base/hull_increase +event:/sub/base/hull_restored +event:/sub/base/hull_warning +event:/sub/base/make_coffee +event:/sub/base/map room/apear +event:/sub/base/map room/map_room_background +event:/sub/base/map room/option_tweek +event:/sub/base/map room/scan +event:/sub/base/map room/select +event:/sub/base/medkit_locker/close +event:/sub/base/medkit_locker/open +event:/sub/base/nuclear_reactor_death +event:/sub/base/nuclearreactor_working_loop +event:/sub/base/nuke_gen_loop +event:/sub/base/place +event:/sub/base/place +event:/sub/base/power_10_3D +event:/sub/base/power_30_3D +event:/sub/base/power_down +event:/sub/base/power_down_3D +event:/sub/base/power_down_3D +event:/sub/base/power_loop +event:/sub/base/power_loop +event:/sub/base/power_off +event:/sub/base/power_off +event:/sub/base/power_structure_damage +event:/sub/base/power_transmitter_death +event:/sub/base/power_up +event:/sub/base/power_up_3D +event:/sub/base/power_up_3D +event:/sub/base/pressure_damage_heavy +event:/sub/base/pressure_damage_heavy +event:/sub/base/pressure_damage_light +event:/sub/base/pressure_damage_light +event:/sub/base/pressure_damage_medium +event:/sub/base/pressure_damage_medium +event:/sub/base/seamoth_dock +event:/sub/base/solar_panel_death +event:/sub/base/thermal_plant_death +event:/sub/base/vendingmachine_use +event:/sub/base/water_filter_loop +event:/sub/base/water_filter_spawn +event:/sub/base/water_filter_spawn_bottle +event:/sub/base/welcome +event:/sub/base/welcome _3D +event:/sub/common/emergency_music +event:/sub/common/fishsplat +event:/sub/common/splash_in_and_out +event:/sub/common/sub_splash +event:/sub/common/surface_surface +event:/sub/cyclops/AI_abandon +event:/sub/cyclops/AI_ahead_flank +event:/sub/cyclops/AI_ahead_slow +event:/sub/cyclops/AI_ahead_standard +event:/sub/cyclops/AI_attack +event:/sub/cyclops/AI_cavitate +event:/sub/cyclops/AI_decoy +event:/sub/cyclops/AI_depth_update_1 +event:/sub/cyclops/AI_depth_update_2 +event:/sub/cyclops/AI_depth_warning_1 +event:/sub/cyclops/AI_depth_warning_2 +event:/sub/cyclops/AI_depth_warning_3 +event:/sub/cyclops/AI_drain +event:/sub/cyclops/AI_emergency_speed +event:/sub/cyclops/AI_engine_down +event:/sub/cyclops/AI_engine_heat_critical +event:/sub/cyclops/AI_engine_overheat +event:/sub/cyclops/AI_engine_up +event:/sub/cyclops/AI_external_damage +event:/sub/cyclops/AI_fire_detected +event:/sub/cyclops/AI_fire_extinguished +event:/sub/cyclops/AI_fire_system +event:/sub/cyclops/AI_hull_crit +event:/sub/cyclops/AI_hull_low +event:/sub/cyclops/AI_leak +event:/sub/cyclops/AI_no_power +event:/sub/cyclops/AI_power_low +event:/sub/cyclops/AI_shields +event:/sub/cyclops/AI_silent_running +event:/sub/cyclops/AI_system_failure +event:/sub/cyclops/AI_welcome +event:/sub/cyclops/AI_welcome_attention +event:/sub/cyclops/climb_back_down +event:/sub/cyclops/climb_back_up +event:/sub/cyclops/climb_front_down +event:/sub/cyclops/climb_front_up +event:/sub/cyclops/control_room_ambience +event:/sub/cyclops/creature_attack_sfx +event:/sub/cyclops/cyclops_door_close +event:/sub/cyclops/cyclops_door_open +event:/sub/cyclops/cyclops_helm door_close +event:/sub/cyclops/cyclops_helm_door_open +event:/sub/cyclops/cyclops_loop_epic_fast +event:/sub/cyclops/cyclops_loop_fast +event:/sub/cyclops/cyclops_loop_normal +event:/sub/cyclops/cyclops_loop_rpm +event:/sub/cyclops/cyclops_loop_slow +event:/sub/cyclops/cyclops_stop +event:/sub/cyclops/decoy_loop +event:/sub/cyclops/docking_doors_close +event:/sub/cyclops/docking_doors_open +event:/sub/cyclops/docking_hatch_close +event:/sub/cyclops/docking_hatch_open +event:/sub/cyclops/engine_room +event:/sub/cyclops/enter_hatch +event:/sub/cyclops/exit_hatch +event:/sub/cyclops/explode +event:/sub/cyclops/explode_countdown +event:/sub/cyclops/floodlights_off +event:/sub/cyclops/floodlights_on +event:/sub/cyclops/horn +event:/sub/cyclops/impact_solid_hard +event:/sub/cyclops/impact_solid_medium +event:/sub/cyclops/impact_solid_soft +event:/sub/cyclops/install_mod +event:/sub/cyclops/interface_popup +event:/sub/cyclops/interface_select +event:/sub/cyclops/leak_loop +event:/sub/cyclops/lights_off +event:/sub/cyclops/lights_on +event:/sub/cyclops/load_decoy +event:/sub/cyclops/locker_close +event:/sub/cyclops/locker_close +event:/sub/cyclops/locker_open +event:/sub/cyclops/locker_open +event:/sub/cyclops/outer_hatch_close +event:/sub/cyclops/outer_hatch_open +event:/sub/cyclops/pressure_damage_heavy +event:/sub/cyclops/pressure_damage_light +event:/sub/cyclops/pressure_damage_medium +event:/sub/cyclops/proximity +event:/sub/cyclops/shield_on_loop +event:/sub/cyclops/siren +event:/sub/cyclops/siren_3d +event:/sub/cyclops/sonar +event:/sub/cyclops/start +event:/sub/cyclops/sub_ambieance +event:/sub/drone/change_camera +event:/sub/drone/connected +event:/sub/drone/connecting_loop +event:/sub/drone/idle +event:/sub/drone/motor_loop +event:/sub/exo/claw_hit_fish +event:/sub/exo/claw_hit_terain +event:/sub/exo/claw_pickup +event:/sub/exo/claw_punch +event:/sub/exo/dock_exo_cyclops +event:/sub/exo/dock_exo_moonpool +event:/sub/exo/drill_hit_loop +event:/sub/exo/drill_loop +event:/sub/exo/enter_exo +event:/sub/exo/hook_hit +event:/sub/exo/hook_loop +event:/sub/exo/hook_shoot +event:/sub/exo/interior_loop +event:/sub/exo/jets_empty +event:/sub/exo/jets_loop +event:/sub/exo/jump +event:/sub/exo/land +event:/sub/exo/land_precursor +event:/sub/exo/sit +event:/sub/exo/step +event:/sub/exo/step_precursor +event:/sub/exo/undock_exo_cyclops +event:/sub/exo/undock_exo_moonpool +event:/sub/exo/welcome +event:/sub/pod/climb_in_bottom +event:/sub/pod/climb_in_top +event:/sub/pod/climb_out_bottom +event:/sub/pod/climb_out_bottom_first_use +event:/sub/pod/climb_out_top +event:/sub/pod/climb_out_top_first_use +event:/sub/pod/fix_panel_powerup +event:/sub/pod/pod_background +event:/sub/pod/pod_background_damaged +event:/sub/pod/pod_fire +event:/sub/pod/pod_fire +event:/sub/pod/pod_sparks +event:/sub/pod/radio/radio_generic +event:/sub/pod/radio/radio_lifepod_17 +event:/sub/pod/radio/radio_lifepod_bounceback +event:/sub/pod/radio/radio_new_msg_loop +event:/sub/pod/radio/radio_play +event:/sub/pod/radio/radio_power_on +event:/sub/pod/radio/radioKoosh26 +event:/sub/pod/radio/radioMushroom24 +event:/sub/pod/radio/radioRadiationSuit +event:/sub/pod/radio/radioSunbeam_not coming +event:/sub/pod/radio/radioSunbeamEvent01 +event:/sub/pod/radio/radioSunbeamEvent02 +event:/sub/pod/radio/radioSunbeamEvent03 +event:/sub/pod/radio/radioSunbeamEvent04 +event:/sub/pod/radio/radioSunbeamEvent05 +event:/sub/pod/radio/radioSunbeamEvent05_PDA +event:/sub/rocket/all_systems_go +event:/sub/rocket/auxilery_on +event:/sub/rocket/call_lift_loop +event:/sub/rocket/call_lift_loop_2 +event:/sub/rocket/computer_on +event:/sub/rocket/coms_on +event:/sub/rocket/end_cin_music +event:/sub/rocket/end_cin_music_short +event:/sub/rocket/end_cin_sfx +event:/sub/rocket/end_cin_sfx_short +event:/sub/rocket/epic_splash +event:/sub/rocket/hydrolics_on +event:/sub/rocket/ladders/innerPlatform_ladder_down +event:/sub/rocket/ladders/innerPlatform_ladder_up +event:/sub/rocket/ladders/innerRocketShip_ladder_down +event:/sub/rocket/ladders/innerRocketShip_ladder_up +event:/sub/rocket/ladders/outerPlatform_ladder_down +event:/sub/rocket/ladders/outerPlatform_ladder_up +event:/sub/rocket/lifesupport_on +event:/sub/rocket/lift_arrive +event:/sub/rocket/lift_beep +event:/sub/rocket/outside_bottom_loop +event:/sub/rocket/rocket +event:/sub/rocket/rocket_door_open +event:/sub/rocket/rocket_door_open_inside +event:/sub/rocket/rocket_finished +event:/sub/rocket/rocket_interior_loop +event:/sub/rocket/stage_build +event:/sub/rocket/start +event:/sub/rocket/stop +event:/sub/rocket/telemerty_on +event:/sub/rocket/time capsual_launch +event:/sub/rocket/time_pod_close +event:/sub/rocket/time_pod_open +event:/sub/rocket/time_pod_open_first_use +event:/sub/rocket/time_pod_open_first_use_VO +event:/sub/rocket/use_lift +event:/sub/rocket/use_lift_2 +event:/sub/seamoth/AI_no_power +event:/sub/seamoth/crush_damage +event:/sub/seamoth/crush_depth_update +event:/sub/seamoth/crush_depth_warning +event:/sub/seamoth/depth_update +event:/sub/seamoth/depth_warning +event:/sub/seamoth/dock +event:/sub/seamoth/dock_seamoth_cyclops +event:/sub/seamoth/enter_seamoth +event:/sub/seamoth/first_use +event:/sub/seamoth/glass_break +event:/sub/seamoth/hull_breach_warning +event:/sub/seamoth/hull_fix +event:/sub/seamoth/impact_solid_hard +event:/sub/seamoth/impact_solid_medium +event:/sub/seamoth/impact_solid_soft +event:/sub/seamoth/interior_loop +event:/sub/seamoth/power_down +event:/sub/seamoth/pulse +event:/sub/seamoth/pulse_charge_loop +event:/sub/seamoth/seaglide_equip +event:/sub/seamoth/seaglide_light_off +event:/sub/seamoth/seaglide_light_on +event:/sub/seamoth/seaglide_loop +event:/sub/seamoth/seaglide_loop_rpm +event:/sub/seamoth/seaglide_rev_up +event:/sub/seamoth/seaglide_stop +event:/sub/seamoth/seaglide_upgrade_loop +event:/sub/seamoth/seajet_equip +event:/sub/seamoth/seamoth_light_off +event:/sub/seamoth/seamoth_light_on +event:/sub/seamoth/seamoth_loop +event:/sub/seamoth/seamoth_loop_rpm +event:/sub/seamoth/seamoth_rev_up +event:/sub/seamoth/seamoth_stop +event:/sub/seamoth/select +event:/sub/seamoth/sonar_loop +event:/sub/seamoth/sparks +event:/sub/seamoth/storage_close +event:/sub/seamoth/storage_open +event:/sub/seamoth/torpedo_armed +event:/sub/seamoth/torpedo_disarmed +event:/sub/seamoth/torpedo_explode_loop +event:/sub/seamoth/torpedo_fire +event:/sub/seamoth/undock +event:/sub/seamoth/undock_seamoth_cyclops +event:/sub/seamoth/welcome +event:/sub/seatruck/connect_segment +event:/sub/seatruck/disconnect_segment +event:/sub_module/fabricator/build +event:/sub_module/fabricator/build_long_end +event:/sub_module/fabricator/build_long_loop +event:/sub_module/fabricator/build_long_start +event:/sub_module/fabricator/close +event:/sub_module/fabricator/fabricator_back +event:/sub_module/fabricator/fabricator_click +event:/sub_module/fabricator/fabricator_new_item +event:/sub_module/fabricator/menu_up +event:/sub_module/fabricator/negative +event:/sub_module/fabricator/open +event:/sub_module/first_aid/spawn +event:/sub_module/workbench/build_long_loop +event:/sub_module/workbench/close +event:/sub_module/workbench/open +event:/sub_module/workbench/working +event:/tools/airbladder/airbladder_deflate +event:/tools/airbladder/airbladder_deflate_surface +event:/tools/airbladder/airbladder_hold_loop +event:/tools/airbladder/airbladder_inflate +event:/tools/airbladder/airbladder_pickup +event:/tools/battery_die +event:/tools/battery_insert +event:/tools/beacon/beacon_loop +event:/tools/beacon/draw +event:/tools/builder/complete +event:/tools/builder/deploy +event:/tools/builder/first_use +event:/tools/builder/loop +event:/tools/builder/place +event:/tools/builder/remove +event:/tools/constructor/bot_1_hover +event:/tools/constructor/bot_2_hover +event:/tools/constructor/bot_3_hover +event:/tools/constructor/bot_4_hover +event:/tools/constructor/bots_build +event:/tools/constructor/bots_confirm +event:/tools/constructor/bots_fly_infront +event:/tools/constructor/bots_out +event:/tools/constructor/constructor_climb +event:/tools/constructor/constructor_deploy_end +event:/tools/constructor/constructor_deploy_start +event:/tools/constructor/deploy +event:/tools/constructor/spawn +event:/tools/constructor/sub_splash +event:/tools/diamondblade/deploy +event:/tools/diamondblade/hit +event:/tools/diamondblade/swing +event:/tools/divereel/breadcrum +event:/tools/divereel/deploy +event:/tools/divereel/node_loop +event:/tools/divereel/reeling +event:/tools/divereel/reload +event:/tools/divereel/reset_path +event:/tools/divereel/set_anchor +event:/tools/divereel/unravel +event:/tools/dolls/jack +event:/tools/dolls/mark +event:/tools/extinguisher/deploy +event:/tools/extinguisher/first use +event:/tools/extinguisher/shoot +event:/tools/extinguisher/use_loop +event:/tools/flare/deploy +event:/tools/flare/first_use +event:/tools/flare/on_loop +event:/tools/flare/throw +event:/tools/flashlight/deploy +event:/tools/flashlight/fist_use +event:/tools/flashlight/turn_off +event:/tools/flashlight/turn_on +event:/tools/floating_locker/close +event:/tools/floating_locker/deploy +event:/tools/floating_locker/open +event:/tools/gravcannon/deploy +event:/tools/gravcannon/fail +event:/tools/gravcannon/fire +event:/tools/gravcannon/first_use +event:/tools/gravcannon/grab_loop +event:/tools/gravcannon/ready +event:/tools/gravcannon/reload +event:/tools/gravcannon/repulse +event:/tools/gravsphere/draw +event:/tools/gravsphere/explode +event:/tools/gravsphere/loop +event:/tools/gravsphere/loop_actual +event:/tools/knife/deploy +event:/tools/knife/first_use +event:/tools/knife/heat_hit +event:/tools/knife/heat_idle +event:/tools/knife/hit +event:/tools/knife/swing +event:/tools/knife/swing_surface +event:/tools/lasercutter/cut_end +event:/tools/lasercutter/cut_loop +event:/tools/lasercutter/deploy +event:/tools/lasercutter/door_cut +event:/tools/lasercutter/first_use +event:/tools/lasercutter/use_no_cut +event:/tools/lights/pick_up +event:/tools/lights/place +event:/tools/pda/close +event:/tools/pda/drop_item +event:/tools/pda/equip_gear +event:/tools/pda/first_use +event:/tools/pda/new_biome +event:/tools/pda/open +event:/tools/pda/select +event:/tools/pda/unequip_gear +event:/tools/pipes/bubbles_loop +event:/tools/pipes/motor_loop +event:/tools/scan +event:/tools/scanner/draw +event:/tools/scanner/first_use +event:/tools/scanner/new_blueprint +event:/tools/scanner/new_encyclopediea +event:/tools/scanner/new_PDA_data +event:/tools/scanner/scan_complete +event:/tools/scanner/scan_loop +event:/tools/stasis_gun/charge +event:/tools/stasis_gun/deploy +event:/tools/stasis_gun/fire +event:/tools/stasis_gun/first_use +event:/tools/stasis_gun/holding_loop +event:/tools/stasis_gun/sphere_activate +event:/tools/stasis_gun/sphere_deactivate +event:/tools/stasis_gun/sphere_enter +event:/tools/swimcharge +event:/tools/teraformer/cut_loop +event:/tools/teraformer/cut_ready +event:/tools/teraformer/draw +event:/tools/teraformer/place_loop +event:/tools/transfuser/deploy +event:/tools/transfuser/fail +event:/tools/transfuser/inject_serum +event:/tools/transfuser/take_sample +event:/tools/use_loot +event:/tools/welder/deploy +event:/tools/welder/first_use +event:/tools/welder/weld_end +event:/tools/welder/weld_loop +snapshot:/aurora warnings +snapshot:/bloodkelp_verb +snapshot:/bloodkelp_verb +snapshot:/boneshark_bite +snapshot:/boneshark_bite +snapshot:/boost_music_3db +snapshot:/boost_music_3db +snapshot:/breathing on +snapshot:/breathing on +snapshot:/cyclops interior +snapshot:/cyclops interior +snapshot:/cyclops interior +snapshot:/cyclops interior +snapshot:/cyclops interior +snapshot:/dream_loop_weather_down +snapshot:/dream_loop_weather_down +snapshot:/drowning_filter +snapshot:/drowning_new +snapshot:/drowning_new +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck when voice +snapshot:/duck_endgame_ship_amb +snapshot:/duck_endgame_ship_amb +snapshot:/filter down +snapshot:/filter up +snapshot:/filter up +snapshot:/filter up +snapshot:/filter up +snapshot:/filter up +snapshot:/filter up +snapshot:/fixing bs code problems +snapshot:/fixing bs code problems +snapshot:/force_indoor pointsource_ON +snapshot:/force_indoor pointsource_ON +snapshot:/force_indoor pointsource_ON +snapshot:/force_indoor pointsource_ON +snapshot:/ghost bite +snapshot:/ghost bite +snapshot:/hotspot +snapshot:/hotspot +snapshot:/hotspot_footsteps +snapshot:/hotspot_footsteps +snapshot:/hypothermia +snapshot:/hypothermia +snapshot:/hypothermia +snapshot:/ice_worm_dangerlevel_debug +snapshot:/ice_worm_dangerlevel_debug +snapshot:/in_cave +snapshot:/in_cave +snapshot:/in_cave +snapshot:/in_cave +snapshot:/inside_mute +snapshot:/inside_mute +snapshot:/inside_mute +snapshot:/island echo +snapshot:/island echo +snapshot:/island echo +snapshot:/jukebox_muffle +snapshot:/jukebox_mute +snapshot:/jukebox_on +snapshot:/jukebox_verb_large +snapshot:/jukebox_verb_small +snapshot:/kelpblend verb +snapshot:/kelpblend verb +snapshot:/kelps verb +snapshot:/loading_screen_mute_all +snapshot:/loading_screen_mute_all +snapshot:/lower Verb +snapshot:/lower Verb +snapshot:/lower_music_in_base +snapshot:/lower_music_in_base +snapshot:/lower_music_in_base +snapshot:/lower_music_in_PDA +snapshot:/lower_music_on_pause +snapshot:/lowpass +snapshot:/lowpass +snapshot:/lowpass +snapshot:/lowpass +snapshot:/lowpass_abovesurface_music +snapshot:/lowpass_abovesurface_music +snapshot:/lowpass_mix +snapshot:/lowpass_mix +snapshot:/lowpass_underwater_music +snapshot:/lowpass_underwater_music +snapshot:/mtue failsafe background +snapshot:/mtue failsafe background +snapshot:/mtue failsafe background +snapshot:/mtue failsafe background +snapshot:/mtue failsafe background +snapshot:/mtue failsafe background +snapshot:/muffle_creatures_abovesurface +snapshot:/muffle_creatures_abovesurface +snapshot:/muffle_creatures_abovesurface +snapshot:/muffle_gate_sounds +snapshot:/muffle_gate_sounds +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_outdoor_amb +snapshot:/muffle_purplevent_explosions +snapshot:/muffle_purplevent_explosions +snapshot:/muffle_thunder_and_hail_cave +snapshot:/muffle_thunder_and_hail_cave +snapshot:/muffle_thunder_and_hail_cave +snapshot:/muffle_thunder_and_hail_indoors +snapshot:/muffle_thunder_and_hail_indoors +snapshot:/muffle_thunder_and_hail_indoors +snapshot:/mushroomverb +snapshot:/mushroomverb +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute water creatures +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute all +snapshot:/mute cold breaths only +snapshot:/mute cold breaths only +snapshot:/mute cyclops voice +snapshot:/mute cyclops voice +snapshot:/mute deploys +snapshot:/mute deploys +snapshot:/mute dives +snapshot:/mute dragon +snapshot:/mute dragon +snapshot:/mute fabricator +snapshot:/mute fabricator +snapshot:/mute fabricator +snapshot:/mute Jukebox +snapshot:/mute Jukebox +snapshot:/mute lost river +snapshot:/mute music +snapshot:/mute music +snapshot:/mute music +snapshot:/mute music +snapshot:/mute music +snapshot:/mute non sea creatures +snapshot:/mute non sea creatures +snapshot:/mute non sea creatures +snapshot:/mute non sea creatures +snapshot:/mute non sea creatures +snapshot:/mute reaper +snapshot:/mute reefback +snapshot:/mute reefback +snapshot:/mute rocket loops +snapshot:/mute sea +snapshot:/mute sea +snapshot:/mute sea +snapshot:/mute sea +snapshot:/mute voice +snapshot:/mute voice +snapshot:/mute voice +snapshot:/mute when pain +snapshot:/mute when pain +snapshot:/mute_beacons_when_inside +snapshot:/mute_beacons_when_inside +snapshot:/mute_beacons_when_inside +snapshot:/mute_beacons_when_inside +snapshot:/mute_eastarctic_water_amb +snapshot:/mute_eastarctic_water_amb +snapshot:/mute_emote_foley +snapshot:/mute_emote_foley +snapshot:/mute_emote_vo +snapshot:/mute_emote_vo +snapshot:/mute_ice_worm +snapshot:/mute_ice_worm +snapshot:/mute_normal_footsteps +snapshot:/mute_player_voice +snapshot:/mute_player_voice +snapshot:/mute_player_voice +snapshot:/mute_power_room +snapshot:/mute_power_room +snapshot:/mute_purple_vents +snapshot:/mute_purple_vents +snapshot:/mute_surface_and_submerge +snapshot:/mute_surface_and_submerge +snapshot:/mute_treespires_when inside_ventgarden +snapshot:/mute_treespires_when inside_ventgarden +snapshot:/mute_treespires_when inside_ventgarden +snapshot:/mute_wind +snapshot:/mute_wind +snapshot:/New Snapshot +snapshot:/No verb +snapshot:/No verb +snapshot:/No verb +snapshot:/No verb +snapshot:/No verb +snapshot:/onland +snapshot:/onland +snapshot:/onland +snapshot:/onland +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/outside_mute +snapshot:/pda_pause +snapshot:/pda_pause +snapshot:/pod_verb +snapshot:/pod_verb +snapshot:/pod_verb +snapshot:/prec_base +snapshot:/prec_base +snapshot:/prec_base +snapshot:/prevent_hypothermia +snapshot:/prevent_hypothermia +snapshot:/prevent_music_lowpass +snapshot:/prevent_music_lowpass +snapshot:/prevent_music_lowpass +snapshot:/prevent_music_lowpass +snapshot:/radio filter +snapshot:/radio filter +snapshot:/radio signal stgrength +snapshot:/radio signal stgrength +snapshot:/raise_footsteps +snapshot:/raise_footsteps +snapshot:/raise_footsteps +snapshot:/raise_footsteps +snapshot:/rOCKET INTERIOR +snapshot:/rOCKET INTERIOR +snapshot:/skip_intro_mute_all +snapshot:/spy_penguin_first_person_filter +snapshot:/spy_penguin_first_person_filter +snapshot:/title_screen_force_unmute +snapshot:/title_screen_force_unmute +snapshot:/title_screen_penguin_mix +snapshot:/title_screen_penguin_mix +snapshot:/trippy +snapshot:/trippy +snapshot:/underwater verb +snapshot:/underwater verb +snapshot:/underwater verb +snapshot:/underwater verb +snapshot:/underwater verb +snapshot:/underwater verb +snapshot:/underwater_caves +snapshot:/underwater_caves +snapshot:/underwater_caves +snapshot:/underwater_caves +snapshot:/When freedive sound +snapshot:/When freedive sound +snapshot:/Whiteout +snapshot:/WORM_SPAWNED +snapshot:/WORM_SPAWNED \ No newline at end of file From a40420248032714caf63d6b27a51be36654d6285 Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:47:38 +0330 Subject: [PATCH 02/12] chore: Specified game process (#553) Added BepinProcess attribute --- Nautilus/Initializer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Nautilus/Initializer.cs b/Nautilus/Initializer.cs index e67761e49..cf74672e1 100644 --- a/Nautilus/Initializer.cs +++ b/Nautilus/Initializer.cs @@ -15,8 +15,13 @@ namespace Nautilus; /// /// WARNING: This class is for use only by BepInEx. /// -[BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] +[BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] +#if BELOWZERO +[BepInProcess("SubnauticaZero.exe")] +#else +[BepInProcess("Subnautica.exe")] +#endif public class Initializer : BaseUnityPlugin { private static readonly Harmony _harmony = new(PluginInfo.PLUGIN_GUID); From 5a7fa36d6597e9f3fb5ecbb263cf94d64ef1a585 Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:48:04 +0330 Subject: [PATCH 03/12] feat: Custom FMOD support for PlayableDirector (#554) * Added attaching functionality for FMOD channel * Added FMOD support for playable behaviour --- Nautilus/Handlers/CustomSoundHandler.cs | 37 ++++ Nautilus/Nautilus.csproj | 1 + Nautilus/Patchers/CustomSoundPatcher.cs | 216 +++++++++++++++++++++++- 3 files changed, 252 insertions(+), 2 deletions(-) diff --git a/Nautilus/Handlers/CustomSoundHandler.cs b/Nautilus/Handlers/CustomSoundHandler.cs index 72fa7e907..b9020c163 100644 --- a/Nautilus/Handlers/CustomSoundHandler.cs +++ b/Nautilus/Handlers/CustomSoundHandler.cs @@ -169,4 +169,41 @@ public static bool TryGetCustomSoundChannel(int id, out Channel channel) { return CustomSoundPatcher.EmitterPlayedChannels.TryGetValue(id, out channel); } + + + /// + /// Attaches the specified channel to the given transform. This results in the sound position following the . + /// + /// The channel to attach. + /// The transform which the channel will follow. + public static void AttachChannelToGameObject(Channel channel, Transform transform) + { + var index = CustomSoundPatcher.AttachedChannels.FindIndex(x => x.Channel.handle == channel.handle); + var attachedChannel = new CustomSoundPatcher.AttachedChannel(channel, transform); + if (index == -1) + { + CustomSoundPatcher.AttachedChannels.Add(attachedChannel); + } + else + { + CustomSoundPatcher.AttachedChannels[index] = attachedChannel; + } + + CustomSoundPatcher.SetChannel3DAttributes(channel, transform); + } + + /// + /// Detaches the specified channel from any game object. + /// + /// The channel to detach. + public static void DetachChannelFromGameObject(Channel channel) + { + var index = CustomSoundPatcher.AttachedChannels.FindIndex(x => x.Channel.handle == channel.handle); + if (index == -1) + { + InternalLogger.Warn($"{nameof(CustomSoundHandler)}: The specified channel is not attached to any game object."); + } + + CustomSoundPatcher.AttachedChannels.RemoveAt(index); + } } \ No newline at end of file diff --git a/Nautilus/Nautilus.csproj b/Nautilus/Nautilus.csproj index ae1db35c3..2cecc44b3 100644 --- a/Nautilus/Nautilus.csproj +++ b/Nautilus/Nautilus.csproj @@ -46,6 +46,7 @@ + diff --git a/Nautilus/Patchers/CustomSoundPatcher.cs b/Nautilus/Patchers/CustomSoundPatcher.cs index 6ca5378bb..7d4a2de76 100644 --- a/Nautilus/Patchers/CustomSoundPatcher.cs +++ b/Nautilus/Patchers/CustomSoundPatcher.cs @@ -4,19 +4,26 @@ using FMODUnity; using HarmonyLib; using Nautilus.FMod.Interfaces; +using Nautilus.Handlers; using Nautilus.Utility; using UnityEngine; +using UnityEngine.Playables; namespace Nautilus.Patchers; internal class CustomSoundPatcher { + internal record struct AttachedChannel(Channel Channel, Transform Transform); + internal static readonly SelfCheckingDictionary CustomSounds = new("CustomSounds"); internal static readonly SelfCheckingDictionary CustomSoundBuses = new("CustomSoundBuses"); internal static readonly SelfCheckingDictionary CustomFModSounds = new("CustoomFModSounds"); internal static readonly Dictionary EmitterPlayedChannels = new(); + internal static List AttachedChannels = new(); private static readonly Dictionary PlayedChannels = new(); + private static readonly Dictionary PlayableBehaviorChannels = new(); + private static readonly List _attachedChannelsToRemove = new(); internal static void Patch(Harmony harmony) { @@ -68,7 +75,212 @@ public static bool FMODExtension_GetLength_Prefix(string path, ref int __result) __result = 0; return false; } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.PerformSeek))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_PerformSeek_Prefix(FMODEventPlayableBehavior __instance) + { + if (!PlayableBehaviorChannels.TryGetValue(__instance, out var channel)) + { + return true; + } + + if (__instance.seek < 0) + { + return true; + } + + channel.setPosition((uint)__instance.seek, TIMEUNIT.MS); + __instance.seek = -1; + return false; + } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.PlayEvent))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_PlayEvent_Prefix(FMODEventPlayableBehavior __instance) + { + if (string.IsNullOrEmpty(__instance.eventName)) + { + return true; + } + + if (string.IsNullOrEmpty(__instance.eventName) || !CustomSounds.TryGetValue(__instance.eventName, out Sound soundEvent) + && !CustomFModSounds.ContainsKey(__instance.eventName)) return true; + + Channel channel; + if (CustomFModSounds.TryGetValue(__instance.eventName, out var fModSound)) + { + if (!fModSound.TryPlaySound(out channel)) + return false; + } + else if (CustomSoundBuses.TryGetValue(__instance.eventName, out Bus bus)) + { + if (!AudioUtils.TryPlaySound(soundEvent, bus, out channel)) + return false; + } + else + { + return false; + } + + PlayableBehaviorChannels[__instance] = channel; + + channel.setPaused(true); + + __instance.PerformSeek(); + + if (__instance.TrackTargetObject) + { + CustomSoundHandler.AttachChannelToGameObject(channel, __instance.TrackTargetObject.transform); + } + else + { + SetChannel3DAttributes(channel, Vector3.zero); + } + + channel.setVolume(__instance.currentVolume); + + channel.setPaused(false); + + return false; + } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.OnExit))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_OnExit_Prefix(FMODEventPlayableBehavior __instance) + { + if (!PlayableBehaviorChannels.TryGetValue(__instance, out var channel)) + { + return true; + } + + if (!__instance.isPlayheadInside) + { + return false; + } + + if (__instance.stopType != FMODUnity.STOP_MODE.None) + { + channel.stop(); + } + + PlayableBehaviorChannels.Remove(__instance); + __instance.isPlayheadInside = false; + + return false; + } + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.ProcessFrame))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_ProcessFrame_Prefix(FMODEventPlayableBehavior __instance) + { + return !PlayableBehaviorChannels.ContainsKey(__instance); + } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.UpdateBehavior))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_UpdateBehavior_Prefix(FMODEventPlayableBehavior __instance, float time, float volume) + { + if (!PlayableBehaviorChannels.TryGetValue(__instance, out var channel)) + { + return true; + } + + if (volume != __instance.currentVolume) + { + __instance.currentVolume = volume; + channel.setVolume(volume); + } + + if (time >= __instance.OwningClip.start && time < __instance.OwningClip.end) + { + __instance.OnEnter(); + } + else + { + __instance.OnExit(); + } + + return false; + } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.OnGraphStop))] + [HarmonyPostfix] + public static void FMODEventPlayableBehavior_OnGraphStop_Postfix(FMODEventPlayableBehavior __instance) + { + if (!PlayableBehaviorChannels.TryGetValue(__instance, out var channel)) + { + channel.stop(); + PlayableBehaviorChannels.Remove(__instance); + } + } + + [HarmonyPatch(typeof(FMODEventPlayableBehavior), nameof(FMODEventPlayableBehavior.Evaluate))] + [HarmonyPrefix] + public static bool FMODEventPlayableBehavior_Evaluate_Postfix(FMODEventPlayableBehavior __instance, double time, FrameData info, bool evaluate) + { + if (!PlayableBehaviorChannels.TryGetValue(__instance, out var channel)) + { + return true; + } + + if (!info.timeHeld && time >= __instance.OwningClip.start && time < __instance.OwningClip.end) + { + if (!__instance.isPlayheadInside) + { + if (time - __instance.OwningClip.start > 0.1) + { + __instance.seek = __instance.GetPosition(time); + } + __instance.OnEnter(); + return false; + } + if ((evaluate || info.seekOccurred || info.timeLooped || info.evaluationType == FrameData.EvaluationType.Evaluate)) + { + __instance.seek = __instance.GetPosition(time); + __instance.PerformSeek(); + return false; + } + } + else + { + __instance.OnExit(); + } + + return false; + } + + [HarmonyPatch(typeof(RuntimeManager), nameof(RuntimeManager.Update))] + [HarmonyPostfix] + public static void RuntimeManager_Update_Postfix(RuntimeManager __instance) + { + if (!__instance.studioSystem.isValid()) + { + return; + } + + foreach (var attachedChannel in AttachedChannels) + { + attachedChannel.Channel.isPlaying(out var isPlaying); + if (!isPlaying || !attachedChannel.Transform) + { + _attachedChannelsToRemove.Add(attachedChannel); + continue; + } + + SetChannel3DAttributes(attachedChannel.Channel, attachedChannel.Transform); + } + + if (_attachedChannelsToRemove.Count > 0) + { + foreach (var toRemove in _attachedChannelsToRemove) + { + AttachedChannels.Remove(toRemove); + } + _attachedChannelsToRemove.Clear(); + } + } + #if SUBNAUTICA [HarmonyPatch(typeof(FMODUWE), nameof(FMODUWE.PlayOneShotImpl))] @@ -700,13 +912,13 @@ public static bool FMOD_CustomLoopingEmitter_OnPlay_Prefix(FMOD_CustomLoopingEmi } #endif - private static void SetChannel3DAttributes(Channel channel, Transform transform) + internal static void SetChannel3DAttributes(Channel channel, Transform transform) { ATTRIBUTES_3D attributes = transform.To3DAttributes(); channel.set3DAttributes(ref attributes.position, ref attributes.velocity); } - private static void SetChannel3DAttributes(Channel channel, Vector3 position) + internal static void SetChannel3DAttributes(Channel channel, Vector3 position) { ATTRIBUTES_3D attributes = position.To3DAttributes(); channel.set3DAttributes(ref attributes.position, ref attributes.velocity); From 32159812e89d5af381489855bd1b27723bd21af4 Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:49:40 +0330 Subject: [PATCH 04/12] fix!: Seatruck Fabricator & Fix tabs and crafting nodes on same level (#556) * Made tabs and crafting nodes compatible Co-Authored-By: EldritchCarMaker <97289845+EldritchCarMaker@users.noreply.github.com> * Revert "fix: Use Fallback Node if targeted node not found. (#527)" This reverts commit 48d9b00a37a1649a0a0eeba11872452c52f3c286. * Revert "chore: Clean up repetitive code in CraftTreePatcher.cs (#526)" This reverts commit 42e3ca75af34f452165477fcc463dffc1842e36e. * Revert "feat: Workbench Organization (#486)" This reverts commit e992abeeb66ea26bfa5c5bef5d59759eadb3240e. * Removed commented code --------- Co-authored-by: EldritchCarMaker <97289845+EldritchCarMaker@users.noreply.github.com> --- Nautilus/Handlers/CraftTreeHandler.cs | 9 -- Nautilus/Patchers/CraftTreePatcher.cs | 124 ++++---------------------- 2 files changed, 18 insertions(+), 115 deletions(-) diff --git a/Nautilus/Handlers/CraftTreeHandler.cs b/Nautilus/Handlers/CraftTreeHandler.cs index d7fbaaf3e..2a46919d3 100644 --- a/Nautilus/Handlers/CraftTreeHandler.cs +++ b/Nautilus/Handlers/CraftTreeHandler.cs @@ -29,7 +29,6 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt nodes.Add(new CraftingNode(stepsToTab, craftTree, craftingItem)); CraftTreePatcher.CraftingNodes[craftTree] = nodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// @@ -47,7 +46,6 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt nodes.Add(new CraftingNode(new string[0], craftTree, craftingItem)); CraftTreePatcher.CraftingNodes[craftTree] = nodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } #if SUBNAUTICA @@ -67,7 +65,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// @@ -87,7 +84,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, new Atlas.Sprite(sprite), name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// @@ -112,7 +108,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// @@ -137,7 +132,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, new Atlas.Sprite(sprite), name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } #elif BELOWZERO @@ -157,7 +151,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// @@ -182,7 +175,6 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; - CraftTreePatcher.CachedTrees.Remove(craftTree); } #endif @@ -209,7 +201,6 @@ public static void RemoveNode(CraftTree.Type craftTree, params string[] stepsToN nodesToRemove.Add(new Node(stepsToNode, craftTree)); CraftTreePatcher.NodesToRemove[craftTree] = nodesToRemove; - CraftTreePatcher.CachedTrees.Remove(craftTree); } /// diff --git a/Nautilus/Patchers/CraftTreePatcher.cs b/Nautilus/Patchers/CraftTreePatcher.cs index aadf91441..a28fcd86d 100644 --- a/Nautilus/Patchers/CraftTreePatcher.cs +++ b/Nautilus/Patchers/CraftTreePatcher.cs @@ -18,17 +18,6 @@ internal class CraftTreePatcher internal static Dictionary> NodesToRemove = new(); internal static Dictionary> CraftingNodes = new(); internal static Dictionary> TabNodes = new(); - internal static Dictionary CachedTrees = new(); - internal static Dictionary Fallbacks = new() - { - { CraftTree.Type.Workbench, TechType.Workbench }, - { CraftTree.Type.Fabricator, TechType.Fabricator }, - { CraftTree.Type.Constructor, TechType.Constructor }, - { CraftTree.Type.SeamothUpgrades, TechType.BaseUpgradeConsole }, - { CraftTree.Type.MapRoom, TechType.BaseMapRoom } - }; - private const string FallbackTabNode = "Modded"; - private const string VanillaRoot = "Vanilla"; #endregion @@ -36,67 +25,15 @@ internal class CraftTreePatcher internal static void Patch(Harmony harmony) { - CreateFallbackNodes(); harmony.PatchAll(typeof(CraftTreePatcher)); InternalLogger.Log($"CraftTreePatcher is done.", LogLevel.Debug); } - - private static void CreateFallbackNodes() - { - CreateVanillaTabNode(CraftTree.Type.Workbench, "Modification Station", TechType.Workbench, CraftTree.WorkbenchScheme().root); - CreateVanillaTabNode(CraftTree.Type.MapRoom, "Scanner Upgrades", TechType.BaseMapRoom, CraftTree.MapRoomSheme().root); - -#if SUBNAUTICA - CreateVanillaTabNode(CraftTree.Type.CyclopsFabricator, "Cyclops Fabricator", TechType.Cyclops, CraftTree.CyclopsFabricatorScheme().root); - Fallbacks.Add(CraftTree.Type.CyclopsFabricator, TechType.Cyclops); -#elif BELOWZERO - Fallbacks.Add(CraftTree.Type.SeaTruckFabricator, TechType.SeaTruckFabricator); -#endif - - foreach (var pair in Fallbacks) - CreateFallbackNode(pair.Key, pair.Value); - } - - private static void CreateFallbackNode(CraftTree.Type craftTreeType, TechType techTypeForSprite) - { - CraftTreeHandler.AddTabNode(craftTreeType, FallbackTabNode + craftTreeType, "Mod Items", SpriteManager.Get(techTypeForSprite)); - } - - private static void CreateVanillaTabNode(CraftTree.Type treeType, string DisplayName, TechType spriteTechType, TreeNode root) - { - var removedNodes = new List(); - foreach (var node in root.nodes) - { - if (node is not CraftNode craftNode || craftNode.action == TreeAction.Expand) - continue; - - CraftTreeHandler.RemoveNode(treeType, new[] { node.id }); - removedNodes.Add(craftNode); - } - - if (removedNodes.Count == 0) - return; - - var vanillaTab = VanillaRoot + treeType; - CraftTreeHandler.AddTabNode(treeType, vanillaTab, DisplayName, SpriteManager.Get(spriteTechType)); - foreach (var node in removedNodes) - { - InternalLogger.Debug($"Moved {node.techType0} from {treeType} root into new {vanillaTab} tab."); - CraftTreeHandler.AddCraftingNode(treeType, node.techType0, new[] { vanillaTab }); - } - InternalLogger.Info($"Reorganized {removedNodes.Count} {treeType} nodes into new {vanillaTab} tab."); - } + [HarmonyPostfix] [HarmonyPatch(typeof(CraftTree), nameof(CraftTree.GetTree))] private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __result) { - if (CachedTrees.TryGetValue(treeType, out var cachedTree)) - { - __result = cachedTree; - return; - } - __result ??= !CustomTrees.TryGetValue(treeType, out var customRoot) ? __result : customRoot.CustomCraftingTree; if (__result == null) @@ -108,10 +45,14 @@ private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __resul return; } +#if BELOWZERO + if (treeType is CraftTree.Type.SeaTruckFabricator) + { + PatchCraftTree(ref __result, CraftTree.Type.Fabricator); + } +#endif PatchCraftTree(ref __result, treeType); CraftTree.AddToCraftableTech(__result); - CachedTrees.Add(treeType, __result); - return; } #endregion @@ -120,7 +61,7 @@ private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __resul private static void PatchCraftTree(ref CraftTree __result, CraftTree.Type type) { - List removals = NodesToRemove.TryGetValue(type, out removals) ? removals : new List(); + List removals = NodesToRemove.TryGetValue(type, out removals)? removals: new List(); RemoveNodes(ref __result, ref removals); AddCustomTabs(ref __result, type); @@ -135,26 +76,17 @@ private static void AddCustomTabs(ref CraftTree tree, CraftTree.Type type) List customTabs = TabNodes.TryGetValue(type, out customTabs) ? customTabs : new List(); foreach (TabNode customNode in customTabs) { - if (!TraverseTree(tree.nodes, customNode.Path, out var currentNode)) + if(!TraverseTree(tree.nodes, customNode.Path, out var currentNode)) { InternalLogger.Error($"Cannot add tab: {customNode.Name} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the parent node could not be found."); continue; } - if (currentNode.nodes.Any(node => node is CraftNode craftNode && craftNode.action == TreeAction.Craft)) - { - InternalLogger.Error($"Cannot add tab: {customNode.Name} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as it is being added to a parent node that contains crafting nodes. {string.Join(", ", currentNode.nodes.Where(node => node is CraftNode craftNode && craftNode.action == TreeAction.Craft).Select(x => x.id))} "); - continue; - } - - if (TraverseTree(currentNode, new[] { customNode.Name }, out _)) - { - // This node already exists, skip it. - continue; - } - // Add the new tab node. - currentNode.AddNode(new CraftNode(customNode.Name, TreeAction.Expand, TechType.None)); + currentNode.AddNode(new TreeNode[] + { + new CraftNode(customNode.Name, TreeAction.Expand, TechType.None) + }); InternalLogger.Debug($"Added tab: {customNode.Name} to {customNode.Scheme} at {string.Join("/", customNode.Path)}"); } } @@ -166,35 +98,15 @@ private static void PatchNodes(ref CraftTree tree, CraftTree.Type type) { if (!TraverseTree(tree.nodes, customNode.Path, out var currentNode)) { - InternalLogger.Warn($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the parent node could not be found."); - - if (!TraverseTree(tree.nodes, new[] { FallbackTabNode + customNode.Scheme }, out currentNode)) - { - InternalLogger.Error($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the fallback node could not be found."); - continue; - } - } - - if (currentNode.nodes.Any(x => x is CraftNode craftNode && craftNode.action == TreeAction.Expand)) - { - InternalLogger.Warn($"Cannot add Crafting node: {customNode.TechType.AsString()} as it is being added to {currentNode.id} that contains Tab nodes. {string.Join(", ", currentNode.nodes.Where(node => node is CraftNode craftNode && craftNode.action == TreeAction.Expand).Select(x => x.id))}"); - InternalLogger.Warn($"Adding to Fallback {FallbackTabNode} node in tree root."); - - if (!TraverseTree(tree.nodes, new[] { FallbackTabNode + customNode.Scheme }, out currentNode)) - { - InternalLogger.Error($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the fallback node could not be found."); - continue; - } - } - - if (TraverseTree(currentNode, new[] { customNode.TechType.AsString(false) }, out _)) - { - // This node already exists, skip it. + InternalLogger.Error($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the parent node could not be found."); continue; } // Add the node. - currentNode.AddNode(new CraftNode(customNode.TechType.AsString(false), TreeAction.Craft, customNode.TechType)); + currentNode.AddNode(new TreeNode[] + { + new CraftNode(customNode.TechType.AsString(false), TreeAction.Craft, customNode.TechType) + }); InternalLogger.Debug($"Added Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)}"); } } From 288e473b56212961cef734f712726ad88d5acb1f Mon Sep 17 00:00:00 2001 From: Indigocoder1 <130301845+Indigocoder1@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:12:54 -0700 Subject: [PATCH 05/12] feat: Thunderkit Utilities (#558) * Added thunderkit utilites * Added SN/BZ checking * Added separate enums for the layers in SN & BZ * Changed name of application modes * Moved material getters to MaterialUtils * Changed layer application to use switch expression * Removed unnecessary comment * Changed property names to respect their type name * Added default index of 0 to material indices * Added graphic setting and reverted default build config * Added graphic option to layer applier & removed outdated comment --- Nautilus/Utility/MaterialUtils.cs | 23 +++- Nautilus/Utility/MaterialUtils_BelowZero.cs | 47 +++++++ Nautilus/Utility/MaterialUtils_Subnautica.cs | 59 +++++++++ .../ThunderkitUtilities/ApplySNFont.cs | 27 ++++ .../ThunderkitUtilities/ApplySNLayer.cs | 79 ++++++++++++ .../ThunderkitUtilities/ApplySNMaterial.cs | 120 ++++++++++++++++++ .../ThunderkitUtilities/ApplySNShaders.cs | 19 +++ .../Utility/ThunderkitUtilities/SetModes.cs | 16 +++ 8 files changed, 388 insertions(+), 2 deletions(-) create mode 100644 Nautilus/Utility/MaterialUtils_BelowZero.cs create mode 100644 Nautilus/Utility/ThunderkitUtilities/ApplySNFont.cs create mode 100644 Nautilus/Utility/ThunderkitUtilities/ApplySNLayer.cs create mode 100644 Nautilus/Utility/ThunderkitUtilities/ApplySNMaterial.cs create mode 100644 Nautilus/Utility/ThunderkitUtilities/ApplySNShaders.cs create mode 100644 Nautilus/Utility/ThunderkitUtilities/SetModes.cs diff --git a/Nautilus/Utility/MaterialUtils.cs b/Nautilus/Utility/MaterialUtils.cs index 44657aefc..7dbd9e8e6 100644 --- a/Nautilus/Utility/MaterialUtils.cs +++ b/Nautilus/Utility/MaterialUtils.cs @@ -19,9 +19,8 @@ internal static void Patch() private static IEnumerator LoadReferences() { -#if SUBNAUTICA yield return PatchInternal(); -#endif + IsReady = true; yield break; @@ -32,6 +31,26 @@ private static IEnumerator LoadReferences() /// public static bool IsReady { get; private set; } + /// + /// Gets the basic glass material + /// + public static Material GlassMaterial { get; private set; } + + /// + /// Gets the material for the outside of glass, such as for base windows + /// + public static Material ExteriorGlassMaterial { get; private set; } + + /// + /// Gets the material for the inside of glass, such as the inside of the Cyclops windshield + /// + public static Material InteriorGlassMaterial { get; private set; } + + /// + /// Gets a shiny glass material + /// + public static Material ShinyGlassMaterial { get; private set; } + /// /// Contains references to various Shaders. /// diff --git a/Nautilus/Utility/MaterialUtils_BelowZero.cs b/Nautilus/Utility/MaterialUtils_BelowZero.cs new file mode 100644 index 000000000..a126260a7 --- /dev/null +++ b/Nautilus/Utility/MaterialUtils_BelowZero.cs @@ -0,0 +1,47 @@ +using System.Collections; +using UnityEngine; + +#if BELOWZERO +namespace Nautilus.Utility; + +public static partial class MaterialUtils +{ + private static IEnumerator PatchInternal() + { + yield return LoadGlassMaterials(); + } + + private static IEnumerator LoadGlassMaterials() + { + var seamothTask = CraftData.GetPrefabForTechTypeAsync(TechType.SeaTruck); + + yield return seamothTask; + + var glassMaterial = seamothTask.GetResult() + .transform.Find("model/seatruck_anim/Seatruck_cabin_exterior_glass_geo") + .GetComponent().material; + + GlassMaterial = new Material(glassMaterial); + + ExteriorGlassMaterial = new Material(glassMaterial); + ExteriorGlassMaterial.SetFloat("_SpecInt", 100); + ExteriorGlassMaterial.SetFloat("_Shininess", 6.3f); + ExteriorGlassMaterial.SetFloat("_Fresnel", 0.85f); + ExteriorGlassMaterial.SetColor("_Color", new Color(0.33f, 0.58f, 0.71f, 0.1f)); + ExteriorGlassMaterial.SetColor("_SpecColor", new Color(0.5f, 0.76f, 1f, 1f)); + + ShinyGlassMaterial = new Material(glassMaterial); + ShinyGlassMaterial.SetColor("_Color", new Color(1, 1, 1, 0.2f)); + ShinyGlassMaterial.SetFloat("_SpecInt", 3); + ShinyGlassMaterial.SetFloat("_Shininess", 8); + ShinyGlassMaterial.SetFloat("_Fresnel", 0.78f); + + InteriorGlassMaterial = new Material(glassMaterial); + InteriorGlassMaterial.SetColor("_Color", new Color(0.67f, 0.71f, 0.76f, 0.56f)); + InteriorGlassMaterial.SetFloat("_SpecInt", 2); + InteriorGlassMaterial.SetFloat("_Shininess", 6f); + InteriorGlassMaterial.SetFloat("_Fresnel", 0.88f); + } +} + +#endif \ No newline at end of file diff --git a/Nautilus/Utility/MaterialUtils_Subnautica.cs b/Nautilus/Utility/MaterialUtils_Subnautica.cs index 88636f59f..a39bba9ef 100644 --- a/Nautilus/Utility/MaterialUtils_Subnautica.cs +++ b/Nautilus/Utility/MaterialUtils_Subnautica.cs @@ -15,6 +15,8 @@ private static IEnumerator PatchInternal() yield return LoadAirWaterBarrierMaterial(); yield return LoadForcefieldMaterial(); yield return LoadGhostMaterial(); + yield return LoadGlassMaterials(); + yield return LoadUIMaterial(); } /// @@ -47,6 +49,11 @@ private static IEnumerator PatchInternal() /// public static Material GhostMaterial { get; private set; } + /// + /// Gets the material used by the UI in the Cyclops + /// + public static Material HolographicUIMaterial { get; private set; } + private static IEnumerator LoadIonCubeMaterial() { if (IonCubeMaterial) @@ -128,5 +135,57 @@ private static IEnumerator LoadGhostMaterial() GhostMaterial = wallShelf.GetComponentInChildren().ghostMaterial; } } + + private static IEnumerator LoadGlassMaterials() + { + var seamothTask = CraftData.GetPrefabForTechTypeAsync(TechType.Seamoth); + + yield return seamothTask; + + var glassMaterial = seamothTask.GetResult() + .transform.Find("Model/Submersible_SeaMoth/Submersible_seaMoth_geo/Submersible_SeaMoth_glass_geo") + .GetComponent().material; + + GlassMaterial = new Material(glassMaterial); + + ExteriorGlassMaterial = new Material(glassMaterial); + ExteriorGlassMaterial.SetFloat("_SpecInt", 100); + ExteriorGlassMaterial.SetFloat("_Shininess", 6.3f); + ExteriorGlassMaterial.SetFloat("_Fresnel", 0.85f); + ExteriorGlassMaterial.SetColor("_Color", new Color(0.33f, 0.58f, 0.71f, 0.1f)); + ExteriorGlassMaterial.SetColor("_SpecColor", new Color(0.5f, 0.76f, 1f, 1f)); + + ShinyGlassMaterial = new Material(glassMaterial); + ShinyGlassMaterial.SetColor("_Color", new Color(1, 1, 1, 0.2f)); + ShinyGlassMaterial.SetFloat("_SpecInt", 3); + ShinyGlassMaterial.SetFloat("_Shininess", 8); + ShinyGlassMaterial.SetFloat("_Fresnel", 0.78f); + + InteriorGlassMaterial = new Material(glassMaterial); + InteriorGlassMaterial.SetColor("_Color", new Color(0.67f, 0.71f, 0.76f, 0.56f)); + InteriorGlassMaterial.SetFloat("_SpecInt", 2); + InteriorGlassMaterial.SetFloat("_Shininess", 6f); + InteriorGlassMaterial.SetFloat("_Fresnel", 0.88f); + } + + private static bool _cyclopsLoaded; + + private static IEnumerator LoadUIMaterial() + { + yield return new WaitUntil(() => LightmappedPrefabs.main); + + LightmappedPrefabs.main.RequestScenePrefab("Cyclops", new LightmappedPrefabs.OnPrefabLoaded(OnCyclopsLoaded)); + + yield return new WaitUntil(() => _cyclopsLoaded); + } + + private static void OnCyclopsLoaded(GameObject cyclops) + { + var holoMat = cyclops.transform.Find("HelmHUD/HelmHUDVisuals/Canvas_LeftHUD/EngineOnUI/EngineOff_Button") + .GetComponent().material; + + HolographicUIMaterial = new Material(holoMat); + _cyclopsLoaded = true; + } } #endif \ No newline at end of file diff --git a/Nautilus/Utility/ThunderkitUtilities/ApplySNFont.cs b/Nautilus/Utility/ThunderkitUtilities/ApplySNFont.cs new file mode 100644 index 000000000..881d48996 --- /dev/null +++ b/Nautilus/Utility/ThunderkitUtilities/ApplySNFont.cs @@ -0,0 +1,27 @@ +using UnityEngine; +using TMPro; + +namespace Nautilus.Utility.ThunderkitUtilities; + +internal class ApplySNFont : MonoBehaviour +{ + [Tooltip("How to apply the font")] + public GeneralSetMode fontSetMode; + + private void Start() + { + switch (fontSetMode) + { + case GeneralSetMode.SingleObject: + GetComponent().font = FontUtils.Aller_Rg; + break; + case GeneralSetMode.AllChildObjects: + GetComponentsInChildren().ForEach(t => t.font = FontUtils.Aller_Rg); + break; + case GeneralSetMode.AllChildObjectsIncludeInactive: + GetComponentsInChildren(true).ForEach(t => t.font = FontUtils.Aller_Rg); + break; + } + + } +} diff --git a/Nautilus/Utility/ThunderkitUtilities/ApplySNLayer.cs b/Nautilus/Utility/ThunderkitUtilities/ApplySNLayer.cs new file mode 100644 index 000000000..4f07755fd --- /dev/null +++ b/Nautilus/Utility/ThunderkitUtilities/ApplySNLayer.cs @@ -0,0 +1,79 @@ +using System.Reflection; +using UnityEngine; +using UnityEngine.UI; + +namespace Nautilus.Utility.ThunderkitUtilities; + +internal class ApplySNLayer : MonoBehaviour +{ + [Tooltip("The name of the layer you want to apply")] + public LayerName layerName; + + [Tooltip("How to apply the layer")] + public MaterialSetMode layerSetMode; + + private void Start() + { + int layer = layerName switch + { + LayerName.Default => LayerID.Default, + LayerName.Useable => LayerID.Useable, + LayerName.NotUseable => LayerID.NotUseable, + LayerName.Player => LayerID.Player, + LayerName.TerrainCollider => LayerID.TerrainCollider, + LayerName.UI => LayerID.UI, + LayerName.Trigger => LayerID.Trigger, + LayerName.BaseClipProxy => LayerID.BaseClipProxy, + LayerName.OnlyVehicle => LayerID.OnlyVehicle, + LayerName.Vehicle => LayerID.Vehicle, +#if SUBNAUTICA + LayerName.DefaultCollisionMask => LayerID.DefaultCollisionMask, + LayerName.SubRigidbodyExclude => LayerID.SubRigidbodyExclude, +#elif BELOWZERO + LayerName.Interior => LayerID.Interior, + LayerName.AllowPlayerAndVehicle => LayerID.AllowPlayerAndVehicle, +#endif + _ => 0 + }; + + switch(layerSetMode) + { + case MaterialSetMode.SingleObject: + gameObject.layer = layer; + break; + case MaterialSetMode.AllChildObjects: + GetComponentsInChildren().ForEach(g => g.layer = layer); + break; + case MaterialSetMode.AllChildObjectsIncludeInactive: + GetComponentsInChildren(true).ForEach(g => g.layer = layer); + break; + case MaterialSetMode.AllChildGraphics: + GetComponentsInChildren(true).ForEach(g => g.gameObject.layer = layer); + break; + } + } + + /// + /// These are taken from + /// + public enum LayerName + { + Default, + Useable, + NotUseable, + Player, + TerrainCollider, + UI, + Trigger, + BaseClipProxy, + OnlyVehicle, + Vehicle, +#if SUBNAUTICA + DefaultCollisionMask, + SubRigidbodyExclude, +#elif BELOWZERO + Interior, + AllowPlayerAndVehicle +#endif + } +} diff --git a/Nautilus/Utility/ThunderkitUtilities/ApplySNMaterial.cs b/Nautilus/Utility/ThunderkitUtilities/ApplySNMaterial.cs new file mode 100644 index 000000000..adba9e314 --- /dev/null +++ b/Nautilus/Utility/ThunderkitUtilities/ApplySNMaterial.cs @@ -0,0 +1,120 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.UI; + +namespace Nautilus.Utility.ThunderkitUtilities; + +internal class ApplySNMaterial : MonoBehaviour +{ + [Tooltip("How to apply the material")] + public MaterialSetMode materialSetMode; + + [Tooltip("What material to apply")] + public MaterialType materialType; + + [Tooltip("Run at start, or be manually called?")] + public bool runAtStart = true; + + [Header("Single Object Settings:")] + public Renderer renderer; + public int[] materialIndices = new[] { 0 }; + + private void OnValidate() + { + if (!renderer) TryGetComponent(out renderer); + } + + private void Start() + { + if (!runAtStart) return; + + AssignMaterials(); + } + + /// + /// Applies the set material using the specified + /// + public void AssignMaterials() + { + switch(materialSetMode) + { + case MaterialSetMode.SingleObject: + ApplyMaterialsOnSingleRend(); + break; + case MaterialSetMode.AllChildObjects: + ApplyMaterialsOnChildren(false); + break; + case MaterialSetMode.AllChildObjectsIncludeInactive: + ApplyMaterialsOnChildren(true); + break; + case MaterialSetMode.AllChildGraphics: + foreach (var graphic in GetComponentsInChildren(true)) + { + graphic.material = GetMaterial(materialType); + } + break; + } + } + + private void ApplyMaterialsOnSingleRend() + { + if (renderer == null) throw new System.Exception($"The renderer is null on {gameObject} when SN materials were trying to be applied"); + + var mats = renderer.materials; + foreach (var index in materialIndices) + { + mats[index] = GetMaterial(materialType); + } + + renderer.materials = mats; + } + + private void ApplyMaterialsOnChildren(bool includeInactive) + { + var rends = GetComponentsInChildren(includeInactive); + foreach (var rend in rends) + { + var materials = rend.materials; + for (int i = 0; i < materials.Length; i++) + { + materials[i] = GetMaterial(materialType); + } + + rend.materials = materials; + } + } + + private Material GetMaterial(MaterialType type) + { + Material mat = type switch + { +#if SN_STABLE + MaterialType.WaterBarrier => MaterialUtils.AirWaterBarrierMaterial, + MaterialType.ForceField => MaterialUtils.ForceFieldMaterial, + MaterialType.StasisField => MaterialUtils.StasisFieldMaterial, + MaterialType.HolographicUI => MaterialUtils.HolographicUIMaterial, +#endif + MaterialType.Glass => MaterialUtils.GlassMaterial, + MaterialType.ExteriorGlass => MaterialUtils.ExteriorGlassMaterial, + MaterialType.ShinyGlass => MaterialUtils.ShinyGlassMaterial, + MaterialType.InteriorWindowGlass => MaterialUtils.InteriorGlassMaterial, + _ => null + }; + + return mat; + } + + internal enum MaterialType + { + Glass, + ExteriorGlass, + ShinyGlass, + InteriorWindowGlass, +#if SN_STABLE + WaterBarrier, + ForceField, + StasisField, + HolographicUI +#endif + } +} diff --git a/Nautilus/Utility/ThunderkitUtilities/ApplySNShaders.cs b/Nautilus/Utility/ThunderkitUtilities/ApplySNShaders.cs new file mode 100644 index 000000000..743aa428c --- /dev/null +++ b/Nautilus/Utility/ThunderkitUtilities/ApplySNShaders.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace Nautilus.Utility.ThunderkitUtilities; + +internal class ApplySNShaders : MonoBehaviour +{ + [Tooltip("Which GameObject to apply the shaders to (All children will also be affected)")] + public GameObject applyTo; + + private void OnValidate() + { + if (applyTo == null) applyTo = gameObject; + } + + private void Start() + { + MaterialUtils.ApplySNShaders(applyTo); + } +} diff --git a/Nautilus/Utility/ThunderkitUtilities/SetModes.cs b/Nautilus/Utility/ThunderkitUtilities/SetModes.cs new file mode 100644 index 000000000..d6f8d3846 --- /dev/null +++ b/Nautilus/Utility/ThunderkitUtilities/SetModes.cs @@ -0,0 +1,16 @@ +namespace Nautilus.Utility.ThunderkitUtilities; + +internal enum GeneralSetMode +{ + SingleObject, + AllChildObjects, + AllChildObjectsIncludeInactive, +} + +internal enum MaterialSetMode +{ + SingleObject, + AllChildObjects, + AllChildObjectsIncludeInactive, + AllChildGraphics +} From 68109eb86e7bce7c205f243a60587d457b34817d Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Sat, 19 Oct 2024 20:29:22 +0330 Subject: [PATCH 06/12] fix: Duplicated nodes each time a craft tree is accessed (#559) Fixed nodes getting duplicated everytime --- Nautilus/Patchers/CraftTreePatcher.cs | 51 +++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/Nautilus/Patchers/CraftTreePatcher.cs b/Nautilus/Patchers/CraftTreePatcher.cs index a28fcd86d..764348d79 100644 --- a/Nautilus/Patchers/CraftTreePatcher.cs +++ b/Nautilus/Patchers/CraftTreePatcher.cs @@ -21,6 +21,8 @@ internal class CraftTreePatcher #endregion + private static Dictionary _originalTrees = new(); + #region Patches internal static void Patch(Harmony harmony) @@ -28,15 +30,14 @@ internal static void Patch(Harmony harmony) harmony.PatchAll(typeof(CraftTreePatcher)); InternalLogger.Log($"CraftTreePatcher is done.", LogLevel.Debug); } - [HarmonyPostfix] [HarmonyPatch(typeof(CraftTree), nameof(CraftTree.GetTree))] private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __result) { - __result ??= !CustomTrees.TryGetValue(treeType, out var customRoot) ? __result : customRoot.CustomCraftingTree; + var craftTree = !CustomTrees.TryGetValue(treeType, out var customRoot) ? __result : customRoot.CustomCraftingTree; - if (__result == null) + if (craftTree == null) { // The game actually has a few CraftTree.Type that are not used... // None, Unused1, Unused2, etc... @@ -45,14 +46,23 @@ private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __resul return; } + if (!_originalTrees.TryGetValue(treeType, out var originalTree)) + { + originalTree = CopyTree(craftTree); + _originalTrees.Add(treeType, originalTree); + } + + var treeCopy = CopyTree(originalTree); + #if BELOWZERO if (treeType is CraftTree.Type.SeaTruckFabricator) { - PatchCraftTree(ref __result, CraftTree.Type.Fabricator); + PatchCraftTree(ref treeCopy, CraftTree.Type.Fabricator); } #endif - PatchCraftTree(ref __result, treeType); - CraftTree.AddToCraftableTech(__result); + PatchCraftTree(ref treeCopy, treeType); + CraftTree.AddToCraftableTech(treeCopy); + __result = treeCopy; } #endregion @@ -149,6 +159,35 @@ private static void RemoveNodes(ref CraftTree tree, ref List nodesToRemove } } + private static CraftTree CopyTree(CraftTree tree) + { + return new CraftTree(tree.id, (CraftNode)CopyCraftNode(tree.nodes)); + } + + /// + /// Copy the specified node and it's inner nodes recursively. + /// + /// The node to begin this operation on. Can be used on any node. + /// A complete copy of the passed node. + private static TreeNode CopyCraftNode(TreeNode treeNode) + { + var copiedNode = treeNode.Copy(); + copiedNode.nodes = treeNode.nodes.ToList(); + + if (copiedNode.nodes.Count == 0) + { + return copiedNode; + } + + for (var i = 0; i < copiedNode.nodes.Count; i++) + { + treeNode.nodes[i] = CopyCraftNode(treeNode.nodes[i]); + treeNode.nodes[i].parent = copiedNode; + } + + return copiedNode; + } + private static bool TraverseTree(TreeNode nodes, string[] path, out TreeNode currentNode) { currentNode = nodes; From dd547c77397f677549220da495fdf709c3eec21e Mon Sep 17 00:00:00 2001 From: tinyhoot <78366332+tinyhoot@users.noreply.github.com> Date: Sun, 10 Nov 2024 08:05:13 +0100 Subject: [PATCH 07/12] fix: Reversible craft tree nodes (#562) * chore: Consolidate CraftTreeHandler overloads. * fix: Opposing CraftTree changes properly cancel each other out. --- Nautilus/Handlers/CraftTreeHandler.cs | 96 ++++++++++++++++----------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/Nautilus/Handlers/CraftTreeHandler.cs b/Nautilus/Handlers/CraftTreeHandler.cs index 2a46919d3..0abe3db59 100644 --- a/Nautilus/Handlers/CraftTreeHandler.cs +++ b/Nautilus/Handlers/CraftTreeHandler.cs @@ -1,8 +1,11 @@ namespace Nautilus.Handlers; +using System; using System.Collections.Generic; +using System.Linq; using Nautilus.Crafting; using Nautilus.Patchers; +using Nautilus.Utility; /// /// A handler class for creating and modifying crafting trees. @@ -29,6 +32,17 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt nodes.Add(new CraftingNode(stepsToTab, craftTree, craftingItem)); CraftTreePatcher.CraftingNodes[craftTree] = nodes; + + // If this node had previously been slated for removal, undo that instruction. + if (CraftTreePatcher.NodesToRemove.TryGetValue(craftTree, out List queuedNodes)) + { + var fullPath = stepsToTab.Append(craftingItem.AsString(false)); + int removedNodes = queuedNodes.RemoveAll(node => node.Path.SequenceEqual(fullPath)); + if (removedNodes > 0) + { + InternalLogger.Debug($"Removal of CraftNode at {string.Join("/", fullPath)} overwritten by new custom CraftNode."); + } + } } /// @@ -36,16 +50,9 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt /// /// The target craft tree to edit. /// The item to craft. - public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingItem) { - if (!CraftTreePatcher.CraftingNodes.TryGetValue(craftTree, out var nodes)) - { - nodes = new List(); - } - - nodes.Add(new CraftingNode(new string[0], craftTree, craftingItem)); - CraftTreePatcher.CraftingNodes[craftTree] = nodes; + AddCraftingNode(craftTree, craftingItem, Array.Empty()); } #if SUBNAUTICA @@ -58,13 +65,7 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt /// The sprite of the tab. public static void AddTabNode(CraftTree.Type craftTree, string name, string displayName, Atlas.Sprite sprite) { - if (!CraftTreePatcher.TabNodes.TryGetValue(craftTree, out var craftTreeTabNodes)) - { - craftTreeTabNodes = new List(); - } - - craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, sprite, name, displayName)); - CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + AddTabNode(craftTree, name, displayName, sprite, Array.Empty()); } /// @@ -74,16 +75,9 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp /// The ID of the tab node. Must be unique! /// The display name of the tab, which will show up when you hover your mouse on the tab. If null or empty, this will use the language line "{craftTreeName}_{tabName}" instead. /// The sprite of the tab. - public static void AddTabNode(CraftTree.Type craftTree, string name, string displayName, UnityEngine.Sprite sprite) { - if (!CraftTreePatcher.TabNodes.TryGetValue(craftTree, out var craftTreeTabNodes)) - { - craftTreeTabNodes = new List(); - } - - craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, new Atlas.Sprite(sprite), name, displayName)); - CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + AddTabNode(craftTree, name, displayName, new Atlas.Sprite(sprite), Array.Empty()); } /// @@ -108,6 +102,17 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + + // If this node had previously been slated for removal, undo that instruction. + if (CraftTreePatcher.NodesToRemove.TryGetValue(craftTree, out List queuedNodes)) + { + var fullPath = stepsToTab.Append(name); + int removedNodes = queuedNodes.RemoveAll(node => node.Path.SequenceEqual(fullPath)); + if (removedNodes > 0) + { + InternalLogger.Debug($"Removal of TabNode at {string.Join("/", fullPath)} overwritten by new custom TabNode."); + } + } } /// @@ -125,13 +130,7 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp /// public static void AddTabNode(CraftTree.Type craftTree, string name, string displayName, UnityEngine.Sprite sprite, params string[] stepsToTab) { - if (!CraftTreePatcher.TabNodes.TryGetValue(craftTree, out var craftTreeTabNodes)) - { - craftTreeTabNodes = new List(); - } - - craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, new Atlas.Sprite(sprite), name, displayName)); - CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + AddTabNode(craftTree, name, displayName, new Atlas.Sprite(sprite), stepsToTab); } #elif BELOWZERO @@ -144,13 +143,7 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp /// The sprite of the tab. public static void AddTabNode(CraftTree.Type craftTree, string name, string displayName, UnityEngine.Sprite sprite) { - if (!CraftTreePatcher.TabNodes.TryGetValue(craftTree, out var craftTreeTabNodes)) - { - craftTreeTabNodes = new List(); - } - - craftTreeTabNodes.Add(new TabNode(new string[0], craftTree, sprite, name, displayName)); - CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + AddTabNode(craftTree, name, displayName, sprite, Array.Empty()); } /// @@ -175,6 +168,17 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp craftTreeTabNodes.Add(new TabNode(stepsToTab, craftTree, sprite, name, displayName)); CraftTreePatcher.TabNodes[craftTree] = craftTreeTabNodes; + + // If this node had previously been slated for removal, undo that instruction. + if (CraftTreePatcher.NodesToRemove.TryGetValue(craftTree, out List queuedNodes)) + { + var fullPath = stepsToTab.Append(name); + int removedNodes = queuedNodes.RemoveAll(node => node.Path.SequenceEqual(fullPath)); + if (removedNodes > 0) + { + InternalLogger.Debug($"Removal of TabNode at {string.Join("/", fullPath)} overwritten by new custom TabNode."); + } + } } #endif @@ -201,6 +205,24 @@ public static void RemoveNode(CraftTree.Type craftTree, params string[] stepsToN nodesToRemove.Add(new Node(stepsToNode, craftTree)); CraftTreePatcher.NodesToRemove[craftTree] = nodesToRemove; + + // If this is a previously registered custom node, undo that instruction. + // This avoids accumulation of instructions that cancel each other out. + int removedNodes = 0; + if (CraftTreePatcher.CraftingNodes.TryGetValue(craftTree, out List craftingNodes)) + { + removedNodes += craftingNodes.RemoveAll(node => node.Path.Append(node.TechType.ToString()).SequenceEqual(stepsToNode)); + } + + if (CraftTreePatcher.TabNodes.TryGetValue(craftTree, out List tabNodes)) + { + removedNodes += tabNodes.RemoveAll(node => node.Path.Append(node.Id).SequenceEqual(stepsToNode)); + } + + if (removedNodes > 0) + { + InternalLogger.Debug($"Removed another mod's custom node at {string.Join("/", stepsToNode)} from future craft trees."); + } } /// From e0b3d66631053c6e41831f16e812aaec88daedff Mon Sep 17 00:00:00 2001 From: Lee23 <31892011+LeeTwentyThree@users.noreply.github.com> Date: Mon, 11 Nov 2024 23:57:32 -0500 Subject: [PATCH 08/12] feat: Add generic overloads for PrefabUtils methods (#561) * Add generic variant of AddStorageContainer * Add generic overload of AddConstructable --- Nautilus/Utility/PrefabUtils.cs | 38 +++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/Nautilus/Utility/PrefabUtils.cs b/Nautilus/Utility/PrefabUtils.cs index 5eb5e2bc1..dcf5265a5 100644 --- a/Nautilus/Utility/PrefabUtils.cs +++ b/Nautilus/Utility/PrefabUtils.cs @@ -111,6 +111,21 @@ public static void AddBasicComponents(GameObject prefab, string classId, TechTyp /// This should be a child of , and NOT the root. If it is the same value as , you have done something wrong! /// A reference to the added instance. public static Constructable AddConstructable(GameObject prefab, TechType techType, ConstructableFlags constructableFlags, GameObject model = null) + { + return AddConstructable(prefab, techType, constructableFlags, model); + } + + /// + /// Adds and configures the component or a derived type on the specified prefab. + /// + /// The prefab to operate on. + /// The tech type associated with the specified prefab. + /// A bitmask comprised of one or more that specify how the prefab should be treated during placement. + /// The child GameObject that holds all the renderers that are used for the ghost model. + /// If assigned, this parameter will control the field. This field MUST BE ASSIGNED A VALUE to avoid errors when building! + /// This should be a child of , and NOT the root. If it is the same value as , you have done something wrong! + /// A reference to the added instance. + public static T AddConstructable(GameObject prefab, TechType techType, ConstructableFlags constructableFlags, GameObject model = null) where T : Constructable { if (techType is TechType.None) { @@ -118,7 +133,7 @@ public static Constructable AddConstructable(GameObject prefab, TechType techTyp return null; } - var constructable = prefab.EnsureComponent(); + var constructable = prefab.EnsureComponent(); constructable.controlModelState = true; // TODO: Add ghost material for BZ #if SUBNAUTICA @@ -189,6 +204,25 @@ public static VFXFabricating AddVFXFabricating(GameObject prefabRoot, string pat /// If true, you cannot destroy this prefab unless all of its storage containers are empty. /// A reference to the added instance. public static StorageContainer AddStorageContainer(GameObject prefabRoot, string storageRootName, string storageRootClassId, int width, int height, bool preventDeconstructionIfNotEmpty = true) + { + return AddStorageContainer(prefabRoot, storageRootName, storageRootClassId, width, height, + preventDeconstructionIfNotEmpty); + } + + /// + /// Adds a component of the type or a derived class to the given prefab, for basic use cases with lockers and such. + /// Due to how this component needs to be initialized, this method will disable the object and re-enable it after the component is added (assuming it was already active). This all happens within the same frame and will not be seen. + /// + /// The prefab that the component is added onto. This does not necessarily NEED to be the "prefab root". You can set it to a + /// child collider if you want a smaller area of interaction or to have multiple storage containers on one prefab. + /// The name of the object that internally holds all of the items. + /// A unique string for the component. + /// The width of this container's face. + /// The height of this container's interface. + /// If true, you cannot destroy this prefab unless all of its storage containers are empty. + /// A reference to the added instance. + public static T AddStorageContainer(GameObject prefabRoot, string storageRootName, string storageRootClassId, + int width, int height, bool preventDeconstructionIfNotEmpty = true) where T : StorageContainer { var wasActive = prefabRoot.activeSelf; @@ -200,7 +234,7 @@ public static StorageContainer AddStorageContainer(GameObject prefabRoot, string var childObjectIdentifier = storageRoot.AddComponent(); childObjectIdentifier.ClassId = storageRootClassId; - var container = prefabRoot.AddComponent(); + var container = prefabRoot.AddComponent(); container.prefabRoot = prefabRoot; container.width = width; container.height = height; From 536af8cbc2b281e7ec6d80285664d940226caf4b Mon Sep 17 00:00:00 2001 From: Lee23 <31892011+LeeTwentyThree@users.noreply.github.com> Date: Mon, 11 Nov 2024 23:57:59 -0500 Subject: [PATCH 09/12] fix!: Fix KnownTechHandler SetAnalysisTechEntry with story goals overload (#560) Change analysis tech overload with story goals Changed this overload to fix story goals not being passed in and made it ONLY available for SN1. --- Nautilus/Handlers/KnownTechHandler.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Nautilus/Handlers/KnownTechHandler.cs b/Nautilus/Handlers/KnownTechHandler.cs index 19dc13d27..f2211c7da 100644 --- a/Nautilus/Handlers/KnownTechHandler.cs +++ b/Nautilus/Handlers/KnownTechHandler.cs @@ -316,6 +316,7 @@ public static void SetAnalysisTechEntry(KnownTech.AnalysisTech analysisTech) AddAnalysisTech(analysisTech); } + #if SUBNAUTICA /// /// Allows you to define which TechTypes are unlocked when a certain TechType is unlocked, i.e., "analysed". /// If there is already an existing AnalysisTech entry for a TechType, all the TechTypes in "techTypesToUnlock" will be @@ -329,8 +330,9 @@ public static void SetAnalysisTechEntry(KnownTech.AnalysisTech analysisTech) /// The story goals that will be triggered when you unlock the blueprint. public static void SetAnalysisTechEntry(TechType techTypeToBeAnalysed, IEnumerable techTypesToUnlock, FMODAsset unlockSound, Sprite unlockSprite, List storyGoals) { - AddAnalysisTech(techTypeToBeAnalysed, techTypesToUnlock, "NotificationBlueprintUnlocked", unlockSound, unlockSprite); + AddAnalysisTech(techTypeToBeAnalysed, techTypesToUnlock, "NotificationBlueprintUnlocked", unlockSound, unlockSprite, storyGoals); } + #endif /// /// Allows you to set up a custom Compound Unlock requiring multiple techtypes to be unlocked before 1 is. From 9d4a89e28a49abe2cff80e5b6e314d1010a019cf Mon Sep 17 00:00:00 2001 From: Metious <71298690+Metious@users.noreply.github.com> Date: Wed, 13 Nov 2024 06:38:57 +0330 Subject: [PATCH 10/12] feat: FMOD fade-outs (#564) * Added Fade out extensions * Patches to allow fade outs * Slight refactoring * Fixed compiler error * Fix fade out not working as intended --------- Co-authored-by: Lee23 <31892011+LeeTwentyThree@users.noreply.github.com> --- Nautilus/Extensions/FModExtensions.cs | 54 ++++++++++++++++++++++ Nautilus/Patchers/CustomSoundPatcher.cs | 60 ++++++++++++++++++++++--- Nautilus/Utility/AudioUtils.cs | 22 ++++----- 3 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 Nautilus/Extensions/FModExtensions.cs diff --git a/Nautilus/Extensions/FModExtensions.cs b/Nautilus/Extensions/FModExtensions.cs new file mode 100644 index 000000000..aa8927736 --- /dev/null +++ b/Nautilus/Extensions/FModExtensions.cs @@ -0,0 +1,54 @@ +using FMOD; +using FMODUnity; +using Nautilus.Patchers; +using Nautilus.Utility; + +namespace Nautilus.Extensions; + +/// +/// Contains extension methods for the FMOD system. +/// +public static class FModExtensions +{ + /// + /// Adds a fade-out point for the specified sound. + /// + /// The sound to add a fade-out to + /// The duration of the fade-out. + /// Fades are only triggered when an emitter respects them. E.G: when calling FMOD_CustomEmitter.Stop(STOP_MODE.ALLOWFADEOUT). + public static void AddFadeOut(this Sound sound, float seconds) + { + if (!sound.hasHandle()) + { + InternalLogger.Error("AddFadeOut: Sound object is missing. Please provide a valid sound object."); + return; + } + + CustomSoundPatcher.FadeOuts[sound.handle] = new CustomSoundPatcher.FadeInfo(sound, seconds); + } + + /// + /// Adds a fade-out point for the specified channel. + /// + /// The channel to add a fade-out to + /// The duration of the fade-out. The fade-out starts at the current time. + /// The DSP clock at the point where the fade was added.
+ /// DSP clock consists of 48_000 ticks per second. For more information, please refer to the FMOD docs. + /// This method only applies the fade-out one time. If you want the fade to stay everytime the sound is played, consider using . + public static void AddFadeOut(this Channel channel, float seconds, out ulong dspClock) + { + if (!channel.hasHandle()) + { + InternalLogger.Error("AddFadeOut: Channel object is invalid. Fade operation is cancelled."); + dspClock = 0; + return; + } + + RuntimeManager.CoreSystem.getSoftwareFormat(out int samplesRate, out _, out _); + + channel.getDSPClock(out _, out ulong parentClock); + channel.addFadePoint(parentClock, 1f); + channel.addFadePoint(parentClock + (ulong)(samplesRate * seconds), 0f); + dspClock = parentClock; + } +} \ No newline at end of file diff --git a/Nautilus/Patchers/CustomSoundPatcher.cs b/Nautilus/Patchers/CustomSoundPatcher.cs index 7d4a2de76..a46fa87ba 100644 --- a/Nautilus/Patchers/CustomSoundPatcher.cs +++ b/Nautilus/Patchers/CustomSoundPatcher.cs @@ -1,24 +1,29 @@ +using System; using System.Collections.Generic; using FMOD; using FMOD.Studio; using FMODUnity; using HarmonyLib; +using Nautilus.Extensions; using Nautilus.FMod.Interfaces; using Nautilus.Handlers; using Nautilus.Utility; using UnityEngine; using UnityEngine.Playables; +using STOP_MODE = FMOD.Studio.STOP_MODE; namespace Nautilus.Patchers; internal class CustomSoundPatcher { internal record struct AttachedChannel(Channel Channel, Transform Transform); + internal record struct FadeInfo(Sound Sound, float Seconds); internal static readonly SelfCheckingDictionary CustomSounds = new("CustomSounds"); internal static readonly SelfCheckingDictionary CustomSoundBuses = new("CustomSoundBuses"); internal static readonly SelfCheckingDictionary CustomFModSounds = new("CustoomFModSounds"); internal static readonly Dictionary EmitterPlayedChannels = new(); + internal static readonly Dictionary FadeOuts = new(); internal static List AttachedChannels = new(); private static readonly Dictionary PlayedChannels = new(); @@ -159,10 +164,14 @@ public static bool FMODEventPlayableBehavior_OnExit_Prefix(FMODEventPlayableBeha return false; } - if (__instance.stopType != FMODUnity.STOP_MODE.None) + if (__instance.stopType == FMODUnity.STOP_MODE.Immediate) { channel.stop(); } + else if (__instance.stopType == FMODUnity.STOP_MODE.AllowFadeout) + { + TryFadeOutBeforeStop(channel); + } PlayableBehaviorChannels.Remove(__instance); __instance.isPlayheadInside = false; @@ -440,11 +449,18 @@ public static bool FMOD_CustomEmitter_Play_Prefix(FMOD_CustomEmitter __instance) [HarmonyPatch(typeof(FMOD_CustomEmitter), nameof(FMOD_CustomEmitter.Stop))] [HarmonyPrefix] - public static bool FMOD_CustomEmitter_Stop_Prefix(FMOD_CustomEmitter __instance) + public static bool FMOD_CustomEmitter_Stop_Prefix(FMOD_CustomEmitter __instance, STOP_MODE stopMode) { if (!EmitterPlayedChannels.TryGetValue(__instance.GetInstanceID(), out var channel)) return true; - channel.stop(); + if (stopMode == STOP_MODE.IMMEDIATE) + { + channel.stop(); + } + else + { + TryFadeOutBeforeStop(channel); + } __instance._playing = false; __instance.OnStop(); @@ -486,7 +502,8 @@ public static bool FMOD_CustomEmitter_ReleaseEvent_Prefix(FMOD_CustomEmitter __i if (__instance.asset == null || !CustomSounds.ContainsKey(__instance.asset.path) && !CustomFModSounds.ContainsKey(__instance.asset.path)) return true; if (!EmitterPlayedChannels.TryGetValue(__instance.GetInstanceID(), out var channel)) return false; // known sound but not played yet - channel.stop(); + TryFadeOutBeforeStop(channel); + EmitterPlayedChannels.Remove(__instance.GetInstanceID()); return false; @@ -761,14 +778,22 @@ public static bool FMOD_CustomEmitter_Play_Prefix(FMOD_CustomEmitter __instance) [HarmonyPatch(typeof(FMOD_CustomEmitter), nameof(FMOD_CustomEmitter.Stop))] [HarmonyPrefix] - public static bool FMOD_CustomEmitter_Stop_Prefix(FMOD_CustomEmitter __instance) + public static bool FMOD_CustomEmitter_Stop_Prefix(FMOD_CustomEmitter __instance, STOP_MODE stopMode) { if (!EmitterPlayedChannels.TryGetValue(__instance.GetInstanceID(), out Channel channel)) { return true; } - channel.stop(); + if (stopMode == STOP_MODE.ALLOWFADEOUT) + { + TryFadeOutBeforeStop(channel); + } + else + { + channel.stop(); + } + __instance._playing = false; __instance.OnStop(); @@ -827,7 +852,9 @@ public static bool FMOD_CustomEmitter_ReleaseEvent_Prefix(FMOD_CustomEmitter __i return false; // known sound but not played yet } - channel.stop(); + TryFadeOutBeforeStop(channel); + + EmitterPlayedChannels.Remove(__instance.GetInstanceID()); return false; @@ -923,4 +950,23 @@ internal static void SetChannel3DAttributes(Channel channel, Vector3 position) ATTRIBUTES_3D attributes = position.To3DAttributes(); channel.set3DAttributes(ref attributes.position, ref attributes.velocity); } + + private static bool TryFadeOutBeforeStop(Channel channel) + { + if (channel.getCurrentSound(out var sound) != RESULT.OK || !FadeOuts.TryGetValue(sound.handle, out var fadeOut)) + { + channel.stop(); + return false; + } + + channel.getDelay(out ulong _, out ulong _, out bool stopChannels); + + if (stopChannels) + return false; + + RuntimeManager.CoreSystem.getSoftwareFormat(out var samplesRate, out _, out _); + channel.AddFadeOut(fadeOut.Seconds, out var dspClock); + channel.setDelay(0, dspClock + (ulong)(samplesRate * fadeOut.Seconds)); + return true; + } } \ No newline at end of file diff --git a/Nautilus/Utility/AudioUtils.cs b/Nautilus/Utility/AudioUtils.cs index af1ef081f..8e4666aab 100644 --- a/Nautilus/Utility/AudioUtils.cs +++ b/Nautilus/Utility/AudioUtils.cs @@ -26,7 +26,7 @@ public static partial class AudioUtils /// For music, PDA voices and any 2D sounds that can have more than one instance at a time. ///
public const MODE StandardSoundModes_Stream = StandardSoundModes_2D | MODE.CREATESTREAM; - + private static FMOD.System FMOD_System => RuntimeManager.CoreSystem; /// @@ -84,14 +84,8 @@ public static IEnumerable CreateSounds(IEnumerable soundPaths, MO public static bool TryPlaySound(Sound sound, string busPath, out Channel channel) { channel = default; - Bus bus = RuntimeManager.GetBus(busPath); - if (bus.getChannelGroup(out ChannelGroup channelGroup) != RESULT.OK || !channelGroup.hasHandle()) - { - bus.lockChannelGroup(); - } - return bus.getChannelGroup(out channelGroup) == RESULT.OK && - channelGroup.getPaused(out bool paused) == RESULT.OK && - FMOD_System.playSound(sound, channelGroup, paused, out channel) == RESULT.OK; + var bus = RuntimeManager.GetBus(busPath); + return TryPlaySound(sound, bus, out channel); } /// @@ -108,9 +102,17 @@ public static bool TryPlaySound(Sound sound, Bus bus, out Channel channel) { bus.lockChannelGroup(); } - return bus.getChannelGroup(out channelGroup) == RESULT.OK && + + var success = bus.getChannelGroup(out channelGroup) == RESULT.OK && channelGroup.getPaused(out bool paused) == RESULT.OK && FMOD_System.playSound(sound, channelGroup, paused, out channel) == RESULT.OK; + + if (!success) + { + return false; + } + + return true; } /// From 931ffb189b70881e5b83a4a94c385516c8a3cb8d Mon Sep 17 00:00:00 2001 From: Lee23 <31892011+LeeTwentyThree@users.noreply.github.com> Date: Tue, 12 Nov 2024 22:10:57 -0500 Subject: [PATCH 11/12] Increase version to 1.0.0-pre.33 --- Version.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Version.targets b/Version.targets index 14b34be0a..60adffa44 100644 --- a/Version.targets +++ b/Version.targets @@ -3,7 +3,7 @@ 1.0.0 - 32 + 33 pre.$(SuffixNumber) \ No newline at end of file From 198fcc75a2285cf8d9a9031c5a9024f3fd6cc0fa Mon Sep 17 00:00:00 2001 From: Lee23 <31892011+LeeTwentyThree@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:55:41 -0500 Subject: [PATCH 12/12] fix: Re-introduce gridding in mixed craft tree tabs (#565) --- Nautilus/Patchers/CraftDataPatcher.cs | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Nautilus/Patchers/CraftDataPatcher.cs b/Nautilus/Patchers/CraftDataPatcher.cs index 0fb2b3b4a..2a198c851 100644 --- a/Nautilus/Patchers/CraftDataPatcher.cs +++ b/Nautilus/Patchers/CraftDataPatcher.cs @@ -78,6 +78,45 @@ internal static void Patch(Harmony harmony) InternalLogger.Log("CraftDataPatcher is done.", LogLevel.Debug); } + + [HarmonyPatch(typeof(uGUI_CraftingMenu), nameof(uGUI_CraftingMenu.IsGrid))] + [HarmonyPrefix] + private static bool ShouldGridPostfix(uGUI_CraftingMenu.Node node, ref bool __result) + { + __result = ShouldGrid(); + return false; + + bool ShouldGrid() + { + var craftings = 0; + var tabs = 0; + + foreach (var child in node) + { + if (child.action == TreeAction.Expand) + { + tabs++; + } + else if (child.action == TreeAction.Craft) + { + craftings++; + } + } + + return craftings > tabs; + } + } + + [HarmonyPatch(typeof(uGUI_CraftingMenu), nameof(uGUI_CraftingMenu.Collapse))] + [HarmonyPostfix] + private static void CollapsePostfix(uGUI_CraftingMenu.Node parent) + { + if (parent == null) return; + + if (parent.action != TreeAction.Craft) return; + + parent.icon.SetActive(false); + } [HarmonyPrefix] [HarmonyPatch(typeof(CraftData), nameof(CraftData.GetTechType), new Type[] { typeof(GameObject), typeof(GameObject) }, argumentVariations: new ArgumentType[] { ArgumentType.Normal, ArgumentType.Out })]