Skip to content

Commit

Permalink
research screen refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Thepigcat76 committed Jan 23, 2025
1 parent de5760d commit 186cf93
Show file tree
Hide file tree
Showing 18 changed files with 231 additions and 484 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -14,20 +12,20 @@
public final class ResearchInstance {
public static final Codec<ResearchInstance> 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<RegistryFriendlyByteBuf, ResearchInstance> 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> research;
private EntryType researchStatus;
private ResearchStatus researchStatus;

public ResearchInstance(ResourceKey<Research> research, EntryType researchStatus) {
public ResearchInstance(ResourceKey<Research> research, ResearchStatus researchStatus) {
this.research = research;
this.researchStatus = researchStatus;
}
Expand All @@ -36,16 +34,16 @@ public ResourceKey<Research> 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
Expand Down
Original file line number Diff line number Diff line change
@@ -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");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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);

}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -1,55 +1,46 @@
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<ResourceLocation, List<ResearchMethod>> 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<>();
}

@Override
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;
Expand All @@ -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<ResearchMethod> methods = ResearchHelper.getResearch(this.entry.getResearch().getResearch(), Minecraft.getInstance().level.registryAccess()).researchMethods();
List<ResearchMethod> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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<ResearchNode> 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<>();
}

Expand All @@ -37,10 +32,24 @@ public Set<ResearchNode> 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) {

}
}
Loading

0 comments on commit 186cf93

Please sign in to comment.