package net.minecraft.client.gui.screens.recipebook; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.ClientRecipeBook; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.StateSwitchingButton; import net.minecraft.client.gui.components.WidgetSprites; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.ExtendedRecipeBookCategory; import net.minecraft.world.item.crafting.display.RecipeDisplayEntry; @Environment(EnvType.CLIENT) public class RecipeBookTabButton extends StateSwitchingButton { private static final WidgetSprites SPRITES = new WidgetSprites( ResourceLocation.withDefaultNamespace("recipe_book/tab"), ResourceLocation.withDefaultNamespace("recipe_book/tab_selected") ); private final RecipeBookComponent.TabInfo tabInfo; private static final float ANIMATION_TIME = 15.0F; private float animationTime; public RecipeBookTabButton(RecipeBookComponent.TabInfo tabInfo) { super(0, 0, 35, 27, false); this.tabInfo = tabInfo; this.initTextureValues(SPRITES); } public void startAnimation(ClientRecipeBook recipeBook, boolean isFiltering) { RecipeCollection.CraftableStatus craftableStatus = isFiltering ? RecipeCollection.CraftableStatus.CRAFTABLE : RecipeCollection.CraftableStatus.ANY; for (RecipeCollection recipeCollection : recipeBook.getCollection(this.tabInfo.category())) { for (RecipeDisplayEntry recipeDisplayEntry : recipeCollection.getSelectedRecipes(craftableStatus)) { if (recipeBook.willHighlight(recipeDisplayEntry.id())) { this.animationTime = 15.0F; return; } } } } @Override public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { if (this.sprites != null) { if (this.animationTime > 0.0F) { float f = 1.0F + 0.1F * (float)Math.sin(this.animationTime / 15.0F * (float) Math.PI); guiGraphics.pose().pushPose(); guiGraphics.pose().translate((float)(this.getX() + 8), (float)(this.getY() + 12), 0.0F); guiGraphics.pose().scale(1.0F, f, 1.0F); guiGraphics.pose().translate((float)(-(this.getX() + 8)), (float)(-(this.getY() + 12)), 0.0F); } ResourceLocation resourceLocation = this.sprites.get(true, this.isStateTriggered); int i = this.getX(); if (this.isStateTriggered) { i -= 2; } guiGraphics.blitSprite(RenderType::guiTextured, resourceLocation, i, this.getY(), this.width, this.height); this.renderIcon(guiGraphics); if (this.animationTime > 0.0F) { guiGraphics.pose().popPose(); this.animationTime -= partialTick; } } } private void renderIcon(GuiGraphics guiGraphics) { int i = this.isStateTriggered ? -2 : 0; if (this.tabInfo.secondaryIcon().isPresent()) { guiGraphics.renderFakeItem(this.tabInfo.primaryIcon(), this.getX() + 3 + i, this.getY() + 5); guiGraphics.renderFakeItem((ItemStack)this.tabInfo.secondaryIcon().get(), this.getX() + 14 + i, this.getY() + 5); } else { guiGraphics.renderFakeItem(this.tabInfo.primaryIcon(), this.getX() + 9 + i, this.getY() + 5); } } public ExtendedRecipeBookCategory getCategory() { return this.tabInfo.category(); } public boolean updateVisibility(ClientRecipeBook recipeBook) { List list = recipeBook.getCollection(this.tabInfo.category()); this.visible = false; for (RecipeCollection recipeCollection : list) { if (recipeCollection.hasAnySelected()) { this.visible = true; break; } } return this.visible; } }