Skip to content

Commit

Permalink
Merge pull request #24 from refinedmods/release/0.3.0
Browse files Browse the repository at this point in the history
Release v0.3.0
  • Loading branch information
raoulvdberge authored Aug 8, 2024
2 parents c41f877 + 6cc6b8e commit 1c70c85
Show file tree
Hide file tree
Showing 17 changed files with 622 additions and 33 deletions.
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.3.0] - 2024-08-08

### Added

- Grouping support for the Pattern Grid.
- Recipe transfer support for the Pattern Grid.

## [0.2.2] - 2024-07-26

### Fixed
Expand Down Expand Up @@ -56,7 +63,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- Support for REI collapsable entries.
- Grid / REI search box synchronization options.

[Unreleased]: https://github.com/refinedmods/refinedstorage-rei-integration/compare/v0.2.2...HEAD
[Unreleased]: https://github.com/refinedmods/refinedstorage-rei-integration/compare/v0.3.0...HEAD

[0.3.0]: https://github.com/refinedmods/refinedstorage-rei-integration/compare/v0.2.2...v0.3.0

[0.2.2]: https://github.com/refinedmods/refinedstorage-rei-integration/compare/v0.2.1...v0.2.2

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Adds support for:
- Exclusion zones
- Ghost ingredient dragging
- Using the R/U keys on Grid slots and filtering slots
- Recipe transfer integration for the Crafting Grid
- Recipe transfer integration for the Crafting Grid and Pattern Grid
- Collapsable entries
- Grid / REI search box synchronization

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
refinedarchitectVersion=0.16.9
refinedstorageVersion=2.0.0-milestone.4.5
refinedstorageVersion=2.0.0-milestone.4.6
# https://linkie.shedaniel.dev/dependencies?loader=neoforge&version=1.21
# https://linkie.shedaniel.dev/dependencies?loader=fabric&version=1.21
architecturyVersion=13.0.3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,22 @@
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.registry.transfer.TransferHandler;
import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRenderer;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.plugin.common.BuiltinPlugin;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.world.item.ItemStack;

class CraftingGridTransferHandler implements TransferHandler {
private static final Color MISSING_COLOR = new Color(1.0f, 0.0f, 0.0f, 0.4f);
private static final CategoryIdentifier<?> CRAFTING = CategoryIdentifier.of("minecraft", "plugins/crafting");

@Override
public Result handle(final Context context) {
if (!(context.getMenu() instanceof CraftingGridContainerMenu containerMenu)
|| !context.getDisplay().getCategoryIdentifier().equals(CRAFTING)
|| !context.getDisplay().getCategoryIdentifier().equals(BuiltinPlugin.CRAFTING)
|| !(context.getDisplay() instanceof DefaultCraftingDisplay<?> defaultCraftingDisplay)) {
return Result.createNotApplicable();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.refinedmods.refinedstorage.rei.fabric;

import com.refinedmods.refinedstorage.common.support.AbstractBaseContainerMenu;
import com.refinedmods.refinedstorage.common.support.AbstractBaseScreen;
import com.refinedmods.refinedstorage.common.support.containermenu.FilterSlot;
import com.refinedmods.refinedstorage.common.support.packet.c2s.C2SPackets;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.drag.DraggableStack;
import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor;
import me.shedaniel.rei.api.client.gui.drag.DraggedAcceptorResult;
import me.shedaniel.rei.api.client.gui.drag.DraggingContext;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;

class FilterDraggableStackVisitor
implements DraggableStackVisitor<AbstractBaseScreen<? extends AbstractBaseContainerMenu>> {
@Override
public Stream<BoundsProvider> getDraggableAcceptingBounds(
final DraggingContext<AbstractBaseScreen<? extends AbstractBaseContainerMenu>> context,
final DraggableStack stack
) {
final var screen = context.getScreen();
final var menu = screen.getMenu();
final List<BoundsProvider> bounds = new ArrayList<>();
if (stack.getStack().getType() == VanillaEntryTypes.ITEM) {
addSlotBounds(stack, menu, bounds, screen);
}
return bounds.stream();
}

private void addSlotBounds(
final DraggableStack stack,
final AbstractBaseContainerMenu menu,
final List<BoundsProvider> bounds,
final AbstractBaseScreen<? extends AbstractBaseContainerMenu> screen
) {
final ItemStack itemStack = (ItemStack) stack.getStack().getValue();
for (final Slot slot : menu.slots) {
if (slot instanceof FilterSlot filterSlot && isValid(itemStack, filterSlot)) {
bounds.add(BoundsProvider.ofRectangle(toRectangle(screen, slot)));
}
}
}

@Override
public DraggedAcceptorResult acceptDraggedStack(
final DraggingContext<AbstractBaseScreen<? extends AbstractBaseContainerMenu>> context,
final DraggableStack stack
) {
final var screen = context.getScreen();
final var menu = screen.getMenu();
if (stack.getStack().getValue() instanceof ItemStack itemStack) {
return accept(context, menu, screen, itemStack);
}
return DraggedAcceptorResult.PASS;
}

private DraggedAcceptorResult accept(
final DraggingContext<AbstractBaseScreen<? extends AbstractBaseContainerMenu>> context,
final AbstractBaseContainerMenu menu,
final AbstractBaseScreen<? extends AbstractBaseContainerMenu> screen,
final ItemStack stack
) {
for (final Slot slot : menu.slots) {
if (slot instanceof FilterSlot filterSlot && isValid(stack, filterSlot)) {
final Rectangle slotBounds = toRectangle(screen, slot);
if (!slotBounds.contains(context.getCurrentPosition())) {
continue;
}
C2SPackets.sendFilterSlotChange(stack, filterSlot.index);
return DraggedAcceptorResult.ACCEPTED;
}
}
return DraggedAcceptorResult.PASS;
}

private static boolean isValid(final ItemStack stack, final FilterSlot slot) {
return slot.isActive() && slot.mayPlace(stack);
}

private static Rectangle toRectangle(final AbstractBaseScreen<? extends AbstractBaseContainerMenu> screen,
final Slot slot) {
return new Rectangle(screen.getLeftPos() + slot.x, screen.getTopPos() + slot.y, 18, 18);
}

@Override
public <R extends Screen> boolean isHandingScreen(final R screen) {
return screen instanceof AbstractBaseScreen<?>
&& ((AbstractBaseScreen<?>) screen).getMenu() instanceof AbstractBaseContainerMenu;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public CompoundEventResult<EntryStack<?>> provide(final Screen screen, final Poi
if (resource == null) {
return CompoundEventResult.pass();
}
final PlatformResourceKey underlyingResource = resource.getUnderlyingResource();
final PlatformResourceKey underlyingResource = resource.getResourceForRecipeMods();
if (underlyingResource == null) {
return CompoundEventResult.pass();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.refinedmods.refinedstorage.rei.fabric;

import com.refinedmods.refinedstorage.api.resource.ResourceAmount;
import com.refinedmods.refinedstorage.common.api.RefinedStorageApi;
import com.refinedmods.refinedstorage.common.autocrafting.PatternGridContainerMenu;
import com.refinedmods.refinedstorage.common.support.resource.ItemResource;

import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;

import me.shedaniel.rei.api.client.registry.transfer.TransferHandler;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.plugin.common.BuiltinPlugin;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay;
import net.minecraft.world.item.ItemStack;

class PatternGridTransferHandler implements TransferHandler {
@Override
public Result handle(final Context context) {
if (!(context.getMenu() instanceof PatternGridContainerMenu containerMenu)) {
return Result.createNotApplicable();
}
final Result result = transferRegularRecipe(context, containerMenu);
if (result != null) {
return result;
}
return transferProcessingRecipe(context, containerMenu);
}

@Nullable
private Result transferRegularRecipe(final Context context, final PatternGridContainerMenu containerMenu) {
if (context.getDisplay().getCategoryIdentifier().equals(BuiltinPlugin.CRAFTING)
&& context.getDisplay() instanceof DefaultCraftingDisplay<?> defaultCraftingDisplay) {
return transferCraftingRecipe(context, containerMenu, defaultCraftingDisplay);
} else if (context.getDisplay().getCategoryIdentifier().equals(BuiltinPlugin.STONE_CUTTING)) {
return transferStonecutterRecipe(context, containerMenu);
} else if (context.getDisplay().getCategoryIdentifier().equals(BuiltinPlugin.SMITHING)) {
return transferSmithingTableRecipe(context, containerMenu);
}
return null;
}

private Result transferCraftingRecipe(final Context context,
final PatternGridContainerMenu containerMenu,
final DefaultCraftingDisplay<?> display) {
final List<List<ItemResource>> inputs = getItems(
display.getOrganisedInputEntries(3, 3)
);
if (context.isActuallyCrafting()) {
containerMenu.transferCraftingRecipe(inputs);
}
return Result.createSuccessful().blocksFurtherHandling();
}

private Result transferStonecutterRecipe(final Context context, final PatternGridContainerMenu menu) {
final List<List<ItemResource>> inputs = getItems(context.getDisplay().getInputEntries());
final List<List<ItemResource>> outputs = getItems(context.getDisplay().getOutputEntries());
final boolean valid = !inputs.isEmpty()
&& !outputs.isEmpty()
&& !inputs.getFirst().isEmpty()
&& !outputs.getFirst().isEmpty();
if (context.isActuallyCrafting() && valid) {
menu.transferStonecutterRecipe(inputs.getFirst().getFirst(), outputs.getFirst().getFirst());
}
return Result.createSuccessful().blocksFurtherHandling();
}

private Result transferSmithingTableRecipe(final Context context, final PatternGridContainerMenu menu) {
final List<List<ItemResource>> inputs = getItems(context.getDisplay().getInputEntries());
if (context.isActuallyCrafting() && inputs.size() == 3) {
menu.transferSmithingTableRecipe(inputs.get(0), inputs.get(1), inputs.get(2));
}
return Result.createSuccessful().blocksFurtherHandling();
}

private Result transferProcessingRecipe(final Context context, final PatternGridContainerMenu menu) {
final List<List<ResourceAmount>> inputs = getResources(context.getDisplay().getInputEntries());
final List<List<ResourceAmount>> outputs = getResources(context.getDisplay().getOutputEntries());
if (context.isActuallyCrafting()) {
menu.transferProcessingRecipe(inputs, outputs);
}
return Result.createSuccessful().blocksFurtherHandling();
}

private List<List<ItemResource>> getItems(final List<EntryIngredient> ingredients) {
return ingredients.stream()
.map(this::convertIngredientToItemStacks)
.map(list -> list.stream().map(ItemResource::ofItemStack).collect(Collectors.toList()))
.toList();
}

private List<ItemStack> convertIngredientToItemStacks(final EntryIngredient ingredient) {
return CollectionUtils.<EntryStack<?>, ItemStack>filterAndMap(
ingredient,
stack -> stack.getType() == VanillaEntryTypes.ITEM,
EntryStack::castValue
);
}

private List<List<ResourceAmount>> getResources(final List<EntryIngredient> ingredients) {
return ingredients.stream()
.map(ingredient -> ingredient.stream()
.flatMap(
item -> RefinedStorageApi.INSTANCE.getIngredientConverter().convertToResourceAmount(item.getValue())
.stream())
.collect(Collectors.toList()))
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@ public class ReiClientPlugin implements REIClientPlugin {
public void registerScreens(final ScreenRegistry registry) {
registry.registerFocusedStack(new GridFocusedStackProvider());
registry.registerFocusedStack(new ResourceFocusedStackProvider());
registry.registerDraggableStackVisitor(new DraggableStackVisitorImpl());
registry.registerDraggableStackVisitor(new ResourceDraggableStackVisitor());
registry.registerDraggableStackVisitor(new FilterDraggableStackVisitor());
}

@Override
public void registerTransferHandlers(final TransferHandlerRegistry registry) {
registry.register(new CraftingGridTransferHandler());
registry.register(new PatternGridTransferHandler());
}

@Override
Expand All @@ -55,6 +57,7 @@ private Component tagName(final String name) {
public void registerCollapsibleEntries(final CollapsibleEntryRegistry registry) {
groupItems(registry, tagName("cables"), ContentIds.CABLE, Tags.CABLES);
groupItems(registry, tagName("grids"), ContentIds.GRID, Tags.GRIDS);
groupItems(registry, tagName("pattern_grids"), ContentIds.PATTERN_GRID, Tags.PATTERN_GRIDS);
groupItems(registry, tagName("crafting_grids"), ContentIds.CRAFTING_GRID, Tags.CRAFTING_GRIDS);
groupItems(registry, tagName("importers"), ContentIds.IMPORTER, Tags.IMPORTERS);
groupItems(registry, tagName("exporters"), ContentIds.EXPORTER, Tags.EXPORTERS);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.refinedmods.refinedstorage.rei.fabric;

import com.refinedmods.refinedstorage.api.resource.ResourceAmount;
import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey;
import com.refinedmods.refinedstorage.common.api.support.resource.RecipeModIngredientConverter;
import com.refinedmods.refinedstorage.common.support.resource.FluidResource;
Expand All @@ -23,6 +24,23 @@ public Optional<PlatformResourceKey> convertToResource(final Object ingredient)
return Optional.empty();
}

@Override
public Optional<ResourceAmount> convertToResourceAmount(final Object ingredient) {
if (ingredient instanceof FluidStack fluidStack) {
return Optional.of(new ResourceAmount(
new FluidResource(fluidStack.getFluid(), fluidStack.getPatch()),
fluidStack.getAmount()
));
}
if (ingredient instanceof ItemStack itemStack) {
return Optional.of(new ResourceAmount(
ItemResource.ofItemStack(itemStack),
itemStack.getCount()
));
}
return Optional.empty();
}

@Override
public Optional<Object> convertToIngredient(final PlatformResourceKey resource) {
if (resource instanceof ItemResource itemResource) {
Expand Down
Loading

0 comments on commit 1c70c85

Please sign in to comment.