Skip to content

Commit

Permalink
Generalize ghost ingredient drag&drop over REI/EMI (#7759)
Browse files Browse the repository at this point in the history
  • Loading branch information
shartte authored Mar 13, 2024
1 parent d9290f5 commit 1650b1c
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@
import appeng.api.stacks.AEItemKey;
import appeng.api.stacks.GenericStack;
import appeng.client.gui.AEBaseScreen;
import appeng.core.network.NetworkHandler;
import appeng.core.network.serverbound.InventoryActionPacket;
import appeng.helpers.InventoryAction;
import appeng.menu.slot.FakeSlot;

public final class DropTargets {
Expand All @@ -34,8 +31,6 @@ public static List<DropTarget> getTargets(AEBaseScreen<?> aeScreen) {
private record FakeSlotDropTarget(Rect2i area, FakeSlot slot) implements DropTarget {
@Override
public boolean canDrop(GenericStack stack) {
var wrapped = wrapFilterAsItem(stack);

// Use the standard inventory function to test if the dragged stack would in theory be accepted
return slot.canSetFilterTo(wrapFilterAsItem(stack));
}
Expand All @@ -45,8 +40,7 @@ public boolean drop(GenericStack stack) {
var itemStack = wrapFilterAsItem(stack);

if (slot.canSetFilterTo(itemStack)) {
NetworkHandler.instance().sendToServer(new InventoryActionPacket(InventoryAction.SET_FILTER,
slot.index, itemStack));
slot.setFilterTo(itemStack);
return true;
}
return false;
Expand Down
133 changes: 26 additions & 107 deletions src/main/java/appeng/integration/modules/rei/GhostIngredientHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,34 +18,18 @@

package appeng.integration.modules.rei;

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

import org.jetbrains.annotations.Nullable;

import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;

import dev.architectury.fluid.FluidStack;
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.EntryStack;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;

import appeng.api.stacks.AEFluidKey;
import appeng.api.stacks.GenericStack;
import appeng.client.gui.AEBaseScreen;
import appeng.core.network.NetworkHandler;
import appeng.core.network.serverbound.InventoryActionPacket;
import appeng.helpers.InventoryAction;
import appeng.menu.slot.AppEngSlot;
import appeng.menu.slot.FakeSlot;
import appeng.integration.modules.itemlists.DropTargets;

/**
* JEI allows ingredients to be dragged from a JEI panel onto compatible slots to set filters and the like without
Expand All @@ -62,108 +46,43 @@ public <R extends Screen> boolean isHandingScreen(R screen) {
@Override
public Stream<BoundsProvider> getDraggableAcceptingBounds(DraggingContext<AEBaseScreen> context,
DraggableStack stack) {
List<DropTarget> targets = getTargets(context, stack);

return targets.stream().map(target -> BoundsProvider.ofRectangle(target.getArea()));
}

@Override
public DraggedAcceptorResult acceptDraggedStack(DraggingContext<AEBaseScreen> context, DraggableStack stack) {
var targets = getTargets(context, stack);
var pos = context.getCurrentPosition();

for (var target : targets) {
if (target.getArea().contains(pos)) {
if (target.accept(stack)) {
return DraggedAcceptorResult.ACCEPTED;
}
}
}

return DraggedAcceptorResult.PASS;
}

@Nullable
private ItemStack wrapDraggedItem(EntryStack<?> entryStack) {
if (entryStack.getType() == VanillaEntryTypes.ITEM) {
return entryStack.castValue();
} else {
var genericStack = GenericEntryStackHelper.ingredientToStack(entryStack);
if (genericStack != null) {
return GenericStack.wrapInItemStack(genericStack);
}
}
return null;
}

private List<DropTarget> getTargets(DraggingContext<AEBaseScreen> context, DraggableStack stack) {
var wrapped = wrapDraggedItem(stack.getStack());
if (wrapped == null) {
return Collections.emptyList();
var genericStack = GenericEntryStackHelper.ingredientToStack(stack.getStack());
if (genericStack == null) {
return Stream.of();
}

List<DropTarget> targets = new ArrayList<>();
addItemStackTargets(context.getScreen(), targets, wrapped);
return targets;
}

/**
* Returns possible drop-targets for ghost items.
*/
private static void addItemStackTargets(AEBaseScreen<?> gui, List<DropTarget> targets, ItemStack draggedStack) {
for (Slot slot : gui.getMenu().slots) {
if (slot.isActive() && slot instanceof FakeSlot fakeSlot) {
// Use the standard inventory function to test if the dragged stack would in theory be accepted
if (!fakeSlot.canSetFilterTo(draggedStack)) {
continue;
}

targets.add(new ItemSlotTarget(gui, fakeSlot));
}
}
return DropTargets.getTargets(context.getScreen())
.stream()
.filter(dropTarget -> dropTarget.canDrop(genericStack))
.map(target -> {
var area = target.area();
return BoundsProvider.ofRectangle(new Rectangle(
area.getX(), area.getY(),
area.getWidth(), area.getHeight()));
});
}

private static class ItemSlotTarget implements DropTarget {
private final AppEngSlot slot;
private final Rectangle area;

public ItemSlotTarget(AEBaseScreen<?> screen, AppEngSlot slot) {
this.slot = slot;
this.area = new Rectangle(screen.getGuiLeft() + slot.x, screen.getGuiTop() + slot.y, 16, 16);
@Override
public DraggedAcceptorResult acceptDraggedStack(DraggingContext<AEBaseScreen> context, DraggableStack stack) {
var genericStack = GenericEntryStackHelper.ingredientToStack(stack.getStack());
if (genericStack == null) {
return DraggedAcceptorResult.PASS;
}

@Override
public Rectangle getArea() {
return area;
var pos = context.getCurrentPosition();
if (pos == null) {
return DraggedAcceptorResult.PASS;
}

@Override
public boolean accept(DraggableStack ingredient) {
var entryStack = ingredient.getStack();
if (entryStack.getType() == VanillaEntryTypes.ITEM) {
ItemStack itemStack = entryStack.castValue();
NetworkHandler.instance().sendToServer(new InventoryActionPacket(InventoryAction.SET_FILTER,
slot.index, itemStack));
return true;
} else if (entryStack.getType() == VanillaEntryTypes.FLUID) {
FluidStack fluidStack = entryStack.castValue();

// Wrap in a generic stack to set it anyway
var wrappedFluid = GenericStack.wrapInItemStack(
new GenericStack(AEFluidKey.of(fluidStack.getFluid(), fluidStack.getTag()),
fluidStack.getAmount()));
NetworkHandler.instance().sendToServer(new InventoryActionPacket(InventoryAction.SET_FILTER,
slot.index, wrappedFluid));
return true;
for (var target : DropTargets.getTargets(context.getScreen())) {
if (target.area().contains(pos.x, pos.y) && target.canDrop(genericStack)) {
target.drop(genericStack);
return DraggedAcceptorResult.ACCEPTED;
}
return false;
}
}

interface DropTarget {
Rectangle getArea();

boolean accept(DraggableStack stack);
return DraggedAcceptorResult.PASS;
}

}
9 changes: 9 additions & 0 deletions src/main/java/appeng/menu/slot/FakeSlot.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@

import appeng.api.config.Actionable;
import appeng.api.inventories.InternalInventory;
import appeng.core.network.NetworkHandler;
import appeng.core.network.serverbound.InventoryActionPacket;
import appeng.helpers.InventoryAction;
import appeng.util.ConfigInventory;
import appeng.util.ConfigMenuInventory;

Expand Down Expand Up @@ -64,6 +67,12 @@ public boolean canSetFilterTo(ItemStack stack) {
return slot < getInventory().size() && getInventory().isItemValid(slot, stack);
}

// Used by the item list mod dropping ghost ingredients on this slot
public void setFilterTo(ItemStack itemStack) {
NetworkHandler.instance().sendToServer(new InventoryActionPacket(InventoryAction.SET_FILTER,
index, itemStack));
}

public void increase(ItemStack is) {
// Special support for increasing the configured stocking amount by simply clicking
if (getInventory() instanceof ConfigMenuInventory configInv) {
Expand Down

0 comments on commit 1650b1c

Please sign in to comment.