Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/com/buuz135/replication/Replication.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.buuz135.replication.block.*;
import com.buuz135.replication.block.tile.MatterPipeBlockEntity;
import com.buuz135.replication.block.tile.ReplicationMachine;
import com.buuz135.replication.calculation.ItemVariants;
import com.buuz135.replication.calculation.ReplicationCalculation;
import com.buuz135.replication.client.ClientEvents;
import com.buuz135.replication.container.ReplicationTerminalContainer;
Expand Down Expand Up @@ -210,6 +211,7 @@ protected void initModules() {
}
}).subscribe();

ItemVariants.init();
ReplicationCalculation.init();

if (ModList.get().isLoaded("guideme")) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.buuz135.replication.api;

import net.minecraft.world.item.Item;
import net.neoforged.bus.api.Event;
import net.neoforged.fml.event.IModBusEvent;

import java.util.function.BiConsumer;

public class CollectItemVariantsEvent extends Event implements IModBusEvent {
private final BiConsumer<Item, IItemVariantProvider> consumer;

public CollectItemVariantsEvent(BiConsumer<Item, IItemVariantProvider> consumer) {
this.consumer = consumer;
}

public void add(Item item, IItemVariantProvider provider) {
consumer.accept(item, provider);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.buuz135.replication.api;

import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.item.ItemStack;

import java.util.Set;

public interface IItemVariantProvider {
// Get name of variant
String getVariantKey(ItemStack stack);

// Do not mutate stack.
ItemStack normalize(ItemStack stack);

Set<ItemStack> getVariants(HolderLookup.Provider registries);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.buuz135.replication.ReplicationRegistry;
import com.buuz135.replication.api.pattern.IMatterPatternHolder;
import com.buuz135.replication.api.pattern.IMatterPatternModifier;
import com.buuz135.replication.calculation.ItemVariants;
import com.buuz135.replication.calculation.ReplicationCalculation;
import com.buuz135.replication.client.gui.addons.IdentificationChamberAddon;
import com.buuz135.replication.util.InvUtil;
Expand All @@ -28,7 +29,6 @@
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;


public class IdentificationChamberBlockEntity extends ReplicationMachine<IdentificationChamberBlockEntity>{


Expand Down Expand Up @@ -130,7 +130,7 @@ private <T> IMatterPatternModifier.ModifierAction executeProgress(IMatterPattern
this.getInput().getStackInSlot(0).shrink(1);
syncObject(this.input);
} else {
returnedValue = patternModifier.addPattern(this.level, stack, input.getItem().getDefaultInstance(), (float) ReplicationConfig.IdentificationChamber.IDENTIFICATION_PROGRESS);
returnedValue = patternModifier.addPattern(this.level, stack, ItemVariants.normalize(input).stack(), (float) ReplicationConfig.IdentificationChamber.IDENTIFICATION_PROGRESS);
}
if (returnedValue.getPattern() != null && returnedValue.getPattern().getCompletion() >= 1) {
this.getInput().getStackInSlot(0).shrink(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.buuz135.replication.api.task.IReplicationTask;
import com.buuz135.replication.api.task.ReplicationTask;
import com.buuz135.replication.block.ReplicatorBlock;
import com.buuz135.replication.calculation.ItemVariants;
import com.buuz135.replication.calculation.ReplicationCalculation;
import com.buuz135.replication.client.gui.addons.ReplicatorCraftingAddon;
import com.buuz135.replication.client.gui.addons.ReplicatorMotorAddon;
Expand Down Expand Up @@ -106,7 +107,7 @@ public ReplicatorBlockEntity(BasicTileBlock<ReplicatorBlockEntity> base, BlockEn

@Override
public void setFilter(int slot, ItemStack stack) {
super.setFilter(slot, stack.getItem().getDefaultInstance());
super.setFilter(slot, ItemVariants.normalize(stack).stack());
}

@OnlyIn(Dist.CLIENT)
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/com/buuz135/replication/calculation/ItemVariant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.buuz135.replication.calculation;

import net.minecraft.world.item.ItemStack;

// Needed to ensure hashCode is valid for storing in maps.
public record ItemVariant(ItemStack stack) {
@Override
public int hashCode() {
return ItemStack.hashItemAndComponents(stack);
}

@Override
public boolean equals(Object o) {
if (!(o instanceof ItemVariant(ItemStack otherStack))) return false;
return ItemStack.isSameItemSameComponents(stack, otherStack);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.buuz135.replication.calculation;

import com.buuz135.replication.api.CollectItemVariantsEvent;
import com.buuz135.replication.api.IItemVariantProvider;
import com.hrznstudio.titanium.event.handler.EventManager;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.neoforged.fml.ModLoader;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

// TODO: Should cache results.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will handle this if you're happy with the idea :)

public class ItemVariants {
private static final Map<Item, IItemVariantProvider> providers = new HashMap<>();

public static void init() {
EventManager.mod(FMLCommonSetupEvent.class).process(commonSetupEvent -> {
var event = new CollectItemVariantsEvent(providers::put);
ModLoader.postEvent(event);
}).subscribe();
}

public static String getName(ItemVariant variant) {
if (providers.containsKey(variant.stack().getItem())) {
return BuiltInRegistries.ITEM.getKey(variant.stack().getItem()).toString() +
providers.get(variant.stack().getItem()).getVariantKey(variant.stack());
}

return BuiltInRegistries.ITEM.getKey(variant.stack().getItem()).toString();
}

public static ItemVariant normalize(ItemStack stack) {
if (providers.containsKey(stack.getItem())) {
return new ItemVariant(providers.get(stack.getItem()).normalize(stack));
}

return new ItemVariant(stack.getItem().getDefaultInstance());
}

public static Set<ItemVariant> getVariants(Item item, HolderLookup.Provider registries) {
if (providers.containsKey(item)) {
return providers.get(item).getVariants(registries).stream().map(ItemVariant::new).collect(Collectors.toSet());
}

return Set.of(new ItemVariant(item.getDefaultInstance()));
}
}
Loading