Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v0.3.0 #24

Merged
merged 3 commits into from
Aug 8, 2024
Merged
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
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
Loading