package net.minecraft.client.gui.screens.inventory; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ARGB; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; @Environment(EnvType.CLIENT) public class CyclingSlotBackground { private static final int ICON_CHANGE_TICK_RATE = 30; private static final int ICON_SIZE = 16; private static final int ICON_TRANSITION_TICK_DURATION = 4; private final int slotIndex; private List icons = List.of(); private int tick; private int iconIndex; public CyclingSlotBackground(int slotIndex) { this.slotIndex = slotIndex; } public void tick(List icons) { if (!this.icons.equals(icons)) { this.icons = icons; this.iconIndex = 0; } if (!this.icons.isEmpty() && ++this.tick % 30 == 0) { this.iconIndex = (this.iconIndex + 1) % this.icons.size(); } } public void render(AbstractContainerMenu containerMenu, GuiGraphics guiGraphics, float partialTick, int x, int y) { Slot slot = containerMenu.getSlot(this.slotIndex); if (!this.icons.isEmpty() && !slot.hasItem()) { boolean bl = this.icons.size() > 1 && this.tick >= 30; float f = bl ? this.getIconTransitionTransparency(partialTick) : 1.0F; if (f < 1.0F) { int i = Math.floorMod(this.iconIndex - 1, this.icons.size()); this.renderIcon(slot, (ResourceLocation)this.icons.get(i), 1.0F - f, guiGraphics, x, y); } this.renderIcon(slot, (ResourceLocation)this.icons.get(this.iconIndex), f, guiGraphics, x, y); } } private void renderIcon(Slot slot, ResourceLocation icon, float alpha, GuiGraphics guiGraphics, int x, int y) { guiGraphics.blitSprite(RenderType::guiTextured, icon, x + slot.x, y + slot.y, 16, 16, ARGB.white(alpha)); } private float getIconTransitionTransparency(float partialTick) { float f = this.tick % 30 + partialTick; return Math.min(f, 4.0F) / 4.0F; } }