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.getInstance()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Gui.getMobEffectSprite()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ComponentRenderUtils.clipText()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数/方法调用/返回值 - 关联成员:
Component.translatable()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
Identifier.withDefaultNamespace()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
MobEffectUtil.formatDuration()
- 引用位置: