zh_cn:tutorial:fluids
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:fluids [2021/08/17 12:14] – [渲染设置] solidblock | zh_cn:tutorial:fluids [2023/05/04 11:31] (current) – [渲染设置] solidblock | ||
---|---|---|---|
Line 3: | Line 3: | ||
在这里,我们将介绍自定义流体的创建。如果计划创建多个流体,建议创建一个抽象的基本流体类,在其中设置必要的默认值,这些默认值将在其子类中共享。我们还将使其像湖泊一样在世界中生成。 | 在这里,我们将介绍自定义流体的创建。如果计划创建多个流体,建议创建一个抽象的基本流体类,在其中设置必要的默认值,这些默认值将在其子类中共享。我们还将使其像湖泊一样在世界中生成。 | ||
===== 创建抽象流体 ===== | ===== 创建抽象流体 ===== | ||
- | 原版流体扩展了'' | + | 原版流体继承了 '' |
- | <code java [enable_line_numbers=" | + | <yarncode |
- | public abstract class TutorialFluid extends | + | public abstract class TutorialFluid extends |
- | { | + | |
/** | /** | ||
* @return 给定的流体是否为该流体的实例? | * @return 给定的流体是否为该流体的实例? | ||
*/ | */ | ||
@Override | @Override | ||
- | public boolean | + | public boolean |
- | { | + | |
return fluid == getStill() || fluid == getFlowing(); | return fluid == getStill() || fluid == getFlowing(); | ||
} | } | ||
/** | /** | ||
- | * @return 流体是否可以像无限刷水的方法一样无限生成? | + | * @return 流体是否可以像无限刷水的方法一样无限生成?在原版,这取决于游戏规则。 |
*/ | */ | ||
@Override | @Override | ||
- | protected boolean | + | protected boolean |
- | { | + | |
return false; | return false; | ||
} | } | ||
Line 30: | Line 27: | ||
*/ | */ | ||
@Override | @Override | ||
- | protected void beforeBreakingBlock(WorldAccess | + | protected void method_15730(class_1936 |
- | { | + | |
final BlockEntity blockEntity = state.getBlock().hasBlockEntity() ? world.getBlockEntity(pos) : null; | final BlockEntity blockEntity = state.getBlock().hasBlockEntity() ? world.getBlockEntity(pos) : null; | ||
Block.dropStacks(state, | Block.dropStacks(state, | ||
Line 37: | Line 33: | ||
/** | /** | ||
- | * Lava returns true if its FluidState | + | * 熔岩在其 |
- | * Fluid is Water. | + | |
* | * | ||
- | * @return 给定的流体能否流入它的FluidState? | + | * @return 给定的流体能否流入它的 FluidState? |
*/ | */ | ||
@Override | @Override | ||
- | protected boolean | + | protected boolean |
- | { | + | |
return false; | return false; | ||
} | } | ||
Line 53: | Line 47: | ||
*/ | */ | ||
@Override | @Override | ||
- | protected int getFlowSpeed(WorldView | + | protected int method_15733(class_4538 |
- | { | + | |
return 4; | return 4; | ||
} | } | ||
Line 62: | Line 55: | ||
*/ | */ | ||
@Override | @Override | ||
- | protected int getLevelDecreasePerBlock(WorldView | + | protected int method_15739(class_4538 |
- | { | + | |
return 1; | return 1; | ||
} | } | ||
Line 71: | Line 63: | ||
*/ | */ | ||
@Override | @Override | ||
- | public int getTickRate(WorldView | + | public int method_15789(class_4538 |
- | { | + | |
return 5; | return 5; | ||
} | } | ||
Line 80: | Line 71: | ||
*/ | */ | ||
@Override | @Override | ||
- | protected float getBlastResistance() | + | protected float method_15784() { |
- | { | + | |
return 100.0F; | return 100.0F; | ||
} | } | ||
} | } | ||
- | </code> | + | </yarncode> |
- | ===== 进行 | + | ===== 实现 |
现在让我们制作一个拥有静止和流动两个变种的实际流体。在此教程中,我们将其称为“酸”。缺失的引用稍后补全。 | 现在让我们制作一个拥有静止和流动两个变种的实际流体。在此教程中,我们将其称为“酸”。缺失的引用稍后补全。 | ||
- | <code java [enable_line_numbers=" | + | <yarncode |
- | public abstract class AcidFluid extends TutorialFluid | + | public abstract class AcidFluid extends TutorialFluid { |
- | { | + | |
@Override | @Override | ||
- | public | + | public |
- | { | + | return YOUR_STILL_FLUID_HERE; |
- | return | + | |
} | } | ||
- | + | ||
@Override | @Override | ||
- | public | + | public |
- | { | + | return YOUR_FLOWING_FLUID_HERE; |
- | return | + | |
} | } | ||
- | + | ||
@Override | @Override | ||
- | public | + | public |
- | { | + | return YOUR_BUCKET_ITEM_HERE; |
- | return | + | |
} | } | ||
- | + | ||
@Override | @Override | ||
- | protected | + | protected |
- | { | + | return YOUR_FLUID_BLOCK_HERE.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState)); |
- | // method_15741 converts the LEVEL_1_8 of the fluid state to the LEVEL_15 the fluid block uses | + | |
- | return | + | |
} | } | ||
- | + | ||
- | public static class Flowing extends AcidFluid | + | public static class Flowing extends AcidFluid { |
- | { | + | |
@Override | @Override | ||
- | protected void appendProperties(StateManager.Builder<Fluid, FluidState> builder) | + | protected void method_15775(class_2689.class_2690<class_3611, class_3610> builder) { |
- | { | + | super.method_15775(builder); |
- | super.appendProperties(builder); | + | builder.method_11667(field_15900); |
- | builder.add(LEVEL); | + | |
} | } | ||
- | + | ||
@Override | @Override | ||
- | public int getLevel(FluidState | + | public int method_15779(class_3610 |
- | { | + | return fluidState.method_11654(field_15900); |
- | return fluidState.get(LEVEL); | + | |
} | } | ||
- | + | ||
@Override | @Override | ||
- | public boolean | + | public boolean |
- | { | + | |
return false; | return false; | ||
} | } | ||
} | } | ||
- | + | ||
- | public static class Still extends AcidFluid | + | public static class Still extends AcidFluid { |
- | { | + | |
@Override | @Override | ||
- | public int getLevel(FluidState | + | public int method_15779(class_3610 |
- | { | + | |
return 8; | return 8; | ||
} | } | ||
- | + | ||
@Override | @Override | ||
- | public boolean | + | public boolean |
- | { | + | |
return true; | return true; | ||
} | } | ||
} | } | ||
} | } | ||
- | </code> | + | </yarncode> |
- | 接下来,我们将制作静态和动态酸变体的静态实例,以及一个酸桶。 在您的'' | + | 接下来,我们将制作静态和动态酸变体的静态实例,以及一个酸桶。在您的 '' |
- | <code java [enable_line_numbers=" | + | <yarncode |
- | // ... | + | public static |
- | + | public static | |
- | public static | + | public static |
- | public static | + | |
- | + | ||
- | public static | + | |
- | + | ||
- | // ... | + | |
@Override | @Override | ||
- | public void onInitialize() | + | public void onInitialize() { |
- | { | + | STILL_ACID = class_2378.method_10230(class_7923.field_41173, new class_2960(" |
- | // ... | + | FLOWING_ACID = class_2378.method_10230(class_7923.field_41173, new class_2960(" |
- | + | ACID_BUCKET = class_2378.method_10230(class_7923.field_41178, new class_2960(" | |
- | STILL_ACID = Registry.register(Registry.FLUID, new Identifier(MOD_ID, " | + | |
- | + | ||
- | FLOWING_ACID = Registry.register(Registry.FLUID, new Identifier(MOD_ID, " | + | |
- | + | ||
- | ACID_BUCKET = Registry.register(Registry.ITEM, new Identifier(MOD_ID, " | + | |
- | + | ||
// ... | // ... | ||
} | } | ||
+ | |||
// ... | // ... | ||
- | </code> | + | </yarncode> |
- | 为了使自定义流体表现得像水或熔岩,您必须将其添加到相应的流体标签中:对于水,制作'' | + | 为了使自定义流体表现得像水或熔岩,您必须将其添加到相应的流体标签中:对于水,制作 '' |
<code json [enable_line_numbers=" | <code json [enable_line_numbers=" | ||
{ | { | ||
Line 190: | Line 158: | ||
" | " | ||
[ | [ | ||
- | "your_mod_id: | + | "tutorial: |
- | "your_mod_id: | + | "tutorial: |
] | ] | ||
} | } | ||
Line 198: | Line 166: | ||
==== 制作一个流体方块 ==== | ==== 制作一个流体方块 ==== | ||
- | 接下来,我们需要在世界中创建表示酸的方块。'' | + | 接下来,我们需要在世界中创建表示酸的方块。'' |
- | <code java [enable_line_numbers=" | + | <yarncode |
- | // ... | + | public static |
- | + | ||
- | public static | + | |
- | + | ||
- | // ... | + | |
@Override | @Override | ||
- | public void onInitialize() | + | public void onInitialize() { |
- | { | + | ACID = class_2378.method_10230(class_7923.field_41175, new class_2960(" |
- | // ... | + | |
- | + | ||
- | ACID = Registry.register(Registry.BLOCK, new Identifier(MOD_ID, " | + | |
// ... | // ... | ||
- | } | + | } |
+ | </ | ||
- | // ... | + | 既然我们有了这些静态对象,我们回到 '' |
- | </ | + | <yarncode |
- | + | public abstract class AcidFluid extends TutorialFluid { | |
- | 既然我们有了这些静态对象,我们回到'' | + | |
- | <code java [enable_line_numbers=" | + | |
- | public abstract class AcidFluid extends TutorialFluid | + | |
- | { | + | |
@Override | @Override | ||
- | public | + | public |
- | { | + | |
return TutorialMod.STILL_ACID; | return TutorialMod.STILL_ACID; | ||
} | } | ||
- | + | ||
@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 |
- | // method_15741 | + | return TutorialMod.ACID.method_9564().method_11657(class_2741.field_12538, method_15741(fluidState)); |
- | return TutorialMod.ACID.getDefaultState().with(Properties.LEVEL_15, method_15741(fluidState)); | + | } |
+ | |||
+ | public static class Flowing extends AcidFluid { | ||
+ | @Override | ||
+ | protected void method_15775(class_2689.class_2690< | ||
+ | super.method_15775(builder); | ||
+ | builder.method_11667(field_15900); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int method_15779(class_3610 fluidState) { | ||
+ | return fluidState.method_11654(field_15900); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public boolean method_15793(class_3610 fluidState) { | ||
+ | return false; | ||
+ | } | ||
} | } | ||
- | + | ||
- | // ... | + | public static class Still extends AcidFluid { |
- | } | + | @Override |
- | </code> | + | public int method_15779(class_3610 fluidState) { |
+ | return 8; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public boolean method_15793(class_3610 fluidState) { | ||
+ | return true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </yarncode> | ||
===== 渲染设置 ===== | ===== 渲染设置 ===== | ||
- | 为了让流体拥有纹理,或者与一个颜色绑定,你需要为其注册一个'' | + | 为了让流体拥有纹理,或者与一个颜色绑定,你需要为其注册一个'' |
+ | |||
+ | < | ||
+ | @Environment(EnvType.CLIENT) | ||
+ | public class TutorialModClient implements ClientModInitializer { | ||
- | <code java [enable_line_numbers=" | ||
- | public class TutorialModClient implements ClientModInitializer | ||
- | { | ||
- | // ... | ||
- | |||
@Override | @Override | ||
- | public void onInitializeClient() | + | public void onInitializeClient() { |
- | { | + | FluidRenderHandlerRegistry.INSTANCE.register(TutorialMod.STILL_ACID, |
- | // ... | + | new class_2960(" |
- | + | new class_2960("minecraft: | |
- | setupFluidRendering(TutorialMod.STILL_ACID, | + | 0x4CC248 |
- | BlockRenderLayerMap.INSTANCE.putFluids(RenderLayer.getTranslucent(), TutorialMod.STILL_ACID, | + | )); |
- | + | ||
+ | BlockRenderLayerMap.INSTANCE.putFluids(class_1921.method_23583(), TutorialMod.STILL_ACID, | ||
+ | |||
+ | //if you want to use custom textures they needs to be registered. | ||
+ | //In this example this is unnecessary because the vanilla water textures are already registered. | ||
+ | //To register your custom textures use this method. | ||
+ | // | ||
+ | // registry.register(new Identifier(" | ||
+ | // registry.register(new Identifier(" | ||
+ | //}); | ||
// ... | // ... | ||
} | } | ||
- | |||
- | // ... | ||
- | |||
- | public static void setupFluidRendering(final Fluid still, final Fluid flowing, final Identifier textureFluidId, | ||
- | { | ||
- | final Identifier stillSpriteId = new Identifier(textureFluidId.getNamespace(), | ||
- | final Identifier flowingSpriteId = new Identifier(textureFluidId.getNamespace(), | ||
- | |||
- | // If they' | ||
- | ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register((atlasTexture, | ||
- | { | ||
- | registry.register(stillSpriteId); | ||
- | registry.register(flowingSpriteId); | ||
- | }); | ||
- | |||
- | final Identifier fluidId = Registry.FLUID.getId(still); | ||
- | final Identifier listenerId = new Identifier(fluidId.getNamespace(), | ||
- | |||
- | final Sprite[] fluidSprites = { null, null }; | ||
- | |||
- | ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(new SimpleSynchronousResourceReloadListener() | ||
- | { | ||
- | @Override | ||
- | public Identifier getFabricId() | ||
- | { | ||
- | return listenerId; | ||
- | } | ||
- | |||
- | /** | ||
- | * Get the sprites from the block atlas when resources are reloaded | ||
- | */ | ||
- | @Override | ||
- | public void apply(ResourceManager resourceManager) | ||
- | { | ||
- | final Function< | ||
- | fluidSprites[0] = atlas.apply(stillSpriteId); | ||
- | fluidSprites[1] = atlas.apply(flowingSpriteId); | ||
- | } | ||
- | }); | ||
- | |||
- | // The FluidRenderer gets the sprites and color from a FluidRenderHandler during rendering | ||
- | final FluidRenderHandler renderHandler = new FluidRenderHandler() | ||
- | { | ||
- | @Override | ||
- | public Sprite[] getFluidSprites(BlockRenderView view, BlockPos pos, FluidState state) | ||
- | { | ||
- | return fluidSprites; | ||
- | } | ||
- | |||
- | @Override | ||
- | public int getFluidColor(BlockRenderView view, BlockPos pos, FluidState state) | ||
- | { | ||
- | return color; | ||
- | } | ||
- | }; | ||
- | |||
- | FluidRenderHandlerRegistry.INSTANCE.register(still, | ||
- | FluidRenderHandlerRegistry.INSTANCE.register(flowing, | ||
- | } | ||
- | |||
- | // ... | ||
} | } | ||
- | </code> | + | </yarncode> |
如果你需要使用你自己的流体纹理,你可以参考原版资源包(('' | 如果你需要使用你自己的流体纹理,你可以参考原版资源包(('' |
zh_cn/tutorial/fluids.1629202474.txt.gz · Last modified: 2021/08/17 12:14 by solidblock