Skip to content

Commit

Permalink
wip graph
Browse files Browse the repository at this point in the history
  • Loading branch information
Thepigcat76 committed Jan 12, 2025
1 parent bfa2d8f commit 4f85bc2
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
// 1.21.1 2025-01-12T01:35:51.697973695 Registries
a2254160c3b757cc65c156058b73a4d7fcfee7af data/researchd/researchd/research/example.json
// 1.21.1 2025-01-12T11:42:27.249407057 Registries
1c90d9b45c6886c69a5e05f3b5b8f43ed409246f data/researchd/researchd/research/coal.json
5675612b592e247a9090712849c235fedca9bcc8 data/researchd/researchd/research/copper.json
9228586f51e932a81cbe989082a1395abf460d5e data/researchd/researchd/research/stick.json
5d59ad6b8434e563bab7b543ab6e1b90e1dc5bfc data/researchd/researchd/research/stone.json
19ef9527cf9f4017e6f1abe9717cbb27ee522af9 data/researchd/researchd/research/wood.json
aa3e8393680f785192c41c83fc3f389967312dfc data/researchd/researchd/research/wooden_pickaxe.json
1cdd93f8a6bb79a07d1657ef616b5bd4fbdb247d data/researchd/researchd/research_pack/end.json
89ac98c63d706e87b221fe288b9947b8018976ca data/researchd/researchd/research_pack/nether.json
f077b1491836c0ad25f25653e259fb15df317440 data/researchd/researchd/research_pack/overworld.json

This file was deleted.

4 changes: 2 additions & 2 deletions src/main/java/com/portingdeadmods/researchd/Researchd.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ private void registerRegistries(NewRegistryEvent event) {
}

private void registerDatapackRegistries(DataPackRegistryEvent.NewRegistry event) {
event.dataPackRegistry(ResearchdRegistries.RESEARCH_KEY, Research.CODEC);
event.dataPackRegistry(ResearchdRegistries.RESEARCH_PACK_KEY, ResearchPack.CODEC);
event.dataPackRegistry(ResearchdRegistries.RESEARCH_KEY, Research.CODEC, Research.CODEC);
event.dataPackRegistry(ResearchdRegistries.RESEARCH_PACK_KEY, ResearchPack.CODEC, ResearchPack.CODEC);
}

public static ResourceLocation rl(String path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class ResearchdRegistries {
public static final ResourceKey<Registry<ResearchPredicateSerializer<?>>> RESEARCH_PREDICATE_SERIALIZER_KEY =
ResourceKey.createRegistryKey(Researchd.rl("research_predicate_serializer"));

public static final Registry<ResearchSerializer<?>> RESEARCH_SERIALIZER = new RegistryBuilder<>(RESEARCH_SERIALIZER_KEY).create();
public static final Registry<ResearchSerializer<?>> RESEARCH_SERIALIZER = new RegistryBuilder<>(RESEARCH_SERIALIZER_KEY).sync(true).create();
public static final Registry<ResearchPackSerializer<?>> RESEARCH_PACK_SERIALIZER = new RegistryBuilder<>(RESEARCH_PACK_SERIALIZER_KEY).create();
public static final Registry<ResearchPredicateSerializer<?>> RESEARCH_PREDICATE_SERIALIZER = new RegistryBuilder<>(RESEARCH_PREDICATE_SERIALIZER_KEY).create();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.Item;

import java.util.List;
import java.util.Map;
import java.util.Optional;

Expand All @@ -28,7 +29,7 @@ public interface Research {
/**
* @return An {@link Optional} {@link ResourceKey} which represents the parent of this research.
*/
Optional<ResourceKey<Research>> parent();
List<ResourceKey<Research>> parents();

/**
* @return whether the parent needs to researched to research this research
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.portingdeadmods.researchd.client;

import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.ResearchdRegistries;
import com.portingdeadmods.researchd.api.research.Research;
import com.portingdeadmods.researchd.client.screens.graph.ResearchNode;
import com.portingdeadmods.researchd.registries.Researches;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.level.Level;

import java.util.*;

public class ResearchManager {
private Set<Holder<Research>> researches = new HashSet<>();
private Set<ResearchNode> nodes = new HashSet<>();
private Set<ResearchNode> rootNodes;

public ResearchManager(Level level) {
RegistryAccess registryAccess = level.registryAccess();
HolderLookup.RegistryLookup<Research> registry = registryAccess.lookupOrThrow(ResearchdRegistries.RESEARCH_KEY);

// Collect researches
registry.listElements().forEach(research -> {
this.researches.add(research);
this.nodes.add(new ResearchNode(research));
});

for (ResearchNode node : this.nodes) {
List<Holder<Research>> parents = node.getHolder().value().parents().stream()
.map(registryAccess::holderOrThrow).toList();

for (Holder<Research> parentResearch : parents) {
ResearchNode parentNode = getNodeByResearch(parentResearch);
if (parentNode != null) {
parentNode.addNext(node);
}
}
}

Set<ResearchNode> referencedNodes = new HashSet<>();
for (ResearchNode node : this.nodes) {
referencedNodes.addAll(node.getNext());
}

HashSet<ResearchNode> researchNodesCopy = new HashSet<>(this.nodes);
researchNodesCopy.removeAll(referencedNodes);

this.rootNodes = new HashSet<>(researchNodesCopy);
}

public void setCoordinates(int paddingX, int paddingY) {
int i = 0;
for (ResearchNode node : this.rootNodes) {
Researchd.LOGGER.debug("root: {}", node.getHolder().getKey().location());
setCoordinate(node, paddingX + i * 40, paddingY, 0);
i++;
}
}

public void setCoordinate(ResearchNode node, int x, int y, int nesting) {
Researchd.LOGGER.debug("node: {}, nesting: {}", node.getHolder().getKey().location(), nesting);
node.setX(x);
node.setY(y);
Researchd.LOGGER.debug("y: {}", y);
List<ResearchNode> next = node.getNext();
for (int i = 0; i < next.size(); i++) {
ResearchNode nextNode = next.get(i);
int newNesting = nesting + 1;
setCoordinate(nextNode, x + i * 30, y + newNesting * 30, newNesting + 1);
}
}

public ResearchNode getNodeByResearch(Holder<Research> research) {
for (ResearchNode node : nodes) {
if (node.getHolder().is(research.getKey())) {
return node;
}
}
return null;
}

public Set<ResearchNode> getNodes() {
return nodes;
}

public Set<Holder<Research>> getResearches() {
return researches;
}

public Set<ResearchNode> getRootNodes() {
return rootNodes;
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
package com.portingdeadmods.researchd.client.screens;

import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.api.research.Research;
import com.portingdeadmods.researchd.client.ResearchManager;
import com.portingdeadmods.researchd.client.screens.graph.ResearchGraph;
import com.portingdeadmods.researchd.client.screens.graph.ResearchNode;
import com.portingdeadmods.researchd.client.screens.list.EntryType;
import com.portingdeadmods.researchd.client.screens.list.TechList;
import com.portingdeadmods.researchd.client.screens.list.TechListEntry;
import com.portingdeadmods.researchd.client.screens.queue.ResearchQueue;
import com.portingdeadmods.researchd.impl.research.SimpleResearch;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.components.StringWidget;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Items;

import java.util.List;
import java.util.Map;
import java.util.Optional;

public class ResearchScreen extends Screen {
public static final ResourceLocation BACKGROUND_TEXTURE = Researchd.rl("textures/gui/research_screen.png");
Expand All @@ -39,13 +24,16 @@ public ResearchScreen() {
this.techList.fillList();
this.researchQueue = new ResearchQueue(0, 0);
this.researchQueue.fillList();
int width = Minecraft.getInstance().getWindow().getGuiScaledWidth();
Minecraft mc = Minecraft.getInstance();
int width = mc.getWindow().getGuiScaledWidth();
Researchd.LOGGER.debug("Width: {}", width);
int x = 174;
this.researchGraph = new ResearchGraph(x, 0, 300, 253);
ResearchNode node = new ResearchNode(SimpleResearch.debug(Items.IRON_NUGGET), EntryType.RESEARCHED, x + 60, 60);
this.researchGraph.setNode(node);
node.addNext(new ResearchNode(SimpleResearch.debug(Items.IRON_BARS), EntryType.RESEARCHABLE, x + 70, 100));
ResearchManager manager = new ResearchManager(mc.level);
manager.setCoordinates(174, 10);
this.researchGraph = new ResearchGraph(manager, x, 0, 300, 253);
//ResearchNode node = new ResearchNode(SimpleResearch.debug(Items.IRON_NUGGET), EntryType.RESEARCHED, x + 60, 60);
//this.researchGraph.setNode(node);
//node.addNext(new ResearchNode(SimpleResearch.debug(Items.IRON_BARS), EntryType.RESEARCHABLE, x + 70, 100));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
package com.portingdeadmods.researchd.client.screens.graph;

import com.portingdeadmods.researchd.client.ResearchManager;
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 org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ResearchGraph extends AbstractWidget {
private @Nullable ResearchNode node;
private final List<ResearchNode> nodes;
private Set<ResearchNode> rootNodes;
private Set<ResearchNode> nodes;

public ResearchGraph(int x, int y, int width, int height) {
super(x, y, width, height, Component.empty());
this.nodes = new ArrayList<>();
this.nodes = new HashSet<>();
this.rootNodes = new HashSet<>();
}

public void setNode(@Nullable ResearchNode node) {
this.node = node;
public ResearchGraph(ResearchManager manager, int x, int y, int width, int height) {
super(x, y, width, height, Component.empty());
this.nodes = manager.getNodes();
this.rootNodes = manager.getRootNodes();
}

@Override
protected void renderWidget(GuiGraphics guiGraphics, int i, int i1, float v) {
if (node != null) {
for (ResearchNode node : this.rootNodes) {
renderNode(node, guiGraphics, i, i1, v);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,25 @@
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 java.util.ArrayList;
import java.util.List;

public class ResearchNode extends TechListEntry {
private final List<ResearchNode> next;
private final Holder<Research> holder;

public ResearchNode(Research research, EntryType type, int x, int y) {
super(research, type, x, y);
public ResearchNode(Holder<Research> research) {
super(research.value(), EntryType.LOCKED, 0, 0);
this.next = new ArrayList<>();
this.holder = research;
}

public Holder<Research> getHolder() {
return holder;
}

public void addNext(ResearchNode next) {
Expand All @@ -31,4 +39,12 @@ public void removeNext(ResearchNode toRemove) {
public List<ResearchNode> getNext() {
return next;
}

@Override
public String toString() {
return "ResearchNode{" +
"next=" + next +
", holder=" + holder +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;

import java.util.Objects;

public class TechListEntry extends AbstractWidget {
public static final int WIDTH = 20;
public static final int HEIGHT = 24;
Expand Down Expand Up @@ -57,4 +59,15 @@ protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, flo
@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) && type == entry.type;
}

@Override
public int hashCode() {
return Objects.hash(research, type);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,16 @@
import net.minecraft.world.level.ItemLike;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.*;

// TODO: Change icon to Ingredient
public record SimpleResearch(Item icon, Map<ResourceKey<ResearchPack>, Integer> researchPoints, Optional<ResourceKey<Research>> parent, boolean requiresParent) implements Research {
public record SimpleResearch(Item icon, Map<ResourceKey<ResearchPack>, Integer> researchPoints,
List<ResourceKey<Research>> parents, boolean requiresParent) implements Research {
public static SimpleResearch debug(ItemLike icon) {
return new SimpleResearch(icon.asItem(), Map.of(), Optional.empty(), false);
return new SimpleResearch(icon.asItem(), Map.of(), Collections.emptyList(), false);
}

private static SimpleResearch fromStringMap(Item icon, Map<String, Integer> researchPoints, Optional<ResourceKey<Research>> parent, boolean requiresParent) {
private static SimpleResearch fromStringMap(Item icon, Map<String, Integer> researchPoints, List<ResourceKey<Research>> parent, boolean requiresParent) {
Map<ResourceKey<ResearchPack>, Integer> map = new HashMap<>();
for (Map.Entry<String, Integer> researchPoint : researchPoints.entrySet()) {
ResourceKey<ResearchPack> researchPack = ResourceKey.create(ResearchdRegistries.RESEARCH_PACK_KEY, ResourceLocation.parse(researchPoint.getKey()));
Expand All @@ -51,12 +50,23 @@ public ResearchSerializer<?> getSerializer() {
return Serializer.INSTANCE;
}

@Override
public boolean equals(Object o) {
if (!(o instanceof SimpleResearch that)) return false;
return requiresParent == that.requiresParent && Objects.equals(icon, that.icon) && Objects.equals(parents, that.parents) && Objects.equals(researchPoints, that.researchPoints);
}

@Override
public int hashCode() {
return Objects.hash(icon, researchPoints, parents, requiresParent);
}

public static class Serializer implements ResearchSerializer<SimpleResearch> {
public static final Serializer INSTANCE = new Serializer();
public static final MapCodec<SimpleResearch> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
CodecUtils.registryCodec(BuiltInRegistries.ITEM).fieldOf("icon").forGetter(SimpleResearch::icon),
Codec.unboundedMap(Codec.STRING, Codec.INT).fieldOf("research_points").forGetter(SimpleResearch::getStringMap),
ExtraCodecs.optionalEmptyMap(Research.RESOURCE_KEY_CODEC).fieldOf("parent").forGetter(SimpleResearch::parent),
Research.RESOURCE_KEY_CODEC.listOf().fieldOf("parents").forGetter(SimpleResearch::parents),
Codec.BOOL.fieldOf("requires_parent").forGetter(SimpleResearch::requiresParent)
).apply(instance, SimpleResearch::fromStringMap));

Expand All @@ -77,7 +87,7 @@ public StreamCodec<RegistryFriendlyByteBuf, SimpleResearch> streamCodec() {
public static class Builder implements Research.Builder<SimpleResearch> {
private Item icon = Items.AIR;
private Map<ResourceKey<ResearchPack>, Integer> researchPacks = Map.of();
private ResourceKey<Research> parent = null;
private List<ResourceKey<Research>> parents = Collections.emptyList();
private boolean requiresParent = false;

public static Builder of() {
Expand All @@ -97,8 +107,9 @@ public Builder researchPacks(Map<ResourceKey<ResearchPack>, Integer> researchPac
return this;
}

public Builder parent(@Nullable ResourceKey<Research> parent) {
this.parent = parent;
@SafeVarargs
public final Builder parents(ResourceKey<Research>... parents) {
this.parents = List.of(parents);
return this;
}

Expand All @@ -109,7 +120,7 @@ public Builder requiresParent(boolean requiresParent) {

@Override
public SimpleResearch build() {
return new SimpleResearch(this.icon, this.researchPacks, Optional.ofNullable(this.parent), this.requiresParent);
return new SimpleResearch(this.icon, this.researchPacks, this.parents, this.requiresParent);
}
}
}
Loading

0 comments on commit 4f85bc2

Please sign in to comment.