diff --git a/src/conduits/java/com/enderio/conduits/common/blockentity/ConduitBlockEntity.java b/src/conduits/java/com/enderio/conduits/common/blockentity/ConduitBlockEntity.java index a487e9e6..80cf16bf 100644 --- a/src/conduits/java/com/enderio/conduits/common/blockentity/ConduitBlockEntity.java +++ b/src/conduits/java/com/enderio/conduits/common/blockentity/ConduitBlockEntity.java @@ -10,6 +10,7 @@ import com.enderio.conduits.common.blockentity.connection.DynamicConnectionState; import com.enderio.conduits.common.blockentity.connection.IConnectionState; import com.enderio.conduits.common.blockentity.connection.StaticConnectionStates; +import com.enderio.conduits.common.init.ConduitItems; import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.conduits.common.network.ConduitSavedData; import com.enderio.core.common.blockentity.EnderBlockEntity; @@ -28,6 +29,7 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -566,8 +568,9 @@ public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { } ItemStack existing = getStackInSlot(slot); - - int limit = Math.min(getSlotLimit(slot), stack.getMaxStackSize()); + int limit = stack.getItem().equals(ConduitItems.SPEED_UPGRADE.asItem()) ? 15 + : stack.getItem().equals(ConduitItems.SPEED_DOWNGRADE.asItem()) ? 3 + : Math.min(getSlotLimit(slot), stack.getMaxStackSize()); if (!existing.isEmpty()) { if (!ItemHandlerHelper.canItemStacksStack(stack, existing)) { @@ -629,8 +632,7 @@ public int getSlotLimit(int slot) { @Override public boolean isItemValid(int slot, @NotNull ItemStack stack) { - //TODO implement - return slot < getSlots(); + return slot < getSlots() && SlotData.of(slot).slotType().acceptsItem(stack.getItem()); } @Override @@ -647,8 +649,7 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { ConduitConnection connection = bundle.getConnection(data.direction()); ConduitMenuData conduitData = bundle.getTypes().get(data.conduitIndex()).getMenuData(); - if ((data.slotType() == SlotType.FILTER_EXTRACT && conduitData.hasFilterExtract()) || (data.slotType() == SlotType.FILTER_INSERT - && conduitData.hasFilterInsert()) || (data.slotType() == SlotType.UPGRADE_EXTRACT && conduitData.hasUpgrade())) { + if (data.slotType().isAvailableFor(conduitData)) { connection.setItem(data.slotType(), data.conduitIndex(), stack); } } diff --git a/src/conduits/java/com/enderio/conduits/common/blockentity/SlotType.java b/src/conduits/java/com/enderio/conduits/common/blockentity/SlotType.java index d81d08f0..3c7bd3ea 100644 --- a/src/conduits/java/com/enderio/conduits/common/blockentity/SlotType.java +++ b/src/conduits/java/com/enderio/conduits/common/blockentity/SlotType.java @@ -1,6 +1,8 @@ package com.enderio.conduits.common.blockentity; import com.enderio.api.conduit.ConduitMenuData; +import com.enderio.conduits.common.init.ConduitItems; +import net.minecraft.world.item.Item; public enum SlotType { FILTER_EXTRACT, @@ -8,6 +10,14 @@ public enum SlotType { UPGRADE_EXTRACT; public static final int Y_POSITION = 71; + + public boolean acceptsItem(Item item) { + return switch (this) { + case FILTER_INSERT, FILTER_EXTRACT -> item.equals(ConduitItems.BASIC_ITEM_FILTER.asItem()) || item.equals(ConduitItems.BIG_ITEM_FILTER.asItem()); + case UPGRADE_EXTRACT -> item.equals(ConduitItems.SPEED_DOWNGRADE.asItem()) || item.equals(ConduitItems.SPEED_UPGRADE.asItem()); + }; + } + public int getX() { return switch (this) { case FILTER_EXTRACT -> 113; @@ -27,4 +37,5 @@ public boolean isAvailableFor(ConduitMenuData data) { case UPGRADE_EXTRACT -> data.hasUpgrade(); }; } + } diff --git a/src/conduits/java/com/enderio/conduits/common/init/ConduitItems.java b/src/conduits/java/com/enderio/conduits/common/init/ConduitItems.java index ff492ed9..2aa62924 100644 --- a/src/conduits/java/com/enderio/conduits/common/init/ConduitItems.java +++ b/src/conduits/java/com/enderio/conduits/common/init/ConduitItems.java @@ -8,6 +8,7 @@ import com.tterrag.registrate.Registrate; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; import net.minecraft.world.item.Item; import net.minecraftforge.fml.common.Mod; @@ -26,6 +27,8 @@ public class ConduitItems { public static final ItemEntry BASIC_ITEM_FILTER = filterItemBasic("basic_item_filter").register(); public static final ItemEntry BIG_ITEM_FILTER = filterItemBig("big_item_filter").register(); + public static final ItemEntry SPEED_UPGRADE = REGISTRATE.item("extract_speed_upgrade", Item::new).tab(EIOCreativeTabs.MAIN).register(); + public static final ItemEntry SPEED_DOWNGRADE = REGISTRATE.item("extract_speed_downgrade", Item::new).tab(EIOCreativeTabs.MAIN).register(); private static ItemEntry createConduitItem(Supplier> type, String itemName) { return REGISTRATE.item(itemName + "_conduit", diff --git a/src/conduits/java/com/enderio/conduits/common/menu/ConduitSlot.java b/src/conduits/java/com/enderio/conduits/common/menu/ConduitSlot.java index 567e5f7f..aef75eb4 100644 --- a/src/conduits/java/com/enderio/conduits/common/menu/ConduitSlot.java +++ b/src/conduits/java/com/enderio/conduits/common/menu/ConduitSlot.java @@ -42,14 +42,12 @@ public Slot setBackground(ResourceLocation atlas, ResourceLocation sprite) { @Override public boolean mayPlace(ItemStack stack) { - if (slotType == SlotType.UPGRADE_EXTRACT) { - return false; - } - // TODO check slot type, fluid filter for fluid etc... return isVisible() && super.mayPlace(stack) && ( stack.is(ConduitItems.BASIC_ITEM_FILTER.asItem())) - || stack.is(ConduitItems.BIG_ITEM_FILTER.asItem()); + || stack.is(ConduitItems.BIG_ITEM_FILTER.asItem()) + || stack.is(ConduitItems.SPEED_UPGRADE.asItem()) + || stack.is(ConduitItems.SPEED_DOWNGRADE.asItem()); } @Override diff --git a/src/conduits/java/com/enderio/conduits/common/types/item/ItemConduitTicker.java b/src/conduits/java/com/enderio/conduits/common/types/item/ItemConduitTicker.java index 91bf7323..66f3593e 100644 --- a/src/conduits/java/com/enderio/conduits/common/types/item/ItemConduitTicker.java +++ b/src/conduits/java/com/enderio/conduits/common/types/item/ItemConduitTicker.java @@ -8,6 +8,7 @@ import com.enderio.conduits.common.blockentity.ConduitBlockEntity; import com.enderio.conduits.common.blockentity.SlotData; import com.enderio.conduits.common.blockentity.SlotType; +import com.enderio.conduits.common.init.ConduitItems; import dev.gigaherz.graph3.Graph; import dev.gigaherz.graph3.Mergeable; import net.minecraft.core.BlockPos; @@ -35,7 +36,6 @@ public void tickGraph(ConduitType type, List> loadedNodes, var conduitItemHandler = conduitBlockEntity.getConduitItemHandler(); for (var slotType: SlotType.values()) { - if (slotType == SlotType.UPGRADE_EXTRACT) continue; // not implemented for (var dir: Direction.values()) { var extendedData = node.getExtendedConduitData().castTo(ItemExtendedData.class).compute(dir); var item = conduitItemHandler.getStackInSlot(new SlotData(dir, conduitBlockEntity.getBundle().getTypes().indexOf(type), slotType).slotIndex()); @@ -46,6 +46,9 @@ public void tickGraph(ConduitType type, List> loadedNodes, if (slotType == SlotType.FILTER_INSERT) { extendedData.insertFilter = item; } + if (slotType == SlotType.UPGRADE_EXTRACT) { + extendedData.extractRate = item.isEmpty() ? 4 : item.getItem().equals(ConduitItems.SPEED_DOWNGRADE.asItem()) ? item.getCount() : 4 + 4 * item.getCount(); + } } } } @@ -57,13 +60,13 @@ protected void tickCapabilityGraph(ConduitType type, List