AdvancementsScreen.java

net.minecraft.client.gui.screens.advancements.AdvancementsScreen

信息

  • 全限定名:net.minecraft.client.gui.screens.advancements.AdvancementsScreen
  • 类型:public class
  • 包:net.minecraft.client.gui.screens.advancements
  • 源码路径:src/main/java/net/minecraft/client/gui/screens/advancements/AdvancementsScreen.java
  • 起始行号:L27
  • 继承:Screen
  • 实现:ClientAdvancements.Listener
  • 职责:

    TODO

字段/常量

  • WINDOW_LOCATION

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

      TODO

  • WINDOW_WIDTH

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

      TODO

  • WINDOW_HEIGHT

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

      TODO

  • WINDOW_INSIDE_X

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

      TODO

  • WINDOW_INSIDE_Y

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

      TODO

  • WINDOW_INSIDE_WIDTH

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

      TODO

  • WINDOW_INSIDE_HEIGHT

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

      TODO

  • WINDOW_TITLE_X

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

      TODO

  • WINDOW_TITLE_Y

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

      TODO

  • BACKGROUND_TEXTURE_WIDTH

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

      TODO

  • BACKGROUND_TEXTURE_HEIGHT

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

      TODO

  • BACKGROUND_TILE_WIDTH

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

      TODO

  • BACKGROUND_TILE_HEIGHT

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

      TODO

  • BACKGROUND_TILE_COUNT_X

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

      TODO

  • BACKGROUND_TILE_COUNT_Y

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

      TODO

  • SCROLL_SPEED

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

      TODO

  • VERY_SAD_LABEL

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

      TODO

  • NO_ADVANCEMENTS_LABEL

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

      TODO

  • TITLE

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

      TODO

  • layout

    • 类型: HeaderAndFooterLayout
    • 修饰符: private final
    • 源码定位: L47
    • 说明:

      TODO

  • lastScreen

    • 类型: Screen
    • 修饰符: private final
    • 源码定位: L48
    • 说明:

      TODO

  • advancements

    • 类型: ClientAdvancements
    • 修饰符: private final
    • 源码定位: L49
    • 说明:

      TODO

  • tabs

    • 类型: Map<AdvancementHolder,AdvancementTab>
    • 修饰符: private final
    • 源码定位: L50
    • 说明:

      TODO

  • selectedTab

    • 类型: AdvancementTab
    • 修饰符: private
    • 源码定位: L51
    • 说明:

      TODO

  • isScrolling

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L52
    • 说明:

      TODO

内部类/嵌套类型

构造器

public AdvancementsScreen(ClientAdvancements advancements) @ L54

  • 构造器名:AdvancementsScreen
  • 源码定位:L54
  • 修饰符:public

参数:

  • advancements: ClientAdvancements

说明:

TODO

public AdvancementsScreen(ClientAdvancements advancements, Screen lastScreen) @ L58

  • 构造器名:AdvancementsScreen
  • 源码定位:L58
  • 修饰符:public

参数:

  • advancements: ClientAdvancements
  • lastScreen: Screen

说明:

TODO

方法

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

protected void init() @ L64

  • 方法名:init
  • 源码定位:L64
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

protected void repositionElements() @ L82

  • 方法名:repositionElements
  • 源码定位:L82
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

public void onClose() @ L87

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

参数:

说明:

TODO

public void removed() @ L92

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

参数:

说明:

TODO

public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) @ L101

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

参数:

  • event: MouseButtonEvent
  • doubleClick: boolean

说明:

TODO

public boolean keyPressed(KeyEvent event) @ L118

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

参数:

  • event: KeyEvent

说明:

TODO

public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) @ L129

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

参数:

  • graphics: GuiGraphicsExtractor
  • mouseX: int
  • mouseY: int
  • a: float

说明:

TODO

public boolean mouseDragged(MouseButtonEvent event, double dx, double dy) @ L151

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

参数:

  • event: MouseButtonEvent
  • dx: double
  • dy: double

说明:

TODO

public boolean mouseReleased(MouseButtonEvent event) @ L167

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

参数:

  • event: MouseButtonEvent

说明:

TODO

public boolean mouseScrolled(double x, double y, double scrollX, double scrollY) @ L173

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

参数:

  • x: double
  • y: double
  • scrollX: double
  • scrollY: double

说明:

TODO

private void extractInside(GuiGraphicsExtractor graphics, int xo, int yo) @ L183

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

参数:

  • graphics: GuiGraphicsExtractor
  • xo: int
  • yo: int

说明:

TODO

public void extractWindow(GuiGraphicsExtractor graphics, int xo, int yo, int mouseX, int mouseY) @ L195

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

参数:

  • graphics: GuiGraphicsExtractor
  • xo: int
  • yo: int
  • mouseX: int
  • mouseY: int

说明:

TODO

private void extractTooltips(GuiGraphicsExtractor graphics, int mouseX, int mouseY, int xo, int yo) @ L210

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

参数:

  • graphics: GuiGraphicsExtractor
  • mouseX: int
  • mouseY: int
  • xo: int
  • yo: int

说明:

TODO

public void onAddAdvancementRoot(AdvancementNode root) @ L228

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

参数:

  • root: AdvancementNode

说明:

TODO

public void onRemoveAdvancementRoot(AdvancementNode root) @ L236

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

参数:

  • root: AdvancementNode

说明:

TODO

public void onAddAdvancementTask(AdvancementNode task) @ L240

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

参数:

  • task: AdvancementNode

说明:

TODO

public void onRemoveAdvancementTask(AdvancementNode task) @ L248

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

参数:

  • task: AdvancementNode

说明:

TODO

public void onUpdateAdvancementProgress(AdvancementNode advancement, AdvancementProgress progress) @ L252

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

参数:

  • advancement: AdvancementNode
  • progress: AdvancementProgress

说明:

TODO

public void onSelectedTabChanged(AdvancementHolder selectedTab) @ L260

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

参数:

  • selectedTab: AdvancementHolder

说明:

TODO

public void onAdvancementsCleared() @ L265

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

参数:

说明:

TODO

public AdvancementWidget getAdvancementWidget(AdvancementNode node) @ L271

  • 方法名:getAdvancementWidget
  • 源码定位:L271
  • 返回类型:AdvancementWidget
  • 修饰符:public

参数:

  • node: AdvancementNode

说明:

TODO

private AdvancementTab getTab(AdvancementNode node) @ L276

  • 方法名:getTab
  • 源码定位:L276
  • 返回类型:AdvancementTab
  • 修饰符:private

参数:

  • node: AdvancementNode

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class AdvancementsScreen extends Screen implements ClientAdvancements.Listener {
    private static final Identifier WINDOW_LOCATION = Identifier.withDefaultNamespace("textures/gui/advancements/window.png");
    public static final int WINDOW_WIDTH = 252;
    public static final int WINDOW_HEIGHT = 140;
    private static final int WINDOW_INSIDE_X = 9;
    private static final int WINDOW_INSIDE_Y = 18;
    public static final int WINDOW_INSIDE_WIDTH = 234;
    public static final int WINDOW_INSIDE_HEIGHT = 113;
    private static final int WINDOW_TITLE_X = 8;
    private static final int WINDOW_TITLE_Y = 6;
    private static final int BACKGROUND_TEXTURE_WIDTH = 256;
    private static final int BACKGROUND_TEXTURE_HEIGHT = 256;
    public static final int BACKGROUND_TILE_WIDTH = 16;
    public static final int BACKGROUND_TILE_HEIGHT = 16;
    public static final int BACKGROUND_TILE_COUNT_X = 14;
    public static final int BACKGROUND_TILE_COUNT_Y = 7;
    private static final double SCROLL_SPEED = 16.0;
    private static final Component VERY_SAD_LABEL = Component.translatable("advancements.sad_label");
    private static final Component NO_ADVANCEMENTS_LABEL = Component.translatable("advancements.empty");
    private static final Component TITLE = Component.translatable("gui.advancements");
    private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
    private final @Nullable Screen lastScreen;
    private final ClientAdvancements advancements;
    private final Map<AdvancementHolder, AdvancementTab> tabs = Maps.newLinkedHashMap();
    private @Nullable AdvancementTab selectedTab;
    private boolean isScrolling;
 
    public AdvancementsScreen(ClientAdvancements advancements) {
        this(advancements, null);
    }
 
    public AdvancementsScreen(ClientAdvancements advancements, @Nullable Screen lastScreen) {
        super(TITLE);
        this.advancements = advancements;
        this.lastScreen = lastScreen;
    }
 
    @Override
    protected void init() {
        this.layout.addTitleHeader(TITLE, this.font);
        this.tabs.clear();
        this.selectedTab = null;
        this.advancements.setListener(this);
        if (this.selectedTab == null && !this.tabs.isEmpty()) {
            AdvancementTab firstTab = this.tabs.values().iterator().next();
            this.advancements.setSelectedTab(firstTab.getRootNode().holder(), true);
        } else {
            this.advancements.setSelectedTab(this.selectedTab == null ? null : this.selectedTab.getRootNode().holder(), true);
        }
 
        this.layout.addToFooter(Button.builder(CommonComponents.GUI_DONE, button -> this.onClose()).width(200).build());
        this.layout.visitWidgets(x$0 -> this.addRenderableWidget(x$0));
        this.repositionElements();
    }
 
    @Override
    protected void repositionElements() {
        this.layout.arrangeElements();
    }
 
    @Override
    public void onClose() {
        this.minecraft.setScreen(this.lastScreen);
    }
 
    @Override
    public void removed() {
        this.advancements.setListener(null);
        ClientPacketListener connection = this.minecraft.getConnection();
        if (connection != null) {
            connection.send(ServerboundSeenAdvancementsPacket.closedScreen());
        }
    }
 
    @Override
    public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) {
        if (event.button() == 0) {
            int xo = (this.width - 252) / 2;
            int yo = (this.height - 140) / 2;
 
            for (AdvancementTab tab : this.tabs.values()) {
                if (tab.isMouseOver(xo, yo, event.x(), event.y())) {
                    this.advancements.setSelectedTab(tab.getRootNode().holder(), true);
                    break;
                }
            }
        }
 
        return super.mouseClicked(event, doubleClick);
    }
 
    @Override
    public boolean keyPressed(KeyEvent event) {
        if (this.minecraft.options.keyAdvancements.matches(event)) {
            this.minecraft.setScreen(null);
            this.minecraft.mouseHandler.grabMouse();
            return true;
        } else {
            return super.keyPressed(event);
        }
    }
 
    @Override
    public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) {
        super.extractRenderState(graphics, mouseX, mouseY, a);
        int xo = (this.width - 252) / 2;
        int yo = (this.height - 140) / 2;
        graphics.nextStratum();
        this.extractInside(graphics, xo, yo);
        graphics.nextStratum();
        this.extractWindow(graphics, xo, yo, mouseX, mouseY);
        if (this.isScrolling && this.selectedTab != null) {
            if (this.selectedTab.canScrollHorizontally() && this.selectedTab.canScrollVertically()) {
                graphics.requestCursor(CursorTypes.RESIZE_ALL);
            } else if (this.selectedTab.canScrollHorizontally()) {
                graphics.requestCursor(CursorTypes.RESIZE_EW);
            } else if (this.selectedTab.canScrollVertically()) {
                graphics.requestCursor(CursorTypes.RESIZE_NS);
            }
        }
 
        this.extractTooltips(graphics, mouseX, mouseY, xo, yo);
    }
 
    @Override
    public boolean mouseDragged(MouseButtonEvent event, double dx, double dy) {
        if (event.button() != 0) {
            this.isScrolling = false;
            return false;
        } else {
            if (!this.isScrolling) {
                this.isScrolling = true;
            } else if (this.selectedTab != null) {
                this.selectedTab.scroll(dx, dy);
            }
 
            return true;
        }
    }
 
    @Override
    public boolean mouseReleased(MouseButtonEvent event) {
        this.isScrolling = false;
        return super.mouseReleased(event);
    }
 
    @Override
    public boolean mouseScrolled(double x, double y, double scrollX, double scrollY) {
        if (this.selectedTab != null) {
            this.selectedTab.scroll(scrollX * 16.0, scrollY * 16.0);
            return true;
        } else {
            return false;
        }
    }
 
    private void extractInside(GuiGraphicsExtractor graphics, int xo, int yo) {
        AdvancementTab tab = this.selectedTab;
        if (tab == null) {
            graphics.fill(xo + 9, yo + 18, xo + 9 + 234, yo + 18 + 113, -16777216);
            int midX = xo + 9 + 117;
            graphics.centeredText(this.font, NO_ADVANCEMENTS_LABEL, midX, yo + 18 + 56 - 9 / 2, -1);
            graphics.centeredText(this.font, VERY_SAD_LABEL, midX, yo + 18 + 113 - 9, -1);
        } else {
            tab.extractContents(graphics, xo + 9, yo + 18);
        }
    }
 
    public void extractWindow(GuiGraphicsExtractor graphics, int xo, int yo, int mouseX, int mouseY) {
        graphics.blit(RenderPipelines.GUI_TEXTURED, WINDOW_LOCATION, xo, yo, 0.0F, 0.0F, 252, 140, 256, 256);
        if (this.tabs.size() > 1) {
            for (AdvancementTab tab : this.tabs.values()) {
                tab.extractTab(graphics, xo, yo, mouseX, mouseY, tab == this.selectedTab);
            }
 
            for (AdvancementTab tab : this.tabs.values()) {
                tab.extractIcon(graphics, xo, yo);
            }
        }
 
        graphics.text(this.font, this.selectedTab != null ? this.selectedTab.getTitle() : TITLE, xo + 8, yo + 6, -12566464, false);
    }
 
    private void extractTooltips(GuiGraphicsExtractor graphics, int mouseX, int mouseY, int xo, int yo) {
        if (this.selectedTab != null) {
            graphics.pose().pushMatrix();
            graphics.pose().translate(xo + 9, yo + 18);
            graphics.nextStratum();
            this.selectedTab.extractTooltips(graphics, mouseX - xo - 9, mouseY - yo - 18, xo, yo);
            graphics.pose().popMatrix();
        }
 
        if (this.tabs.size() > 1) {
            for (AdvancementTab tab : this.tabs.values()) {
                if (tab.isMouseOver(xo, yo, mouseX, mouseY)) {
                    graphics.setTooltipForNextFrame(this.font, tab.getTitle(), mouseX, mouseY);
                }
            }
        }
    }
 
    @Override
    public void onAddAdvancementRoot(AdvancementNode root) {
        AdvancementTab tab = AdvancementTab.create(this.minecraft, this, this.tabs.size(), root);
        if (tab != null) {
            this.tabs.put(root.holder(), tab);
        }
    }
 
    @Override
    public void onRemoveAdvancementRoot(AdvancementNode root) {
    }
 
    @Override
    public void onAddAdvancementTask(AdvancementNode task) {
        AdvancementTab tab = this.getTab(task);
        if (tab != null) {
            tab.addAdvancement(task);
        }
    }
 
    @Override
    public void onRemoveAdvancementTask(AdvancementNode task) {
    }
 
    @Override
    public void onUpdateAdvancementProgress(AdvancementNode advancement, AdvancementProgress progress) {
        AdvancementWidget widget = this.getAdvancementWidget(advancement);
        if (widget != null) {
            widget.setProgress(progress);
        }
    }
 
    @Override
    public void onSelectedTabChanged(@Nullable AdvancementHolder selectedTab) {
        this.selectedTab = this.tabs.get(selectedTab);
    }
 
    @Override
    public void onAdvancementsCleared() {
        this.tabs.clear();
        this.selectedTab = null;
    }
 
    public @Nullable AdvancementWidget getAdvancementWidget(AdvancementNode node) {
        AdvancementTab tab = this.getTab(node);
        return tab == null ? null : tab.getWidget(node.holder());
    }
 
    private @Nullable AdvancementTab getTab(AdvancementNode node) {
        AdvancementNode root = node.root();
        return this.tabs.get(root.holder());
    }
}

引用的其他类