Skip to content

Commit

Permalink
chore: Make filter slot handling more generic.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rover656 committed Sep 30, 2024
1 parent 5cc79a0 commit b3e4108
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
package com.enderio.base.common.integrations.jei;

import com.enderio.base.common.menu.EntityFilterSlot;
import com.enderio.base.common.menu.FilterSlot;
import com.enderio.base.common.menu.FluidFilterSlot;
import com.enderio.base.common.menu.ItemFilterSlot;
import com.enderio.base.common.tag.EIOTags;
import com.enderio.core.client.gui.screen.EIOScreen;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.handlers.IGhostIngredientHandler;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.neoforge.NeoForgeTypes;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SpawnEggItem;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.fluids.FluidStack;

import java.util.ArrayList;
Expand All @@ -34,16 +30,12 @@ public <I> List<Target<I>> getTargetsTyped(EIOScreen gui, ITypedIngredient<I> in
if (ingredient.getType() == VanillaTypes.ITEM_STACK) {
ItemStack currentIngredient = (ItemStack)ingredient.getIngredient();

// Any filter slot will accept items too, in case they are supported (like entity for example)
if (slot instanceof ItemFilterSlot itemFilterSlot) {
targets.add(new ItemStackTarget<>(bounds, itemFilterSlot));
} else if (slot instanceof FluidFilterSlot fluidFilterSlot) {
if (currentIngredient.getCapability(Capabilities.FluidHandler.ITEM) != null) {
targets.add(new IndirectItemStackTarget<>(bounds, fluidFilterSlot));
}
} else if (slot instanceof EntityFilterSlot entityFilterSlot) {
if (currentIngredient.is(EIOTags.Items.ENTITY_STORAGE) || currentIngredient.getItem() instanceof SpawnEggItem) {
targets.add(new IndirectItemStackTarget<>(bounds, entityFilterSlot));
} else if (slot instanceof FilterSlot<?> otherFilterSlot) {
// If the item can be converted to the resource, allow it to be dragged too.
if (otherFilterSlot.getResourceFrom(currentIngredient).isPresent()) {
targets.add(new IndirectItemStackTarget<>(bounds, otherFilterSlot));
}
}
} else if (ingredient.getType() == NeoForgeTypes.FLUID_STACK) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@
import com.enderio.base.common.init.EIODataComponents;
import com.enderio.base.common.tag.EIOTags;
import net.minecraft.client.Minecraft;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SpawnEggItem;

Expand All @@ -22,7 +19,7 @@ public EntityFilterSlot(Consumer<StoredEntityData> consumer, int pSlot, int pX,
}

@Override
protected Optional<StoredEntityData> getResourceFrom(ItemStack itemStack) {
public Optional<StoredEntityData> getResourceFrom(ItemStack itemStack) {
if (itemStack.is(EIOTags.Items.ENTITY_STORAGE)) {
StoredEntityData ghost = itemStack.get(EIODataComponents.STORED_ENTITY);
return Optional.of(ghost);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public final void setResource(T resource) {
consumer.accept(processResource(resource));
}

protected abstract Optional<T> getResourceFrom(ItemStack itemStack);
public abstract Optional<T> getResourceFrom(ItemStack itemStack);

public T processResource(T resource) {
return resource;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ public FluidFilterSlot(Consumer<FluidStack> consumer, int pSlot, int pX, int pY)
}

@Override
protected Optional<FluidStack> getResourceFrom(ItemStack itemStack) {
public Optional<FluidStack> getResourceFrom(ItemStack itemStack) {
IFluidHandlerItem capability = itemStack.getCapability(Capabilities.FluidHandler.ITEM);
if (capability != null) {
return Optional.of(capability.getFluidInTank(0).copy());
var fluid = capability.getFluidInTank(0).copy();
if (!fluid.isEmpty()) {
return Optional.of(fluid);
}
}

return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public ItemStack processResource(ItemStack resource) {
}

@Override
protected Optional<ItemStack> getResourceFrom(ItemStack itemStack) {
public Optional<ItemStack> getResourceFrom(ItemStack itemStack) {
return Optional.of(itemStack);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
import com.enderio.base.common.menu.FilterSlot;
import mekanism.api.chemical.ChemicalStack;
import mekanism.api.chemical.IChemicalHandler;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;

import java.util.Optional;
Expand All @@ -18,11 +15,13 @@ public ChemicalFilterSlot(Consumer<ChemicalStack> consumer, int pSlot, int pX, i
}

@Override
protected Optional<ChemicalStack> getResourceFrom(ItemStack itemStack) {
public Optional<ChemicalStack> getResourceFrom(ItemStack itemStack) {
IChemicalHandler capability = itemStack.getCapability(MekanismModule.Capabilities.Item.CHEMICAL);
if (capability != null) {
var ghost = capability.getChemicalInTank(0).copy();
return Optional.of(ghost);
if (!ghost.isEmpty()) {
return Optional.of(ghost);
}
}

return Optional.empty();
Expand Down

0 comments on commit b3e4108

Please sign in to comment.