2025-11-24 22:52:51 +03:00

281 lines
11 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.google.common.collect.Maps
* org.jspecify.annotations.Nullable
*/
package net.minecraft.client.gui.screens.advancements;
import com.google.common.collect.Maps;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import java.util.Map;
import net.minecraft.advancements.AdvancementHolder;
import net.minecraft.advancements.AdvancementNode;
import net.minecraft.advancements.AdvancementProgress;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.advancements.AdvancementTab;
import net.minecraft.client.gui.screens.advancements.AdvancementWidget;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.client.multiplayer.ClientAdvancements;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ServerboundSeenAdvancementsPacket;
import net.minecraft.resources.Identifier;
import org.jspecify.annotations.Nullable;
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 -> {
AbstractWidget cfr_ignored_0 = (AbstractWidget)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())) continue;
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;
}
return super.keyPressed(event);
}
@Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float a) {
super.render(graphics, mouseX, mouseY, a);
int xo = (this.width - 252) / 2;
int yo = (this.height - 140) / 2;
graphics.nextStratum();
this.renderInside(graphics, xo, yo);
graphics.nextStratum();
this.renderWindow(graphics, xo, yo);
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.renderTooltips(graphics, mouseX, mouseY, xo, yo);
}
@Override
public boolean mouseDragged(MouseButtonEvent event, double dx, double dy) {
if (event.button() != 0) {
this.isScrolling = false;
return false;
}
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;
}
return false;
}
private void renderInside(GuiGraphics 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.drawCenteredString(this.font, NO_ADVANCEMENTS_LABEL, midX, yo + 18 + 56 - this.font.lineHeight / 2, -1);
graphics.drawCenteredString(this.font, VERY_SAD_LABEL, midX, yo + 18 + 113 - this.font.lineHeight, -1);
return;
}
tab.drawContents(graphics, xo + 9, yo + 18);
}
public void renderWindow(GuiGraphics graphics, int xo, int yo) {
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.drawTab(graphics, xo, yo, tab == this.selectedTab);
}
for (AdvancementTab tab : this.tabs.values()) {
tab.drawIcon(graphics, xo, yo);
}
}
graphics.drawString(this.font, this.selectedTab != null ? this.selectedTab.getTitle() : TITLE, xo + 8, yo + 6, -12566464, false);
}
private void renderTooltips(GuiGraphics graphics, int mouseX, int mouseY, int xo, int yo) {
if (this.selectedTab != null) {
graphics.pose().pushMatrix();
graphics.pose().translate((float)(xo + 9), (float)(yo + 18));
graphics.nextStratum();
this.selectedTab.drawTooltips(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)) continue;
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) {
return;
}
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());
}
}