From dc702a01e6f4ab99c045599558e0b6707f01dd8b Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 25 Jan 2021 17:53:26 +0800 Subject: [PATCH] FluidStackHooks in getting the rendering information for the fluids (#26) --- .../architectury/hooks/FluidStackHooks.java | 69 ++++++++++++++ .../hooks/fabric/FluidStackHooksImpl.java | 90 +++++++++++++++++++ .../hooks/forge/FluidStackHooksImpl.java | 79 ++++++++++++++++ 3 files changed, 238 insertions(+) diff --git a/common/src/main/java/me/shedaniel/architectury/hooks/FluidStackHooks.java b/common/src/main/java/me/shedaniel/architectury/hooks/FluidStackHooks.java index 09a7a819..07328cb2 100644 --- a/common/src/main/java/me/shedaniel/architectury/hooks/FluidStackHooks.java +++ b/common/src/main/java/me/shedaniel/architectury/hooks/FluidStackHooks.java @@ -22,9 +22,18 @@ package me.shedaniel.architectury.hooks; import me.shedaniel.architectury.annotations.ExpectPlatform; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.architectury.utils.Fraction; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class FluidStackHooks { private FluidStackHooks() {} @@ -80,4 +89,64 @@ public class FluidStackHooks { public static Fraction bucketAmount() { throw new AssertionError(); } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + public static int getColor(@NotNull FluidStack stack) { + throw new AssertionError(); + } + + @ExpectPlatform + @Environment(EnvType.CLIENT) + public static int getColor(@NotNull Fluid fluid) { + throw new AssertionError(); + } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/FluidStackHooksImpl.java b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/FluidStackHooksImpl.java index 860bb2aa..85c02f78 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/FluidStackHooksImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/FluidStackHooksImpl.java @@ -26,14 +26,22 @@ import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.architectury.utils.NbtType; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Objects; @@ -103,4 +111,86 @@ public class FluidStackHooksImpl { public static Fraction bucketAmount() { return Fraction.ofWhole(1); } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return null; + TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(state.getType()).getFluidSprites(level, pos, state); + if (sprites == null) return null; + return sprites[0]; + } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return null; + TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid()).getFluidSprites(null, null, stack.getFluid().defaultFluidState()); + if (sprites == null) return null; + return sprites[0]; + } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return null; + TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(fluid).getFluidSprites(null, null, fluid.defaultFluidState()); + if (sprites == null) return null; + return sprites[0]; + } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return null; + FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(state.getType()); + if (handler == null) return null; + TextureAtlasSprite[] sprites = handler.getFluidSprites(level, pos, state); + if (sprites == null) return null; + return sprites[1]; + } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return null; + FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid()); + if (handler == null) return null; + TextureAtlasSprite[] sprites = handler.getFluidSprites(null, null, stack.getFluid().defaultFluidState()); + if (sprites == null) return null; + return sprites[1]; + } + + @Environment(EnvType.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return null; + TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(fluid).getFluidSprites(null, null, fluid.defaultFluidState()); + if (sprites == null) return null; + return sprites[1]; + } + + @Environment(EnvType.CLIENT) + public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return -1; + FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(state.getType()); + if (handler == null) return -1; + return handler.getFluidColor(level, pos, state); + } + + @Environment(EnvType.CLIENT) + public static int getColor(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return -1; + FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid()); + if (handler == null) return -1; + return handler.getFluidColor(null, null, stack.getFluid().defaultFluidState()); + } + + @Environment(EnvType.CLIENT) + public static int getColor(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return -1; + FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(fluid); + if (handler == null) return -1; + return handler.getFluidColor(null, null, fluid.defaultFluidState()); + } } diff --git a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/FluidStackHooksImpl.java b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/FluidStackHooksImpl.java index fcf7c7a1..7bdef3d3 100644 --- a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/FluidStackHooksImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/FluidStackHooksImpl.java @@ -21,9 +21,22 @@ package me.shedaniel.architectury.hooks.forge; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.architectury.utils.Fraction; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class FluidStackHooksImpl { public static Component getName(FluidStack stack) { @@ -53,4 +66,70 @@ public class FluidStackHooksImpl { public static Fraction bucketAmount() { return Fraction.ofWhole(1000); } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return null; + ResourceLocation texture = state.getType().getAttributes().getStillTexture(level, pos); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return null; + ResourceLocation texture = stack.getFluid().getAttributes().getStillTexture(FluidStackHooksForge.toForge(stack)); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return null; + ResourceLocation texture = fluid.getAttributes().getStillTexture(); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return null; + ResourceLocation texture = state.getType().getAttributes().getFlowingTexture(level, pos); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return null; + ResourceLocation texture = stack.getFluid().getAttributes().getFlowingTexture(FluidStackHooksForge.toForge(stack)); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + @Nullable + public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return null; + ResourceLocation texture = fluid.getAttributes().getFlowingTexture(); + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + } + + @OnlyIn(Dist.CLIENT) + public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) { + if (state.getType() == Fluids.EMPTY) return -1; + return state.getType().getAttributes().getColor(level, pos); + } + + @OnlyIn(Dist.CLIENT) + public static int getColor(@NotNull FluidStack stack) { + if (stack.getFluid() == Fluids.EMPTY) return -1; + return stack.getFluid().getAttributes().getColor(FluidStackHooksForge.toForge(stack)); + } + + @OnlyIn(Dist.CLIENT) + public static int getColor(@NotNull Fluid fluid) { + if (fluid == Fluids.EMPTY) return -1; + return fluid.getAttributes().getColor(); + } }