/* * Roughly Enough Items by Danielshe. * Licensed under the MIT License. */ package me.shedaniel.rei.gui.renderers; import com.google.common.collect.Lists; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.ClientHelper; import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.gui.widget.EntryListWidget; import me.shedaniel.rei.gui.widget.QueuedTooltip; import me.shedaniel.rei.impl.ScreenHelper; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.GuiLighting; import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexFormats; import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.fluid.Fluid; import net.minecraft.util.Lazy; import net.minecraft.util.Pair; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; import java.util.Collections; import java.util.List; public abstract class FluidRenderer extends Renderer { public boolean drawTooltip = false; public Lazy> sprite = new Lazy<>(() -> { try { FluidRenderHandler fluidRenderHandler = FluidRenderHandlerRegistry.INSTANCE.get(getFluid()); if (fluidRenderHandler == null) return null; Sprite[] sprites = fluidRenderHandler.getFluidSprites(MinecraftClient.getInstance().world, MinecraftClient.getInstance().world == null ? null : BlockPos.ORIGIN, getFluid().getDefaultState()); int color = -1; if (MinecraftClient.getInstance().world != null) color = fluidRenderHandler.getFluidColor(MinecraftClient.getInstance().world, BlockPos.ORIGIN, getFluid().getDefaultState()); return new Pair<>(sprites[0], color); } catch (Exception e) { e.printStackTrace(); return null; } }); @Override public void render(int x, int y, double mouseX, double mouseY, float delta) { x = x - 8; y = y - 6; Pair pair = this.sprite.get(); if (pair != null) { Sprite sprite = pair.getLeft(); Integer int_5 = pair.getRight(); int a = 255; int r = (int_5 >> 16 & 255); int g = (int_5 >> 8 & 255); int b = (int_5 & 255); MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX); GuiLighting.disable(); Tessellator tess = Tessellator.getInstance(); BufferBuilder bb = tess.getBufferBuilder(); bb.begin(7, VertexFormats.POSITION_UV_COLOR); bb.vertex(x + 16, y, blitOffset).texture(sprite.getMaxU(), sprite.getMinV()).color(r, g, b, a).next(); bb.vertex(x, y, blitOffset).texture(sprite.getMinU(), sprite.getMinV()).color(r, g, b, a).next(); bb.vertex(x, y + 16, blitOffset).texture(sprite.getMinU(), sprite.getMaxV()).color(r, g, b, a).next(); bb.vertex(x + 16, y + 16, blitOffset).texture(sprite.getMaxU(), sprite.getMaxV()).color(r, g, b, a).next(); tess.draw(); } this.blitOffset = 0; if (drawTooltip && mouseX >= x - 8 && mouseX <= x + 8 && mouseY >= y - 6 && mouseY <= y + 10) queueTooltip(getFluid(), delta); this.drawTooltip = false; } protected void queueTooltip(Fluid fluid, float delta) { ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(fluid))); } private List getTooltip(Fluid fluid) { List toolTip = Lists.newArrayList(EntryListWidget.tryGetFluidName(fluid)); if (RoughlyEnoughItemsCore.getConfigManager().getConfig().shouldAppendModNames()) { final String modString = ClientHelper.getInstance().getFormattedModFromIdentifier(Registry.FLUID.getId(fluid)); toolTip.addAll(getExtraToolTips(fluid)); boolean alreadyHasMod = false; for (String s : toolTip) if (s.equalsIgnoreCase(modString)) { alreadyHasMod = true; break; } if (!alreadyHasMod) toolTip.add(modString); } return toolTip; } protected List getExtraToolTips(Fluid stack) { return Collections.emptyList(); } public abstract Fluid getFluid(); }