tutorial:fluids
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:fluids [2023/05/04 11:22] – [Making an abstract fluid] solidblock | tutorial:fluids [2026/02/23 14:26] (current) – fixed reference infinitychances | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| ===== Making an abstract fluid ===== | ===== Making an abstract fluid ===== | ||
| - | Vanilla fluids extend '' | + | Vanilla fluids extend '' |
| - | <yarncode | + | <code java [enable_line_numbers=" |
| - | public abstract class TutorialFluid extends | + | public abstract class TutorialFluid extends |
| /** | /** | ||
| * @return whether the given fluid an instance of this fluid | * @return whether the given fluid an instance of this fluid | ||
| */ | */ | ||
| @Override | @Override | ||
| - | public boolean | + | public boolean |
| - | return fluid == method_15751() || fluid == method_15750(); | + | return fluid == getSource() || fluid == getFlowing(); |
| } | } | ||
| Line 20: | Line 20: | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected boolean | + | protected boolean |
| return false; | return false; | ||
| } | } | ||
| Line 29: | Line 29: | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected void method_15730(class_1936 world, class_2338 | + | protected void beforeDestroyingBlock(LevelAccessor level, BlockPos |
| - | final | + | final |
| - | class_2248.method_9610(state, | + | Block.dropResources(state, |
| } | } | ||
| Line 41: | Line 41: | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected boolean | + | protected boolean |
| return false; | return false; | ||
| } | } | ||
| Line 50: | Line 50: | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected int method_15733(class_4538 worldView) { | + | protected int getSlopeFindDistance(LevelReader reader) { |
| return 4; | return 4; | ||
| } | } | ||
| /** | /** | ||
| - | * Water returns 1. Lava returns 2 in the Overworld | + | * Water returns 1. Lava returns 2 in the overworld |
| + | * @return How many levels a fluid loses per block. | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected int method_15739(class_4538 worldView) { | + | protected int getDropOff(LevelReader reader) { |
| return 1; | return 1; | ||
| } | } | ||
| Line 64: | Line 65: | ||
| /** | /** | ||
| * Water returns 5. Lava returns 30 in the Overworld and 10 in the Nether. | * Water returns 5. Lava returns 30 in the Overworld and 10 in the Nether. | ||
| + | * Seems to return the delay before it updates its state. | ||
| */ | */ | ||
| @Override | @Override | ||
| - | public int method_15789(class_4538 worldView) { | + | public int getTickDelay(LevelReader reader) { |
| return 5; | return 5; | ||
| } | } | ||
| Line 74: | Line 76: | ||
| */ | */ | ||
| @Override | @Override | ||
| - | protected float method_15784() { | + | protected float getExplosionResistance() { |
| return 100.0F; | return 100.0F; | ||
| } | } | ||
| } | } | ||
| - | </yarncode> | + | </code> |
| ===== Implementation ===== | ===== Implementation ===== | ||
| Now let's make an actual fluid which will have still and flowing variants. For this tutorial, we will call it Acid. The missing references will be filled in shortly. | Now let's make an actual fluid which will have still and flowing variants. For this tutorial, we will call it Acid. The missing references will be filled in shortly. | ||
| - | <yarncode | + | <code java [enable_line_numbers=" |
| public abstract class AcidFluid extends TutorialFluid { | public abstract class AcidFluid extends TutorialFluid { | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| return YOUR_FLOWING_FLUID_HERE; | return YOUR_FLOWING_FLUID_HERE; | ||
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| return YOUR_BUCKET_ITEM_HERE; | return YOUR_BUCKET_ITEM_HERE; | ||
| } | } | ||
| @Override | @Override | ||
| - | protected | + | protected |
| - | return YOUR_FLUID_BLOCK_HERE.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState)); | + | return YOUR_FLUID_BLOCK_HERE.defaultBlockState().setValue(BlockStateProperties.LEVEL, getLegacyLevel(state)); |
| } | } | ||
| public static class Flowing extends AcidFluid { | public static class Flowing extends AcidFluid { | ||
| @Override | @Override | ||
| - | protected void method_15775(class_2689.class_2690<class_3611, class_3610> builder) { | + | protected void createFluidStateDefinition(StateDefinition.Builder<Fluid, FluidState> builder) { |
| - | super.method_15775(builder); | + | super.createFluidStateDefinition(builder); |
| - | builder.method_11667(field_15900); | + | builder.add(LEVEL); |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| } | } | ||
| Line 125: | Line 127: | ||
| public static class Still extends AcidFluid { | public static class Still extends AcidFluid { | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| } | } | ||
| } | } | ||
| - | </yarncode> | + | </code> |
| Next, we'll make static instances of still and flowing acid variants, and an acid bucket. In your '' | Next, we'll make static instances of still and flowing acid variants, and an acid bucket. In your '' | ||
| - | <yarncode | + | <code java [enable_line_numbers=" |
| - | public static | + | public static |
| - | public static | + | public static |
| - | public static | + | public static |
| @Override | @Override | ||
| public void onInitialize() { | public void onInitialize() { | ||
| - | STILL_ACID | + | ACID_SOURCE |
| - | FLOWING_ACID = class_2378.method_10230(class_7923.field_41173, new class_2960(MOD_ID, " | + | FLOWING_ACID = |
| - | ACID_BUCKET = class_2378.method_10230(class_7923.field_41178, new class_2960(MOD_ID, " | + | ACID_BUCKET = Registry.register(BuiltInRegistries.ITEM, Identifier.fromNamespaceAndPath(" |
| - | new class_1755(STILL_ACID, new class_1792.class_1793().method_7896(class_1802.field_8550).method_7889(1))); | + | new BucketItem(ACID_SOURCE, |
| // ... | // ... | ||
| Line 155: | Line 157: | ||
| // ... | // ... | ||
| - | </yarncode> | + | </code> |
| - | To make a custom fluid behave more like water or lava, you must add it to a corresponding fluid tag: For water, make a '' | + | To make a custom fluid behave more like water or lava, you must add it to a corresponding fluid tag: For water, make a '' |
| <code json [enable_line_numbers=" | <code json [enable_line_numbers=" | ||
| { | { | ||
| Line 163: | Line 165: | ||
| " | " | ||
| [ | [ | ||
| - | "your_mod_id: | + | "tutorial: |
| - | "your_mod_id: | + | "tutorial: |
| ] | ] | ||
| } | } | ||
| Line 170: | Line 172: | ||
| ===== Making a fluid block ===== | ===== Making a fluid block ===== | ||
| - | Next we need to create a block which will represent acid in the world. '' | + | Next we need to create a block which will represent acid in the world. '' |
| - | <yarncode | + | <code java [enable_line_numbers=" |
| - | public static | + | public static |
| @Override | @Override | ||
| public void onInitialize() { | public void onInitialize() { | ||
| - | ACID = class_2378.method_10230(class_7923.field_41175, new class_2960(MOD_ID, " | + | ACID = Registry.register(BuiltInRegistries.BLOCK, Identifier.fromNamespaceAndPath(" |
| // ... | // ... | ||
| } | } | ||
| - | </yarncode> | + | </code> |
| Now that we have these static objects, we can go back to '' | Now that we have these static objects, we can go back to '' | ||
| - | <yarncode | + | <code java [enable_line_numbers=" |
| public abstract class AcidFluid extends TutorialFluid { | public abstract class AcidFluid extends TutorialFluid { | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return TutorialMod.STILL_ACID; | + | return TutorialMod.ACID_SOURCE; |
| } | } | ||
| - | + | ||
| @Override | @Override | ||
| - | public | + | public |
| return TutorialMod.FLOWING_ACID; | return TutorialMod.FLOWING_ACID; | ||
| } | } | ||
| - | + | ||
| @Override | @Override | ||
| - | public | + | public |
| return TutorialMod.ACID_BUCKET; | return TutorialMod.ACID_BUCKET; | ||
| } | } | ||
| - | + | ||
| @Override | @Override | ||
| - | protected | + | protected |
| - | // method_15741 converts the LEVEL_1_8 of the fluid state to the LEVEL_15 the fluid block uses | + | return TutorialMod.ACID.defaultBlockState().setValue(BlockStateProperties.LEVEL, getLegacyLevel(state)); |
| - | return TutorialMod.ACID.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState)); | + | |
| } | } | ||
| public static class Flowing extends AcidFluid { | public static class Flowing extends AcidFluid { | ||
| @Override | @Override | ||
| - | protected void method_15775(class_2689.class_2690<class_3611, class_3610> builder) { | + | protected void createFluidStateDefinition(StateDefinition.Builder<Fluid, FluidState> builder) { |
| - | super.method_15775(builder); | + | super.createFluidStateDefinition(builder); |
| - | builder.method_11667(field_15900); | + | builder.add(LEVEL); |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| } | } | ||
| Line 228: | Line 229: | ||
| public static class Still extends AcidFluid { | public static class Still extends AcidFluid { | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | return | + | return |
| } | } | ||
| } | } | ||
| - | } | + | } |
| - | </yarncode> | + | </code> |
| ===== Rendering setup ===== | ===== Rendering setup ===== | ||
| - | For your fluids to have textures or be tinted with a color, you will need to register a '' | + | For your fluids to have textures or be tinted with a color, you will need to register a '' |
| - | <yarncode | + | <code java [enable_line_numbers=" |
| + | @Environment(EnvType.CLIENT) | ||
| public class TutorialModClient implements ClientModInitializer { | public class TutorialModClient implements ClientModInitializer { | ||
| @Override | @Override | ||
| public void onInitializeClient() { | public void onInitializeClient() { | ||
| - | FluidRenderHandlerRegistry.INSTANCE.register(TutorialMod.STILL_ACID, TutorialMod.FLOWING_ACID, | + | FluidRenderHandlerRegistry.INSTANCE.register(TutorialMod.ACID_SOURCE, TutorialMod.FLOWING_ACID, |
| - | new class_2960(" | + | |
| - | new class_2960(" | + | |
| - | 0x4CC248 | + | |
| - | )); | + | |
| - | BlockRenderLayerMap.INSTANCE.putFluids(class_1921.method_23583(), TutorialMod.STILL_ACID, TutorialMod.FLOWING_ACID); | + | BlockRenderLayerMap.putFluids(ChunkSectionLayer.TRANSLUCENT, TutorialMod.ACID_SOURCE, TutorialMod.FLOWING_ACID); |
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ===== Adding custom textures to your fluid ===== | ||
| + | To create a fluid with custom textures, you will need at least 2 new textures, with an optional 3rd, overlay texture that is shown when you look at the fluid behind glass or leaves. All textures go in the block textures folder. | ||
| - | //if you want to use custom textures they needs to be registered. | + | The first texture should |
| - | //In this example this is unnecessary because | + | The second texture should be named YOUR_FLUID_NAME_flowing.png, |
| - | //To register | + | The third will be named YOUR_FLUID_NAME_overlay.png, and should not be animated. |
| - | // | + | |
| - | // registry.register(new Identifier(" | + | |
| - | // registry.register(new Identifier(" | + | |
| - | //}); | + | |
| - | // ... | + | Using our acid example, the client initializer will look like this: |
| + | <code java [enable_line_numbers=" | ||
| + | @Environment(EnvType.CLIENT) | ||
| + | public class TutorialModClient implements ClientModInitializer { | ||
| + | |||
| + | @Override | ||
| + | public void onInitializeClient() { | ||
| + | FluidRenderHandlerRegistry.INSTANCE.register(TutorialMod.ACID_SOURCE, | ||
| + | Identifier.fromNamespaceAndPath(" | ||
| + | Identifier.fromNamespaceAndPath(" | ||
| + | Identifier.fromNamespaceAndPath(" | ||
| + | |||
| + | BlockRenderLayerMap.putFluids(ChunkSectionLayer.TRANSLUCENT, | ||
| } | } | ||
| } | } | ||
| - | </yarncode> | + | </code> |
| - | If you want to use your own fluid textures, you can refer to vanilla' | + | You can refer to vanilla' |
| - | ===== Generation in the world ===== | ||
| - | TODO Update to 1.19.4 | ||
| - | </ | ||
tutorial/fluids.1683199321.txt.gz · Last modified: 2023/05/04 11:22 by solidblock