EffectsInInventory.java

net.minecraft.client.gui.screens.inventory.EffectsInInventory

信息

  • 全限定名:net.minecraft.client.gui.screens.inventory.EffectsInInventory
  • 类型:public class
  • 包:net.minecraft.client.gui.screens.inventory
  • 源码路径:src/main/java/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java
  • 起始行号:L24
  • 职责:

    TODO

字段/常量

  • EFFECT_BACKGROUND_SPRITE

    • 类型: Identifier
    • 修饰符: private static final
    • 源码定位: L25
    • 说明:

      TODO

  • EFFECT_BACKGROUND_AMBIENT_SPRITE

    • 类型: Identifier
    • 修饰符: private static final
    • 源码定位: L26
    • 说明:

      TODO

  • ICON_SIZE

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

  • SPACING

    • 类型: int
    • 修饰符: public static final
    • 源码定位: L28
    • 说明:

      TODO

  • TEXT_X_OFFSET

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L29
    • 说明:

      TODO

  • SPRITE_SQUARE_SIZE

    • 类型: int
    • 修饰符: public static final
    • 源码定位: L30
    • 说明:

      TODO

  • screen

    • 类型: AbstractContainerScreen<?>
    • 修饰符: private final
    • 源码定位: L31
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L32
    • 说明:

      TODO

内部类/嵌套类型

构造器

public EffectsInInventory(AbstractContainerScreen<?> screen) @ L34

  • 构造器名:EffectsInInventory
  • 源码定位:L34
  • 修饰符:public

参数:

  • screen: AbstractContainerScreen<?>

说明:

TODO

方法

下面的方法块按源码顺序生成。

public boolean canSeeEffects() @ L39

  • 方法名:canSeeEffects
  • 源码定位:L39
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY) @ L45

  • 方法名:extractRenderState
  • 源码定位:L45
  • 返回类型:void
  • 修饰符:public

参数:

  • graphics: GuiGraphicsExtractor
  • mouseX: int
  • mouseY: int

说明:

TODO

private void extractEffects(GuiGraphicsExtractor graphics, Collection<MobEffectInstance> activeEffects, int x0, int yStep, int mouseX, int mouseY, int maxWidth) @ L60

  • 方法名:extractEffects
  • 源码定位:L60
  • 返回类型:void
  • 修饰符:private

参数:

  • graphics: GuiGraphicsExtractor
  • activeEffects: Collection
  • x0: int
  • yStep: int
  • mouseX: int
  • mouseY: int
  • maxWidth: int

说明:

TODO

private int extractBackground(GuiGraphicsExtractor graphics, Font font, Component effectName, Component duration, int x0, int y0, boolean isAmbient, int maxTextureWidth) @ L78

  • 方法名:extractBackground
  • 源码定位:L78
  • 返回类型:int
  • 修饰符:private

参数:

  • graphics: GuiGraphicsExtractor
  • font: Font
  • effectName: Component
  • duration: Component
  • x0: int
  • y0: int
  • isAmbient: boolean
  • maxTextureWidth: int

说明:

TODO

private void extractText(GuiGraphicsExtractor graphics, Component effectText, Component duration, Font font, int x0, int y0, int textureWidth, int yStep, int mouseX, int mouseY) @ L88

  • 方法名:extractText
  • 源码定位:L88
  • 返回类型:void
  • 修饰符:private

参数:

  • graphics: GuiGraphicsExtractor
  • effectText: Component
  • duration: Component
  • font: Font
  • x0: int
  • y0: int
  • textureWidth: int
  • yStep: int
  • mouseX: int
  • mouseY: int

说明:

TODO

private Component getEffectName(MobEffectInstance effect) @ L110

  • 方法名:getEffectName
  • 源码定位:L110
  • 返回类型:Component
  • 修饰符:private

参数:

  • effect: MobEffectInstance

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class EffectsInInventory {
    private static final Identifier EFFECT_BACKGROUND_SPRITE = Identifier.withDefaultNamespace("container/inventory/effect_background");
    private static final Identifier EFFECT_BACKGROUND_AMBIENT_SPRITE = Identifier.withDefaultNamespace("container/inventory/effect_background_ambient");
    private static final int ICON_SIZE = 18;
    public static final int SPACING = 7;
    private static final int TEXT_X_OFFSET = 32;
    public static final int SPRITE_SQUARE_SIZE = 32;
    private final AbstractContainerScreen<?> screen;
    private final Minecraft minecraft;
 
    public EffectsInInventory(AbstractContainerScreen<?> screen) {
        this.screen = screen;
        this.minecraft = Minecraft.getInstance();
    }
 
    public boolean canSeeEffects() {
        int xo = this.screen.leftPos + this.screen.imageWidth + 2;
        int availableWidth = this.screen.width - xo;
        return availableWidth >= 32;
    }
 
    public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY) {
        int xo = this.screen.leftPos + this.screen.imageWidth + 2;
        int availableWidth = this.screen.width - xo;
        Collection<MobEffectInstance> activeEffects = this.minecraft.player.getActiveEffects();
        if (!activeEffects.isEmpty() && availableWidth >= 32) {
            int maxWidth = availableWidth >= 120 ? availableWidth - 7 : 32;
            int yStep = 33;
            if (activeEffects.size() > 5) {
                yStep = 132 / (activeEffects.size() - 1);
            }
 
            this.extractEffects(graphics, activeEffects, xo, yStep, mouseX, mouseY, maxWidth);
        }
    }
 
    private void extractEffects(
        GuiGraphicsExtractor graphics, Collection<MobEffectInstance> activeEffects, int x0, int yStep, int mouseX, int mouseY, int maxWidth
    ) {
        Iterable<MobEffectInstance> sortedEffects = Ordering.natural().sortedCopy(activeEffects);
        int y0 = this.screen.topPos;
        Font font = this.screen.getFont();
 
        for (MobEffectInstance effect : sortedEffects) {
            boolean isAmbient = effect.isAmbient();
            Component effectText = this.getEffectName(effect);
            Component duration = MobEffectUtil.formatDuration(effect, 1.0F, this.minecraft.level.tickRateManager().tickrate());
            int textureWidth = this.extractBackground(graphics, font, effectText, duration, x0, y0, isAmbient, maxWidth);
            this.extractText(graphics, effectText, duration, font, x0, y0, textureWidth, yStep, mouseX, mouseY);
            graphics.blitSprite(RenderPipelines.GUI_TEXTURED, Gui.getMobEffectSprite(effect.getEffect()), x0 + 7, y0 + 7, 18, 18);
            y0 += yStep;
        }
    }
 
    private int extractBackground(
        GuiGraphicsExtractor graphics, Font font, Component effectName, Component duration, int x0, int y0, boolean isAmbient, int maxTextureWidth
    ) {
        int nameWidth = 32 + font.width(effectName) + 7;
        int durationWidth = 32 + font.width(duration) + 7;
        int textureWidth = Math.min(maxTextureWidth, Math.max(nameWidth, durationWidth));
        graphics.blitSprite(RenderPipelines.GUI_TEXTURED, isAmbient ? EFFECT_BACKGROUND_AMBIENT_SPRITE : EFFECT_BACKGROUND_SPRITE, x0, y0, textureWidth, 32);
        return textureWidth;
    }
 
    private void extractText(
        GuiGraphicsExtractor graphics, Component effectText, Component duration, Font font, int x0, int y0, int textureWidth, int yStep, int mouseX, int mouseY
    ) {
        int textX = x0 + 32;
        int textY = y0 + 7;
        int maxTextWidth = textureWidth - 32 - 7;
        boolean isCompact;
        if (maxTextWidth > 0) {
            boolean shouldClip = font.width(effectText) > maxTextWidth;
            FormattedCharSequence clippedText = shouldClip ? ComponentRenderUtils.clipText(effectText, font, maxTextWidth) : effectText.getVisualOrderText();
            graphics.text(font, clippedText, textX, textY, -1);
            graphics.text(font, duration, textX, textY + 9, -8355712);
            isCompact = shouldClip;
        } else {
            isCompact = true;
        }
 
        if (isCompact && mouseX >= x0 && mouseX <= x0 + textureWidth && mouseY >= y0 && mouseY <= y0 + yStep) {
            graphics.setTooltipForNextFrame(this.screen.getFont(), List.of(effectText, duration), Optional.empty(), mouseX, mouseY);
        }
    }
 
    private Component getEffectName(MobEffectInstance effect) {
        MutableComponent name = effect.getEffect().value().getDisplayName().copy();
        if (effect.getAmplifier() >= 1 && effect.getAmplifier() <= 9) {
            name.append(CommonComponents.SPACE).append(Component.translatable("enchantment.level." + (effect.getAmplifier() + 1)));
        }
 
        return name;
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 字段/方法调用
    • 关联成员: Minecraft.getInstance()
  • Font

    • 引用位置: 参数
  • Gui

    • 引用位置: 方法调用
    • 关联成员: Gui.getMobEffectSprite()
  • GuiGraphicsExtractor

    • 引用位置: 参数
  • ComponentRenderUtils

    • 引用位置: 方法调用
    • 关联成员: ComponentRenderUtils.clipText()
  • AbstractContainerScreen

    • 引用位置: 参数/字段
  • Component

    • 引用位置: 参数/方法调用/返回值
    • 关联成员: Component.translatable()
  • Identifier

    • 引用位置: 字段/方法调用
    • 关联成员: Identifier.withDefaultNamespace()
  • MobEffectInstance

    • 引用位置: 参数
  • MobEffectUtil

    • 引用位置: 方法调用
    • 关联成员: MobEffectUtil.formatDuration()