Code/net/minecraft/client/gui/screens/inventory/CyclingSlotBackground.java

60 lines
2.4 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.client.gui.screens.inventory;
import java.util.List;
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;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.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 p_267314_) {
this.slotIndex = p_267314_;
}
public void tick(List<ResourceLocation> p_267074_) {
if (!this.icons.equals(p_267074_)) {
this.icons = p_267074_;
this.iconIndex = 0;
}
if (!this.icons.isEmpty() && ++this.tick % 30 == 0) {
this.iconIndex = (this.iconIndex + 1) % this.icons.size();
}
}
public void render(AbstractContainerMenu p_267293_, GuiGraphics p_282894_, float p_266785_, int p_266711_, int p_266841_) {
Slot slot = p_267293_.getSlot(this.slotIndex);
if (!this.icons.isEmpty() && !slot.hasItem()) {
boolean flag = this.icons.size() > 1 && this.tick >= 30;
float f = flag ? this.getIconTransitionTransparency(p_266785_) : 1.0F;
if (f < 1.0F) {
int i = Math.floorMod(this.iconIndex - 1, this.icons.size());
this.renderIcon(slot, this.icons.get(i), 1.0F - f, p_282894_, p_266711_, p_266841_);
}
this.renderIcon(slot, this.icons.get(this.iconIndex), f, p_282894_, p_266711_, p_266841_);
}
}
private void renderIcon(Slot p_283532_, ResourceLocation p_283004_, float p_282627_, GuiGraphics p_282825_, int p_281375_, int p_283041_) {
p_282825_.blitSprite(RenderType::guiTextured, p_283004_, p_281375_ + p_283532_.x, p_283041_ + p_283532_.y, 16, 16, ARGB.white(p_282627_));
}
private float getIconTransitionTransparency(float p_266904_) {
float f = this.tick % 30 + p_266904_;
return Math.min(f, 4.0F) / 4.0F;
}
}