minecraft-src/net/minecraft/client/gui/screens/inventory/CyclingSlotBackground.java
2025-07-04 03:15:13 +03:00

60 lines
2.1 KiB
Java

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<ResourceLocation> icons = List.of();
private int tick;
private int iconIndex;
public CyclingSlotBackground(int slotIndex) {
this.slotIndex = slotIndex;
}
public void tick(List<ResourceLocation> 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;
}
}