CC-Tweaked/projects/fabric/src/client/java/dan200/computercraft/client/integration/rei/REIComputerCraft.java

84 lines
3.8 KiB
Java

// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.integration.rei;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.integration.RecipeModHelpers;
import dan200.computercraft.shared.platform.RegistryEntry;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dev.architectury.event.EventResult;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry;
import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.BuiltinPlugin;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.DyedItemColor;
/**
* REI integration for ComputerCraft.
* <p>
* This is Fabric-only for now - getting the common jar working outside of architectury is awkward.
*/
public class REIComputerCraft implements REIClientPlugin {
@Override
public void registerItemComparators(ItemComparatorRegistry registry) {
registry.register((context, stack) -> {
long hash = 1;
var left = TurtleItem.getUpgradeWithData(stack, TurtleSide.LEFT);
var right = TurtleItem.getUpgradeWithData(stack, TurtleSide.RIGHT);
if (left != null) hash = hash * 31 + left.holder().key().location().hashCode();
if (right != null) hash = hash * 31 + right.holder().key().location().hashCode();
return hash;
}, ModRegistry.Items.TURTLE_NORMAL.get(), ModRegistry.Items.TURTLE_ADVANCED.get());
registry.register((context, stack) -> {
var upgrade = PocketComputerItem.getUpgradeWithData(stack);
return upgrade == null ? 1 : upgrade.holder().key().location().hashCode();
}, ModRegistry.Items.POCKET_COMPUTER_NORMAL.get(), ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get());
registry.register((context, stack) -> DyedItemColor.getOrDefault(stack, -1), ModRegistry.Items.DISK.get());
}
@Override
public void registerEntries(EntryRegistry registry) {
for (var stack : RecipeModHelpers.getExtraStacks(BasicDisplay.registryAccess())) {
registry.addEntry(EntryStacks.of(stack));
}
}
@Override
public void registerCollapsibleEntries(CollapsibleEntryRegistry registry) {
addCollapsableGroup(registry, ModRegistry.Items.TURTLE_NORMAL);
addCollapsableGroup(registry, ModRegistry.Items.TURTLE_ADVANCED);
addCollapsableGroup(registry, ModRegistry.Items.POCKET_COMPUTER_NORMAL);
addCollapsableGroup(registry, ModRegistry.Items.POCKET_COMPUTER_ADVANCED);
}
private static void addCollapsableGroup(CollapsibleEntryRegistry registry, RegistryEntry<? extends Item> holder) {
var item = holder.get();
registry.group(holder.id(), new ItemStack(item).getDisplayName(), VanillaEntryTypes.ITEM, x -> x.getValue().is(item));
}
@Override
public void registerDisplays(DisplayRegistry registry) {
registry.registerDisplayGenerator(BuiltinPlugin.CRAFTING, new UpgradeDisplayGenerator());
// Hide all upgrade recipes
registry.registerVisibilityPredicate((category, display) ->
display.getDisplayLocation().map(RecipeModHelpers::shouldRemoveRecipe).orElse(false)
? EventResult.interruptFalse() : EventResult.pass());
}
}