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 })]