From a45e9460e5d1f59c440b9fde53efdbe0727fc9cb Mon Sep 17 00:00:00 2001 From: Govorunb Date: Thu, 20 Jun 2024 00:12:39 +1000 Subject: [PATCH] remove ecclib cache FMODAssets (removes a teeny-tiny memory leak) update readme a bit while we're at it --- BelowZero.props | 1 - .../BepInEx/plugins/ECCLibrary/ECCLibrary.dll | Bin 75776 -> 0 bytes .../BepInEx/plugins/ECCLibrary/ECCLibrary.xml | 2533 ---------------- .../BepInEx/plugins/ECCLibrary/ECCLibrary.dll | Bin 78848 -> 0 bytes .../BepInEx/plugins/ECCLibrary/ECCLibrary.xml | 2562 ----------------- README.md | 82 +- SCHIZO/Commands/FMODCommand.cs | 23 +- .../Components/CreaturePhysicMaterial.cs | 9 +- .../Data/ModdedWaterParkCreatureData.cs | 10 +- SCHIZO/Creatures/UnityCreaturePrefab.cs | 18 +- SCHIZO/Helpers/FMODHelpers.GameEvents.cs | 14 + SCHIZO/Helpers/FMODHelpers.cs | 83 +- SCHIZO/Helpers/ObjectReferences.cs | 31 + SCHIZO/Items/Components/ModdedCreatureEgg.cs | 13 +- SCHIZO/Items/Data/PDAEncyclopediaInfo.cs | 4 +- SCHIZO/Jukebox/JukeboxDiskPrefab.BelowZero.cs | 2 +- SCHIZO/Plugin.cs | 4 - SCHIZO/SCHIZO.csproj | 1 - SCHIZO/Sounds/ItemSounds.cs | 4 +- Subnautica.props | 1 - .../SCHIZO/Items/Data/Crafting/Item.cs | 4 +- 21 files changed, 212 insertions(+), 5187 deletions(-) delete mode 100644 Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.dll delete mode 100644 Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.xml delete mode 100644 Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.dll delete mode 100644 Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.xml create mode 100644 SCHIZO/Helpers/FMODHelpers.GameEvents.cs create mode 100644 SCHIZO/Helpers/ObjectReferences.cs diff --git a/BelowZero.props b/BelowZero.props index ffc17eda..fcbad2fa 100644 --- a/BelowZero.props +++ b/BelowZero.props @@ -10,7 +10,6 @@ - diff --git a/Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.dll b/Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.dll deleted file mode 100644 index d896f446c46ad7c1c7701ef8f15aab3fe079f409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75776 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 diff --git a/Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.xml b/Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.xml deleted file mode 100644 index 1c539cee..00000000 --- a/Install/BelowZero/BepInEx/plugins/ECCLibrary/ECCLibrary.xml +++ /dev/null @@ -1,2533 +0,0 @@ - - - - ECCLibrary - - - - - Manages the creation of cooked and cured creatures. - - - - - Advanced method to create a cooked/cured creature. - - - - - The fastest way to create a cooked AND cured variant of the given creature. Automatically assigns the Analysis Tech so it is unlocked with the creature. - - The original uncooked creature. MUST have been registered already. - Name of the cooked fish item. - Description of the cooked fish item. - Icon of the cooked fish item. - Name of the cured fish item. - Description of the cured fish item. - Icon of the cured fish item. - Food values of the cooked, which will automatically determine the cured values. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Holds both the cooked and cured version of the creature. - - - - - Holds both the cooked and cured version of the creature. - - - - - Simple method to create a cooked variant of the given creature. - - The original uncooked creature. MUST have been registered already. - Name of the cooked fish item. - Description of the cooked fish item. - Food values. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Simple method to create a cured variant of the given creature. - - The original uncooked creature. MUST have been registered already. - Name of the cured fish item. - Description of the cured fish item. - Food value of the food. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Override this class to define a new creature. Call the method on an instance to add it to the game. - - - - - Information for registering the prefab. - - - - - A reference to the custom prefab instance. - - - - - Instantiates a Creature Asset with the given PrefabInfo. Call the Register method to add the creature to the game. - - - Information required for spawning. Must be unique. - An instance of this struct can be easily created by calling . - - - - The ClassID of this creature, sourced from the PrefabInfo property. - - - - - The TechType of this creature, sourced from the PrefabInfo property. - - - - - The EntityInfo for this creature, only assigned after is called. - - - - - Registers this creature into the game. - - - - - An empty method that can be overriden to insert code that runs directly after the prefab is registered (runs at patch time). - - - - - The majority of the data for each creature should be assigned through this call. - - - - - - Changes to the prefab can be applied here. - - - - - - - - By default calls to convert the materials of the entire prefab. Can be overriden to have more control over the process. - - - - - - An alternative to that does not use inheritance. Supply a template and any needed prefab code. - - - - - An optional call that allows for modification of the prefab after creation. - - - - - An optional call that, if overriden, no longer applies the MarmosetUBER shader automatically and allows for full control of the materials. Called AFTER ! - - - - - Creates a basic Creature Asset that does not use inheritance. Supply a template and any needed prefab code. Call the Register method to add the creature to the game. - - The unique PrefabInfo of this creature instance. - The template that contains all of the creature's data. - An optional call that allows for modification of the prefab after creation. - An optional call that, if overriden, no longer applies the MarmosetUBER shader automatically and allows for full control of the materials. Called AFTER ! - - - - Handled by the class. - - - - - - Handled by the class. - - - - - - - - Handled by the class. - - - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Swim speed when swimming toward a Cyclops. - - - - - If the Cyclops is this many meters or more away from the creature's spawn point (leash position), it will be ignored. Generally has a value of 100f or more. - - - - - The amount of aggression gained per second while aware of a Cyclops. Note that this aggression is linked to '', NOT ''. -
Generally 0.2f for smaller creatures and 0.4f for a leviathan. -
-
- - - Minimum amount of time between each "attack". Generally 6 seconds for smaller creatures and 3 seconds for a leviathan. - - - - - How fast the aggression to noise decreases. Typically 0.08f for smaller creatures and 0.01f for leviathans. - - - - - Minimum aggression to attack. All vanilla creatures use a value of 0.75f. - - - - - - - The priority for this , expected to be in the range [0, 1]. - Swim speed when swimming toward a Cyclops. - If the Cyclops is this many meters or more away from the creature's spawn point (leash position), it will be ignored. Generally has a value of 100f or more. - The amount of aggression gained per second while aware of a Cyclops. Note that this aggression is linked to '', NOT ''. -
Generally 0.2f for smaller creatures and 0.4f for a leviathan. - Minimum amount of time between each "attack". Generally 6 seconds for smaller creatures and 3 seconds for a leviathan. - How fast the aggression to noise decreases. Typically 0.08f for smaller creatures and 0.01f for leviathans. - Minimum aggression to attack. All vanilla creatures use a value of 0.75f. -
- - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How fast the creature swims while attacking. - - - - - Minimum amount of aggression needed to start an attack, generally 0.5f - 0.75f. - - - - - Maximum length of the attack. Generally ranges from 7 to 10 seconds. - - - - - Minimum number of seconds between attacks. Generally ranges from 10 to 20 seconds. - - - - - Minimum length of the attack. Almost always 3 seconds. - - - - - How long the can be recognized for after it was last set. For most creatures, this is only 5 seconds. Does not influence how long the attack will be. - - - - - Almost always true, meaning the creature is no longer aggressive after the time is up. - - - - - - - The priority for this , expected to be in the range [0, 1]. Typically higher than object avoidance priorities! - How fast the creature swims while attacking. - Minimum amount of aggression needed to start an attack, generally 0.5f - 0.75f. - Maximum length of the attack. Generally ranges from 7 to 10 seconds. - Minimum number of seconds between attacks. Generally ranges from 10 to 20 seconds. - Minimum length of the attack. Almost always 3 seconds. - How long the can be recognized for after it was last set. For most creatures, this is only 5 seconds. Does not influence how long the attack will be. - Almost always true, meaning the creature is no longer aggressive after the time is up. - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - If true, the creature will only avoid terrain. Otherwise, all solid objects will be avoided. Typically true for larger creatures. - - - - - How fast this creature swims away from obstacles (m/s). Should generally match the swim speed. - - - - - How much empty space there must be in any direction around the creature for it to choose that path as "clear". Typically 5f for small fish, up to 10f for larger fish. Large enough values may disable this behaviour entirely. - - - - - The action will only perform if there is an obstacle within this many meters in front of the creature (or around the creature if scanRadius > 0). Typically similar to the avoidance distance. - - - - - How long this creature will continue to swim away from the terrain. Almost always equal to 2f. - - - - - How long between each "scan". Typically 1f but lower values may be needed for faster creatures. - - - - - If equal to 0f (as done by most creatures), the creature will look for obstacles directly in front of it. Otherwise it will perform a SphereCast with this starting radius. - - - - - The maximum number of times a random direction is evaluated to check for a clear path. If all "clear checks" fail, the action will be canceled and the creature will ignore the obstacle. Almost always 10. - - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. - - The priority for this , expected to be in the range [0, 1]. Typically lower than attack priorities! - If true, the creature will only avoid terrain. Otherwise, all solid objects will be avoided. Typically true for larger creatures. - How fast this creature swims away from obstacles (m/s). Should generally match the swim speed. - How much empty space there must be in any direction around the creature for it to choose that path as "clear". Typically 5f for small fish, up to 10f for larger fish. Large enough values may disable this behaviour entirely. - The action will only perform if there is an obstacle within this many meters in front of the creature (or around the creature if scanRadius > 0). Typically similar to the avoidance distance. - How long this creature will continue to swim away from the terrain. Almost always equal to 2f. - How long between each "scan". Typically 1f but lower values may be needed for faster creatures. - If equal to 0f (as done by most creatures), the creature will look for obstacles directly in front of it. Otherwise it will perform a SphereCast with this starting radius. - The maximum number of times a random direction is evaluated to check for a clear path. If all "clear checks" fail, the action will be canceled and the creature will ignore the obstacle. Almost always 10. - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How fast this creature swims when intentionally avoiding terrain. - - - - - How many meters long an "empty space" is required to be, in any given direction. Typically about 30 meters. - - - - - Similar to avoidanceDistance, defines how many meters long an "empty space" is required to be, in any given direction. Typically uses the same value as avoidanceDistance and is used for the cheaper "initial check" that determines whether or not the actual avoidance takes place. - - - - - Must be in the range [0, 1]. The higher this value, the more it tends to only focus on points in front of it. Generally 0.5f, but the Reaper Leviathan uses a value of 1f. - - - - - The quality of object avoidance. Almost always seen as 10 (the default value). - - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - The priority for this , expected to be in the range [0, 1]. - How fast this creature swims when intentionally avoiding terrain. - How many meters long an "empty space" is required to be, in any given direction. Typically about 30 meters. - Similar to avoidanceDistance, defines how many meters long an "empty space" is required to be, in any given direction. Typically uses the same value as avoidanceDistance and is used for the cheaper "initial check" that determines whether or not the actual avoidance takes place. - Must be in the range [0, 1]. The higher this value, the more it tends to only focus on points in front of it. Generally 0.5f, but the Reaper Leviathan uses a value of 1f. - The quality of object avoidance. Almost always seen as 10 (the default value). - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How much damage must be taken before the creature will begin to flee. - - - - - How long the creature flees for. - - - - - At least how far in meters the creature will flee when attacked. - - - - - How fast the creature will flee in m/s. - - - - - How many seconds are between each "swim". - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - How much damage must be taken before the creature will begin to flee. - How long the creature flees for. - At least how far in meters the creature will flee when attacked. - How fast the creature will flee in m/s. - How many seconds are between each "swim". - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Default swim speed when swimming. - - - - - Interval between swimming. - - - - - The quality of the terrain avoidance. - - - - - How tired this creature gets while fleeing, each second. - - - - - The velocity when tired. - - - - - How exhausted the creature gets while fleeing, each second. - - - - - The velocity when exhausted (after fleeing too long). - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - Default swim speed when swimming. - Interval between swimming. - The quality of the terrain avoidance. - How tired this creature gets while fleeing, each second. - The velocity when tired. - How exhausted the creature gets while fleeing, each second. - The velocity when exhausted (after fleeing too long). - - - - Contains data pertaining to creating the CreatureAction. This component keeps creatures from wandering too far. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How far the creature has to be from its spawn point to begin swimming back to it. For small and medium creatures usually has a value of 15-30 meters. Typically very high (upwards of 150m) for leviathans. - - - - - How fast the creature swims back to its spawn point. Generally matches SwimRandom swim velocity, more or less. - - - - - The minimum amount of time between each "swim". Vanilla creatures always use a value of 1 second (there is very little reason to change this). - - - - - How long the creature will continue to swim back to its spawn point during each "swim" (unless overriden by another action). Generally 3 seconds but sometimes (rarely) higher. - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - How far the creature has to be from its spawn point to begin swimming back to it. For small and medium creatures usually has a value of 15-30 meters. Typically very high (upwards of 150m) for leviathans. - How fast the creature swims back to its spawn point. Generally matches SwimRandom swim velocity, more or less. - The minimum amount of time between each "swim". Vanilla creatures always use a value of 1 second (there is very little reason to change this). - How long the creature will continue to swim back to its spawn point during each "swim" (unless overriden by another action). Generally 3 seconds but sometimes (rarely) higher. - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Swim speed for this action (m/s). Should match speed defined in the . Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - - - - - Maximum distance this fish will swim away from its "leader". Default value is 2 meters. - - - - - Number of seconds between each time the creature repositions itself. Default value is 1 second. - - - - - If the creature leaves this radius (in meters) of its leader, it will stop following. Default value is 20 meters. - - - - - Value with expected range of [0.0, 1.0]. Default value is 0.5f. - Every 2 seconds, a schooling creature checks if it should begin schooling. This value determines the chance of forming a school. A value of 0f means it will never school, while 1f means it always will attempt. - - - - - Value with expected range of [0.0, 1.0]. Default value is 0.1f. - Every 2 seconds, a schooling creature checks if it should stop schooling. This value determines the chance of breaking off. A value of 0f means it will never break off, while 1f disables the behaviour. - - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - - The priority for this , expected to be in the range [0, 1]. - Swim speed for this action (m/s). Should match speed defined in the . Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - Maximum distance this fish will swim away from its "leader". Default value is 2 meters. - Number of seconds between each time the creature repositions itself. Default value is 1 second. - If the creature leaves this radius (in meters) of its leader, it will stop following. Default value is 20 meters. - - Value with expected range of [0.0, 1.0]. Default value is 0.5f. - Every 2 seconds, a schooling creature checks if it should begin schooling. This value determines the chance of forming a school. A value of 0f means it will never school, while 1f means it always will attempt. - - - /// Value with expected range of [0.0, 1.0]. Default value is 0.1f. - Every 2 seconds, a schooling creature checks if it should stop schooling. This value determines the chance of breaking off. A value of 0f means it will never break off, while 1f disables the behaviour. - - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - The distance this creature can wander in any direction every time the action is played. X and Z values should always be identical and are usually 10 - 30 meters. Typically the vertical (Y) range is only 20% - 25% of the horizontal range. - - - - - Swim speed for this action (m/s). Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - - - - - The time in seconds between each change in direction. Typically 5 seconds, but more sporadic creatures may have values as low as 2 seconds. - - - - - In the vanilla game this value is typically set to 'true' for leviathans. If enabled, the creature will always swim towards a point at the maximum distance allowed by . Otherwise, the distance will be random. - - - - - The higher this value, the more this creature tends to continue swimming in the same direction. Default value is 0.5f. Typically higher (1.0f-1.2f) for larger creatures. - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - The distance this creature can wander in any direction every time the action is played. X and Z values should always be identical and are usually 10 - 30 meters. Typically the vertical (Y) range is only 20% - 25% of the horizontal range. - Swim speed for this action (m/s). Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - The time in seconds between each change in direction. Typically 5 seconds, but more sporadic creatures may have values as low as 2 seconds. - In the vanilla game this value is typically set to 'true' for leviathans. If enabled, the creature will always swim towards a point at the maximum distance allowed by . Otherwise, the distance will be random. - The higher this value, the more this creature tends to continue swimming in the same direction. Default value is 0.5f. Typically higher (1.0f-1.2f) for larger creatures. - - - - Stores references to the basic components of a creature. Each field should not be expected to be assigned. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. - - - - - At this speed, the Animator's "speed" parameter will be at its maximum of 1f. This should roughly match the creature's maximum velocity. - - - - - Pitch can be described by looking up and down. The parameter for pitch 'pitch' and is always on a scale from -1 to 1. When the creature has rotated by a pitch of in one way, it will equal 1. If it rotated the opposite direction the same amount, it would equal -1. - - - - - In this case, tilt is rotating left and right. This parameter has the same rules, basically, as . - - - - - Strafe animation consists of Up, Down, Left, Right, Forward, and Backwards animations, always relative to the creature's current rotation. The parameters used by this are 'speed_x'. 'speed_y', and 'speed_z', on a scale from -1 to 1. False by default. - - - - - A longer damp time means it takes longer for these strafe, pitch, and tilt animations to take effect, but a more smooth transition. - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. - - At this speed, the Animator's "speed" parameter will be at its maximum of 1f. This should roughly match the creature's maximum velocity. - Pitch can be described by looking up and down. The parameter for pitch 'pitch' and is always on a scale from -1 to 1. When the creature has rotated by a pitch of in one way, it will equal 1. If it rotated the opposite direction the same amount, it would equal -1. - In this case, tilt is rotating left and right. This parameter has the same rules, basically, as . - Strafe animation consists of Up, Down, Left, Right, Forward, and Backwards animations, always relative to the creature's current rotation. The parameters used by this are 'speed_x'. 'speed_y', and 'speed_z', on a scale from -1 to 1. False by default. - A longer damp time means it takes longer for these strafe, pitch, and tilt animations to take effect, but a more smooth transition. - - - - Contains data pertaining to certain creature functions becoming more optimized (lower quality) at a distance. Default values are (10, 50, 500). - - - - - Beyond this distance some animations may be removed. - - - - - Beyond this distance some functionalities may be less precise. - - - - - Beyond this distance trail animations will no longer exist. - - - - - Contains data pertaining to certain creature functions becoming more optimized (lower quality) at a distance. - - Beyond this distance some animations may be removed. 10f by default. - Beyond this distance some functionalities may be less precise, and any TrailManagers that have enabled (on by default) will stop functioning. 50f by default. - Beyond this distance all TrailManagers will cease to function. 500f by default. - - - - Contains basic data pertaining to the s of a creature. - - - - - The rate at which the creature gets hungrier. Predators often require higher levels of hunger to attack. - - - - - The rate at which this creature becomes passive while actively hunting. - - - - - The rate at which this creature becomes less scared. Used in very specific circumstances, most notably when taking damage. - - - - - Contains basic data pertaining to the s of a creature. - - The rate at which the creature gets hungrier. Predators often require higher levels of hunger to attack. - The rate at which this creature becomes passive while actively hunting. - The rate at which this creature becomes less scared. Used in very specific circumstances, most notably when taking damage. - - - - Contains data pertaining to creating the component. - - - - - How fast this creature accelerates while swimming in m/s/s. A value of 10f is used for most creatures, but 12f is used for the Reaper Leviathan & Sea Dragon. - - - - - Rotation speed when turning left/right. Generally has a value of 0.6f. Sometimes (but not always) has smaller values with larger creatures. - - - - - Rotation speed when turning up/down. Generally has a value of 3f, with few exceptions. - - - - - How much this creature tends to "drift", in the range [0f, 1.0f]. Most common value is 0.5f. Generally values (0.3f~) are used for smaller creatures and varies for leviathans. - - - - - If true, this creature will not be able to look upwards/downwards (rotation about X axis will always be 0). - - - - - If enabled, the creature can move (swim and/or walk) above water. - - - - - Typically enabled for most land creatures. - - - - - Contains data pertaining to creating the component. - - How fast this creature accelerates while swimming in m/s/s. A value of 10f is used for most creatures, but 12f is used for the Reaper Leviathan & Sea Dragon. - Rotation speed when turning left/right. Generally has a value of 0.6f. Sometimes (but not always) has smaller values with larger creatures. - Rotation speed when turning up/down. Generally has a value of 3f, with few exceptions. - How much this creature tends to "drift", in the range [0f, 1.0f]. Most common value is 0.5f. Generally lower values (0.3f~) are used for smaller creatures and varies for leviathans - If true, this creature will not be able to look upwards/downwards (rotation about X axis will always be 0). - If enabled, the creature can move (swim and/or walk) above water. - Typically enabled for most land creatures. - - - - Contains data pertaining to the component. - - - - - Whether the creature respawns or not. - - - - - If the creature can respawn at all, then this stops it from respawning when killed by the player. Should be FALSE for prey, and TRUE for predators! - - - - - How long it takes for this creature to respawn. - - - - - Contains data pertaining to the component. - - Whether the creature respawns or not. - If the creature can respawn at all, then this stops it from respawning when killed by the player. Should be FALSE for prey, and TRUE for predators! - How long it takes for this creature to respawn. - - - - Contains data pertaining to creating the component. - - - - - A less useful "turn speed" property, which vaguely determines the speed at which a creature can turn fully around. If in doubt, leave at its default of value of 1f. - - - - - Contains data pertaining to creating the component. - - A less useful "turn speed" property, which vaguely determines the speed at which a creature can turn fully around. If in doubt, leave at its default of value of 1f. - - - - Contains all of the data related to registering a creature into the game. - - - - - Contains all of the data related to registering a creature into the game. - - The model that is cloned to create the creature GameObject. - Goes hand in hand with the EcoTargetType. Please note the Player is a SHARK! Determines very few creature behaviours/interactions. - Goes hand in hand with the BehaviourType. Determines many interactions with creatures, specifically how this creature is "located" or "targeted" by other creatures - Maximum health of this creature. - - - - The model that is cloned to create the creature GameObject. - - - - - Physic material used for all colliders. If unassigned, will default to . - - - - - Contains data pertaining to creating the component. - - - - - Contains data pertaining to creating the component. - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. -
Means the 'speed' parameter can be used in the creature's Animator. -
NOT assigned by default! -
-
- - - Contains data pertaining to the action. Assigned a generic value by default, but can be changed or set to null. - - - - - Contains data pertaining to the action. This component keeps creatures from wandering too far. Not assigned by default. - - - - - Contains data pertaining to the action. Not assigned by default. - - - - - Contains data pertaining to the action. Assigned by default with default values and a priority of 0.8f. - - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. Not assigned by default. - - - - - Contains data pertaining to picking up and/or holding fish in your hands. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - - - - Contains data pertaining to the component. Assigned by default to enable respawning. MUST be assigned! - - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - - - - The Type of the main component that must inherit from . - - - - - Sets the Type of the main component. Must inherit from . - - - - - - A list of all data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - - - - Adds a single type of aggression to this creature. This method can be called MULTIPLE TIMES to add multiple types of aggression! Not functional without the component. - - - - - - Contains data pertaining to creating the CreatureAction. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. Not assigned by default. - - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - Not assigned by default. - - - - - Mass in kg. Ranges from about 1.8f to 4050f. Default is 15kg. - - - - - Determines the distance for which certain calculations (such as Trail Managers) perform (or don't). It is recommended to increase these values for large creatures. - - - - - The FOV is used for detecting things such as prey. SHOULD BE NEGATIVE! This value has an expected range of [-1, 0]. Is 0f by default. A value of -1 means a given object is ALWAYS in view. - - - - - Whether the creature is immune to brine or not. False by default. Typically useful for Lost River creatures. - - - - - Total power output of this creature. All ECC creatures can be put in the bioreactor as long as this value is greater than 0. Default value is 200. - - - - - The Surface Type applied to the main collider. Default is . - - - - - Settings that determine basic attributes of the creature. - - - - - Contains data pertaining to the [sic] component. Not assigned by default. - - - - - If set to true, the Scanner Room can scan for this creature. False by default. - - - - - Possible sizes for this creature. Randomly picks a value in the range of 0 to 1. This value can not go above 1. Flat curve at 1 by default. - - - - - Roughly determines how far this creature can be loaded in. - - - - - Goes hand in hand with the EcoTargetType. Please note the Player is a SHARK! Determines very few creature behaviours/interactions. - - - - - Goes hand in hand with the BehaviourType. Determines many interactions with creatures, specifically how this creature is "located" or "targeted" by other creatures. - - - - - Controls health and damage-taking aspects of this creature. - - - - - Settings for growth in Alien Containment. Not assigned by default. - - - - - Properly assigns values to the property, and creates a new instance of the ScriptableObject if null. - - - - - - Pickup sounds of the item. - - - - - Alternative to that is always marked as valid for custom prefabs. - - - - - Creates a new , but for a vanilla or custom prefab. - - Can be an addressable key or ClassID. - - - True, as long as the RuntimeKey exists. - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - - - - The maximum range in meters from which the vehicle is noticed and targeted. Any piloted vehicle in this range WILL be targeted. - Values around 40m are typical, but anything is valid. - - - - - The aggression that is added to this creature every second that the vehicle is in range. Default value is 0.5, which is quite high. - - - - - The amount of time between each distance check in seconds. This value is typically one second and there is VERY little reason to change this. - - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - The maximum range in meters from which the vehicle is noticed and targeted. Any piloted vehicle in this range WILL be targeted. - Values around 40m are typical, but anything is valid. - The aggression that is added to this creature every second that the vehicle is in range. Default value is 0.5, which is quite high. - The amount of time between each distance check in seconds. This value is typically one second and there is VERY little reason to change this. - - - - Contains data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - - - - The targeted EcoTargetType of this specific component. Every creature can have multiple components. Remember, the Player is ! - - - - - The amount of the aggression trait added each second while targeting a creature. Generally 1f-2f. - - - - - Creatures beyond this distance from the creature will not be targeted. Ranges from 15f for smaller predators to 150f for the Ghost Leviathan, however larger values are allowed. - - - - - An arbitrary distance scale that influences how far creatures can be targeted from. Typically 1, but should be larger (3+) if the maxRangeScalar is higher. - - - - - If false, this creature will attack other creatures with the same TechType. - - - - - The minimum velocity required to see a target. Generally 0f and therefore unset, but the Crashfish for example has this value at 0.2f. - - - - - Minimum amount of hunger needed to become aggressive to a target. Generally 0f, and rarely exceeds 0.1f unless the creature actually can eat it. In that case use a value around 0.8f. - - - - - Contains data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - The targeted EcoTargetType of this specific component. Every creature can have multiple components. Remember, the Player is ! - The amount of the aggression trait added each second while targeting a creature. Generally 1f-2f. - Creatures beyond this distance from the creature will not be targeted. Ranges from 15f for smaller predators to 150f for the Ghost Leviathan, however larger values are allowed. - An arbitrary distance scale that influences how far creatures can be targeted from. Typically 1, but should be larger (3+) if the maxRangeScalar is higher. - If false, this creature will attack other creatures with the same TechType. - Minimum amount of hunger needed to become aggressive to a target. Generally 0f, and rarely exceeds 0.1f unless the creature actually can eat it. In that case use a value around 0.8f. - The minimum velocity required to see a target. Generally 0f and therefore unset, but the Crashfish for example has this value at 0.2f. - - - - Contains data pertaining to the [sic] component. - - - - - The max amount of Food this item will give when eaten. - - - - - The max amount of Water this item will give when eaten. - - - - - Whether this item decomposes over time. - - - - - How fast this item decomposes, relative to other items. Default value is 1f. - - - - - Constructor. - - The max amount of Food this item will give when eaten. - The max amount of Water this item will give when eaten. - Whether this item decomposes over time. - - - - Constructor. - - The max amount of Food this item will give when eaten. - The max amount of Water this item will give when eaten. - Whether this item decomposes over time. - How fast this item decomposes, relative to other items. Default value is 1f. - - - - Contains data pertaining to picking up and/or holding fish in your hands. - - - - - Can this fish be held in the hotbar? - - - - - If can be held: The TechType that is used to find the holding animation. - - - - - If can be held: The name of the model used for the World View, which must be a child of the object. - - - - - If can be held: The name of the model used for the First Person View, which must be a child of the object. - - - - - This constructor overload creates a instance for creatures that can be picked up but NOT held. - - - - - This constructor overload creates a instance for creatures that can be picked up AND held. - - If can be held: The TechType that is used to find the holding animation. - If can be held: The name of the model used for the World View, which must be a child of the object. - If can be held: The name of the model used for the First Person View, which must be a child of the object. - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. - - - - - The target type that scares this creature. - - - - - How fast this creature gets scared per second (maximum "fear" is 1f). - - - - - How far this creature can get scared. - - - - - A creature must have this much mass or more to evoke fear. - - - - - Every seconds, this creature will scan the area looking for things to be scared of. - - - - - The creature will only be afraid if within this many meters of the player object. - - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. - - The target type that scares this creature. - How fast this creature gets scared per second (maximum "fear" is 1f). - How far this creature can get scared. - A creature must have this much mass or more to evoke fear. - Every seconds, this creature will scan the area looking for things to be scared of. - The creature will only be afraid if within this many meters of the player object. - - - - Data that controls the creation of the VFXFabricating component on a prefab, in order to have a model in the Fabricator. - - - - - Leave as null or empty to point to the prefab root. Otherwise this is the path to the crafting model Transform, relative to the prefab's root Transform. - For example, the Repair Tool's would be `welder_scaled/welder`. - - - - - The relative y position of where the ghost effect begins, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a negative value because the bottom of an object is below its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - - - - - The relative y position of where the ghost effect ends, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a positive value because the top of an object is above its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - - - - - The offset of the model when being crafted (in METERS). This is generally around zero, but the y value may be ajusted up or down a few millimeters to fix clipping/floating issues. - - - - - Rotational offset. - - - - - The relative scale of the model. Generally is 1x for most items. - - - - - Data that controls the creation of the VFXFabricating component on a prefab, in order to have a model in the Fabricator. - - Leave as null or empty to point to the prefab root. Otherwise this is the path to the crafting model Transform, relative to the prefab's root Transform. - For example, the Repair Tool's would be `welder_scaled/welder`. - The relative y position of where the ghost effect begins, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a negative value because the bottom of an object is below its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - The relative y position of where the ghost effect ends, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a positive value because the top of an object is above its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - The offset of the model when being crafted (in METERS). This is generally around zero, but the y value may be ajusted up or down a few millimeters to fix clipping/floating issues. - The relative scale of the model. Generally is 1x for most items. - Rotational offset. - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - - - - The size of this creature at birth. Typically a fraction fo the max size. - - - - - The maximum size of this creature when fully grown. - - - - - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - - - - - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - - - - - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - - - - - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - - - - - The prefab for either the egg or the child version of the creature (which can be the adult object). - - - - - The prefab for the adult creature GameObject. - - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - The size of this creature at birth. Typically a fraction fo the max size. - The maximum size of this creature when fully grown. - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - The prefab for either the egg or the child version of the creature (which can be the adult object). - The prefab for the adult creature GameObject, for creatures with a juvenile form. - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - The size of this creature at birth. Typically a fraction fo the max size. - The maximum size of this creature when fully grown. - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - ClassID / TechType of the prefab for either the egg or the child version of the creature (which can be the adult object). - ClassID of the prefab for the adult creature GameObject, for creatures with a juvenile form. - - - - Class containing data related to creature spawning, simplifying usage of the . - - - - - Component that inherits from DropTool for use in custom held fish. Allows reusing vanilla fish holding animations from the player. - - - - - Name of the animation parameter. - - - - - Overrides the original property. - - - - - Sets the field to match the holding animation of the fish defined by . - - - - - - Sets the callback in the Start method. - - - - - Component to affect. - - - - - GameObject holding the callback component. - - - - - Callback method type name. - - - - - Callback method name. - - - - - Main and only config file for ECCLibrary. - - - - - Utility methods related to assigning patch-time data. - - - - - Creates an instance of the ScriptableObject. - - - - - - - - - - Makes a given TechType immune to acid, such as brine. - - - - - - Set the BehaviourType of a TechType. Used for certain creature interactions. - - - - - - - Sets the Bioreactor charge of to . - - - - - - - Registers a single PDA encylopedia entry into the game for a given creature asset. - - Relevant CreatureAsset. - Path to this entry in the databank. - To find examples of this string, open "...Subnautica\Subnautica_Data\StreamingAssets\SNUnmanagedData\LanguageFiles\English.json" and search for "EncyPath". - Examples: - - Lifeforms/Fauna/Herbivores - Lifeforms/Fauna/Carnivores - Lifeforms/Fauna/Rays - Lifeforms/Fauna/Sharks - Lifeforms/Fauna/Leviathans - Lifeforms/Fauna/Other - Lifeforms/Fauna/SmallHerbivores - Lifeforms/Fauna/LargeHerbivores - - - Displayed title of the PDA entry in English. If set to null, you can implement your own language system. - Displayed description of the PDA entry in English. If set to null, you can implement your own language system. - Duration of scanning in seconds. - Databank entry image. Can be null. - Small popup image. Can be null. - - - - Utility methods related to constructing a creature prefab GameObject. - - - Utilities related to creating a creature prefab object. - - - - - Makes a given GameObject scannable with the scanner room, using the component. - - - Whether to automatically update the position of this ResourceTracker or not (should always be true for creatures). - - - - Multiplies damage of the given by . - - - - - Adds the component onto a prefab to enable its model in the Fabricator. Automatically determines settings if is null. - - - - - Adds the [sic] component to the given GameObject. - - - - - Adds the component onto the object with the given . - - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. The first child of this object and all children of the first child are used for the trail. - The CreatureComponents of this creature. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - The total strength of the movement. A value too low or too high will break the trail completely. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. The first child of this object and all children of the first child are used for the trail. - The BehaviourLOD of this creature. - The creature's uppermost Transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - The total strength of the movement. A value too low or too high will break the trail completely. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. - The CreatureComponents of this creature. - Any objects that are simulated. Should NOT include the 's transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. - The BehaviourLOD of this creature. - The creature's uppermost Transform. - Any objects that are simulated. Should NOT include the 's transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - - - - Adds an instance of the component onto that calls the method as defined by the parameters. - - The object that holds the touch trigger, for example a creature's mouth collider. Must have Collider with set to TRUE. - The GameObject that holds the callback component and method. - The name of the type that holds the action performed when the object is collided with. - The name of the method that is performed when the object is collided with. - - - - - Assigns the essential fields of any sort of MeleeAttack component. For anything else, you're on your own. - - Type which must be the same as or inherit from MeleeAttack. - The creature prefab root. - Components reference object. - The object that has the bite trigger. - If true, the component will be added and properly assigned. - Bite damage. - Seconds between each bite. - If false, this creature is unable to attack the Seamoth and PRAWN Suit. - - - - - Utility methods related to using the class more efficiently. An alternative to setting all properties manually. - - - - - Sets the most commonly used properties relating to creature data. - Assigns the following properties so that you don't have to: - - - - - - - - - The creature template to modify. - Roughly determines how far this creature can be loaded in. - Mass in kg. Ranges from about 1.8f to 4050f. Default is 15kg. - The FOV is used for detecting things such as prey. - SHOULD BE NEGATIVE! This value has an expected range of [-1, 0]. Is 0f by default. A value of -1 means a given object is ALWAYS in view. - Determines the distance for which certain calculations (such as Trail Managers) perform (or don't). It is recommended to increase these values for large creatures. - Total power output of this creature. All ECC creatures can be put in the bioreactor as long as this value is greater than 0. - - - - Sets the most commonly used properties relating to creature motion. - Assigns the following properties so that you don't have to: - - - - - - The creature template to modify. - Contains data pertaining to the action. - Contains data pertaining to the action. This component keeps creatures from wandering too far. - - - - Sets properties related to generic prey creatures. Adds basic fear elements and allows it to be picked up and eaten. - Assigns the following properties so that you don't have to: - - - - - - - - The creature template to modify. - The velocity in m/s at which the creature swims away from the player and other perceived threats. - Contains data pertaining to picking up and/or holding fish in your hands. - Contains data pertaining to the [sic] component. - - - - Holds generic sound assets that are used for creatures in the game. - - - - - Fish damage sound. - - - - - Sound for unlocking normal databank entries. - - - - - Contains various utilities of no particular category. - - - - - Helps in the loading of AssetBundles from an "Assets" folder in your mod folder root. An example of an AssetBundle path: `...Subnautica\QMods\DeExtinction\Assets\deextinctionassets`. - - The assembly to grab the mod from. See . - The name of the AssetBundle file in your assets folder, that will be loaded. For De-Extinction, it is `deextinctionassets`. - A loaded AssetBundle. - - - - Compares two strings using the simplified ECCStringComparison. - - - - - - - - - Returns an instance of the PhysicMaterial class that should be used for creatures. The dynamicFriction and staticFriction fields are set to 0 and the combine mode is set to multiply. Please do not modify fields on this class. - - - - - - Creates an FMODAsset with the given parameters. - - - - - - - - Various ECC-related extensions for GameObjects. - - - - - Find a GameObject in this object's hiearchy, by name. - - - - - - - - - Various ECC-related extensions for Transforms. - - - - - Find a GameObject in this object's hiearchy, by name. - - - - - - - - - Locally resets all or some components of this Transform. - - This. - Zero position? - Zero rotation? - Zero scale? - - - - Enum which is solely used for ECCHelper methods. - - - - - 'A' == 'a' - - - - - 'A' != 'a' - - - - - Whether this string starts with the other given string. Not case sensitive. - - - - - Whether this string starts with the other given string. Case sensitive. - - - - - Whether a given string is located anywhere inside of a larger string. Not case sensitive. - - - - - Whether a given string is located anywhere inside of a larger string. Case sensitive. - - - - - Helps in the creation of a . Call the method to apply the changes. - - - - - Helps in the creation of a . Call the method to apply the changes. - - The object that holds all creature components. - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - Helps in the creation of a . Call the method to apply the changes. - - The root of the creature. Typically the object that holds the Creature component and all CreatureActions. - The BehaviourLOD of this creature. - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - The root of the creature. Typically the object that holds the Creature component and all CreatureActions. - - - - - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - - - - - The array that contains all of the transforms of the affected bones. - - - - - The BehaviourLOD of this creature. - - - - - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - - - - - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - If true, this TrailManager could be disabled while outside the BehaviourLOD's "close threshold" (for performance reasons). True by default. - - - - - Sets the multiplier in every direction to . - - - - - Forces the Trails array to contain every single child of the . Does not work well when the creature has fins or any sort of bone structure in the spine that isn't meant to be 100% animated. - - - - - Fills the Trails array with every child of the RootSegment (recursive) that contains in its name (case insensitive). Ordered from parent to child, top to bottom. - - - - - Fills the Trails array with every child (recursive) of the that contains 'phys' in its name (case insensitive). Ordered from parent to child, top to bottom. - - - - - Finalizes creation of this TrailManager. - - - - - Utilities related to the class. - - - - - Animation curve that is flat with a value of 1 all across. - - - - - Returns an animation curve that represents a straight line from to . - - - - - - - - Sets the pitch, roll, and yaw multipliers of a given TrailManager to a single value. - - The TrailManager to modify. - The curve to assign to each field. - The same TrailManager (for fluent code). - - - - Indicates the type of the async method builder that should be used by a language compiler to - build the attributed async method or to build the attributed type when used as the return type - of an async method. - - - - Initializes the . - The of the associated builder. - - - Gets the of the associated builder. - - - - An attribute that allows parameters to receive the expression of other parameters. - - - - - Initializes a new instance of the class. - - The condition parameter value. - - - - Gets the parameter name the expression is retrieved from. - - - - - Indicates that compiler support for a particular feature is required for the location where this attribute is applied. - - - - - Creates a new instance of the type. - - The name of the feature to indicate. - - - - The name of the compiler feature. - - - - - If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand . - - - - - The used for the ref structs C# feature. - - - - - The used for the required members C# feature. - - - - - Indicates which arguments to a method involving an interpolated string handler should be passed to that handler. - - - - - Initializes a new instance of the class. - - The name of the argument that should be passed to the handler. - may be used as the name of the receiver in an instance method. - - - - Initializes a new instance of the class. - - The names of the arguments that should be passed to the handler. - may be used as the name of the receiver in an instance method. - - - - Gets the names of the arguments that should be passed to the handler. - - may be used as the name of the receiver in an instance method. - - - - Indicates the attributed type is to be used as an interpolated string handler. - - - - - Used to indicate to the compiler that a method should be called - in its containing module's initializer. - - - When one or more valid methods - with this attribute are found in a compilation, the compiler will - emit a module initializer which calls each of the attributed methods. - - Certain requirements are imposed on any method targeted with this attribute: - - The method must be `static`. - - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc. - - The method must be parameterless. - - The method must return `void`. - - The method must not be generic or be contained in a generic type. - - The method's effective accessibility must be `internal` or `public`. - - The specification for module initializers in the .NET runtime can be found here: - https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer - - - - - Specifies that a type has required members or that a member is required. - - - - - Used to indicate to the compiler that the .locals init flag should not be set in method headers. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class with the specified message. - - An optional message associated with this attribute instance. - - - - Returns the optional message associated with this attribute instance. - - - - - Returns the optional URL associated with this attribute instance. - - - - - Specifies that null is allowed as an input even if the corresponding type disallows it. - - - - - Specifies that null is disallowed as an input even if the corresponding type allows it. - - - - - Applied to a method that will never return under any circumstance. - - - - - Specifies that the method will not return if the associated Boolean parameter is passed the specified value. - - - - - Initializes the attribute with the specified parameter value. - - - The condition parameter value. Code after the method will be considered unreachable - by diagnostics if the argument to the associated parameter matches this value. - - - - - Gets the condition parameter value. - - - - - Specifies that an output may be null even if the corresponding type disallows it. - - - - - Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. - - - - - Initializes the attribute with the specified return value condition. - - The return value condition. If the method returns this value, the associated parameter may be null. - - - - Gets the return value condition. - - - - - Specifies that the method or property will ensure that the listed field and property members have not-null values. - - - - - Initializes the attribute with a field or property member. - - The field or property member that is promised to be not-null. - - - - Initializes the attribute with the list of field and property members. - - The list of field and property members that are promised to be not-null. - - - - Gets field or property member names. - - - - - Specifies that the method or property will ensure that the listed field and property - members have not-null values when returning with the specified return value condition. - - - - - Initializes the attribute with the specified return value condition and a field or property member. - - The return value condition. If the method returns this value, the associated parameter will not be null. - The field or property member that is promised to be not-null. - - - - Initializes the attribute with the specified return value condition and list of field and property members. - - The return value condition. If the method returns this value, the associated parameter will not be null. - The list of field and property members that are promised to be not-null. - - - - Gets the return value condition. - - - - - Gets field or property member names. - - - - - Specifies that an output will not be null even if the corresponding type allows it. - Specifies that an input argument was not null when the call returns. - - - - - Specifies that the output will be non-null if the named parameter is non-null. - - - - - Initializes the attribute with the associated parameter name. - - The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. - - - - Gets the associated parameter name. - - - - - Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. - - - - - Initializes the attribute with the specified return value condition. - - The return value condition. If the method returns this value, the associated parameter will not be null. - - - Gets the return value condition. - - - - Specifies that this constructor sets all required members for the current type, - and callers do not need to set any required members themselves. - - - - - Specifies the syntax used in a string. - - - - - Initializes the with the identifier of the syntax used. - - The syntax identifier. - - - Initializes the with the identifier of the syntax used. - The syntax identifier. - Optional arguments associated with the specific syntax employed. - - - Gets the identifier of the syntax used. - - - Optional arguments associated with the specific syntax employed. - - - The syntax identifier for strings containing composite formats for string formatting. - - - The syntax identifier for strings containing date format specifiers. - - - The syntax identifier for strings containing date and time format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing JavaScript Object Notation (JSON). - - - The syntax identifier for strings containing numeric format specifiers. - - - The syntax identifier for strings containing regular expressions. - - - The syntax identifier for strings containing time format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing URIs. - - - The syntax identifier for strings containing XML. - - - - Used to indicate a byref escapes and is not scoped. - - - - There are several cases where the C# compiler treats a as implicitly - - where the compiler does not allow the to escape the method. - - - For example: - - for instance methods. - parameters that refer to types. - parameters. - - - - This attribute is used in those instances where the should be allowed to escape. - - - Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for - API authors to understand the lifetime implications of applying this attribute and how it may impact their users. - - - - - Represent a type can be used to index a collection either from the start or the end. - - Index is used by the C# compiler to support the new index syntax - - int[] someArray = new int[5] { 1, 2, 3, 4, 5 } ; - int lastElement = someArray[^1]; // lastElement = 5 - - - - - Construct an Index using a value and indicating if the index is from the start or from the end. - The index value. it has to be zero or positive number. - Indicating if the index is from the start or from the end. - - If the Index constructed from the end, index value 1 means pointing at the last element and index value 0 means pointing at beyond last element. - - - - Create an Index pointing at first element. - - - Create an Index pointing at beyond last element. - - - Create an Index from the start at the position indicated by the value. - The index value from the start. - - - Create an Index from the end at the position indicated by the value. - The index value from the end. - - - Returns the index value. - - - Indicates whether the index is from the start or the end. - - - Calculate the offset from the start using the giving collection length. - The length of the collection that the Index will be used with. length has to be a positive value - - For performance reason, we don't validate the input length parameter and the returned offset value against negative values. - we don't validate either the returned offset is greater than the input length. - It is expected Index will be used with collections which always have non negative length/count. If the returned offset is negative and - then used to index a collection will get out of range exception which will be same affect as the validation. - - - - Indicates whether the current Index object is equal to another object of the same type. - An object to compare with this object - - - Indicates whether the current Index object is equal to another Index object. - An object to compare with this object - - - Returns the hash code for this instance. - - - Converts integer number to an Index. - - - Converts the value of the current Index object to its equivalent string representation. - - - Represent a range has start and end indexes. - - Range is used by the C# compiler to support the range syntax. - - int[] someArray = new int[5] { 1, 2, 3, 4, 5 }; - int[] subArray1 = someArray[0..2]; // { 1, 2 } - int[] subArray2 = someArray[1..^0]; // { 2, 3, 4, 5 } - - - - - Represent the inclusive start index of the Range. - - - Represent the exclusive end index of the Range. - - - Construct a Range object using the start and end indexes. - Represent the inclusive start index of the range. - Represent the exclusive end index of the range. - - - Indicates whether the current Range object is equal to another object of the same type. - An object to compare with this object - - - Indicates whether the current Range object is equal to another Range object. - An object to compare with this object - - - Returns the hash code for this instance. - - - Converts the value of the current Range object to its equivalent string representation. - - - Create a Range object starting from start index to the end of the collection. - - - Create a Range object starting from first element in the collection to the end Index. - - - Create a Range object starting from first element to the end. - - - Calculate the start offset and length of range object using a collection length. - The length of the collection that the range will be used with. length has to be a positive value. - - For performance reason, we don't validate the input length parameter against negative values. - It is expected Range will be used with collections which always have non negative length/count. - We validate the range is inside the length scope though. - - -
-
diff --git a/Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.dll b/Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.dll deleted file mode 100644 index a7ef19b649ddf0cd983e589ed2baab60927ffb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78848 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

lTAwH=5f)mmVjGbo5$-`sHHS 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 NLF@Pbt98*9_}>94=#2mX diff --git a/Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.xml b/Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.xml deleted file mode 100644 index a3375ac1..00000000 --- a/Install/Subnautica/BepInEx/plugins/ECCLibrary/ECCLibrary.xml +++ /dev/null @@ -1,2562 +0,0 @@ - - - - ECCLibrary - - - -

- Manages the creation of cooked and cured creatures. - - - - - Advanced method to create a cooked/cured creature. - - - - - The fastest way to create a cooked AND cured variant of the given creature. Automatically assigns the Analysis Tech so it is unlocked with the creature. - - The original uncooked creature. MUST have been registered already. - Name of the cooked fish item. - Description of the cooked fish item. - Icon of the cooked fish item. - Name of the cured fish item. - Description of the cured fish item. - Icon of the cured fish item. - Food values of the cooked, which will automatically determine the cured values. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Holds both the cooked and cured version of the creature. - - - - - Holds both the cooked and cured version of the creature. - - - - - Simple method to create a cooked variant of the given creature. - - The original uncooked creature. MUST have been registered already. - Name of the cooked fish item. - Description of the cooked fish item. - Food values. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Simple method to create a cured variant of the given creature. - - The original uncooked creature. MUST have been registered already. - Name of the cured fish item. - Description of the cured fish item. - Food value of the food. - Fabricator settings. If not assigned, automatic values will be determined. Do NOT rely on those being perfect. - - - - Override this class to define a new creature. Call the method on an instance to add it to the game. - - - - - Information for registering the prefab. - - - - - A reference to the custom prefab instance. - - - - - Instantiates a Creature Asset with the given PrefabInfo. Call the Register method to add the creature to the game. - - - Information required for spawning. Must be unique. - An instance of this struct can be easily created by calling . - - - - The ClassID of this creature, sourced from the PrefabInfo property. - - - - - The TechType of this creature, sourced from the PrefabInfo property. - - - - - The EntityInfo for this creature, only assigned after is called. - - - - - Registers this creature into the game. - - - - - An empty method that can be overriden to insert code that runs directly after the prefab is registered (runs at patch time). - - - - - The majority of the data for each creature should be assigned through this call. - - - - - - Changes to the prefab can be applied here. - - - - - - - - By default calls to convert the materials of the entire prefab. Can be overriden to have more control over the process. - - - - - - An alternative to that does not use inheritance. Supply a template and any needed prefab code. - - - - - An optional call that allows for modification of the prefab after creation. - - - - - An optional call that, if overriden, no longer applies the MarmosetUBER shader automatically and allows for full control of the materials. Called AFTER ! - - - - - Creates a basic Creature Asset that does not use inheritance. Supply a template and any needed prefab code. Call the Register method to add the creature to the game. - - The unique PrefabInfo of this creature instance. - The template that contains all of the creature's data. - An optional call that allows for modification of the prefab after creation. - An optional call that, if overriden, no longer applies the MarmosetUBER shader automatically and allows for full control of the materials. Called AFTER ! - - - - Handled by the class. - - - - - - Handled by the class. - - - - - - - - Handled by the class. - - - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Swim speed when swimming toward a Cyclops. - - - - - If the Cyclops is this many meters or more away from the creature's spawn point (leash position), it will be ignored. Generally has a value of 100f or more. - - - - - The amount of aggression gained per second while aware of a Cyclops. Note that this aggression is linked to '', NOT ''. -
Generally 0.2f for smaller creatures and 0.4f for a leviathan. -
-
- - - Minimum amount of time between each "attack". Generally 6 seconds for smaller creatures and 3 seconds for a leviathan. - - - - - How fast the aggression to noise decreases. Typically 0.08f for smaller creatures and 0.01f for leviathans. - - - - - Minimum aggression to attack. All vanilla creatures use a value of 0.75f. - - - - - - - The priority for this , expected to be in the range [0, 1]. - Swim speed when swimming toward a Cyclops. - If the Cyclops is this many meters or more away from the creature's spawn point (leash position), it will be ignored. Generally has a value of 100f or more. - The amount of aggression gained per second while aware of a Cyclops. Note that this aggression is linked to '', NOT ''. -
Generally 0.2f for smaller creatures and 0.4f for a leviathan. - Minimum amount of time between each "attack". Generally 6 seconds for smaller creatures and 3 seconds for a leviathan. - How fast the aggression to noise decreases. Typically 0.08f for smaller creatures and 0.01f for leviathans. - Minimum aggression to attack. All vanilla creatures use a value of 0.75f. -
- - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How fast the creature swims while attacking. - - - - - Minimum amount of aggression needed to start an attack, generally 0.5f - 0.75f. - - - - - Maximum length of the attack. Generally ranges from 7 to 10 seconds. - - - - - Minimum number of seconds between attacks. Generally ranges from 10 to 20 seconds. - - - - - Minimum length of the attack. Almost always 3 seconds. - - - - - How long the can be recognized for after it was last set. For most creatures, this is only 5 seconds. Does not influence how long the attack will be. - - - - - Almost always true, meaning the creature is no longer aggressive after the time is up. - - - - - - - The priority for this , expected to be in the range [0, 1]. Typically higher than object avoidance priorities! - How fast the creature swims while attacking. - Minimum amount of aggression needed to start an attack, generally 0.5f - 0.75f. - Maximum length of the attack. Generally ranges from 7 to 10 seconds. - Minimum number of seconds between attacks. Generally ranges from 10 to 20 seconds. - Minimum length of the attack. Almost always 3 seconds. - How long the can be recognized for after it was last set. For most creatures, this is only 5 seconds. Does not influence how long the attack will be. - Almost always true, meaning the creature is no longer aggressive after the time is up. - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - If true, the creature will only avoid terrain. Otherwise, all solid objects will be avoided. Typically true for larger creatures. - - - - - How fast this creature swims away from obstacles (m/s). Should generally match the swim speed. - - - - - How much empty space there must be in any direction around the creature for it to choose that path as "clear". Typically 5f for small fish, up to 10f for larger fish. Large enough values may disable this behaviour entirely. - - - - - The action will only perform if there is an obstacle within this many meters in front of the creature (or around the creature if scanRadius > 0). Typically similar to the avoidance distance. - - - - - How long this creature will continue to swim away from the terrain. Almost always equal to 2f. - - - - - How long between each "scan". Typically 1f but lower values may be needed for faster creatures. - - - - - If equal to 0f (as done by most creatures), the creature will look for obstacles directly in front of it. Otherwise it will perform a SphereCast with this starting radius. - - - - - The maximum number of times a random direction is evaluated to check for a clear path. If all "clear checks" fail, the action will be canceled and the creature will ignore the obstacle. Almost always 10. - - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. - - The priority for this , expected to be in the range [0, 1]. Typically lower than attack priorities! - If true, the creature will only avoid terrain. Otherwise, all solid objects will be avoided. Typically true for larger creatures. - How fast this creature swims away from obstacles (m/s). Should generally match the swim speed. - How much empty space there must be in any direction around the creature for it to choose that path as "clear". Typically 5f for small fish, up to 10f for larger fish. Large enough values may disable this behaviour entirely. - The action will only perform if there is an obstacle within this many meters in front of the creature (or around the creature if scanRadius > 0). Typically similar to the avoidance distance. - How long this creature will continue to swim away from the terrain. Almost always equal to 2f. - How long between each "scan". Typically 1f but lower values may be needed for faster creatures. - If equal to 0f (as done by most creatures), the creature will look for obstacles directly in front of it. Otherwise it will perform a SphereCast with this starting radius. - The maximum number of times a random direction is evaluated to check for a clear path. If all "clear checks" fail, the action will be canceled and the creature will ignore the obstacle. Almost always 10. - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How fast this creature swims when intentionally avoiding terrain. - - - - - How many meters long an "empty space" is required to be, in any given direction. Typically about 30 meters. - - - - - Similar to avoidanceDistance, defines how many meters long an "empty space" is required to be, in any given direction. Typically uses the same value as avoidanceDistance and is used for the cheaper "initial check" that determines whether or not the actual avoidance takes place. - - - - - Must be in the range [0, 1]. The higher this value, the more it tends to only focus on points in front of it. Generally 0.5f, but the Reaper Leviathan uses a value of 1f. - - - - - The quality of object avoidance. Almost always seen as 10 (the default value). - - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - The priority for this , expected to be in the range [0, 1]. - How fast this creature swims when intentionally avoiding terrain. - How many meters long an "empty space" is required to be, in any given direction. Typically about 30 meters. - Similar to avoidanceDistance, defines how many meters long an "empty space" is required to be, in any given direction. Typically uses the same value as avoidanceDistance and is used for the cheaper "initial check" that determines whether or not the actual avoidance takes place. - Must be in the range [0, 1]. The higher this value, the more it tends to only focus on points in front of it. Generally 0.5f, but the Reaper Leviathan uses a value of 1f. - The quality of object avoidance. Almost always seen as 10 (the default value). - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How much damage must be taken before the creature will begin to flee. - - - - - How long the creature flees for. - - - - - At least how far in meters the creature will flee when attacked. - - - - - How fast the creature will flee in m/s. - - - - - How many seconds are between each "swim". - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - How much damage must be taken before the creature will begin to flee. - How long the creature flees for. - At least how far in meters the creature will flee when attacked. - How fast the creature will flee in m/s. - How many seconds are between each "swim". - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Default swim speed when swimming. - - - - - Interval between swimming. - - - - - The quality of the terrain avoidance. - - - - - How tired this creature gets while fleeing, each second. - - - - - The velocity when tired. - - - - - How exhausted the creature gets while fleeing, each second. - - - - - The velocity when exhausted (after fleeing too long). - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - Default swim speed when swimming. - Interval between swimming. - The quality of the terrain avoidance. - How tired this creature gets while fleeing, each second. - The velocity when tired. - How exhausted the creature gets while fleeing, each second. - The velocity when exhausted (after fleeing too long). - - - - Contains data pertaining to creating the CreatureAction. This component keeps creatures from wandering too far. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - How far the creature has to be from its spawn point to begin swimming back to it. For small and medium creatures usually has a value of 15-30 meters. Typically very high (upwards of 150m) for leviathans. - - - - - How fast the creature swims back to its spawn point. Generally matches SwimRandom swim velocity, more or less. - - - - - The minimum amount of time between each "swim". Vanilla creatures always use a value of 1 second (there is very little reason to change this). - - - - - How long the creature will continue to swim back to its spawn point during each "swim" (unless overriden by another action). Generally 3 seconds but sometimes (rarely) higher. - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - How far the creature has to be from its spawn point to begin swimming back to it. For small and medium creatures usually has a value of 15-30 meters. Typically very high (upwards of 150m) for leviathans. - How fast the creature swims back to its spawn point. Generally matches SwimRandom swim velocity, more or less. - The minimum amount of time between each "swim". Vanilla creatures always use a value of 1 second (there is very little reason to change this). - How long the creature will continue to swim back to its spawn point during each "swim" (unless overriden by another action). Generally 3 seconds but sometimes (rarely) higher. - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - Swim speed for this action (m/s). Should match speed defined in the . Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - - - - - Maximum distance this fish will swim away from its "leader". Default value is 2 meters. - - - - - Number of seconds between each time the creature repositions itself. Default value is 1 second. - - - - - If the creature leaves this radius (in meters) of its leader, it will stop following. Default value is 20 meters. - - - - - Value with expected range of [0.0, 1.0]. Default value is 0.5f. - Every 2 seconds, a schooling creature checks if it should begin schooling. This value determines the chance of forming a school. A value of 0f means it will never school, while 1f means it always will attempt. - - - - - Value with expected range of [0.0, 1.0]. Default value is 0.1f. - Every 2 seconds, a schooling creature checks if it should stop schooling. This value determines the chance of breaking off. A value of 0f means it will never break off, while 1f disables the behaviour. - - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - - The priority for this , expected to be in the range [0, 1]. - Swim speed for this action (m/s). Should match speed defined in the . Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - Maximum distance this fish will swim away from its "leader". Default value is 2 meters. - Number of seconds between each time the creature repositions itself. Default value is 1 second. - If the creature leaves this radius (in meters) of its leader, it will stop following. Default value is 20 meters. - - Value with expected range of [0.0, 1.0]. Default value is 0.5f. - Every 2 seconds, a schooling creature checks if it should begin schooling. This value determines the chance of forming a school. A value of 0f means it will never school, while 1f means it always will attempt. - - - /// Value with expected range of [0.0, 1.0]. Default value is 0.1f. - Every 2 seconds, a schooling creature checks if it should stop schooling. This value determines the chance of breaking off. A value of 0f means it will never break off, while 1f disables the behaviour. - - - - - Contains data pertaining to creating the CreatureAction. - - - - - The priority for this , expected to be in the range [0, 1]. - - - - - The distance this creature can wander in any direction every time the action is played. X and Z values should always be identical and are usually 10 - 30 meters. Typically the vertical (Y) range is only 20% - 25% of the horizontal range. - - - - - Swim speed for this action (m/s). Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - - - - - The time in seconds between each change in direction. Typically 5 seconds, but more sporadic creatures may have values as low as 2 seconds. - - - - - In the vanilla game this value is typically set to 'true' for leviathans. If enabled, the creature will always swim towards a point at the maximum distance allowed by . Otherwise, the distance will be random. - - - - - The higher this value, the more this creature tends to continue swimming in the same direction. Default value is 0.5f. Typically higher (1.0f-1.2f) for larger creatures. - - - - - Contains data pertaining to creating the CreatureAction. - - The priority for this , expected to be in the range [0, 1]. - The distance this creature can wander in any direction every time the action is played. X and Z values should always be identical and are usually 10 - 30 meters. Typically the vertical (Y) range is only 20% - 25% of the horizontal range. - Swim speed for this action (m/s). Typically 2-3 m/s for small fish, 4-8 m/s for medium fish and sharks, and 15-20 m/s for aggressive leviathans. - The time in seconds between each change in direction. Typically 5 seconds, but more sporadic creatures may have values as low as 2 seconds. - In the vanilla game this value is typically set to 'true' for leviathans. If enabled, the creature will always swim towards a point at the maximum distance allowed by . Otherwise, the distance will be random. - The higher this value, the more this creature tends to continue swimming in the same direction. Default value is 0.5f. Typically higher (1.0f-1.2f) for larger creatures. - - - - Stores references to the basic components of a creature. Each field should not be expected to be assigned. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. - - - - - At this speed, the Animator's "speed" parameter will be at its maximum of 1f. This should roughly match the creature's maximum velocity. - - - - - Pitch can be described by looking up and down. The parameter for pitch 'pitch' and is always on a scale from -1 to 1. When the creature has rotated by a pitch of in one way, it will equal 1. If it rotated the opposite direction the same amount, it would equal -1. - - - - - In this case, tilt is rotating left and right. This parameter has the same rules, basically, as . - - - - - Strafe animation consists of Up, Down, Left, Right, Forward, and Backwards animations, always relative to the creature's current rotation. The parameters used by this are 'speed_x'. 'speed_y', and 'speed_z', on a scale from -1 to 1. False by default. - - - - - A longer damp time means it takes longer for these strafe, pitch, and tilt animations to take effect, but a more smooth transition. - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. - - At this speed, the Animator's "speed" parameter will be at its maximum of 1f. This should roughly match the creature's maximum velocity. - Pitch can be described by looking up and down. The parameter for pitch 'pitch' and is always on a scale from -1 to 1. When the creature has rotated by a pitch of in one way, it will equal 1. If it rotated the opposite direction the same amount, it would equal -1. - In this case, tilt is rotating left and right. This parameter has the same rules, basically, as . - Strafe animation consists of Up, Down, Left, Right, Forward, and Backwards animations, always relative to the creature's current rotation. The parameters used by this are 'speed_x'. 'speed_y', and 'speed_z', on a scale from -1 to 1. False by default. - A longer damp time means it takes longer for these strafe, pitch, and tilt animations to take effect, but a more smooth transition. - - - - Contains data pertaining to certain creature functions becoming more optimized (lower quality) at a distance. Default values are (10, 50, 500). - - - - - Beyond this distance some animations may be removed. - - - - - Beyond this distance some functionalities may be less precise. - - - - - Beyond this distance trail animations will no longer exist. - - - - - Contains data pertaining to certain creature functions becoming more optimized (lower quality) at a distance. - - Beyond this distance some animations may be removed. 10f by default. - Beyond this distance some functionalities may be less precise, and any TrailManagers that have enabled (on by default) will stop functioning. 50f by default. - Beyond this distance all TrailManagers will cease to function. 500f by default. - - - - Contains basic data pertaining to the s of a creature. - - - - - The rate at which the creature gets hungrier. Predators often require higher levels of hunger to attack. - - - - - The rate at which this creature becomes passive while actively hunting. - - - - - The rate at which this creature becomes less scared. Used in very specific circumstances, most notably when taking damage. - - - - - Contains basic data pertaining to the s of a creature. - - The rate at which the creature gets hungrier. Predators often require higher levels of hunger to attack. - The rate at which this creature becomes passive while actively hunting. - The rate at which this creature becomes less scared. Used in very specific circumstances, most notably when taking damage. - - - - Contains data pertaining to creating the component. - - - - - How fast this creature accelerates while swimming in m/s/s. A value of 10f is used for most creatures, but 12f is used for the Reaper Leviathan & Sea Dragon. - - - - - Rotation speed when turning left/right. Generally has a value of 0.6f. Sometimes (but not always) has smaller values with larger creatures. - - - - - Rotation speed when turning up/down. Generally has a value of 3f, with few exceptions. - - - - - How much this creature tends to "drift", in the range [0f, 1.0f]. Most common value is 0.5f. Generally values (0.3f~) are used for smaller creatures and varies for leviathans. - - - - - If true, this creature will not be able to look upwards/downwards (rotation about X axis will always be 0). - - - - - If enabled, the creature can move (swim and/or walk) above water. - - - - - Typically enabled for most land creatures. - - - - - Contains data pertaining to creating the component. - - How fast this creature accelerates while swimming in m/s/s. A value of 10f is used for most creatures, but 12f is used for the Reaper Leviathan & Sea Dragon. - Rotation speed when turning left/right. Generally has a value of 0.6f. Sometimes (but not always) has smaller values with larger creatures. - Rotation speed when turning up/down. Generally has a value of 3f, with few exceptions. - How much this creature tends to "drift", in the range [0f, 1.0f]. Most common value is 0.5f. Generally lower values (0.3f~) are used for smaller creatures and varies for leviathans - If true, this creature will not be able to look upwards/downwards (rotation about X axis will always be 0). - If enabled, the creature can move (swim and/or walk) above water. - Typically enabled for most land creatures. - - - - Contains data pertaining to the component. - - - - - Whether the creature respawns or not. - - - - - If the creature can respawn at all, then this stops it from respawning when killed by the player. Should be FALSE for prey, and TRUE for predators! - - - - - How long it takes for this creature to respawn. - - - - - Contains data pertaining to the component. - - Whether the creature respawns or not. - If the creature can respawn at all, then this stops it from respawning when killed by the player. Should be FALSE for prey, and TRUE for predators! - How long it takes for this creature to respawn. - - - - Contains data pertaining to creating the component. - - - - - A less useful "turn speed" property, which vaguely determines the speed at which a creature can turn fully around. If in doubt, leave at its default of value of 1f. - - - - - Contains data pertaining to creating the component. - - A less useful "turn speed" property, which vaguely determines the speed at which a creature can turn fully around. If in doubt, leave at its default of value of 1f. - - - - Contains all of the data related to registering a creature into the game. - - - - - Contains all of the data related to registering a creature into the game. - - The model that is cloned to create the creature GameObject. - Goes hand in hand with the EcoTargetType. Please note the Player is a SHARK! Determines very few creature behaviours/interactions. - Goes hand in hand with the BehaviourType. Determines many interactions with creatures, specifically how this creature is "located" or "targeted" by other creatures - Maximum health of this creature. - - - - The model that is cloned to create the creature GameObject. - - - - - Physic material used for all colliders. If unassigned, will default to . - - - - - Contains data pertaining to creating the component. - - - - - Contains data pertaining to creating the component. - - - - - Contains data pertaining to the component. This component sets animation parameters based on the creature's direction & velocity. -
Means the 'speed' parameter can be used in the creature's Animator. -
NOT assigned by default! -
-
- - - Contains data pertaining to the action. Assigned a generic value by default, but can be changed or set to null. - - - - - Contains data pertaining to the action. This component keeps creatures from wandering too far. Not assigned by default. - - - - - Contains data pertaining to the action. Not assigned by default. - - - - - Contains data pertaining to the action. Assigned by default with default values and a priority of 0.8f. - - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. Not assigned by default. - - - - - Contains data pertaining to picking up and/or holding fish in your hands. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. This component is used by most creatures (everything besides leviathans) to avoid objects and/or terrain. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. This is a more advanced and expensive collision avoidance system used by leviathans. - - - - - Contains data pertaining to the component. Assigned by default to enable respawning. MUST be assigned! - - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - - - - The Type of the main component that must inherit from . - - - - - Sets the Type of the main component. Must inherit from . - - - - - - A list of all data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - - - - Adds a single type of aggression to this creature. This method can be called MULTIPLE TIMES to add multiple types of aggression! Not functional without the component. - - - - - - Contains data pertaining to creating the CreatureAction. Not assigned by default. - - - - - Contains data pertaining to creating the CreatureAction. Not assigned by default. - - - - - Contains data pertaining to adding the CreatureAction. - Each schooling creature chooses a single "leader" larger than itself (and of the same TechType) to follow. Therefore, the property should be defined for this action to function properly. - Not assigned by default. - - - - - Mass in kg. Ranges from about 1.8f to 4050f. Default is 15kg. - - - - - Determines the distance for which certain calculations (such as Trail Managers) perform (or don't). It is recommended to increase these values for large creatures. - - - - - The FOV is used for detecting things such as prey. SHOULD BE NEGATIVE! This value has an expected range of [-1, 0]. Is 0f by default. A value of -1 means a given object is ALWAYS in view. - - - - - Whether the creature is immune to brine or not. False by default. Typically useful for Lost River creatures. - - - - - Total power output of this creature. All ECC creatures can be put in the bioreactor as long as this value is greater than 0. Default value is 200. - - - - - The Surface Type applied to the main collider. Default is . - - - - - Settings that determine basic attributes of the creature. - - - - - Contains data pertaining to the [sic] component. Not assigned by default. - - - - - Whether this creature can randomly spawn with Kharaa symptoms. True by default. - - - - - If set to true, the Scanner Room can scan for this creature. False by default. - - - - - Possible sizes for this creature. Randomly picks a value in the range of 0 to 1. This value can not go above 1. Flat curve at 1 by default. - - - - - Roughly determines how far this creature can be loaded in. - - - - - Goes hand in hand with the EcoTargetType. Please note the Player is a SHARK! Determines very few creature behaviours/interactions. - - - - - Goes hand in hand with the BehaviourType. Determines many interactions with creatures, specifically how this creature is "located" or "targeted" by other creatures. - - - - - Controls health and damage-taking aspects of this creature. - - - - - Settings for growth in Alien Containment. Not assigned by default. - - - - - Properly assigns values to the property, and creates a new instance of the ScriptableObject if null. - - - - - - Pickup sounds of the item. - - - - - Alternative to that is always marked as valid for custom prefabs. - - - - - Creates a new , but for a vanilla or custom prefab. - - Can be an addressable key or ClassID. - - - True, as long as the RuntimeKey exists. - - - - Enum with values that correspond to item pickup sounds. - - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - - - - The maximum range in meters from which the vehicle is noticed and targeted. Any piloted vehicle in this range WILL be targeted. - Values around 40m are typical, but anything is valid. - - - - - The aggression that is added to this creature every second that the vehicle is in range. Default value is 0.5, which is quite high. - - - - - The amount of time between each distance check in seconds. This value is typically one second and there is VERY little reason to change this. - - - - - Contains data pertaining to the component, which encourages creatures to target any small vehicle that the player may be piloting - (this includes ANY vehicle that inherits from the component i.e. the Seamoth or Prawn Suit). Not many creatures use this component, but ones that do - will be VERY aggressive (Boneshark levels of aggression!). - - The maximum range in meters from which the vehicle is noticed and targeted. Any piloted vehicle in this range WILL be targeted. - Values around 40m are typical, but anything is valid. - The aggression that is added to this creature every second that the vehicle is in range. Default value is 0.5, which is quite high. - The amount of time between each distance check in seconds. This value is typically one second and there is VERY little reason to change this. - - - - Contains data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - - - - The targeted EcoTargetType of this specific component. Every creature can have multiple components. Remember, the Player is ! - - - - - The amount of the aggression trait added each second while targeting a creature. Generally 1f-2f. - - - - - Creatures beyond this distance from the creature will not be targeted. Ranges from 15f for smaller predators to 150f for the Ghost Leviathan, however larger values are allowed. - - - - - An arbitrary distance scale that influences how far creatures can be targeted from. Typically 1, but should be larger (3+) if the maxRangeScalar is higher. - - - - - If false, this creature will attack other creatures with the same TechType. - - - - - Only applicable for creatures similar to the Warper. - - - - - The minimum velocity required to see a target. Generally 0f and therefore unset, but the Crashfish for example has this value at 0.2f. - - - - - Minimum amount of hunger needed to become aggressive to a target. Generally 0f, and rarely exceeds 0.1f unless the creature actually can eat it. In that case use a value around 0.8f. - - - - - Contains data pertaining to the component, which enables the creature to become aggressive towards specific fauna/the player. - - The targeted EcoTargetType of this specific component. Every creature can have multiple components. Remember, the Player is ! - The amount of the aggression trait added each second while targeting a creature. Generally 1f-2f. - Creatures beyond this distance from the creature will not be targeted. Ranges from 15f for smaller predators to 150f for the Ghost Leviathan, however larger values are allowed. - An arbitrary distance scale that influences how far creatures can be targeted from. Typically 1, but should be larger (3+) if the maxRangeScalar is higher. - If false, this creature will attack other creatures with the same TechType. - Only applicable for creatures similar to the Warper. - Minimum amount of hunger needed to become aggressive to a target. Generally 0f, and rarely exceeds 0.1f unless the creature actually can eat it. In that case use a value around 0.8f. - The minimum velocity required to see a target. Generally 0f and therefore unset, but the Crashfish for example has this value at 0.2f. - - - - Contains data pertaining to the [sic] component. - - - - - The max amount of Food this item will give when eaten. - - - - - The max amount of Water this item will give when eaten. - - - - - Whether this item decomposes over time. - - - - - How fast this item decomposes, relative to other items. Default value is 1f. - - - - - Constructor. - - The max amount of Food this item will give when eaten. - The max amount of Water this item will give when eaten. - Whether this item decomposes over time. - - - - Constructor. - - The max amount of Food this item will give when eaten. - The max amount of Water this item will give when eaten. - Whether this item decomposes over time. - How fast this item decomposes, relative to other items. Default value is 1f. - - - - Contains data pertaining to picking up and/or holding fish in your hands. - - - - - Can this fish be held in the hotbar? - - - - - If can be held: The TechType that is used to find the holding animation. - - - - - If can be held: The name of the model used for the World View, which must be a child of the object. - - - - - If can be held: The name of the model used for the First Person View, which must be a child of the object. - - - - - This constructor overload creates a instance for creatures that can be picked up but NOT held. - - - - - This constructor overload creates a instance for creatures that can be picked up AND held. - - If can be held: The TechType that is used to find the holding animation. - If can be held: The name of the model used for the World View, which must be a child of the object. - If can be held: The name of the model used for the First Person View, which must be a child of the object. - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. - - - - - The target type that scares this creature. - - - - - How fast this creature gets scared per second (maximum "fear" is 1f). - - - - - How far this creature can get scared. - - - - - A creature must have this much mass or more to evoke fear. - - - - - Every seconds, this creature will scan the area looking for things to be scared of. - - - - - The creature will only be afraid if within this many meters of the player object. - - - - - Contains data pertaining to the component. This component is what enables small fish to swim away from the player and potential predators. - - The target type that scares this creature. - How fast this creature gets scared per second (maximum "fear" is 1f). - How far this creature can get scared. - A creature must have this much mass or more to evoke fear. - Every seconds, this creature will scan the area looking for things to be scared of. - The creature will only be afraid if within this many meters of the player object. - - - - Data that controls the creation of the VFXFabricating component on a prefab, in order to have a model in the Fabricator. - - - - - Leave as null or empty to point to the prefab root. Otherwise this is the path to the crafting model Transform, relative to the prefab's root Transform. - For example, the Repair Tool's would be `welder_scaled/welder`. - - - - - The relative y position of where the ghost effect begins, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a negative value because the bottom of an object is below its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - - - - - The relative y position of where the ghost effect ends, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a positive value because the top of an object is above its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - - - - - The offset of the model when being crafted (in METERS). This is generally around zero, but the y value may be ajusted up or down a few millimeters to fix clipping/floating issues. - - - - - Rotational offset. - - - - - The relative scale of the model. Generally is 1x for most items. - - - - - Data that controls the creation of the VFXFabricating component on a prefab, in order to have a model in the Fabricator. - - Leave as null or empty to point to the prefab root. Otherwise this is the path to the crafting model Transform, relative to the prefab's root Transform. - For example, the Repair Tool's would be `welder_scaled/welder`. - The relative y position of where the ghost effect begins, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a negative value because the bottom of an object is below its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - The relative y position of where the ghost effect ends, in global coordinates relative to the model's center, taking the posOffset into account. - Typically a positive value because the top of an object is above its center. - You may need to adjust this at runtime with Subnautica Runtime Editor to get desired results. - The offset of the model when being crafted (in METERS). This is generally around zero, but the y value may be ajusted up or down a few millimeters to fix clipping/floating issues. - The relative scale of the model. Generally is 1x for most items. - Rotational offset. - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - - - - The size of this creature at birth. Typically a fraction fo the max size. - - - - - The maximum size of this creature when fully grown. - - - - - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - - - - - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - - - - - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - - - - - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - - - - - The prefab for either the egg or the child version of the creature (which can be the adult object). - - - - - The prefab for the adult creature GameObject. - - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - The size of this creature at birth. Typically a fraction fo the max size. - The maximum size of this creature when fully grown. - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - The prefab for either the egg or the child version of the creature (which can be the adult object). - The prefab for the adult creature GameObject, for creatures with a juvenile form. - - - - Contains data pertaining to the ScriptableObject. If assigned, allows a creature to be released in Alien Containment. - - The size of this creature at birth. Typically a fraction fo the max size. - The maximum size of this creature when fully grown. - The size of this creature when released outside. Typically 1f for small creatures and lower for larger creatures. - How many in-game days it takes for this creature to reach its maximum size. Typically takes on a value of 1 to 1.5. - Should be true for creatures that are typically pickupable, and should be FALSE for anything else. - If false, this creature cannot breed regardless of age. True for most creatures besides pets. - ClassID / TechType of the prefab for either the egg or the child version of the creature (which can be the adult object). - ClassID of the prefab for the adult creature GameObject, for creatures with a juvenile form. - - - - Class containing data related to creature spawning, simplifying usage of the . - - - - - Component that inherits from DropTool for use in custom held fish. Allows reusing vanilla fish holding animations from the player. - - - - - Name of the animation parameter. - - - - - Overrides the original property. - - - - - Sets the field to match the holding animation of the fish defined by . - - - - - - Sets the callback in the Start method. - - - - - Component to affect. - - - - - GameObject holding the callback component. - - - - - Callback method type name. - - - - - Callback method name. - - - - - Main and only config file for ECCLibrary. - - - - - Utility methods related to assigning patch-time data. - - - - - Creates an instance of the ScriptableObject. - - - - - - - - - - Makes a given TechType immune to acid, such as brine. - - - - - - Set the BehaviourType of a TechType. Used for certain creature interactions. - - - - - - - Patch the inventory sounds of a TechType. - - - - - - - Sets the Bioreactor charge of to . - - - - - - - Registers a single PDA encylopedia entry into the game for a given creature asset. - - Relevant CreatureAsset. - Path to this entry in the databank. - To find examples of this string, open "...Subnautica\Subnautica_Data\StreamingAssets\SNUnmanagedData\LanguageFiles\English.json" and search for "EncyPath". - Examples: - - Lifeforms/Fauna/Herbivores - Lifeforms/Fauna/Carnivores - Lifeforms/Fauna/Rays - Lifeforms/Fauna/Sharks - Lifeforms/Fauna/Leviathans - Lifeforms/Fauna/Other - Lifeforms/Fauna/SmallHerbivores - Lifeforms/Fauna/LargeHerbivores - - - Displayed title of the PDA entry in English. If set to null, you can implement your own language system. - Displayed description of the PDA entry in English. If set to null, you can implement your own language system. - Duration of scanning in seconds. - Databank entry image. Can be null. - Small popup image. Can be null. - - - - Utility methods related to constructing a creature prefab GameObject. - - - Utilities related to creating a creature prefab object. - - - - - Makes a given GameObject scannable with the scanner room, using the component. - - - Whether to automatically update the position of this ResourceTracker or not (should always be true for creatures). - - - - Multiplies damage of the given by . - - - - - Adds the component onto a prefab to enable its model in the Fabricator. Automatically determines settings if is null. - - - - - Adds the [sic] component to the given GameObject. - - - - - Adds the component onto the object with the given . - - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. The first child of this object and all children of the first child are used for the trail. - The CreatureComponents of this creature. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - The total strength of the movement. A value too low or too high will break the trail completely. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. The first child of this object and all children of the first child are used for the trail. - The BehaviourLOD of this creature. - The creature's uppermost Transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - The total strength of the movement. A value too low or too high will break the trail completely. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. - The CreatureComponents of this creature. - Any objects that are simulated. Should NOT include the 's transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - - - - Creates a , which controls the procedural animations of tail-like objects. - - The root of the spine and object that the is added to. - The BehaviourLOD of this creature. - The creature's uppermost Transform. - Any objects that are simulated. Should NOT include the 's transform. - How fast each segment snaps back into the default position. A higher value gives a more rigid appearance. - How far each segment can be from the original position. - - - - Adds an instance of the component onto that calls the method as defined by the parameters. - - The object that holds the touch trigger, for example a creature's mouth collider. Must have Collider with set to TRUE. - The GameObject that holds the callback component and method. - The name of the type that holds the action performed when the object is collided with. - The name of the method that is performed when the object is collided with. - - - - - Assigns the essential fields of any sort of MeleeAttack component. For anything else, you're on your own. - - Type which must be the same as or inherit from MeleeAttack. - The creature prefab root. - Components reference object. - The object that has the bite trigger. - If true, the component will be added and properly assigned. - Bite damage. - Seconds between each bite. - If false, this creature is unable to attack the Seamoth and PRAWN Suit. - - - - - Utility methods related to using the class more efficiently. An alternative to setting all properties manually. - - - - - Sets the most commonly used properties relating to creature data. - Assigns the following properties so that you don't have to: - - - - - - - - - The creature template to modify. - Roughly determines how far this creature can be loaded in. - Mass in kg. Ranges from about 1.8f to 4050f. Default is 15kg. - The FOV is used for detecting things such as prey. - SHOULD BE NEGATIVE! This value has an expected range of [-1, 0]. Is 0f by default. A value of -1 means a given object is ALWAYS in view. - Determines the distance for which certain calculations (such as Trail Managers) perform (or don't). It is recommended to increase these values for large creatures. - Total power output of this creature. All ECC creatures can be put in the bioreactor as long as this value is greater than 0. - - - - Sets the most commonly used properties relating to creature motion. - Assigns the following properties so that you don't have to: - - - - - - The creature template to modify. - Contains data pertaining to the action. - Contains data pertaining to the action. This component keeps creatures from wandering too far. - - - - Sets properties related to generic prey creatures. Adds basic fear elements and allows it to be picked up and eaten. - Assigns the following properties so that you don't have to: - - - - - - - - The creature template to modify. - The velocity in m/s at which the creature swims away from the player and other perceived threats. - Contains data pertaining to picking up and/or holding fish in your hands. - Contains data pertaining to the [sic] component. - - - - Holds generic sound assets that are used for creatures in the game. - - - - - Fish damage sound. - - - - - Sound for unlocking normal databank entries. - - - - - Contains various utilities of no particular category. - - - - - Helps in the loading of AssetBundles from an "Assets" folder in your mod folder root. An example of an AssetBundle path: `...Subnautica\QMods\DeExtinction\Assets\deextinctionassets`. - - The assembly to grab the mod from. See . - The name of the AssetBundle file in your assets folder, that will be loaded. For De-Extinction, it is `deextinctionassets`. - A loaded AssetBundle. - - - - Compares two strings using the simplified ECCStringComparison. - - - - - - - - - Returns an instance of the PhysicMaterial class that should be used for creatures. The dynamicFriction and staticFriction fields are set to 0 and the combine mode is set to multiply. Please do not modify fields on this class. - - - - - - Converts a to a . - - - - - - Creates an FMODAsset with the given parameters. - - - - - - - - Various ECC-related extensions for GameObjects. - - - - - Find a GameObject in this object's hiearchy, by name. - - - - - - - - - Various ECC-related extensions for Transforms. - - - - - Find a GameObject in this object's hiearchy, by name. - - - - - - - - - Locally resets all or some components of this Transform. - - This. - Zero position? - Zero rotation? - Zero scale? - - - - Enum which is solely used for ECCHelper methods. - - - - - 'A' == 'a' - - - - - 'A' != 'a' - - - - - Whether this string starts with the other given string. Not case sensitive. - - - - - Whether this string starts with the other given string. Case sensitive. - - - - - Whether a given string is located anywhere inside of a larger string. Not case sensitive. - - - - - Whether a given string is located anywhere inside of a larger string. Case sensitive. - - - - - Helps in the creation of a . Call the method to apply the changes. - - - - - Helps in the creation of a . Call the method to apply the changes. - - The object that holds all creature components. - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - Helps in the creation of a . Call the method to apply the changes. - - The root of the creature. Typically the object that holds the Creature component and all CreatureActions. - The BehaviourLOD of this creature. - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - The root of the creature. Typically the object that holds the Creature component and all CreatureActions. - - - - - The object that the TrailManager is added to. Is generally a part of the rig. This bone does NOT get animated, and should NOT be included in the list of trail bones. - - - - - The array that contains all of the transforms of the affected bones. - - - - - The BehaviourLOD of this creature. - - - - - Controls rigidity. The higher this value, the faster the TrailManager can revert to its default (stiff) state. The lower this value, the more "floaty" it appears. - - - - - If -1 (default), there is no limit on how far each segment can go. Otherwise, this value forces each bone to remain within a certain distance of its starting point. - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - Multiplier for the intensity of each bone's trail effect. The lowest time value (t=0) affects the first bone while the highest time value (t=1) affects the last bone. Default value is . - - - - - If true, this TrailManager could be disabled while outside the BehaviourLOD's "close threshold" (for performance reasons). True by default. - - - - - Sets the multiplier in every direction to . - - - - - Forces the Trails array to contain every single child of the . Does not work well when the creature has fins or any sort of bone structure in the spine that isn't meant to be 100% animated. - - - - - Fills the Trails array with every child of the RootSegment (recursive) that contains in its name (case insensitive). Ordered from parent to child, top to bottom. - - - - - Fills the Trails array with every child (recursive) of the that contains 'phys' in its name (case insensitive). Ordered from parent to child, top to bottom. - - - - - Finalizes creation of this TrailManager. - - - - - Utilities related to the class. - - - - - Animation curve that is flat with a value of 1 all across. - - - - - Returns an animation curve that represents a straight line from to . - - - - - - - - Sets the pitch, roll, and yaw multipliers of a given TrailManager to a single value. - - The TrailManager to modify. - The curve to assign to each field. - The same TrailManager (for fluent code). - - - - Indicates the type of the async method builder that should be used by a language compiler to - build the attributed async method or to build the attributed type when used as the return type - of an async method. - - - - Initializes the . - The of the associated builder. - - - Gets the of the associated builder. - - - - An attribute that allows parameters to receive the expression of other parameters. - - - - - Initializes a new instance of the class. - - The condition parameter value. - - - - Gets the parameter name the expression is retrieved from. - - - - - Indicates that compiler support for a particular feature is required for the location where this attribute is applied. - - - - - Creates a new instance of the type. - - The name of the feature to indicate. - - - - The name of the compiler feature. - - - - - If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand . - - - - - The used for the ref structs C# feature. - - - - - The used for the required members C# feature. - - - - - Indicates which arguments to a method involving an interpolated string handler should be passed to that handler. - - - - - Initializes a new instance of the class. - - The name of the argument that should be passed to the handler. - may be used as the name of the receiver in an instance method. - - - - Initializes a new instance of the class. - - The names of the arguments that should be passed to the handler. - may be used as the name of the receiver in an instance method. - - - - Gets the names of the arguments that should be passed to the handler. - - may be used as the name of the receiver in an instance method. - - - - Indicates the attributed type is to be used as an interpolated string handler. - - - - - Used to indicate to the compiler that a method should be called - in its containing module's initializer. - - - When one or more valid methods - with this attribute are found in a compilation, the compiler will - emit a module initializer which calls each of the attributed methods. - - Certain requirements are imposed on any method targeted with this attribute: - - The method must be `static`. - - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc. - - The method must be parameterless. - - The method must return `void`. - - The method must not be generic or be contained in a generic type. - - The method's effective accessibility must be `internal` or `public`. - - The specification for module initializers in the .NET runtime can be found here: - https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer - - - - - Specifies that a type has required members or that a member is required. - - - - - Used to indicate to the compiler that the .locals init flag should not be set in method headers. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class with the specified message. - - An optional message associated with this attribute instance. - - - - Returns the optional message associated with this attribute instance. - - - - - Returns the optional URL associated with this attribute instance. - - - - - Specifies that null is allowed as an input even if the corresponding type disallows it. - - - - - Specifies that null is disallowed as an input even if the corresponding type allows it. - - - - - Applied to a method that will never return under any circumstance. - - - - - Specifies that the method will not return if the associated Boolean parameter is passed the specified value. - - - - - Initializes the attribute with the specified parameter value. - - - The condition parameter value. Code after the method will be considered unreachable - by diagnostics if the argument to the associated parameter matches this value. - - - - - Gets the condition parameter value. - - - - - Specifies that an output may be null even if the corresponding type disallows it. - - - - - Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. - - - - - Initializes the attribute with the specified return value condition. - - The return value condition. If the method returns this value, the associated parameter may be null. - - - - Gets the return value condition. - - - - - Specifies that the method or property will ensure that the listed field and property members have not-null values. - - - - - Initializes the attribute with a field or property member. - - The field or property member that is promised to be not-null. - - - - Initializes the attribute with the list of field and property members. - - The list of field and property members that are promised to be not-null. - - - - Gets field or property member names. - - - - - Specifies that the method or property will ensure that the listed field and property - members have not-null values when returning with the specified return value condition. - - - - - Initializes the attribute with the specified return value condition and a field or property member. - - The return value condition. If the method returns this value, the associated parameter will not be null. - The field or property member that is promised to be not-null. - - - - Initializes the attribute with the specified return value condition and list of field and property members. - - The return value condition. If the method returns this value, the associated parameter will not be null. - The list of field and property members that are promised to be not-null. - - - - Gets the return value condition. - - - - - Gets field or property member names. - - - - - Specifies that an output will not be null even if the corresponding type allows it. - Specifies that an input argument was not null when the call returns. - - - - - Specifies that the output will be non-null if the named parameter is non-null. - - - - - Initializes the attribute with the associated parameter name. - - The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. - - - - Gets the associated parameter name. - - - - - Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. - - - - - Initializes the attribute with the specified return value condition. - - The return value condition. If the method returns this value, the associated parameter will not be null. - - - Gets the return value condition. - - - - Specifies that this constructor sets all required members for the current type, - and callers do not need to set any required members themselves. - - - - - Specifies the syntax used in a string. - - - - - Initializes the with the identifier of the syntax used. - - The syntax identifier. - - - Initializes the with the identifier of the syntax used. - The syntax identifier. - Optional arguments associated with the specific syntax employed. - - - Gets the identifier of the syntax used. - - - Optional arguments associated with the specific syntax employed. - - - The syntax identifier for strings containing composite formats for string formatting. - - - The syntax identifier for strings containing date format specifiers. - - - The syntax identifier for strings containing date and time format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing JavaScript Object Notation (JSON). - - - The syntax identifier for strings containing numeric format specifiers. - - - The syntax identifier for strings containing regular expressions. - - - The syntax identifier for strings containing time format specifiers. - - - The syntax identifier for strings containing format specifiers. - - - The syntax identifier for strings containing URIs. - - - The syntax identifier for strings containing XML. - - - - Used to indicate a byref escapes and is not scoped. - - - - There are several cases where the C# compiler treats a as implicitly - - where the compiler does not allow the to escape the method. - - - For example: - - for instance methods. - parameters that refer to types. - parameters. - - - - This attribute is used in those instances where the should be allowed to escape. - - - Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for - API authors to understand the lifetime implications of applying this attribute and how it may impact their users. - - - - - Represent a type can be used to index a collection either from the start or the end. - - Index is used by the C# compiler to support the new index syntax - - int[] someArray = new int[5] { 1, 2, 3, 4, 5 } ; - int lastElement = someArray[^1]; // lastElement = 5 - - - - - Construct an Index using a value and indicating if the index is from the start or from the end. - The index value. it has to be zero or positive number. - Indicating if the index is from the start or from the end. - - If the Index constructed from the end, index value 1 means pointing at the last element and index value 0 means pointing at beyond last element. - - - - Create an Index pointing at first element. - - - Create an Index pointing at beyond last element. - - - Create an Index from the start at the position indicated by the value. - The index value from the start. - - - Create an Index from the end at the position indicated by the value. - The index value from the end. - - - Returns the index value. - - - Indicates whether the index is from the start or the end. - - - Calculate the offset from the start using the giving collection length. - The length of the collection that the Index will be used with. length has to be a positive value - - For performance reason, we don't validate the input length parameter and the returned offset value against negative values. - we don't validate either the returned offset is greater than the input length. - It is expected Index will be used with collections which always have non negative length/count. If the returned offset is negative and - then used to index a collection will get out of range exception which will be same affect as the validation. - - - - Indicates whether the current Index object is equal to another object of the same type. - An object to compare with this object - - - Indicates whether the current Index object is equal to another Index object. - An object to compare with this object - - - Returns the hash code for this instance. - - - Converts integer number to an Index. - - - Converts the value of the current Index object to its equivalent string representation. - - - Represent a range has start and end indexes. - - Range is used by the C# compiler to support the range syntax. - - int[] someArray = new int[5] { 1, 2, 3, 4, 5 }; - int[] subArray1 = someArray[0..2]; // { 1, 2 } - int[] subArray2 = someArray[1..^0]; // { 2, 3, 4, 5 } - - - - - Represent the inclusive start index of the Range. - - - Represent the exclusive end index of the Range. - - - Construct a Range object using the start and end indexes. - Represent the inclusive start index of the range. - Represent the exclusive end index of the range. - - - Indicates whether the current Range object is equal to another object of the same type. - An object to compare with this object - - - Indicates whether the current Range object is equal to another Range object. - An object to compare with this object - - - Returns the hash code for this instance. - - - Converts the value of the current Range object to its equivalent string representation. - - - Create a Range object starting from start index to the end of the collection. - - - Create a Range object starting from first element in the collection to the end Index. - - - Create a Range object starting from first element to the end. - - - Calculate the start offset and length of range object using a collection length. - The length of the collection that the range will be used with. length has to be a positive value. - - For performance reason, we don't validate the input length parameter against negative values. - It is expected Range will be used with collections which always have non negative length/count. - We validate the range is inside the length scope though. - - - - diff --git a/README.md b/README.md index 2a084324..c8cc0751 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,47 @@ ## Neurosama-Subnautica-Mod -Mod for Subnautica and Subnautica Below Zero, as seen on [vedal987](https://twitch.tv/vedal987)'s streams +Mod for [Subnautica](https://store.steampowered.com/app/264710/Subnautica/) +and [Subnautica: Below Zero](https://store.steampowered.com/app/848450/Subnautica_Below_Zero/), +as seen on [vedal987](https://twitch.tv/vedal987)'s streams -Requires BepInEx, Nautilus and ECCLibrary to run +Mod dependencies: + - [BepInEx Mono v5.4.23](https://github.com/BepInEx/BepInEx/releases/tag/v5.4.23.2) (not compatible with v6) + - [Nautilus 1.0.0-pre.29](https://github.com/SubnauticaModding/Nautilus/releases/tag/1.0.0-pre.29) (later 1.0.0 versions should work) -Please note that a custom version of ECCLibrary is used! +### Credits (currently outdated) -### Credits + ["2Pfrog"] = Credits.Artist, + ["AlexejheroDev"] = Credits.Programming + Credits.ProjectLead, + ["Azit"] = Credits.Artist, + ["baa14453"] = Credits.Lore, + ["bred"] = Credits.Modeling + Credits.Texturing + Credits.Animations, + ["budwheizzah"] = Credits.Programming + Credits.Artist + Credits.Sounds, + ["chrom"] = Credits.Artist, + ["CJMAXiK"] = Credits.Artist + Credits.Sounds, + ["darkeew"] = Credits.Contributor, + ["FutabaKuuhaku"] = Credits.Modeling + Credits.Texturing, + ["Goldenbeasty"] = Credits.Texturing, + ["Govorunb"] = Credits.Programming, + ["greencap"] = Credits.Modeling + Credits.Texturing, + ["Hakuhan"] = Credits.Artist, + ["Kat"] = Credits.Modeling + Credits.Texturing, + ["Kaz"] = Credits.Artist, + ["Lorx"] = Credits.Artist, + ["Moloch"] = Credits.Artist, + ["MyBraza"] = Credits.Artist + Credits.Sounds, + ["NetPlayz"] = Credits.Artist, + ["P3R"] = Credits.Artist, + ["paccha"] = Credits.Artist, + ["Rune"] = Credits.Artist, + ["SADecsSs"] = Credits.Artist, + ["Sandro"] = Credits.Artist, + ["SomeOldGuy"] = Credits.Artist, + ["sugarph"] = Credits.Artist, + ["Troobs"] = Credits.Artist, + ["Vaalmyr"] = Credits.Modeling + Credits.Texturing, + ["vanorsigma"] = Credits.Contributor, + ["w1n7er"] = Credits.Modeling + Credits.Texturing + Credits.Animations, + ["yamplum"] = Credits.Artist + Credits.Lore, + ["YuG"] = Credits.Modeling + Credits.Texturing, - ["2Pfrog"] = Credits.Artist, - ["AlexejheroDev"] = Credits.Programming + Credits.ProjectLead, - ["Azit"] = Credits.Artist, - ["baa14453"] = Credits.Lore, - ["bred"] = Credits.Modeling + Credits.Texturing + Credits.Animations, - ["budwheizzah"] = Credits.Programming + Credits.Artist + Credits.Sounds, - ["chrom"] = Credits.Artist, - ["CJMAXiK"] = Credits.Artist + Credits.Sounds, - ["darkeew"] = Credits.Contributor, - ["FutabaKuuhaku"] = Credits.Modeling + Credits.Texturing, - ["Goldenbeasty"] = Credits.Texturing, - ["Govorunb"] = Credits.Programming, - ["greencap"] = Credits.Modeling + Credits.Texturing, - ["Hakuhan"] = Credits.Artist, - ["Kat"] = Credits.Modeling + Credits.Texturing, - ["Kaz"] = Credits.Artist, - ["Lorx"] = Credits.Artist, - ["Moloch"] = Credits.Artist, - ["MyBraza"] = Credits.Artist + Credits.Sounds, - ["NetPlayz"] = Credits.Artist, - ["P3R"] = Credits.Artist, - ["paccha"] = Credits.Artist, - ["Rune"] = Credits.Artist, - ["SADecsSs"] = Credits.Artist, - ["Sandro"] = Credits.Artist, - ["SomeOldGuy"] = Credits.Artist, - ["sugarph"] = Credits.Artist, - ["Troobs"] = Credits.Artist, - ["Vaalmyr"] = Credits.Modeling + Credits.Texturing, - ["vanorsigma"] = Credits.Contributor, - ["w1n7er"] = Credits.Modeling + Credits.Texturing + Credits.Animations, - ["yamplum"] = Credits.Artist + Credits.Lore, - ["YuG"] = Credits.Modeling + Credits.Texturing, - -Based on ahk1221's Custom Hull Plates mod
-Using Lee23's ECCLibrary mod +Hull plates code based on ahk1221's [Custom Hull Plates](https://github.com/MrPurple6411/My-Subnautica-Mods/tree/main/CustomHullPlates) mod
+Using code based on Lee23's [ECCLibrary](https://github.com/LeeTwentyThree/ECCLibrary/releases/latest) mod diff --git a/SCHIZO/Commands/FMODCommand.cs b/SCHIZO/Commands/FMODCommand.cs index 6dd606e0..8173d8e9 100644 --- a/SCHIZO/Commands/FMODCommand.cs +++ b/SCHIZO/Commands/FMODCommand.cs @@ -6,6 +6,7 @@ using FMODUnity; using SCHIZO.Commands.Attributes; using SCHIZO.Commands.Base; +using SCHIZO.Commands.Output; using SCHIZO.Helpers; using UnityEngine; @@ -15,17 +16,17 @@ namespace SCHIZO.Commands; DisplayName = "FMOD", Description = "Commands for working with FMOD", RegisterConsoleCommand = true - )] +)] public class FMODCommand : CompositeCommand { [SubCommand] - public static string Play(string pathOrGuid, float distance = 0) + public static object Play(string pathOrGuid, float distance = 0) { if (Guid.TryParse(pathOrGuid, out Guid guid)) - pathOrGuid = GetPath(guid.ToString()); + pathOrGuid = FMODHelpers.GetPath(guid); if (string.IsNullOrEmpty(pathOrGuid)) - return "Null sound path"; + return CommonResults.Error("Null sound path"); try { @@ -39,17 +40,17 @@ public static string Play(string pathOrGuid, float distance = 0) Vector3 pos = Camera.main.transform.position + deltaPos; RuntimeManager.PlayOneShot(pathOrGuid, pos); } - return null; + return CommonResults.OK(); } - catch (EventNotFoundException e) + catch (EventNotFoundException) { - return $"FMOD event not found: {e.Message}"; + return CommonResults.Error($"FMOD event not found: {pathOrGuid}"); } } - [SubCommand] - public static string GetPath(string guid) => FMODHelpers.GetPath(guid); - [SubCommand] - public static string GetId(string path) => FMODHelpers.GetId(path); + [SubCommand(NameOverride = "path")] + public static object GetPath(string guid) => (object)FMODHelpers.GetPath(guid) ?? CommonResults.Error("Not found"); + [SubCommand(NameOverride = "id")] + public static object GetId(string path) => (object)FMODHelpers.GetId(path) ?? CommonResults.Error("Not found"); // all of these were adapted from https://discord.com/channels/324207629784186882/324207629784186882/1065010826571956294 [SubCommand] diff --git a/SCHIZO/Creatures/Components/CreaturePhysicMaterial.cs b/SCHIZO/Creatures/Components/CreaturePhysicMaterial.cs index f0ce1dd7..62381f9f 100644 --- a/SCHIZO/Creatures/Components/CreaturePhysicMaterial.cs +++ b/SCHIZO/Creatures/Components/CreaturePhysicMaterial.cs @@ -4,9 +4,16 @@ namespace SCHIZO.Creatures.Components; partial class CreaturePhysicMaterial { + private static readonly PhysicMaterial _frictionless = new() + { + dynamicFriction = 0, + staticFriction = 0, + frictionCombine = PhysicMaterialCombine.Multiply, + bounceCombine = PhysicMaterialCombine.Multiply, + }; private void Awake() { - if (!physicMaterial) physicMaterial = ECCLibrary.ECCUtility.FrictionlessPhysicMaterial; + if (!physicMaterial) physicMaterial = _frictionless; foreach (Collider componentsInChild in GetComponentsInChildren(true)) componentsInChild.sharedMaterial = physicMaterial; diff --git a/SCHIZO/Creatures/Data/ModdedWaterParkCreatureData.cs b/SCHIZO/Creatures/Data/ModdedWaterParkCreatureData.cs index 44506bc9..7c00d6f9 100644 --- a/SCHIZO/Creatures/Data/ModdedWaterParkCreatureData.cs +++ b/SCHIZO/Creatures/Data/ModdedWaterParkCreatureData.cs @@ -1,4 +1,4 @@ -using ECCLibrary.Data; +using Nautilus.Extensions; using UnityEngine; namespace SCHIZO.Creatures.Data; @@ -14,8 +14,12 @@ public WaterParkCreatureData GetData() data.daysToGrow = daysToGrow; data.isPickupableOutside = isPickupableOutside; data.canBreed = canBreed; - data.eggOrChildPrefab = !string.IsNullOrWhiteSpace(eggOrChild.GetClassID()) ? new CustomGameObjectReference(eggOrChild.GetClassID()) : null; - data.adultPrefab = !string.IsNullOrWhiteSpace(adult.GetClassID()) ? new CustomGameObjectReference(adult.GetClassID()) : null; + string eggId = eggOrChild?.GetClassID(); + string adultId = adult?.GetClassID(); + data.eggOrChildPrefab = string.IsNullOrEmpty(eggId) ? null : new(eggId); + data.eggOrChildPrefab?.ForceValid(); + data.adultPrefab = string.IsNullOrEmpty(adultId) ? null : new(adultId); + data.adultPrefab?.ForceValid(); return data; } diff --git a/SCHIZO/Creatures/UnityCreaturePrefab.cs b/SCHIZO/Creatures/UnityCreaturePrefab.cs index 7acacb20..fa32ff34 100644 --- a/SCHIZO/Creatures/UnityCreaturePrefab.cs +++ b/SCHIZO/Creatures/UnityCreaturePrefab.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -using ECCLibrary; using Nautilus.Handlers; +using SCHIZO.Helpers; using SCHIZO.Items; using UnityEngine; using OurCreatureData = SCHIZO.Creatures.Data.CreatureData; @@ -22,10 +22,10 @@ protected override void SetItemProperties() { base.SetItemProperties(); - CreatureDataUtils.SetBehaviorType(ModItem, UnityData.BehaviourType); + CreatureData.behaviourTypeList[ModItem] = UnityData.BehaviourType; - if (UnityData.acidImmune) CreatureDataUtils.SetAcidImmune(ModItem); - if (UnityData.bioReactorCharge > 0) CreatureDataUtils.SetBioreactorCharge(ModItem, UnityData.bioReactorCharge); + if (UnityData.acidImmune) DamageSystem.acidImmune = [.. DamageSystem.acidImmune, ModItem]; + if (UnityData.bioReactorCharge > 0) BaseBioReactor.charge[ModItem] = UnityData.bioReactorCharge; if (UnityData.isPickupable) { @@ -42,22 +42,22 @@ protected override void SetupComponents(GameObject instance) CreatureDeath creatureDeath = instance.GetComponent(); if (creatureDeath) { - creatureDeath.respawnerPrefab = ObjectReferences.respawnerPrefab; + creatureDeath.respawnerPrefab = ObjectReferences.RespawnerPrefab; } SoundOnDamage soundOnDamage = instance.GetComponent(); if (soundOnDamage) { - if (soundOnDamage.damageType == DamageType.Collide) soundOnDamage.sound = ECCSoundAssets.FishSplat; + if (soundOnDamage.damageType == DamageType.Collide) soundOnDamage.sound = FMODHelpers.GameEvents.FishSplat; else LOGGER.LogWarning($"Creature {PrefabInfo.ClassID} has SoundOnDamage component with damage type {soundOnDamage.damageType} which is not supported"); } LiveMixin liveMixin = instance.GetComponent(); if (liveMixin && liveMixin.data) { - liveMixin.data.damageEffect = ObjectReferences.genericCreatureHit; - liveMixin.data.deathEffect = ObjectReferences.genericCreatureHit; - liveMixin.data.electricalDamageEffect = ObjectReferences.electrocutedEffect; + liveMixin.data.damageEffect = ObjectReferences.GenericCreatureHit; + liveMixin.data.deathEffect = ObjectReferences.GenericCreatureHit; + liveMixin.data.electricalDamageEffect = ObjectReferences.ElectrocutedEffect; } if (UnityData.waterParkData) diff --git a/SCHIZO/Helpers/FMODHelpers.GameEvents.cs b/SCHIZO/Helpers/FMODHelpers.GameEvents.cs new file mode 100644 index 00000000..83a9bd50 --- /dev/null +++ b/SCHIZO/Helpers/FMODHelpers.GameEvents.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SCHIZO.Helpers; +partial class FMODHelpers +{ + public static class GameEvents + { + public static FMODAsset FishSplat { get; } = GetFmodAsset("event:/sub/common/fishsplat"); + } +} diff --git a/SCHIZO/Helpers/FMODHelpers.cs b/SCHIZO/Helpers/FMODHelpers.cs index 0de8d124..8a4788bc 100644 --- a/SCHIZO/Helpers/FMODHelpers.cs +++ b/SCHIZO/Helpers/FMODHelpers.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using FMOD; using FMOD.Studio; using FMODUnity; @@ -8,7 +9,7 @@ using STOP_MODE = FMOD.Studio.STOP_MODE; namespace SCHIZO.Helpers; -internal static class FMODHelpers +internal static partial class FMODHelpers { /// /// Attempts to load an FMOD bank from embedded resources. @@ -53,28 +54,38 @@ public static void LoadSubBank(string name, bool throwOnFail = false) { LoadBankFromResources($"{name}.bank", throwOnFail); } - // TODO this can fail if the path/id aren't found but i cba to write the Try___ methods right now + + // TODO these can fail if the path/id aren't found but i cba to write the Try___ methods right now public static string GetPath(string guid) { if (!Guid.TryParse(guid, out Guid guid_)) return null; - RuntimeManager.StudioSystem.lookupPath(guid_, out string pathFromId).CheckResult(); + return GetPath(guid_); + } + public static string GetPath(Guid guid) + { + RuntimeManager.StudioSystem.lookupPath(guid, out string pathFromId).CheckResult(); return pathFromId; } public static string GetId(string path) { - if (string.IsNullOrEmpty(path)) return null; + Guid guid = GetGuid(path); + return guid == default ? null : guid.ToString(); + } + public static Guid GetGuid(string path) + { + if (string.IsNullOrEmpty(path)) return default; - RuntimeManager.StudioSystem.lookupID(path, out Guid guidFromPath).CheckResult(); - return guidFromPath == default ? null : guidFromPath.ToString(); + RuntimeManager.StudioSystem.lookupID(path, out Guid guid).CheckResult(); + return guid; } - public static void PlayId(this FMOD_CustomEmitter emitter, string id, bool is3d = true) - => PlayFmod(emitter, GetPath(id), id, is3d); + public static void PlayGuid(this FMOD_CustomEmitter emitter, Guid guid, bool is3d = true) + => PlayFmod(emitter, GetPath(guid), guid, is3d); public static void PlayPath(this FMOD_CustomEmitter emitter, string path, bool is3d = true) - => PlayFmod(emitter, path, GetId(path), is3d); + => PlayFmod(emitter, path, GetGuid(path), is3d); - public static void PlayFmod(this FMOD_CustomEmitter emitter, string path, string id, bool is3d, float delay = 0) + public static void PlayFmod(this FMOD_CustomEmitter emitter, string path, Guid guid, bool is3d, float delay = 0) { if (string.IsNullOrEmpty(path)) return; @@ -84,7 +95,7 @@ public static void PlayFmod(this FMOD_CustomEmitter emitter, string path, string return; } - emitter.SetAsset(AudioUtils.GetFmodAsset(path, id)); + emitter.SetAsset(GetFmodAsset(path, guid)); emitter.SetParameterValue("3D", is3d ? 1 : 0); emitter.SetParameterValue("Delay", delay); @@ -156,4 +167,54 @@ public static EventInstance PlayOneShotAttached(Guid guid, GameObject gameObject evt.release(); return evt; } + + private static Dictionary _fmodAssetPool = []; + public static FMODAsset GetFmodAsset(string path) + { + if (string.IsNullOrEmpty(path)) return null; + + Guid guid = GetGuid(path); + if (guid == default) + { + LOGGER.LogWarning($"Tried to get FMODAsset for unknown path \"{path}\""); + return null; + } + return GetFmodAssetNoCheck(path, guid); + } + public static FMODAsset GetFmodAsset(Guid guid) + { + if (guid == default) return null; + string path = GetPath(guid); + + if (path is null) + { + LOGGER.LogWarning($"Tried to get FMODAsset for unknown guid {guid}"); + return null; + } + + return GetFmodAssetNoCheck(path, guid); + } + public static FMODAsset GetFmodAsset(string path, Guid guid) + { + if (string.IsNullOrEmpty(path)) return null; + + if (guid != GetGuid(path)) + { + LOGGER.LogWarning($"Tried to get FMODAsset for path \"{path}\" and guid {guid} which don't match!"); + return null; + } + return GetFmodAssetNoCheck(path, guid); + } + + private static FMODAsset GetFmodAssetNoCheck(string path, Guid guid) + { + if (_fmodAssetPool.TryGetValue(guid, out FMODAsset asset) && asset) + return asset; + + asset = ScriptableObject.CreateInstance(); + asset.path = path; + asset.id = guid.ToString(); + _fmodAssetPool[guid] = asset; + return asset; + } } diff --git a/SCHIZO/Helpers/ObjectReferences.cs b/SCHIZO/Helpers/ObjectReferences.cs new file mode 100644 index 00000000..a610f779 --- /dev/null +++ b/SCHIZO/Helpers/ObjectReferences.cs @@ -0,0 +1,31 @@ +using System.Collections; +using UnityEngine; + +namespace SCHIZO.Helpers; +internal static class ObjectReferences +{ + public static bool Done { get; private set; } + + public static IEnumerator SetReferences() + { + TechType creatureReference; +#if SUBNAUTICA + creatureReference = TechType.Peeper; +#elif BELOWZERO + creatureReference = TechType.ArcticPeeper; +#endif + CoroutineTask task = CraftData.GetPrefabForTechTypeAsync(creatureReference); + yield return task; + GameObject peeper = task.GetResult(); + LiveMixinData lm = peeper.GetComponent().data; + GenericCreatureHit = lm.damageEffect; + ElectrocutedEffect = lm.electricalDamageEffect; + RespawnerPrefab = peeper.GetComponent().respawnerPrefab; + + Done = true; + } + + public static GameObject GenericCreatureHit { get; private set; } + public static GameObject ElectrocutedEffect { get; private set; } + public static GameObject RespawnerPrefab { get; private set; } +} diff --git a/SCHIZO/Items/Components/ModdedCreatureEgg.cs b/SCHIZO/Items/Components/ModdedCreatureEgg.cs index cfbdb2f0..4ee9e5e6 100644 --- a/SCHIZO/Items/Components/ModdedCreatureEgg.cs +++ b/SCHIZO/Items/Components/ModdedCreatureEgg.cs @@ -1,4 +1,4 @@ -using ECCLibrary.Data; +using Nautilus.Extensions; namespace SCHIZO.Items.Components; @@ -12,7 +12,16 @@ private void Awake() LOGGER.LogWarning($"{nameof(creatureEgg)} was not assigned to {this}, creating new - deserialization (e.g. loading hatching progress from save) will fail!"); creatureEgg = gameObject.AddComponent(); } - Egg.creaturePrefab = new CustomGameObjectReference(creature.GetClassID()); + + string creatureId = creature.GetClassID(); + if (string.IsNullOrEmpty(creatureId)) + { + LOGGER.LogError($"No creature assigned to egg {this}, destroying"); + Destroy(this); + return; + } + Egg.creaturePrefab = new(creatureId); + Egg.creaturePrefab.ForceValid(); Egg.creatureType = creature.GetTechType(); } } diff --git a/SCHIZO/Items/Data/PDAEncyclopediaInfo.cs b/SCHIZO/Items/Data/PDAEncyclopediaInfo.cs index 9db14933..fc566587 100644 --- a/SCHIZO/Items/Data/PDAEncyclopediaInfo.cs +++ b/SCHIZO/Items/Data/PDAEncyclopediaInfo.cs @@ -1,5 +1,4 @@ using Nautilus.Handlers; -using Nautilus.Utility; using SCHIZO.Helpers; using SCHIZO.Sounds; @@ -21,8 +20,7 @@ public void Register(UnityPrefab prefab) public void Register(string key) { string path = RetargetHelpers.Pick(encyPathSN, encyPathBZ); - FMODAsset vo = string.IsNullOrEmpty(logVO) ? null - : AudioUtils.GetFmodAsset(logVO); + FMODAsset vo = FMODHelpers.GetFmodAsset(logVO); PDAHandler.AddEncyclopediaEntry(key, path, title, description!?.text, image: texture, popupImage: unlockSprite, unlockSound: isImportantUnlock ? PDAHandler.UnlockImportant : PDAHandler.UnlockBasic, diff --git a/SCHIZO/Jukebox/JukeboxDiskPrefab.BelowZero.cs b/SCHIZO/Jukebox/JukeboxDiskPrefab.BelowZero.cs index 905dba26..fcc63da4 100644 --- a/SCHIZO/Jukebox/JukeboxDiskPrefab.BelowZero.cs +++ b/SCHIZO/Jukebox/JukeboxDiskPrefab.BelowZero.cs @@ -44,7 +44,7 @@ private JukeboxDiskPrefab(CustomJukeboxTrack track) JukeboxDisk diskComp = prefab.EnsureComponent(); diskComp.track = track; if (!string.IsNullOrEmpty(track.unlockFmodEvent)) - diskComp.acquireSound = AudioUtils.GetFmodAsset(track.unlockFmodEvent, FMODHelpers.GetId(track.unlockFmodEvent)); + diskComp.acquireSound = FMODHelpers.GetFmodAsset(track.unlockFmodEvent); DestroyDuplicates unique = prefab.EnsureComponent(); unique.identifier = prefab.GetComponent(); diff --git a/SCHIZO/Plugin.cs b/SCHIZO/Plugin.cs index c0dd4d30..5692f0ab 100644 --- a/SCHIZO/Plugin.cs +++ b/SCHIZO/Plugin.cs @@ -3,15 +3,11 @@ using System.Reflection; using BepInEx; using BepInEx.Logging; -using ECCLibrary; using HarmonyLib; -using Nautilus.Handlers; using SCHIZO.Attributes; -using SCHIZO.Commands.Attributes; using SCHIZO.Commands.Base; using SCHIZO.Helpers; using SCHIZO.Resources; -using SCHIZO.Tweaks; using UnityEngine; namespace SCHIZO; diff --git a/SCHIZO/SCHIZO.csproj b/SCHIZO/SCHIZO.csproj index 18519548..4d4a4b34 100644 --- a/SCHIZO/SCHIZO.csproj +++ b/SCHIZO/SCHIZO.csproj @@ -20,7 +20,6 @@ - diff --git a/SCHIZO/Sounds/ItemSounds.cs b/SCHIZO/Sounds/ItemSounds.cs index e5fe6597..0ab1b06c 100644 --- a/SCHIZO/Sounds/ItemSounds.cs +++ b/SCHIZO/Sounds/ItemSounds.cs @@ -31,8 +31,8 @@ public void Start() if (tool) { PlayerTool Tool = (PlayerTool)tool; - Tool.drawSound = Tool.drawSoundUnderwater = AudioUtils.GetFmodAsset(draw); - Tool.holsterSoundAboveWater = Tool.holsterSoundUnderwater = AudioUtils.GetFmodAsset(holster); + Tool.drawSound = Tool.drawSoundUnderwater = FMODHelpers.GetFmodAsset(draw); + Tool.holsterSoundAboveWater = Tool.holsterSoundUnderwater = FMODHelpers.GetFmodAsset(holster); } } diff --git a/Subnautica.props b/Subnautica.props index 91790b55..564149fe 100644 --- a/Subnautica.props +++ b/Subnautica.props @@ -10,7 +10,6 @@ - diff --git a/Unity/Assets/Scripts/SCHIZO/Items/Data/Crafting/Item.cs b/Unity/Assets/Scripts/SCHIZO/Items/Data/Crafting/Item.cs index 231e419a..3731465f 100644 --- a/Unity/Assets/Scripts/SCHIZO/Items/Data/Crafting/Item.cs +++ b/Unity/Assets/Scripts/SCHIZO/Items/Data/Crafting/Item.cs @@ -1,4 +1,4 @@ -using System; +using System; using JetBrains.Annotations; using SCHIZO.Interop.Subnautica.Enums; using UnityEngine; @@ -9,7 +9,7 @@ namespace SCHIZO.Items.Data.Crafting public sealed partial class Item { [SerializeField, UsedImplicitly] - private bool isCustom = false; + private bool isCustom; [SerializeField, UsedImplicitly] private TechType_All techType;