# Fluid Refactor proposal notes # - We remove FluidType. Gone. Thanos snapped out of existence. - Mods SHOULD instead register two fluids: still (or source) and flowing - Or maybe only one if it's not valid for in-world use, or just doesn't flow - Mods SHOULD separate the logic for still/source and flowing fluids so that fluids have more/less data (e.g. flow direction and level) based on their needs - Ideally this should also simplify their update logic, since the state machine is then broken up into three more digestible components: 1. Sources turning adjacent displaceable blocks into flowing fluids; 2. Flowing blocks turning nearby displaceable blocks into flowing fluids, up to a limit; and 3. Flowing blocks merging into a source block, if appropriate, or otherwise updating their flow direction and level - Fluid specific behaviors should be implemented on the fluid: - e.g. fluids that flow upwards (e.g. like `#forge:is_gaseous`) would do their alternate flow logic here - NeoForge MAY provide helpers for one or more of the above points - e.g. gaseous fluid abstractions for flowing upwards - e.g. fluid abstractions for igniting blocks - We instead start to use tags to identify multiple fluids that are "related": - Multiple equivalent fluids (e.g. source and flowing fluids) SHOULD be tagged under something like `#mymod:fluid_name` - Mods SHOULD treat any two fluids tagged under this tag convention as completely interchangeable - NeoForge SHOULD provide a helper for performing this loose "equivalency" check without having to hard-code this convention manually - Modders MUST NOT assume that other mods will pick one entry in this tag over another when converting fluids - Recipes SHOULD be written using these tags instead of separate recipes for each member fluid, if there is more than one - If not, recipes MAY use the direct name of the fluid - **Q:** Is there a scenario where other mods would want to register fluids to this tag? If they have differing textures, it may be undesirable to see fluids change from one form to another - For commonly registered fluids, we MAY encourage a convention tag, e.g. `#c:metal/iron` for iron, `#c:steam` for steam, or `#c:experience` for experience - This would be intended for recipes using fluids to be more compatible with each other, just like how item tags work for ores and ingots - We would also likely include set-intersection tags to describe properties of the fluid, e.g. `#c:is_gaseous`, `#c:is_liquid` or `#c:is_potable` - Properties like density would likely be provided via data maps, or inferred from the above tags - **Q:** Would we want to duplicate them across flowing/source? This seems like it would be awkward for the common case where both match - **Q:** Would mods expect `#c:steam` to be water steam, or should we subfolder this as `#c:steam/water` (e.g. to allow `#c:steam/heavy_water`) - For any reusable behaviors, especially on entities, modders SHOULD create tags to trigger these behaviors, or halt them: - e.g. swimming could be triggered by `#neoforge:is_swimmable` - e.g. drowning could be stopped by `#neoforge:is_breathable` - e.g. burning could be triggered by `#neoforge:is_flammable` ## Entity Changes Necessary ## - The current logic in Entity erroneously sums fluid pushing vectors when in multiple fluid types - We'll change `updateFluidHeightAndDoFluidPushing` to take the average of all fluids the entity is in instead of just per fluid type/group - **Q:** Should it be a weighted average? - Entities need to be changed to NOT use TagKey<Fluid> everywhere. - We'll just directly use the Fluid where appropriate - Vanilla APIs using TagKey will just return the first matching fluid - Since a bunch of vanilla code uses maps, it will be arbitrarily random - Logic uses methods like `isInLava` or `isInWater` to do behavioral changes - We should make these into appropriate behavior tags or methods if necessary - Fog rendering gets weird with multiple fluids with different fog properties - We should take the weighted average of these properties to give a reasonable output - **Q:** Fog color can't just be interpolated in RGB space, or else it will turn an ugly brown/grey - what should we do here?