fabric-rendering-fluids-v1-3.1.38+86b3ae576f.jar

Download file
    package net.fabricmc.fabric.mixin.client.rendering.fluid;

import com.llamalad7.mixinextras.expression.Definition;
import com.llamalad7.mixinextras.expression.Definitions;
import com.llamalad7.mixinextras.expression.Expression;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
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.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderHandlerInfo;
import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderHandlerRegistryImpl;
import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderingImpl;
import net.minecraft.class_1058;
import net.minecraft.class_1920;
import net.minecraft.class_2248;
import net.minecraft.class_2338;
import net.minecraft.class_2680;
import net.minecraft.class_3610;
import net.minecraft.class_4588;
import net.minecraft.class_775;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Environment(EnvType.CLIENT)
@Mixin({class_775.class})
public class FluidRendererMixin {
   @Final
   @Shadow
   private class_1058[] field_4165;
   @Final
   @Shadow
   private class_1058[] field_4166;
   @Shadow
   private class_1058 field_4164;

   @Inject(
      method = {"method_3345(Lnet/minecraft/class_773;Lnet/minecraft/class_11701;)V"},
      at = {@At("RETURN")}
   )
   public void onResourceReloadReturn(CallbackInfo info) {
      class_775 self = (class_775)this;
      ((FluidRenderHandlerRegistryImpl)FluidRenderHandlerRegistry.INSTANCE).onFluidRendererReload(self, this.field_4166, this.field_4165, this.field_4164);
   }

   @Inject(
      method = {"method_3347(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_4588;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)V"},
      at = {@At("HEAD")},
      cancellable = true
   )
   public void onHeadRender(class_1920 view, class_2338 pos, class_4588 vertexConsumer, class_2680 blockState, class_3610 fluidState, CallbackInfo ci) {
      FluidRenderHandlerInfo info = FluidRenderingImpl.getCurrentInfo();
      if (info.handler == null) {
         FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(fluidState.method_15772());
         if (handler != null) {
            handler.renderFluid(pos, view, vertexConsumer, blockState, fluidState);
            ci.cancel();
         }
      }

   }

   @ModifyVariable(
      method = {"method_3347(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_4588;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)V"},
      at = @At("STORE"),
      ordinal = 0
   )
   public class_1058[] modSpriteArray(class_1058[] original) {
      FluidRenderHandlerInfo info = FluidRenderingImpl.getCurrentInfo();
      return info.handler != null ? info.sprites : original;
   }

   @ModifyExpressionValue(
      method = {"method_3347(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_4588;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)V"},
      at = {@At(
   value = "CONSTANT",
   args = {"intValue=16777215"}
), @At(
   value = "INVOKE",
   target = "Lnet/minecraft/class_1163;method_4961(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;)I"
)}
   )
   public int modTintColor(int original, class_1920 world, class_2338 pos, class_4588 vertexConsumer, class_2680 blockState, class_3610 fluidState) {
      FluidRenderHandlerInfo info = FluidRenderingImpl.getCurrentInfo();
      return info.handler != null ? info.handler.getFluidColor(world, pos, fluidState) : original;
   }

   @ModifyVariable(
      method = {"method_3347(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_4588;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)V"},
      at = @At(
   value = "MIXINEXTRAS:EXPRESSION",
   ordinal = 0
),
      slice = @Slice(
   from = @At(
   value = "FIELD",
   target = "Lnet/minecraft/class_775;field_4164:Lnet/minecraft/class_1058;"
)
)
   )
   @Definitions({@Definition(
   id = "getFrameU",
   method = {"Lnet/minecraft/class_1058;method_4580(F)F"}
), @Definition(
   id = "sprite2",
   local = {@Local(
   type = class_1058.class
)}
)})
   @Expression({"@(sprite2).getFrameU(0.0)"})
   private class_1058 modifyOverlaySprite(class_1058 sprite2, class_1920 world, @Local(ordinal = 1) class_2338 neighborPos, @Local(ordinal = 0) boolean isLava, @Local class_1058[] sprites, @Share("useOverlay") LocalBooleanRef useOverlay) {
      FluidRenderHandlerInfo info = FluidRenderingImpl.getCurrentInfo();
      boolean hasOverlay = info.handler != null ? info.hasOverlay : !isLava;
      class_2248 neighborBlock = world.method_8320(neighborPos).method_26204();
      useOverlay.set(hasOverlay && FluidRenderHandlerRegistry.INSTANCE.isBlockTransparent(neighborBlock));
      if (useOverlay.get()) {
         return info.handler != null ? info.overlaySprite : this.field_4164;
      } else {
         return sprites[1];
      }
   }

   @ModifyExpressionValue(
      method = {"method_3347(Lnet/minecraft/class_1920;Lnet/minecraft/class_2338;Lnet/minecraft/class_4588;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;)V"},
      at = {@At("MIXINEXTRAS:EXPRESSION")}
   )
   @Definitions({@Definition(
   id = "sprite2",
   local = {@Local(
   type = class_1058.class
)}
), @Definition(
   id = "waterOverlaySprite",
   field = {"Lnet/minecraft/class_775;field_4164:Lnet/minecraft/class_1058;"}
)})
   @Expression({"sprite2 != this.waterOverlaySprite"})
   private boolean modifyNonOverlayCheck(boolean original, @Share("useOverlay") LocalBooleanRef useOverlay) {
      return !useOverlay.get();
   }
}
    
Download file