BossHealthOverlay.java

net.minecraft.client.gui.components.BossHealthOverlay

信息

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

    TODO

字段/常量

  • BAR_WIDTH

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

      TODO

  • BAR_HEIGHT

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

      TODO

  • BAR_BACKGROUND_SPRITES

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

      TODO

  • BAR_PROGRESS_SPRITES

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

      TODO

  • OVERLAY_BACKGROUND_SPRITES

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

      TODO

  • OVERLAY_PROGRESS_SPRITES

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

      TODO

  • minecraft

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

      TODO

  • events

    • 类型: Map<UUID,LerpingBossEvent>
    • 修饰符: private final
    • 源码定位: L55
    • 说明:

      TODO

内部类/嵌套类型

构造器

public BossHealthOverlay(Minecraft minecraft) @ L57

  • 构造器名:BossHealthOverlay
  • 源码定位:L57
  • 修饰符:public

参数:

  • minecraft: Minecraft

说明:

TODO

方法

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

public void extractRenderState(GuiGraphicsExtractor graphics) @ L61

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

参数:

  • graphics: GuiGraphicsExtractor

说明:

TODO

private void extractBar(GuiGraphicsExtractor graphics, int x, int y, BossEvent event) @ L87

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

参数:

  • graphics: GuiGraphicsExtractor
  • x: int
  • y: int
  • event: BossEvent

说明:

TODO

private void extractBar(GuiGraphicsExtractor graphics, int x, int y, BossEvent event, int width, Identifier[] sprites, Identifier[] overlaySprites) @ L95

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

参数:

  • graphics: GuiGraphicsExtractor
  • x: int
  • y: int
  • event: BossEvent
  • width: int
  • sprites: Identifier[]
  • overlaySprites: Identifier[]

说明:

TODO

public void update(ClientboundBossEventPacket packet) @ L102

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

参数:

  • packet: ClientboundBossEventPacket

说明:

TODO

public void reset() @ L156

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

参数:

说明:

TODO

public boolean shouldPlayMusic() @ L160

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

参数:

说明:

TODO

public boolean shouldDarkenScreen() @ L172

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

参数:

说明:

TODO

public boolean shouldCreateWorldFog() @ L184

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

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class BossHealthOverlay {
    private static final int BAR_WIDTH = 182;
    private static final int BAR_HEIGHT = 5;
    private static final Identifier[] BAR_BACKGROUND_SPRITES = new Identifier[]{
        Identifier.withDefaultNamespace("boss_bar/pink_background"),
        Identifier.withDefaultNamespace("boss_bar/blue_background"),
        Identifier.withDefaultNamespace("boss_bar/red_background"),
        Identifier.withDefaultNamespace("boss_bar/green_background"),
        Identifier.withDefaultNamespace("boss_bar/yellow_background"),
        Identifier.withDefaultNamespace("boss_bar/purple_background"),
        Identifier.withDefaultNamespace("boss_bar/white_background")
    };
    private static final Identifier[] BAR_PROGRESS_SPRITES = new Identifier[]{
        Identifier.withDefaultNamespace("boss_bar/pink_progress"),
        Identifier.withDefaultNamespace("boss_bar/blue_progress"),
        Identifier.withDefaultNamespace("boss_bar/red_progress"),
        Identifier.withDefaultNamespace("boss_bar/green_progress"),
        Identifier.withDefaultNamespace("boss_bar/yellow_progress"),
        Identifier.withDefaultNamespace("boss_bar/purple_progress"),
        Identifier.withDefaultNamespace("boss_bar/white_progress")
    };
    private static final Identifier[] OVERLAY_BACKGROUND_SPRITES = new Identifier[]{
        Identifier.withDefaultNamespace("boss_bar/notched_6_background"),
        Identifier.withDefaultNamespace("boss_bar/notched_10_background"),
        Identifier.withDefaultNamespace("boss_bar/notched_12_background"),
        Identifier.withDefaultNamespace("boss_bar/notched_20_background")
    };
    private static final Identifier[] OVERLAY_PROGRESS_SPRITES = new Identifier[]{
        Identifier.withDefaultNamespace("boss_bar/notched_6_progress"),
        Identifier.withDefaultNamespace("boss_bar/notched_10_progress"),
        Identifier.withDefaultNamespace("boss_bar/notched_12_progress"),
        Identifier.withDefaultNamespace("boss_bar/notched_20_progress")
    };
    private final Minecraft minecraft;
    private final Map<UUID, LerpingBossEvent> events = Maps.newLinkedHashMap();
 
    public BossHealthOverlay(Minecraft minecraft) {
        this.minecraft = minecraft;
    }
 
    public void extractRenderState(GuiGraphicsExtractor graphics) {
        if (!this.events.isEmpty()) {
            graphics.nextStratum();
            ProfilerFiller profiler = Profiler.get();
            profiler.push("bossHealth");
            int screenWidth = graphics.guiWidth();
            int yOffset = 12;
 
            for (LerpingBossEvent event : this.events.values()) {
                int xLeft = screenWidth / 2 - 91;
                this.extractBar(graphics, xLeft, yOffset, event);
                Component msg = event.getName();
                int width = this.minecraft.font.width(msg);
                int x = screenWidth / 2 - width / 2;
                int y = yOffset - 9;
                graphics.text(this.minecraft.font, msg, x, y, -1);
                yOffset += 10 + 9;
                if (yOffset >= graphics.guiHeight() / 3) {
                    break;
                }
            }
 
            profiler.pop();
        }
    }
 
    private void extractBar(GuiGraphicsExtractor graphics, int x, int y, BossEvent event) {
        this.extractBar(graphics, x, y, event, 182, BAR_BACKGROUND_SPRITES, OVERLAY_BACKGROUND_SPRITES);
        int width = Mth.lerpDiscrete(event.getProgress(), 0, 182);
        if (width > 0) {
            this.extractBar(graphics, x, y, event, width, BAR_PROGRESS_SPRITES, OVERLAY_PROGRESS_SPRITES);
        }
    }
 
    private void extractBar(GuiGraphicsExtractor graphics, int x, int y, BossEvent event, int width, Identifier[] sprites, Identifier[] overlaySprites) {
        graphics.blitSprite(RenderPipelines.GUI_TEXTURED, sprites[event.getColor().ordinal()], 182, 5, 0, 0, x, y, width, 5);
        if (event.getOverlay() != BossEvent.BossBarOverlay.PROGRESS) {
            graphics.blitSprite(RenderPipelines.GUI_TEXTURED, overlaySprites[event.getOverlay().ordinal() - 1], 182, 5, 0, 0, x, y, width, 5);
        }
    }
 
    public void update(ClientboundBossEventPacket packet) {
        packet.dispatch(
            new ClientboundBossEventPacket.Handler() {
                {
                    Objects.requireNonNull(BossHealthOverlay.this);
                }
 
                @Override
                public void add(
                    UUID id,
                    Component name,
                    float progress,
                    BossEvent.BossBarColor color,
                    BossEvent.BossBarOverlay overlay,
                    boolean darkenScreen,
                    boolean playMusic,
                    boolean createWorldFog
                ) {
                    BossHealthOverlay.this.events.put(id, new LerpingBossEvent(id, name, progress, color, overlay, darkenScreen, playMusic, createWorldFog));
                }
 
                @Override
                public void remove(UUID id) {
                    BossHealthOverlay.this.events.remove(id);
                }
 
                @Override
                public void updateProgress(UUID id, float progress) {
                    BossHealthOverlay.this.events.get(id).setProgress(progress);
                }
 
                @Override
                public void updateName(UUID id, Component name) {
                    BossHealthOverlay.this.events.get(id).setName(name);
                }
 
                @Override
                public void updateStyle(UUID id, BossEvent.BossBarColor color, BossEvent.BossBarOverlay overlay) {
                    LerpingBossEvent event = BossHealthOverlay.this.events.get(id);
                    event.setColor(color);
                    event.setOverlay(overlay);
                }
 
                @Override
                public void updateProperties(UUID id, boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
                    LerpingBossEvent event = BossHealthOverlay.this.events.get(id);
                    event.setDarkenScreen(darkenScreen);
                    event.setPlayBossMusic(playMusic);
                    event.setCreateWorldFog(createWorldFog);
                }
            }
        );
    }
 
    public void reset() {
        this.events.clear();
    }
 
    public boolean shouldPlayMusic() {
        if (!this.events.isEmpty()) {
            for (BossEvent event : this.events.values()) {
                if (event.shouldPlayBossMusic()) {
                    return true;
                }
            }
        }
 
        return false;
    }
 
    public boolean shouldDarkenScreen() {
        if (!this.events.isEmpty()) {
            for (BossEvent event : this.events.values()) {
                if (event.shouldDarkenScreen()) {
                    return true;
                }
            }
        }
 
        return false;
    }
 
    public boolean shouldCreateWorldFog() {
        if (!this.events.isEmpty()) {
            for (BossEvent event : this.events.values()) {
                if (event.shouldCreateWorldFog()) {
                    return true;
                }
            }
        }
 
        return false;
    }
}

引用的其他类

  • Minecraft

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

    • 引用位置: 参数
  • LerpingBossEvent

    • 引用位置: 字段/构造调用
    • 关联成员: LerpingBossEvent()
  • ClientboundBossEventPacket

    • 引用位置: 参数/方法调用/构造调用
    • 关联成员: ClientboundBossEventPacket.Handler(), Handler()
  • Identifier

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

    • 引用位置: 方法调用
    • 关联成员: Mth.lerpDiscrete()
  • Profiler

    • 引用位置: 方法调用
    • 关联成员: Profiler.get()
  • BossEvent

    • 引用位置: 参数