266 lines
11 KiB
Java
266 lines
11 KiB
Java
|
package net.minecraft.client.gui.screens.advancements;
|
||
|
|
||
|
import com.google.common.collect.Maps;
|
||
|
import java.util.Map;
|
||
|
import javax.annotation.Nullable;
|
||
|
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.components.events.GuiEventListener;
|
||
|
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
|
||
|
import net.minecraft.client.gui.screens.Screen;
|
||
|
import net.minecraft.client.multiplayer.ClientAdvancements;
|
||
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||
|
import net.minecraft.client.renderer.RenderType;
|
||
|
import net.minecraft.network.chat.CommonComponents;
|
||
|
import net.minecraft.network.chat.Component;
|
||
|
import net.minecraft.network.protocol.game.ServerboundSeenAdvancementsPacket;
|
||
|
import net.minecraft.resources.ResourceLocation;
|
||
|
import net.minecraftforge.api.distmarker.Dist;
|
||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||
|
|
||
|
@OnlyIn(Dist.CLIENT)
|
||
|
public class AdvancementsScreen extends Screen implements ClientAdvancements.Listener {
|
||
|
private static final ResourceLocation WINDOW_LOCATION = ResourceLocation.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);
|
||
|
@Nullable
|
||
|
private final Screen lastScreen;
|
||
|
private final ClientAdvancements advancements;
|
||
|
private final Map<AdvancementHolder, AdvancementTab> tabs = Maps.newLinkedHashMap();
|
||
|
@Nullable
|
||
|
private AdvancementTab selectedTab;
|
||
|
private boolean isScrolling;
|
||
|
|
||
|
public AdvancementsScreen(ClientAdvancements p_97340_) {
|
||
|
this(p_97340_, null);
|
||
|
}
|
||
|
|
||
|
public AdvancementsScreen(ClientAdvancements p_333280_, @Nullable Screen p_335811_) {
|
||
|
super(TITLE);
|
||
|
this.advancements = p_333280_;
|
||
|
this.lastScreen = p_335811_;
|
||
|
}
|
||
|
|
||
|
@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 advancementtab = this.tabs.values().iterator().next();
|
||
|
this.advancements.setSelectedTab(advancementtab.getRootNode().holder(), true);
|
||
|
} else {
|
||
|
this.advancements.setSelectedTab(this.selectedTab == null ? null : this.selectedTab.getRootNode().holder(), true);
|
||
|
}
|
||
|
|
||
|
this.layout.addToFooter(Button.builder(CommonComponents.GUI_DONE, p_329618_ -> this.onClose()).width(200).build());
|
||
|
this.layout.visitWidgets(p_335563_ -> {
|
||
|
AbstractWidget abstractwidget = this.addRenderableWidget(p_335563_);
|
||
|
});
|
||
|
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 clientpacketlistener = this.minecraft.getConnection();
|
||
|
if (clientpacketlistener != null) {
|
||
|
clientpacketlistener.send(ServerboundSeenAdvancementsPacket.closedScreen());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean mouseClicked(double p_97343_, double p_97344_, int p_97345_) {
|
||
|
if (p_97345_ == 0) {
|
||
|
int i = (this.width - 252) / 2;
|
||
|
int j = (this.height - 140) / 2;
|
||
|
|
||
|
for (AdvancementTab advancementtab : this.tabs.values()) {
|
||
|
if (advancementtab.isMouseOver(i, j, p_97343_, p_97344_)) {
|
||
|
this.advancements.setSelectedTab(advancementtab.getRootNode().holder(), true);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return super.mouseClicked(p_97343_, p_97344_, p_97345_);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean keyPressed(int p_97353_, int p_97354_, int p_97355_) {
|
||
|
if (this.minecraft.options.keyAdvancements.matches(p_97353_, p_97354_)) {
|
||
|
this.minecraft.setScreen(null);
|
||
|
this.minecraft.mouseHandler.grabMouse();
|
||
|
return true;
|
||
|
} else {
|
||
|
return super.keyPressed(p_97353_, p_97354_, p_97355_);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void render(GuiGraphics p_282589_, int p_282255_, int p_283354_, float p_283123_) {
|
||
|
super.render(p_282589_, p_282255_, p_283354_, p_283123_);
|
||
|
int i = (this.width - 252) / 2;
|
||
|
int j = (this.height - 140) / 2;
|
||
|
this.renderInside(p_282589_, p_282255_, p_283354_, i, j);
|
||
|
this.renderWindow(p_282589_, i, j);
|
||
|
this.renderTooltips(p_282589_, p_282255_, p_283354_, i, j);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean mouseDragged(double p_97347_, double p_97348_, int p_97349_, double p_97350_, double p_97351_) {
|
||
|
if (p_97349_ != 0) {
|
||
|
this.isScrolling = false;
|
||
|
return false;
|
||
|
} else {
|
||
|
if (!this.isScrolling) {
|
||
|
this.isScrolling = true;
|
||
|
} else if (this.selectedTab != null) {
|
||
|
this.selectedTab.scroll(p_97350_, p_97351_);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean mouseScrolled(double p_300678_, double p_297858_, double p_301134_, double p_300488_) {
|
||
|
if (this.selectedTab != null) {
|
||
|
this.selectedTab.scroll(p_301134_ * 16.0, p_300488_ * 16.0);
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void renderInside(GuiGraphics p_282012_, int p_97375_, int p_97376_, int p_97377_, int p_97378_) {
|
||
|
AdvancementTab advancementtab = this.selectedTab;
|
||
|
if (advancementtab == null) {
|
||
|
p_282012_.fill(p_97377_ + 9, p_97378_ + 18, p_97377_ + 9 + 234, p_97378_ + 18 + 113, -16777216);
|
||
|
int i = p_97377_ + 9 + 117;
|
||
|
p_282012_.drawCenteredString(this.font, NO_ADVANCEMENTS_LABEL, i, p_97378_ + 18 + 56 - 9 / 2, -1);
|
||
|
p_282012_.drawCenteredString(this.font, VERY_SAD_LABEL, i, p_97378_ + 18 + 113 - 9, -1);
|
||
|
} else {
|
||
|
advancementtab.drawContents(p_282012_, p_97377_ + 9, p_97378_ + 18);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void renderWindow(GuiGraphics p_283395_, int p_281890_, int p_282532_) {
|
||
|
p_283395_.blit(RenderType::guiTextured, WINDOW_LOCATION, p_281890_, p_282532_, 0.0F, 0.0F, 252, 140, 256, 256);
|
||
|
if (this.tabs.size() > 1) {
|
||
|
for (AdvancementTab advancementtab : this.tabs.values()) {
|
||
|
advancementtab.drawTab(p_283395_, p_281890_, p_282532_, advancementtab == this.selectedTab);
|
||
|
}
|
||
|
|
||
|
for (AdvancementTab advancementtab1 : this.tabs.values()) {
|
||
|
advancementtab1.drawIcon(p_283395_, p_281890_, p_282532_);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
p_283395_.drawString(this.font, this.selectedTab != null ? this.selectedTab.getTitle() : TITLE, p_281890_ + 8, p_282532_ + 6, 4210752, false);
|
||
|
}
|
||
|
|
||
|
private void renderTooltips(GuiGraphics p_282784_, int p_283556_, int p_282458_, int p_281519_, int p_283371_) {
|
||
|
if (this.selectedTab != null) {
|
||
|
p_282784_.pose().pushPose();
|
||
|
p_282784_.pose().translate(p_281519_ + 9, p_283371_ + 18, 400.0F);
|
||
|
this.selectedTab.drawTooltips(p_282784_, p_283556_ - p_281519_ - 9, p_282458_ - p_283371_ - 18, p_281519_, p_283371_);
|
||
|
p_282784_.pose().popPose();
|
||
|
}
|
||
|
|
||
|
if (this.tabs.size() > 1) {
|
||
|
for (AdvancementTab advancementtab : this.tabs.values()) {
|
||
|
if (advancementtab.isMouseOver(p_281519_, p_283371_, p_283556_, p_282458_)) {
|
||
|
p_282784_.renderTooltip(this.font, advancementtab.getTitle(), p_283556_, p_282458_);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onAddAdvancementRoot(AdvancementNode p_300702_) {
|
||
|
AdvancementTab advancementtab = AdvancementTab.create(this.minecraft, this, this.tabs.size(), p_300702_);
|
||
|
if (advancementtab != null) {
|
||
|
this.tabs.put(p_300702_.holder(), advancementtab);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onRemoveAdvancementRoot(AdvancementNode p_298890_) {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onAddAdvancementTask(AdvancementNode p_297934_) {
|
||
|
AdvancementTab advancementtab = this.getTab(p_297934_);
|
||
|
if (advancementtab != null) {
|
||
|
advancementtab.addAdvancement(p_297934_);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onRemoveAdvancementTask(AdvancementNode p_301169_) {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onUpdateAdvancementProgress(AdvancementNode p_300708_, AdvancementProgress p_97369_) {
|
||
|
AdvancementWidget advancementwidget = this.getAdvancementWidget(p_300708_);
|
||
|
if (advancementwidget != null) {
|
||
|
advancementwidget.setProgress(p_97369_);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onSelectedTabChanged(@Nullable AdvancementHolder p_297665_) {
|
||
|
this.selectedTab = this.tabs.get(p_297665_);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void onAdvancementsCleared() {
|
||
|
this.tabs.clear();
|
||
|
this.selectedTab = null;
|
||
|
}
|
||
|
|
||
|
@Nullable
|
||
|
public AdvancementWidget getAdvancementWidget(AdvancementNode p_298026_) {
|
||
|
AdvancementTab advancementtab = this.getTab(p_298026_);
|
||
|
return advancementtab == null ? null : advancementtab.getWidget(p_298026_.holder());
|
||
|
}
|
||
|
|
||
|
@Nullable
|
||
|
private AdvancementTab getTab(AdvancementNode p_300894_) {
|
||
|
AdvancementNode advancementnode = p_300894_.root();
|
||
|
return this.tabs.get(advancementnode.holder());
|
||
|
}
|
||
|
}
|