User Tools

Site Tools


zh_cn:tutorial:fluids

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:fluids [2019/12/19 10:26] lightcolourzh_cn:tutorial:fluids [2023/05/04 11:31] (current) – [渲染设置] solidblock
Line 1: Line 1:
 ====== 创建流体 ====== ====== 创建流体 ======
-===== Overview ===== +===== 概述 ===== 
-在这里,我们将介绍自定义流体的创建。 如果计划创建多个流体,建议创建一个抽象的基本流体类,在其中设置必要的默认值,这些默认值将在其子类中共享。 我们还将使其像湖泊一样在世界上产生。 +在这里,我们将介绍自定义流体的创建。如果计划创建多个流体,建议创建一个抽象的基本流体类,在其中设置必要的默认值,这些默认值将在其子类中共享。我们还将使其像湖泊一样在世界。 
-===== 使用流体abstract  ===== +===== 创建抽象流体 ===== 
-原版流体扩展**net.minecraft.fluid.BaseFluid**类,我们的抽象流体将扩展。 可能是这样的: +原版流体继承了 ''<yarn net.minecraft.class_3609>'',我们也应如此。 
-<code java> +<yarncode java [enable_line_numbers="true"]
-public abstract class BasicFluid extends BaseFluid +public abstract class TutorialFluid extends class_3609 
-+ /** 
-    /** +  * @return 给定的流体是否为该流体的实例? 
-     * @return does it produce infinite fluid (like water)? + */ 
-     */ + @Override 
-    @Override + public boolean method_15780(class_3611 fluid) { 
-    protected boolean isInfinite() + return fluid == getStill() || fluid == getFlowing(); 
-    +
-        return false; +  
-    }+ /** 
 + * @return 流体是否可以像无限刷水的方法一样无限生成?在原版,这取决于游戏规则。 
 +  */ 
 + @Override 
 + protected boolean method_15737() { 
 + return false; 
 +
 +  
 + /** 
 + * 流体流入一个可替换的方块时的行为。 
 + * 水会掉落方块的战利品表。熔岩会播放“block.lava.extinguish”音效。 
 + */ 
 + @Override 
 + protected void method_15730(class_1936 world, class_2338 pos, class_2680 state) 
 + final BlockEntity blockEntity = state.getBlock().hasBlockEntity() ? world.getBlockEntity(pos) : null; 
 + Block.dropStacks(state, world, pos, blockEntity); 
 +
 +  
 + /** 
 + * 熔岩在其 FluidState 高于指定的高度且该流体为水时返回 true。 
 + *  
 + * @return 给定的流体能否流入它的 FluidState? 
 + */ 
 + @Override 
 + protected boolean method_15777(class_3610 fluidState, class_1922 blockView, class_2338 blockPos, class_3611 fluid, class_2350 direction) { 
 + return false; 
 + } 
 +  
 + /** 
 + * 或许与流入周围附近凹洞的距离检查有关? 
 + * 水返回4。熔岩在主世界返回2,而在下界返回4。 
 + */ 
 + @Override 
 + protected int method_15733(class_4538 worldView) { 
 + return 4; 
 +
 +  
 + /** 
 + * 返回每次流动一格,其等级减少的数值。水返回1,熔岩在主世界返回2,在下界返回1。 
 + */ 
 + @Override 
 + protected int method_15739(class_4538 worldView) { 
 + return 1; 
 +
 +  
 + /** 
 + * 返回每流一格需要花费的时间(按刻计算)。水返回5。熔岩在主世界返回30,在下界返回10。 
 + */ 
 + @Override 
 + public int method_15789(class_4538 worldView) { 
 + return 5; 
 +
 +  
 + /** 
 + * 返回爆炸抗性。水和熔岩都返回100.0F。 
 + */ 
 + @Override 
 + protected float method_15784() { 
 + return 100.0F; 
 +
 +
 +</yarncode>
  
-    // make it transparent +===== 实现 ===== 
-    @Override +现在让我们制作一个拥有静止和流动两个变种的实际流体。在此教程中,我们将其称为“酸”。缺失的引用稍后补全。
-    protected BlockRenderLayer getRenderLayer() +
-    { +
-        return BlockRenderLayer.TRANSLUCENT; +
-    }+
  
-    /** +<yarncode java [enable_line_numbers="true"]> 
-     * +public abstract class AcidFluid extends TutorialFluid { 
-     * @return an associated item that "holdsthis fluid + @Override 
-     */ + public class_3611 method_15751() 
-    @Override + return YOUR_STILL_FLUID_HERE; 
-    public abstract Item getBucketItem();+ }
  
-    /** + @Override 
-     * + public class_3611 method_15750() 
-     * @return a blockstate of the associated {@linkplain net.minecraft.block.FluidBlock} with {@linkplain net.minecraft.block.FluidBlock#LEVEL} + return YOUR_FLOWING_FLUID_HERE; 
-     */ + }
-    @Override +
-    protected abstract BlockState toBlockState(FluidState var1);+
  
-    /** + @Override 
-     * + public class_1792 method_15774() 
-     * @return flowing static instance of this fluid + return YOUR_BUCKET_ITEM_HERE; 
-     */ + }
-    @Override +
-    public abstract Fluid getFlowing();+
  
-    /** + @Override 
-     * + protected class_2680 method_15790(class_3610 fluidState) { 
-     * @return still static instance of this fluid + return YOUR_FLUID_BLOCK_HERE.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState)); 
-     */ + }
-    @Override +
-    public abstract Fluid getStill();+
  
-    // how much does the height of the fluid block decreases + public static class Flowing extends AcidFluid { 
-    @Override + @Override 
-    protected int getLevelDecreasePerBlock(ViewableWorld world) + protected void method_15775(class_2689.class_2690<class_3611, class_3610> builder) { 
-    + super.method_15775(builder); 
-        return 1+ builder.method_11667(field_15900)
-    }+ }
  
-    /** + @Override 
-     *  + public int method_15779(class_3610 fluidState) { 
-     * @return update rate + return fluidState.method_11654(field_15900)
-     */ + }
-    @Override +
-    public int getTickRate(ViewableWorld world) +
-    +
-        return 5+
-    }+
  
-    @Override + @Override 
-    protected float getBlastResistance() + public boolean method_15793(class_3610 fluidState) { 
-    + return false
-        return 100+
-    }+ }
  
-    // this seems to determine fluid's spread speed (higher value means faster) + public static class Still extends AcidFluid { 
-    @Override + @Override 
-    protected int method_15733(ViewableWorld world) + public int method_15779(class_3610 fluidState) { 
-    + return 8
-        return 4+ }
-    }+
  
-    /I don't know what this does, but it's present in the water fluid + @Override 
-    @Override + public boolean method_15793(class_3610 fluidState) { 
-    protected void beforeBreakingBlock(IWorld world, BlockPos blockPos, BlockState blockState) { + return true; 
-        BlockEntity blockEntity blockState.getBlock().hasBlockEntity() ? world.getBlockEntity(blockPos: null+
-        Block.dropStacks(blockState, world.getWorld(), blockPos, blockEntity); +
-    } +
- +</yarncode> 
-    // also don't know what it does +接下来,我们将制作静态和动态酸变体的静态实例,以及一个酸桶。在您的 ''ModInitializer'' 中: 
-    public boolean method_15777(FluidState fluidStateBlockView blockViewBlockPos blockPosFluid fluid, Direction direction) { +<yarncode java [enable_line_numbers="true"]> 
-        return direction == Direction.DOWN+public static class_3609 STILL_ACID; 
-    } +public static class_3609 FLOWING_ACID; 
- +public static class_1792 ACID_BUCKET; 
-    /** +  
-     * +@Override 
-     * @return is given fluid instance of this fluid? +public void onInitialize() { 
-     *+ STILL_ACID class_2378.method_10230(class_7923.field_41173, new class_2960("tutorial", "acid"), new AcidFluid.Still())
-    @Override + FLOWING_ACID = class_2378.method_10230(class_7923.field_41173, new class_2960("tutorial", "flowing_acid"), new AcidFluid.Flowing()); 
-    public abstract boolean matchesType(Fluid fluid);+ ACID_BUCKET = class_2378.method_10230(class_7923.field_41178new class_2960("tutorial""acid_bucket"),  
 +        new class_1755(STILL_ACID, new class_1792.class_1793().method_7896(class_1802.field_8550).method_7889(1)))
 +  
 + // ... 
 +} 
 +  
 +// ... 
 +</yarncode>
  
 +为了使自定义流体表现得像水或熔岩,您必须将其添加到相应的流体标签中:对于水,制作 ''data/minecraft/tags/fluids/water.json'' 文件,并在其中写入流体 id:
 +<code json [enable_line_numbers="true"]>
 +{
 + "replace": false,
 + "values":
 + [
 + "tutorial:acid",
 + "tutorial:flowing_acid"
 + ]
 } }
 </code> </code>
  
-===== 进行 ===== 
  
-现在让我们进行实际研究。 它将具有//still// 和 //flowing//变体; 将为“酸性”+==== 制作一个流体方块 ==== 
 +接下来,我们需要在世界中创建表示酸方块''<yarn net.minecraft.class_2404>'' 是我们需要使用的类,但由于构造器受保护,我们不能直接构造它。一种解决方法是制作子类或者匿子类。这里我们展示后一种方式。在您的 ''ModInitializer'' 
 +<yarncode java [enable_line_numbers="true"]> 
 +public static class_2248 ACID;
  
-<code java> +@Override 
-public abstract class Acid extends BasicFluid +public void onInitialize() { 
-+ ACID = class_2378.method_10230(class_7923.field_41175, new class_2960("tutorial", "acid"), new class_2404(STILL_ACID, FabricBlockSettings.method_9630(class_2246.field_10382)){})
-    @Override +  
-    public Item getBucketItem() + // ... 
-    + 
-        return null; +</yarncode>
-    } +
-    @Override +
-    protected BlockState toBlockState(FluidState var1) +
-    { +
-        return null+
-    }+
  
-    @Override +既然我们有了这些静态对象,我们回到 ''AcidFluid'' 并补全被重写的方法: 
-    public Fluid getFlowing() +<yarncode java [enable_line_numbers="true"]> 
-    +public abstract class AcidFluid extends TutorialFluid { 
-        return null+ @Override 
-    }+ public class_3611 method_15751() { 
 + return TutorialMod.STILL_ACID; 
 +
 +  
 + @Override 
 + public class_3611 method_15750() 
 + return TutorialMod.FLOWING_ACID; 
 +
 +  
 + @Override 
 + public class_1792 method_15774() { 
 + return TutorialMod.ACID_BUCKET; 
 +
 +  
 + @Override 
 + protected class_2680 method_15790(class_3610 fluidState) { 
 + // method_15741 将流体状态的 LEVEL_1_8 转换为流体方块使用的 LEVEL_15 
 + return TutorialMod.ACID.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState))
 + }
  
-    @Override + public static class Flowing extends AcidFluid { 
-    public Fluid getStill() + @Override 
-    + protected void method_15775(class_2689.class_2690<class_3611, class_3610> builder) { 
-        return null+ super.method_15775(builder); 
-    }+ builder.method_11667(field_15900)
 + }
  
-    @Override + @Override 
-    public boolean matchesType(Fluid fluid) + public int method_15779(class_3610 fluidState) { 
-    + return fluidState.method_11654(field_15900)
-        return false+ }
-    }+
  
-    // still acid + @Override 
-    public static class Still extends Acid + public boolean method_15793(class_3610 fluidState) { 
-    {+ return false; 
 +
 + }
  
-        @Override + public static class Still extends AcidFluid { 
-        public boolean isStill(FluidState fluidState) + @Override 
-        + public int method_15779(class_3610 fluidState) { 
-            return true+ return 8
-        }+ }
  
-        /** + @Override 
-         * @return height of the fluid block + public boolean method_15793(class_3610 fluidState) { 
-         */ + return true
-        @Override +
-        public int getLevel(FluidState fluidState) + } 
-        +}   
-            return 8+</yarncode> 
-        +===== 渲染设置 ===== 
-    }+为了让流体拥有纹理,或者与一个颜色绑定,你需要为其注册一个''FluidRenderHandler''。这里,我们重用水的纹理,并仅仅改变用于其上的颜色。为确保纹理渲染为半透明的,你可以使用 Fabric 的 ''BlockRenderLayerMap''(参见 [[blockappearance]])。
  
-    // flowing acid +<yarncode java [enable_line_numbers="true"]> 
-    public static class Flowing extends  Acid +@Environment(EnvType.CLIENT) 
-    {+public class TutorialModClient implements ClientModInitializer {
  
-        @Override + @Override 
-        public boolean isStill(FluidState fluidState) + public void onInitializeClient() { 
-        + FluidRenderHandlerRegistry.INSTANCE.register(TutorialMod.STILL_ACID, TutorialMod.FLOWING_ACID, new SimpleFluidRenderHandler( 
-            return false; + new class_2960("minecraft:block/water_still"), 
-        }+ new class_2960("minecraft:block/water_flow"), 
 + 0x4CC248 
 + ));
  
-        /** + BlockRenderLayerMap.INSTANCE.putFluids(class_1921.method_23583(), TutorialMod.STILL_ACID, TutorialMod.FLOWING_ACID);
-         * @return height of the fluid block +
-         */ +
-        @Override +
-        public int getLevel(FluidState fluidState) +
-        { +
-            return fluidState.get(LEVEL); +
-        }+
  
-        @Override + //if you want to use custom textures they needs to be registered. 
-        protected void appendProperties(StateFactory.Builder<FluidFluidStatestateFactoryBuilder) + //In this example this is unnecessary because the vanilla water textures are already registered. 
-        + //To register your custom textures use this method. 
-            super.appendProperties(stateFactoryBuilder); + //ClientSpriteRegistryCallback.event(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE).register((atlasTextureregistry) -> { 
-            stateFactoryBuilder.add(LEVEL); + //    registry.register(new Identifier("tutorial:block/custom_fluid_still")); 
-        } + //    registry.register(new Identifier("tutorial:block/custom_fluid_flowing")); 
-    } + //});
-+
-</code> +
-接下来,我们将制作静态和动态酸变体的静态实例,以及一个酸桶。 在您的** ModInitializer **中: +
-<code java>+
  
-     + // ... 
-    public static Acid stillAcid; + }
-    public static Acid flowingAcid; +
-     +
-    public static BucketItem acidBucket; +
- +
-    @Override +
-    public void onInitialize() +
-    { +
-     +
-        stillAcid = Registry.register(Registry.FLUID, new Identifier(MODID,"acid_still"), new Acid.Still()); +
-        flowingAcid = Registry.register(Registry.FLUID, new Identifier(MODID,"acid_flowing"), new Acid.Flowing()); +
-         +
-        acidBucket = new BucketItem(stillAcid, new Item.Settings().maxCount(1)); +
-        Registry.register(Registry.ITEM, new Identifier(MODID,"acid_bucket"), acidBucket); +
-        +
-</code> +
-为了使自定义流体表现得像水或熔岩,您必须将其添加到相应的流体标签中:制作一个文件''data/minecraft/tags/fluids/ water.json'',并在其中写入流体的标识符: +
-<code json> +
-+
-  "replace": false, +
-  "values":+
-    "modid:acid_still", +
-    "modid:acid_flowing" +
-  ]+
 } }
-</code>+</yarncode>
  
-==== 制作一个流体方块 ==== +如果你需要使用你自己流体纹理,你可以参考原版资源包((''assets/minecraft/blockstates/water.json''\\ ''assets/minecraft/models/block/water.json''\\ ''assets/minecraft/textures/block/water_still.png''\\ ''assets/minecraft/textures/block/water_still.png.mcmeta''\\ ''assets/minecraft/textures/block/water_flow.png''\\ ''assets/minecraft/textures/block/water_flow.png.mcmeta''))作为一个模板。
-接下来,我们需要创建一个代表世界酸图块。 ''net.minecraft.block.FluidBlock'' 是我们需要使用的类,但是出于''mojang''的原因,其构造函数受到保护。 该解决方案是众所周知的-创建它的子类并更改构造函数的可见性: +
-<code java> +
-public class BaseFluidBlock extends FluidBlock +
-+
-    public BaseFluidBlock(BaseFluid fluid, Settings settings) +
-    { +
-        super(fluid, settings)+
-    } +
-+
-</code>+
  
-在创建一个静态块实例: +===== 世界中生成 ===== 
-<code java> +为使得酸湖在世界中生成,你可以在你的''ModInitializer''创建一个''net.minecraft.world.gen.feature.LakeFeature'',然后将其添加到你需要让它生成的生物群系中:
-    ... +
-     +
-    public static FluidBlock acid;+
  
-    @Override +<code java [enable_line_numbers="true"]
-    public void onInitialize() +// ...
-    { +
-     +
-        ... +
-         +
-        acid new BaseFluidBlock(stillAcid, FabricBlockSettings.of(Material.WATER).dropsNothing().build()); +
-        Registry.register(Registry.BLOCK, new Identifier(MODID, "acid_block"), acid); +
-    }     +
-</code+
-现在,当我们有了这些静态对象时,我们返回** Acid **类并完成重写的方法: +
-<code java> +
-public abstract class Acid extends BasicFluid +
-+
-    @Override +
-    public Item getBucketItem() +
-    { +
-        return Mod.acidBucket; +
-    } +
-     +
-    @Override +
-    protected BlockState toBlockState(FluidState fluidState) +
-    { +
-        //don't ask me what **method_15741** does... +
-        return Mod.acid.getDefaultState().with(FluidBlock.LEVEL, method_15741(fluidState)); +
-    }+
  
-    @Override +public static LakeFeature ACID_LAKE;
-    public Fluid getFlowing() +
-    { +
-        return Mod.flowingAcid; +
-    }+
  
-    @Override +// ...
-    public Fluid getStill() +
-    { +
-        return Mod.stillAcid; +
-    }+
  
-    @Override +@Override 
-    public boolean matchesType(Fluid fluid_1+public void onInitialize() 
-    +
-        return fluid_1==Mod.flowingAcid || fluid_1==Mod.stillAcid+ // ... 
-    } +  
-     + ACID_LAKE Registry.register(Registry.FEATURE, new Identifier(MOD_ID, "acid_lake"), new LakeFeature(SingleStateFeatureConfig::deserialize))
-    ... +  
-     + // 在沼泽中生成,类似于水湖,但是概率为40(数字越高,生成几率越低) 
-}     + Biomes.SWAMP.addFeature( 
-</code>+ GenerationStep.Feature.LOCAL_MODIFICATIONS, 
 + ACID_LAKE.configure(new SingleStateFeatureConfig(ACID.getDefaultState())) 
 + .createDecoratedFeature(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(40))) 
 + ); 
 +  
 + // ... 
 +}
  
-现在我们可以断言Acid类已完成。 +// ...
-===== Rendering setup ===== +
- +
-是时候做客户端的事情了。 在** ClientModInitializer **中,您需要为流体指定精灵的位置并定义其渲染。 我将重复使用水纹理,只是更改应用于它们的颜色。 +
-<code java> +
-    @Override +
-    public void onInitializeClient() +
-    { +
-         +
-        // adding the sprites to the block texture atlas +
-        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register((spriteAtlasTexture, registry) -> { +
-         +
-            Identifier stillSpriteLocation = new Identifier("block/water_still"); +
-            Identifier dynamicSpriteLocation = new Identifier("block/water_flow"); +
-            // here I tell to use only 16x16 area of the water texture +
-            FabricSprite stillAcidSprite = new FabricSprite(stillSpriteLocation, 16, 16); +
-            // same, but 32 +
-            FabricSprite dynamicAcidSprite = new FabricSprite(dynamicSpriteLocation, 32, 32); +
-         +
-            registry.register(stillAcidSprite); +
-            registry.register(dynamicAcidSprite); +
-             +
-             +
-            // this renderer is responsible for drawing fluids in a world +
-            FluidRenderHandler acidRenderHandler = new FluidRenderHandler() +
-            { +
-                // return the sprites: still sprite goes first into the array, flowing/dynamic goes last +
-                @Override +
-                public Sprite[] getFluidSprites(ExtendedBlockView extendedBlockView, BlockPos blockPos, FluidState fluidState) +
-                { +
-                    return new Sprite[] {stillAcidSprite, dynamicAcidSprite}; +
-                } +
- +
-                // apply light green color +
-                @Override +
-                public int getFluidColor(ExtendedBlockView view, BlockPos pos, FluidState state) +
-                { +
-                    return 0x4cc248; +
-                } +
-            }; +
- +
-            // registering the same renderer for both fluid variants is intentional +
- +
-            FluidRenderHandlerRegistry.INSTANCE.register(Mod.stillAcid, acidRenderHandler); +
-            FluidRenderHandlerRegistry.INSTANCE.register(Mod.flowingAcid, acidRenderHandler); +
-        }); +
- +
-</code> +
- +
-然后剩下要做的就是创建必要的Json文件和纹理,但是您现在应该知道该怎么做。 +
- +
-===== Generation in a world ===== +
- +
-要在世界上产生酸湖,可以使用在ModInitializer中创建的** net.minecraft.world.gen.feature.LakeFeature **: +
-<code java> +
-         +
-        LakeFeature acidFeature = Registry.register(Registry.FEATURE, new Identifier(MODID,"acid_lake"), new LakeFeature(dynamic -> new LakeFeatureConfig(acid.getDefaultState()))); +
- +
-</code> +
-然后将其放入所需的生物群系中以生成: +
-<code java> +
-        // I tell it to generate like water lakes, with a rarity of 40 (the higher is the number, the lesser is the generation chance): +
-        Biomes.FOREST.addFeature(GenerationStep.Feature.LOCAL_MODIFICATIONS, Biome.configureFeature(acidFeature, new LakeFeatureConfig(acid.getDefaultState()), Decorator.WATER_LAKE, new LakeDecoratorConfig(40)));+
 </code> </code>
-本教程到此结束。 
  
zh_cn/tutorial/fluids.1576751216.txt.gz · Last modified: 2019/12/19 10:26 by lightcolour