diff --git a/src/main/java/com/portingdeadmods/researchd/api/research/ResearchInstance.java b/src/main/java/com/portingdeadmods/researchd/api/research/ResearchInstance.java index 6e1b12a..f775d8d 100644 --- a/src/main/java/com/portingdeadmods/researchd/api/research/ResearchInstance.java +++ b/src/main/java/com/portingdeadmods/researchd/api/research/ResearchInstance.java @@ -2,8 +2,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.portingdeadmods.portingdeadlibs.utils.codec.CodecUtils; -import com.portingdeadmods.researchd.client.screens.list.EntryType; import com.portingdeadmods.researchd.utils.Codecs; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -14,20 +12,20 @@ public final class ResearchInstance { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Research.RESOURCE_KEY_CODEC.fieldOf("research").forGetter(ResearchInstance::getResearch), - Codecs.enumCodec(EntryType.class).fieldOf("research_status").forGetter(ResearchInstance::getResearchStatus) + Codecs.enumCodec(ResearchStatus.class).fieldOf("research_status").forGetter(ResearchInstance::getResearchStatus) ).apply(instance, ResearchInstance::new)); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( Research.RESOURCE_KEY_STREAM_CODEC, ResearchInstance::getResearch, - Codecs.enumStreamCodec(EntryType.class), + Codecs.enumStreamCodec(ResearchStatus.class), ResearchInstance::getResearchStatus, ResearchInstance::new ); private final ResourceKey research; - private EntryType researchStatus; + private ResearchStatus researchStatus; - public ResearchInstance(ResourceKey research, EntryType researchStatus) { + public ResearchInstance(ResourceKey research, ResearchStatus researchStatus) { this.research = research; this.researchStatus = researchStatus; } @@ -36,16 +34,16 @@ public ResourceKey getResearch() { return research; } - public EntryType getResearchStatus() { + public ResearchStatus getResearchStatus() { return researchStatus; } - public void setResearchStatus(EntryType researchStatus) { + public void setResearchStatus(ResearchStatus researchStatus) { this.researchStatus = researchStatus; } public ResearchInstance copy() { - return new ResearchInstance(getResearch(), EntryType.values()[getResearchStatus().ordinal()]); + return new ResearchInstance(getResearch(), ResearchStatus.values()[getResearchStatus().ordinal()]); } @Override diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/list/EntryType.java b/src/main/java/com/portingdeadmods/researchd/api/research/ResearchStatus.java similarity index 78% rename from src/main/java/com/portingdeadmods/researchd/client/screens/list/EntryType.java rename to src/main/java/com/portingdeadmods/researchd/api/research/ResearchStatus.java index 6f1f539..7f2bacc 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/list/EntryType.java +++ b/src/main/java/com/portingdeadmods/researchd/api/research/ResearchStatus.java @@ -1,17 +1,17 @@ -package com.portingdeadmods.researchd.client.screens.list; +package com.portingdeadmods.researchd.api.research; import com.portingdeadmods.researchd.Researchd; import net.minecraft.resources.ResourceLocation; // TODO: Rename to ResearchStatus -public enum EntryType { +public enum ResearchStatus { RESEARCHED("entry_green"), RESEARCHABLE("entry_yellow"), LOCKED("entry_red"); private final ResourceLocation spriteTexture; - EntryType(String spriteTexture) { + ResearchStatus(String spriteTexture) { this.spriteTexture = Researchd.rl("textures/gui/sprites/" + spriteTexture + ".png"); } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreen.java b/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreen.java index 8b54401..b4ed5a8 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreen.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreen.java @@ -2,8 +2,7 @@ import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; import com.portingdeadmods.researchd.Researchd; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import com.portingdeadmods.researchd.client.screens.queue.QueueEntryWidget; +import com.portingdeadmods.researchd.client.screens.graph.ResearchNode; import com.portingdeadmods.researchd.utils.researches.*; import com.portingdeadmods.researchd.client.screens.graph.ResearchGraphWidget; import com.portingdeadmods.researchd.client.screens.list.TechListWidget; @@ -31,8 +30,7 @@ public ResearchScreen() { // TECH LIST this.techList = new TechListWidget(this, 0, 103, 7); - this.techList.setTechList(new TechList(ClientResearchCache.NODES.stream() - .map(n -> new TechListEntry(n.getResearch(), 0, 0)).toList())); + this.techList.setTechList(new TechList(ClientResearchCache.NODES.stream().map(ResearchNode::getInstance).toList())); // QUEUE this.researchQueueWidget = new ResearchQueueWidget(this, 0, 0); @@ -45,7 +43,7 @@ public ResearchScreen() { this.researchGraphWidget.setGraph(ResearchGraph.fromRootNode(mc.player, ClientResearchCache.ROOT_NODE)); this.selectedResearchWidget = new SelectedResearchWidget(0, 42, SelectedResearchWidget.BACKGROUND_WIDTH, SelectedResearchWidget.BACKGROUND_HEIGHT); - this.selectedResearchWidget.setEntry(this.techList.getTechList().entries().getFirst()); + //this.selectedResearchWidget.setEntry(this.techList.getTechList().entries().getFirst()); } @Override @@ -58,9 +56,6 @@ protected void init() { addRenderableWidget(this.techList.startResearchButton); addRenderableWidget(this.researchGraphWidget); addRenderableWidget(this.selectedResearchWidget); - //addRenderableWidget(this.researchQueueWidget.leftButton); - //addRenderableWidget(this.researchQueueWidget.rightButton); - //addRenderableWidget(this.researchQueueWidget.removeButton); } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreenWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreenWidget.java new file mode 100644 index 0000000..5c04f51 --- /dev/null +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/ResearchScreenWidget.java @@ -0,0 +1,83 @@ +package com.portingdeadmods.researchd.client.screens; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; +import com.portingdeadmods.researchd.api.research.ResearchInstance; +import com.portingdeadmods.researchd.utils.researches.ResearchHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.chat.CommonComponents; + +import javax.annotation.Nullable; + +public abstract class ResearchScreenWidget extends AbstractWidget { + public static final int PANEL_WIDTH = 20; + public static final int PANEL_HEIGHT = 24; + + public ResearchScreenWidget(int x, int y, int width, int height) { + super(x, y, width, height, CommonComponents.EMPTY); + } + + @Override + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + } + + public static void renderResearchPanel(GuiGraphics guiGraphics, ResearchInstance instance, int x, int y, int mouseX, int mouseY, int scale) { + renderResearchPanel(guiGraphics, instance, x, y, mouseX, mouseY, scale, true); + } + + public static void renderResearchPanel(GuiGraphics guiGraphics, ResearchInstance instance, int x, int y, int mouseX, int mouseY, int scale, boolean hoverable) { + int width = PANEL_WIDTH; + int height = PANEL_HEIGHT; + guiGraphics.blit(instance.getResearchStatus().getSpriteTexture(), x, y, width * scale, height * scale, 0, 0, width, height, width, height); + + RegistryAccess lookup = Minecraft.getInstance().level.registryAccess(); + + PoseStack poseStack = guiGraphics.pose(); + + poseStack.pushPose(); + { + poseStack.scale(scale, scale, scale); + guiGraphics.renderItem(ResearchHelper.getResearch(instance.getResearch(), lookup).icon().getDefaultInstance(), x - scale / 2 - 3, y - (height * scale) / (2 * scale) - 13); + } + poseStack.popPose(); + + if (isHovering(guiGraphics, x, y, mouseX, mouseY, scale) && hoverable) { + int color = -2130706433; + guiGraphics.fillGradient(RenderType.guiOverlay(), x, y, x + 20 * scale, y + 20 * scale, color, color, 0); + } + } + + public static void renderResearchPanel(GuiGraphics guiGraphics, ResearchInstance instance, int x, int y, int mouseX, int mouseY) { + renderResearchPanel(guiGraphics, instance, x, y, mouseX, mouseY, true); + } + + public static void renderResearchPanel(GuiGraphics guiGraphics, ResearchInstance instance, int x, int y, int mouseX, int mouseY, boolean hoverable) { + GuiUtils.drawImg(guiGraphics, instance.getResearchStatus().getSpriteTexture(), x, y, PANEL_WIDTH, PANEL_HEIGHT); + + RegistryAccess lookup = Minecraft.getInstance().level.registryAccess(); + guiGraphics.renderItem(ResearchHelper.getResearch(instance.getResearch(), lookup).icon().getDefaultInstance(), x + 2, y + 2); + + if (isHovering(guiGraphics, x, y, mouseX, mouseY) && hoverable) { + int color = -2130706433; + guiGraphics.fillGradient(RenderType.guiOverlay(), x, y, x + 20, y + 20, color, color, 0); + } + } + + public static boolean isHovering(@Nullable GuiGraphics guiGraphics, int x, int y, int mouseX, int mouseY) { + return isHovering(guiGraphics, x, y, mouseX, mouseY, 1); + } + + public static boolean isHovering(@Nullable GuiGraphics guiGraphics, int x, int y, int mouseX, int mouseY, int scale) { + return (guiGraphics == null || guiGraphics.containsPointInScissor(mouseX, mouseY)) + && mouseX >= x + && mouseY >= y + && mouseX < x + PANEL_WIDTH * scale + && mouseY < y + PANEL_HEIGHT * scale; + } + +} diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/SelectedResearchWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/SelectedResearchWidget.java index fb296e2..337bb28 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/SelectedResearchWidget.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/SelectedResearchWidget.java @@ -1,41 +1,32 @@ package com.portingdeadmods.researchd.client.screens; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import com.portingdeadmods.portingdeadlibs.utils.Utils; import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; import com.portingdeadmods.researchd.Researchd; import com.portingdeadmods.researchd.api.client.research.ClientResearchMethod; import com.portingdeadmods.researchd.api.research.ResearchInstance; import com.portingdeadmods.researchd.api.research.ResearchMethod; -import com.portingdeadmods.researchd.client.screens.list.EntryType; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import com.portingdeadmods.researchd.registries.Researches; import com.portingdeadmods.researchd.utils.researches.ResearchHelper; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -public class SelectedResearchWidget extends AbstractWidget { +public class SelectedResearchWidget extends ResearchScreenWidget { private static final ResourceLocation BACKGROUND_TEXTURE = Researchd.rl("textures/gui/selected_research.png"); public static final int BACKGROUND_WIDTH = 174; public static final int BACKGROUND_HEIGHT = 61; - private TechListEntry entry; + private ResearchInstance instance; private final Map> methods; public SelectedResearchWidget(int x, int y, int width, int height) { - super(x, y, width, height, Component.empty()); + super(x, y, width, height); this.methods = new Object2ObjectArrayMap<>(); } @@ -43,13 +34,13 @@ public SelectedResearchWidget(int x, int y, int width, int height) { protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float v) { GuiUtils.drawImg(guiGraphics, BACKGROUND_TEXTURE, getX(), getY(), width, height); - if (entry != null) { - entry.renderWidget(guiGraphics, mouseX, mouseY, v, 2); + if (instance != null) { + renderResearchPanel(guiGraphics, instance, 12, 55, mouseX, mouseY, 2, false); guiGraphics.enableScissor(53, 55, 53 + 115, 55 + 48); Font font = Minecraft.getInstance().font; - guiGraphics.drawString(font, Utils.registryTranslation(this.entry.getResearch().getResearch()), 12, 45, -1, false); + guiGraphics.drawString(font, Utils.registryTranslation(this.instance.getResearch()), 12, 45, -1, false); int lineHeight = font.lineHeight + 2; int height = 0; @@ -68,23 +59,17 @@ protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, flo } } - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { - } - - public void setEntry(TechListEntry entry) { - this.entry = entry.copy(); - this.entry.setX(12); - this.entry.setY(55); + public void setSelectedResearch(ResearchInstance instance) { + this.instance = instance.copy(); this.methods.clear(); - List methods = ResearchHelper.getResearch(this.entry.getResearch().getResearch(), Minecraft.getInstance().level.registryAccess()).researchMethods(); + List methods = ResearchHelper.getResearch(this.instance.getResearch(), Minecraft.getInstance().level.registryAccess()).researchMethods(); for (ResearchMethod method : methods) { this.methods.computeIfAbsent(method.id(), key -> new ArrayList<>()).add(method); } } - public TechListEntry getEntry() { - return entry; + public ResearchInstance getInstance() { + return instance; } } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchGraphWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchGraphWidget.java index 564b1af..602d144 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchGraphWidget.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchGraphWidget.java @@ -26,7 +26,9 @@ public void setGraph(ResearchGraph graph) { @Override protected void renderWidget(GuiGraphics guiGraphics, int i, int i1, float v) { guiGraphics.enableScissor(getX(), getY(), getX() + getWidth(), getY() + getHeight()); - renderNode(graph.rootNode(), guiGraphics, i, i1, v); + ResearchNode node = graph.rootNode(); + renderNode(node, guiGraphics, i, i1, v); + guiGraphics.vLine(node.getX() + (node.getWidth() / 2), node.getY() + node.getWidth(), node.getNext().stream().findFirst().get().getY(), -1); guiGraphics.disableScissor(); } @@ -36,8 +38,8 @@ private void renderNode(ResearchNode node, GuiGraphics guiGraphics, int mouseX, if (node.isHovered()) { Minecraft minecraft = Minecraft.getInstance(); guiGraphics.renderComponentTooltip(minecraft.font, List.of( - Utils.registryTranslation(node.getResearch().getResearch()), - Component.translatable("research_desc." + Researchd.MODID + "." + node.getResearch().getResearch().location().getPath()) + Utils.registryTranslation(node.getInstance().getResearch()), + Component.translatable("research_desc." + Researchd.MODID + "." + node.getInstance().getResearch().location().getPath()) ), mouseX, mouseY); } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchNode.java b/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchNode.java index a32d0c2..fe7f123 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchNode.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/graph/ResearchNode.java @@ -1,27 +1,22 @@ package com.portingdeadmods.researchd.client.screens.graph; -import com.portingdeadmods.researchd.api.research.Research; import com.portingdeadmods.researchd.api.research.ResearchInstance; -import com.portingdeadmods.researchd.client.screens.list.EntryType; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import net.minecraft.client.Minecraft; +import com.portingdeadmods.researchd.client.screens.ResearchScreenWidget; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.core.Holder; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; +import net.minecraft.network.chat.CommonComponents; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; -public class ResearchNode extends TechListEntry { +public class ResearchNode extends AbstractWidget { private final Set next; + private final ResearchInstance instance; public ResearchNode(ResearchInstance instance) { - super(instance, 0, 0); + super(0, 0, ResearchScreenWidget.PANEL_WIDTH, ResearchScreenWidget.PANEL_HEIGHT, CommonComponents.EMPTY); + this.instance = instance; this.next = new HashSet<>(); } @@ -37,10 +32,24 @@ public Set getNext() { return next; } + public ResearchInstance getInstance() { + return instance; + } + + @Override + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float v) { + ResearchScreenWidget.renderResearchPanel(guiGraphics, instance, getX(), getY(), mouseX, mouseY); + } + @Override public String toString() { return "ResearchNode{" + "next=" + next + '}'; } + + @Override + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + + } } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListEntry.java b/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListEntry.java deleted file mode 100644 index adf09ee..0000000 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListEntry.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.portingdeadmods.researchd.client.screens.list; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; -import com.portingdeadmods.researchd.api.research.ResearchInstance; -import com.portingdeadmods.researchd.utils.researches.ResearchHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.chat.Component; - -import java.util.Objects; - -public class TechListEntry extends AbstractWidget { - public static final int WIDTH = 20; - public static final int HEIGHT = 24; - - private ResearchInstance research; - - public TechListEntry(ResearchInstance research, int x, int y) { - super(x, y, WIDTH, HEIGHT, Component.empty()); - this.research = research; - } - - public ResearchInstance getResearch() { - return research; - } - - public void setResearch(ResearchInstance research) { - this.research = research; - } - - @Override - public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - GuiUtils.drawImg(guiGraphics, getResearch().getResearchStatus().getSpriteTexture(), getX(), getY(), WIDTH, HEIGHT); - - RegistryAccess lookup = Minecraft.getInstance().level.registryAccess(); - guiGraphics.renderItem(ResearchHelper.getResearch(getResearch().getResearch(), lookup).icon().getDefaultInstance(), getX() + 2, getY() + 2); - - if (isHovered()) { - int color = -2130706433; - guiGraphics.fillGradient(RenderType.guiOverlay(), getX(), getY(), getX() + 20, getY() + 20, color, color, 0); - } - } - - public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick, int scale) { - if (this.visible) { - this.isHovered = guiGraphics.containsPointInScissor(mouseX, mouseY) - && mouseX >= this.getX() - && mouseY >= this.getY() - && mouseX < this.getX() + (this.width * scale) - && mouseY < this.getY() + (this.height * scale); - guiGraphics.blit(getResearch().getResearchStatus().getSpriteTexture(), getX(), getY(), WIDTH * scale, HEIGHT * scale, 0, 0, WIDTH, HEIGHT, WIDTH, HEIGHT); - - RegistryAccess lookup = Minecraft.getInstance().level.registryAccess(); - - PoseStack poseStack = guiGraphics.pose(); - - poseStack.pushPose(); - { - poseStack.scale(scale, scale, scale); - guiGraphics.renderItem(ResearchHelper.getResearch(getResearch().getResearch(), lookup).icon().getDefaultInstance(), getX() - scale / 2 - 3, getY() - (HEIGHT * scale) / (2 * scale) - 13); - } - poseStack.popPose(); - - if (isHovered()) { - int color = -2130706433; - guiGraphics.fillGradient(RenderType.guiOverlay(), getX(), getY(), getX() + 20 * scale, getY() + 20 * scale, color, color, 0); - } - } - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - this.research.setResearchStatus(EntryType.RESEARCHED); - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof TechListEntry entry)) return false; - return Objects.equals(research, entry.research); - } - - @Override - public int hashCode() { - return Objects.hashCode(research); - } - - public TechListEntry copy() { - return new TechListEntry(research.copy(), getX(), getY()); - } - -} diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListWidget.java index 4c18813..3cf1ccf 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListWidget.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/list/TechListWidget.java @@ -2,11 +2,12 @@ import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; import com.portingdeadmods.researchd.Researchd; +import com.portingdeadmods.researchd.api.research.ResearchInstance; import com.portingdeadmods.researchd.client.screens.ResearchScreen; +import com.portingdeadmods.researchd.client.screens.ResearchScreenWidget; import com.portingdeadmods.researchd.client.screens.queue.ResearchQueueWidget; import com.portingdeadmods.researchd.utils.researches.ResearchGraphCache; import com.portingdeadmods.researchd.utils.researches.data.TechList; -import com.portingdeadmods.researchd.utils.researches.TechListHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; @@ -19,7 +20,7 @@ import java.util.function.Consumer; -public class TechListWidget extends AbstractWidget { +public class TechListWidget extends ResearchScreenWidget { private static final ResourceLocation SCROLLER_SPRITE = ResourceLocation.withDefaultNamespace("container/creative_inventory/scroller"); private static final int SCROLLER_WIDTH = 12; private static final int SCROLLER_HEIGHT = 15; @@ -40,10 +41,10 @@ public class TechListWidget extends AbstractWidget { private final ResearchScreen screen; public TechListWidget(ResearchScreen screen, int x, int y, int cols) { - super(x, y, BACKGROUND_WIDTH, BACKGROUND_HEIGHT, Component.empty()); + super(x, y, BACKGROUND_WIDTH, BACKGROUND_HEIGHT); this.cols = cols; int padding = 15; - int scrollerX = getX() + cols * TechListEntry.WIDTH + padding; + int scrollerX = getX() + cols * ResearchScreenWidget.PANEL_WIDTH + padding; this.searchButton = new ImageButton(scrollerX, y + 5, 14, 14, new WidgetSprites( Researchd.rl("search_button"), @@ -59,10 +60,6 @@ public TechListWidget(ResearchScreen screen, int x, int y, int cols) { public void setTechList(TechList techList) { this.techList = techList; - - int paddingX = 12 + getX(); - int paddingY = 24 + getY(); - TechListHelper.setEntryCoordinates(this.techList, 7, paddingX, paddingY); } public void onSearchButtonClicked(Button button) { @@ -71,30 +68,26 @@ public void onSearchButtonClicked(Button button) { public void onStartResearchButtonClicked(Button button) { ResearchQueueWidget queue = this.screen.getResearchQueue(); - queue.addEntry(this.screen.getSelectedResearchWidget().getEntry()); + queue.getQueue().add(this.screen.getSelectedResearchWidget().getInstance()); } @Override protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float v) { GuiUtils.drawImg(guiGraphics, hasSearchBar ? BACKGROUND_TEXTURE_SEARCH_BAR : BACKGROUND_TEXTURE, getX(), getY(), BACKGROUND_WIDTH, BACKGROUND_HEIGHT); - int col = 0; - int row = 0; - for (TechListEntry entry : this.techList.entries()) { - int paddingY = 24; - entry.setY(paddingY + getY() + (row - curRow) * TechListEntry.HEIGHT); - entry.render(guiGraphics, mouseX, mouseY, v); - if (col < cols) { - col++; - } else { - col = 0; - row++; + int paddingX = 12; + int paddingY = 24; + + for (int y = curRow; y < DISPLAY_ROWS; y++) { + for (int x = 0; x < this.cols; x++) { + int index = y * this.cols + x; + if (index < this.techList.entries().size()) { + renderResearchPanel(guiGraphics, this.techList.entries().get(index), paddingX + getX() + x * PANEL_WIDTH, paddingY + getY() + y * PANEL_HEIGHT, mouseX, mouseY); + } } } - int padding = 16; - int paddingY = 24; - int scrollerX = getX() + cols * TechListEntry.WIDTH + padding; + int scrollerX = getX() + cols * ResearchScreenWidget.PANEL_WIDTH + paddingX + 4; guiGraphics.blitSprite(SCROLLER_SPRITE, scrollerX, getY() + paddingY, SCROLLER_WIDTH, SCROLLER_HEIGHT); } @@ -109,35 +102,26 @@ public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, doubl public boolean mouseClicked(double mouseX, double mouseY, int button) { int paddingX = getX() + 12; int paddingY = 24 + getY(); - if (mouseX > paddingX && mouseX < paddingX + this.cols * TechListEntry.WIDTH - && mouseY > paddingY && mouseY < paddingY + DISPLAY_ROWS * TechListEntry.HEIGHT) { - int indexX = ((int) mouseX - paddingX) / TechListEntry.WIDTH; - int indexY = ((int) mouseY - paddingY) / TechListEntry.HEIGHT; + if (mouseX > paddingX && mouseX < paddingX + this.cols * ResearchScreenWidget.PANEL_WIDTH + && mouseY > paddingY && mouseY < paddingY + DISPLAY_ROWS * ResearchScreenWidget.PANEL_HEIGHT) { + int indexX = ((int) mouseX - paddingX) / ResearchScreenWidget.PANEL_WIDTH; + int indexY = ((int) mouseY - paddingY) / ResearchScreenWidget.PANEL_HEIGHT; if (Math.floor((double) this.techList.entries().size() / this.cols) >= indexY && this.techList.entries().size() % this.cols > indexX) { - TechListEntry entry = this.techList.entries().get(indexY * this.cols + indexX); - this.screen.getResearchGraphWidget().setGraph(ResearchGraphCache.computeIfAbsent(Minecraft.getInstance().player, entry.getResearch().getResearch())); - this.screen.getSelectedResearchWidget().setEntry(entry); + ResearchInstance instance = this.techList.entries().get(indexY * this.cols + indexX); + this.screen.getResearchGraphWidget().setGraph(ResearchGraphCache.computeIfAbsent(Minecraft.getInstance().player, instance.getResearch())); + this.screen.getSelectedResearchWidget().setSelectedResearch(instance); } } return false; } - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { - - } - @Override public void visitWidgets(Consumer consumer) { super.visitWidgets(consumer); consumer.accept(this.searchButton); consumer.accept(this.startResearchButton); } - - public TechList getTechList() { - return techList; - } } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/queue/QueueEntryWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/queue/QueueEntryWidget.java deleted file mode 100644 index ffea1ba..0000000 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/queue/QueueEntryWidget.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.portingdeadmods.researchd.client.screens.queue; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.portingdeadmods.researchd.Researchd; -import com.portingdeadmods.researchd.api.research.Research; -import com.portingdeadmods.researchd.api.research.ResearchInstance; -import com.portingdeadmods.researchd.client.screens.ResearchScreen; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import com.portingdeadmods.researchd.utils.researches.data.ResearchQueue; -import com.portingdeadmods.researchd.utils.researches.data.TechList; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.resources.ResourceKey; -import net.minecraft.util.FastColor; - -public class QueueEntryWidget extends AbstractWidget { - private ResearchScreen screen; - private ResearchQueue queue; - private final TechListEntry queueEntry; - private final int index; - - public QueueEntryWidget(ResearchScreen screen, TechListEntry queueEntry, int x, int y, int index) { - super(x, y, TechListEntry.WIDTH, TechListEntry.HEIGHT, CommonComponents.EMPTY); - this.queueEntry = queueEntry.copy(); - this.queueEntry.setX(x); - this.queueEntry.setY(y); - this.index = index; - this.screen = screen; - } - - public void setQueue(ResearchQueue queue) { - this.queue = queue; - } - - @Override - protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float v) { - this.queueEntry.renderWidget(guiGraphics, mouseX, mouseY, v); - - if (this.isHovering(guiGraphics, mouseX, mouseY, getX(), getY() + 17, getWidth(), getHeight() - 17)) { - Font font = Minecraft.getInstance().font; - - int color = FastColor.ARGB32.color(120, 90, 90, 90); - guiGraphics.fillGradient(getX(), getY() + 17, getX() + getWidth(), getY() + getHeight(), color, color); - - PoseStack poseStack = guiGraphics.pose(); - - poseStack.pushPose(); - { - poseStack.translate(0, 0, 1000); - guiGraphics.drawString(font, "x", getX() + 10 - (font.width("x") / 2), getY() + 16, -1, false); - } - poseStack.popPose(); - } - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (this.isHovering(null, (int) mouseX, (int) mouseY, getX(), getY() + 17, getWidth(), getHeight() - 17)) { - Researchd.LOGGER.debug("removing"); - this.screen.getResearchQueue().removeResearch(index); - return super.mouseClicked(mouseX, mouseY, button); - } else if (this.isHovered()) { - this.screen.getSelectedResearchWidget().setEntry(this.getEntry()); - return super.mouseClicked(mouseX, mouseY, button); - } - return false; - } - - public boolean isHovering(GuiGraphics guiGraphics, int mouseX, int mouseY, int x, int y, int width, int height) { - return (guiGraphics == null || - guiGraphics.containsPointInScissor(mouseX, mouseY)) - && mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; - } - - public TechListEntry getEntry() { - return this.queueEntry; - } - - public ResourceKey getResearch() { - return this.queueEntry.getResearch().getResearch(); - } - - public ResearchInstance getResearchInstance() { - return this.queueEntry.getResearch(); - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { - } -} diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/queue/ResearchQueueWidget.java b/src/main/java/com/portingdeadmods/researchd/client/screens/queue/ResearchQueueWidget.java index 120df8f..b7e40c8 100644 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/queue/ResearchQueueWidget.java +++ b/src/main/java/com/portingdeadmods/researchd/client/screens/queue/ResearchQueueWidget.java @@ -1,167 +1,103 @@ package com.portingdeadmods.researchd.client.screens.queue; +import com.mojang.blaze3d.vertex.PoseStack; import com.portingdeadmods.portingdeadlibs.utils.renderers.GuiUtils; import com.portingdeadmods.researchd.Researchd; +import com.portingdeadmods.researchd.api.research.ResearchInstance; import com.portingdeadmods.researchd.client.screens.ResearchScreen; -import com.portingdeadmods.researchd.client.screens.list.EntryType; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import com.portingdeadmods.researchd.client.screens.widgets.QueueControllsButton; +import com.portingdeadmods.researchd.client.screens.ResearchScreenWidget; import com.portingdeadmods.researchd.utils.researches.data.ResearchQueue; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.ImageButton; -import net.minecraft.client.gui.components.WidgetSprites; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FastColor; -import java.util.ArrayList; import java.util.List; -public class ResearchQueueWidget extends AbstractWidget { +public class ResearchQueueWidget extends ResearchScreenWidget { private static final ResourceLocation BACKGROUND_TEXTURE = Researchd.rl("textures/gui/research_queue.png"); private static final int BACKGROUND_WIDTH = 174; private static final int BACKGROUND_HEIGHT = 42; - private final List widgetQueue; - private final ResearchQueue queue; private final ResearchScreen screen; - - public ImageButton leftButton; - public ImageButton rightButton; - public ImageButton removeButton; + private final ResearchQueue queue; public ResearchQueueWidget(ResearchScreen screen, int x, int y) { - super(x, y, BACKGROUND_WIDTH, BACKGROUND_HEIGHT, Component.empty()); + super(x, y, BACKGROUND_WIDTH, BACKGROUND_HEIGHT); this.screen = screen; - this.widgetQueue = new ArrayList<>(); - setLeftButton(-1); - setRightButton(-1); - setRemoveButton(-1); this.queue = new ResearchQueue(); } - public void addEntry(TechListEntry entry) { - if (this.widgetQueue.size() >= 7) return; - if (entry.getResearch().getResearchStatus() == EntryType.RESEARCHED) return; - - for (QueueEntryWidget e : this.widgetQueue) { - if (e.getResearch().equals(entry.getResearch().getResearch())) return; - } - - int index = this.queue.entries().size(); - QueueEntryWidget widget = new QueueEntryWidget(this.screen, entry, 12 + this.widgetQueue.size() * TechListEntry.WIDTH, 17, index); - this.queue.add(entry.getResearch()); - this.widgetQueue.add(widget); - widget.setQueue(this.queue); - } - - public void removeEntry(int index) { - System.out.println("Removing entry at index: " + index); - List copy = new ArrayList<>(this.widgetQueue); - - this.widgetQueue.clear(); - copy.remove(index); - - for (QueueEntryWidget entry : copy) { - addEntry(entry.getEntry()); - } - } - - public void moveEntry(int index, boolean left) { - if (left && index == 0) return; - if (!left && index == this.widgetQueue.size() - 1) return; - - if (!left) index++; - - String direction = left ? "left" : "right"; - System.out.println("Moving entry at index " + index + " to the " + direction); - - List copy = new ArrayList<>(this.widgetQueue); - - QueueEntryWidget entry1 = copy.get(index - 1); - QueueEntryWidget entry2 = copy.get(index); - - copy.set(index - 1, entry2); - copy.set(index, entry1); - - this.widgetQueue.clear(); - for (QueueEntryWidget entry : copy) { - addEntry(entry.getEntry()); - } - } - @Override - protected void renderWidget(GuiGraphics guiGraphics, int i, int i1, float v) { + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float v) { GuiUtils.drawImg(guiGraphics, BACKGROUND_TEXTURE, getX(), getY(), width, height); - for (QueueEntryWidget entry : this.widgetQueue) { - entry.render(guiGraphics, i, i1, v); - } - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + int paddingX = 12; + int paddingY = 17; + List entries = this.queue.entries(); + for (int i = 0; i < entries.size(); i++) { + renderQueuePanel(guiGraphics, entries.get(i), paddingX + i * PANEL_WIDTH, paddingY, mouseX, mouseY); + } } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - for (QueueEntryWidget widget : this.widgetQueue) { - if (widget.isHovered()) { - return widget.mouseClicked(mouseX, mouseY, button); + int paddingX = 12; + int paddingY = 17; + + int index = (int) (mouseX - paddingX) / PANEL_WIDTH; + if (mouseX > paddingX && mouseY > paddingY && index < this.queue.entries().size()) { + ResearchInstance instance = this.queue.entries().get(index); + if (this.isHovering(null, (int) mouseX, (int) mouseY, index, paddingY + 17, getWidth(), getHeight() - 17)) { + Researchd.LOGGER.debug("removing"); + this.screen.getResearchQueue().removeResearch(index); + return super.mouseClicked(mouseX, mouseY, button); + } else if (isHovering(null, index, paddingY, (int) mouseX, (int) mouseY)) { + this.screen.getSelectedResearchWidget().setSelectedResearch(instance); + return super.mouseClicked(mouseX, mouseY, button); } } + return false; } public void removeResearch(int index) { if (this.queue.entries().size() > index) { this.queue.remove(index); - this.widgetQueue.remove(index); } } - private void setLeftButton(int index) { - System.out.println("Setting left button to index: " + index); - if (index == -1) { - this.leftButton = new QueueControllsButton(index, "left", 12 + index * TechListEntry.WIDTH, 17, 0, 0, new WidgetSprites( - Researchd.rl("left_button"), - Researchd.rl("left_button_highlighted") - ), button -> moveEntry(index, true), CommonComponents.EMPTY); + private void renderQueuePanel(GuiGraphics guiGraphics, ResearchInstance instance, int x, int y, int mouseX, int mouseY) { + if (instance == null) return; + + renderResearchPanel(guiGraphics, instance, x, y, mouseX, mouseY, false); + + if (this.isHovering(guiGraphics, mouseX, mouseY, x, y + 17, PANEL_WIDTH, PANEL_HEIGHT - 17)) { + Font font = Minecraft.getInstance().font; + + int color = FastColor.ARGB32.color(120, 90, 90, 90); + guiGraphics.fillGradient(x, y + 17, x + PANEL_WIDTH, y + PANEL_HEIGHT, color, color); + + PoseStack poseStack = guiGraphics.pose(); + + poseStack.pushPose(); + { + poseStack.translate(0, 0, 1000); + guiGraphics.drawString(font, "x", x + 10 - (font.width("x") / 2), y + 16, -1, false); + } + poseStack.popPose(); } - this.leftButton = new QueueControllsButton(index, "left", 12 + index * TechListEntry.WIDTH, 17 + TechListEntry.HEIGHT + 2, 7, 4, new WidgetSprites( - Researchd.rl("left_button"), - Researchd.rl("left_button_highlighted") - ), button -> moveEntry(index, true), CommonComponents.EMPTY); } - private void setRightButton(int index) { - System.out.println("Setting right button to index: " + index); - if (index == -1) { - this.rightButton = new QueueControllsButton(index, "right", 12 + index * TechListEntry.WIDTH + 16, 17, 0, 0, new WidgetSprites( - Researchd.rl("right_button"), - Researchd.rl("right_button_highlighted") - ), button -> moveEntry(index, false), CommonComponents.EMPTY); - } - this.rightButton = new QueueControllsButton(index, "right", 12 + index * TechListEntry.WIDTH + 7 + 4 + 2, 17 + TechListEntry.HEIGHT + 2, 7, 4, new WidgetSprites( - Researchd.rl("right_button"), - Researchd.rl("right_button_highlighted") - ), button -> moveEntry(index, false), CommonComponents.EMPTY); + private boolean isHovering(GuiGraphics guiGraphics, int mouseX, int mouseY, int x, int y, int width, int height) { + return (guiGraphics == null || + guiGraphics.containsPointInScissor(mouseX, mouseY)) + && mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; } - private void setRemoveButton(int index) { - System.out.println("Setting remove button to index: " + index); - if (index == -1) { - this.removeButton = new QueueControllsButton(index, "remove", 12 + index * TechListEntry.WIDTH + 32, 17, 0, 0, new WidgetSprites( - Researchd.rl("remove_button"), - Researchd.rl("remove_button_highlighted") - ), button -> removeEntry(index), CommonComponents.EMPTY); - } - this.removeButton = new QueueControllsButton(index, "remove", 12 + index * TechListEntry.WIDTH + 7 + 1, 17 + TechListEntry.HEIGHT + 2, 4, 4, new WidgetSprites( - Researchd.rl("remove_button"), - Researchd.rl("remove_button_highlighted") - ), button -> removeEntry(index), CommonComponents.EMPTY); + public ResearchQueue getQueue() { + return queue; } } diff --git a/src/main/java/com/portingdeadmods/researchd/client/screens/widgets/QueueControllsButton.java b/src/main/java/com/portingdeadmods/researchd/client/screens/widgets/QueueControllsButton.java deleted file mode 100644 index 7991f27..0000000 --- a/src/main/java/com/portingdeadmods/researchd/client/screens/widgets/QueueControllsButton.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.portingdeadmods.researchd.client.screens.widgets; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.ImageButton; -import net.minecraft.client.gui.components.WidgetSprites; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public class QueueControllsButton extends ImageButton { - protected final WidgetSprites sprites; - private final int index; - private final String type; - - public QueueControllsButton(int index, String type, int x, int y, int width, int height, WidgetSprites sprites, Button.OnPress onPress, Component message) { - super(x, y, width, height, sprites, onPress, message); - this.index = index; - this.type = type; - this.sprites = sprites; - } - - public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - ResourceLocation resourcelocation = this.sprites.get(this.isActive(), this.isHoveredOrFocused()); - guiGraphics.blitSprite(resourcelocation, this.getX(), this.getY(), this.width, this.height); - } - - public int getIndex() { - return this.index; - } - - public String getType() { - return this.type; - } -} diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/ClientResearchCache.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/ClientResearchCache.java index bfdfd14..63f145d 100644 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/ClientResearchCache.java +++ b/src/main/java/com/portingdeadmods/researchd/utils/researches/ClientResearchCache.java @@ -30,7 +30,7 @@ public static void initialize(Player player) { // Add next nodes for (ResearchNode node : NODES) { - List> parents = ResearchHelper.getResearch(node.getResearch().getResearch(), registryAccess).parents(); + List> parents = ResearchHelper.getResearch(node.getInstance().getResearch(), registryAccess).parents(); for (ResourceKey parentResearch : parents) { ResearchNode parentNode = getNodeByResearch(parentResearch); @@ -74,7 +74,7 @@ public static void setCoordinate(Set remaining, ResearchNode node, public static ResearchNode getNodeByResearch(ResourceKey research) { for (ResearchNode node : NODES) { - if (node.getResearch().getResearch().compareTo(research) == 0) { + if (node.getInstance().getResearch().compareTo(research) == 0) { return node; } } diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/ResearchHelper.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/ResearchHelper.java index 079efbe..189b678 100644 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/ResearchHelper.java +++ b/src/main/java/com/portingdeadmods/researchd/utils/researches/ResearchHelper.java @@ -6,8 +6,7 @@ import com.portingdeadmods.researchd.api.capabilties.ResearchdCapabilities; import com.portingdeadmods.researchd.api.research.Research; import com.portingdeadmods.researchd.api.research.ResearchInstance; -import com.portingdeadmods.researchd.client.screens.graph.ResearchNode; -import com.portingdeadmods.researchd.client.screens.list.EntryType; +import com.portingdeadmods.researchd.api.research.ResearchStatus; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistryAccess; @@ -34,7 +33,7 @@ public static void initResearches(Player player) { Researchd.LOGGER.debug("level: {}", levelResearches); levelResearches.removeAll(playerResearches); for (Holder research : levelResearches) { - capability.addResearch(new ResearchInstance(research.getKey(), EntryType.LOCKED)); + capability.addResearch(new ResearchInstance(research.getKey(), ResearchStatus.LOCKED)); } Researchd.LOGGER.debug("player: {}", player.getCapability(ResearchdCapabilities.ENTITY).researches()); } diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/TechListHelper.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/TechListHelper.java deleted file mode 100644 index bd2556f..0000000 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/TechListHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.portingdeadmods.researchd.utils.researches; - -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; -import com.portingdeadmods.researchd.utils.researches.data.TechList; - -public class TechListHelper { - public static void setEntryCoordinates(TechList list, int cols, int paddingX, int paddingY) { - int col = 0; - int row = 0; - for (TechListEntry entry : list.entries()) { - entry.setX(paddingX + col * TechListEntry.WIDTH); - entry.setY(paddingY + row * TechListEntry.HEIGHT); - if (col < cols) { - col++; - } else { - col = 0; - row++; - } - } - } -} diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchGraph.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchGraph.java index afab1f5..c67ca0a 100644 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchGraph.java +++ b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchGraph.java @@ -33,7 +33,7 @@ public static ResearchGraph fromRootNode(Player player, ResearchNode rootNode) { Set researches = capability.researches(); RegistryAccess lookup = player.registryAccess(); - Holder researchHolder = lookup.holderOrThrow(rootNode.getResearch().getResearch()); + Holder researchHolder = lookup.holderOrThrow(rootNode.getInstance().getResearch()); Set parents = new HashSet<>(); diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchQueue.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchQueue.java index 7beb9bb..346184d 100644 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchQueue.java +++ b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/ResearchQueue.java @@ -1,18 +1,19 @@ package com.portingdeadmods.researchd.utils.researches.data; import com.mojang.serialization.Codec; -import com.portingdeadmods.portingdeadlibs.utils.codec.CodecUtils; import com.portingdeadmods.researchd.api.research.ResearchInstance; -import io.netty.buffer.ByteBuf; +import com.portingdeadmods.researchd.api.research.ResearchStatus; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; -public record ResearchQueue(List entries) { +public record ResearchQueue(List entries) implements Iterable { public static final ResearchQueue EMPTY = new ResearchQueue(Collections.emptyList()); public static final Codec CODEC = ResearchInstance.CODEC.listOf().xmap(ResearchQueue::new, ResearchQueue::entries); public static final StreamCodec STREAM_CODEC = ResearchInstance.STREAM_CODEC.apply(ByteBufCodecs.list()).map(ResearchQueue::new, ResearchQueue::entries); @@ -43,6 +44,12 @@ public boolean increasePriority(int index) { * @return whether it was possible to add the element to the queue */ public boolean add(ResearchInstance researchInstance) { + if (researchInstance.getResearchStatus() == ResearchStatus.RESEARCHED) return false; + + for (ResearchInstance instance : this.entries) { + if (instance.getResearch().equals(researchInstance.getResearch())) return false; + } + if (this.entries.size() < QUEUE_LENGTH) { this.entries.add(researchInstance); return true; @@ -62,4 +69,8 @@ public boolean remove(int index) { return false; } + @Override + public @NotNull Iterator iterator() { + return entries.stream().iterator(); + } } diff --git a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/TechList.java b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/TechList.java index 0719198..190f7e3 100644 --- a/src/main/java/com/portingdeadmods/researchd/utils/researches/data/TechList.java +++ b/src/main/java/com/portingdeadmods/researchd/utils/researches/data/TechList.java @@ -1,8 +1,8 @@ package com.portingdeadmods.researchd.utils.researches.data; -import com.portingdeadmods.researchd.client.screens.list.TechListEntry; +import com.portingdeadmods.researchd.api.research.ResearchInstance; import java.util.List; -public record TechList(List entries) { +public record TechList(List entries) { }