Răsfoiți Sursa

FluidStackHooks in getting the rendering information for the fluids (#26)

shedaniel 4 ani în urmă
părinte
comite
dc702a01e6

+ 69 - 0
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();
+    }
 }

+ 90 - 0
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());
+    }
 }

+ 79 - 0
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();
+    }
 }