diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index 54d867c29..3830cb667 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -234,6 +234,9 @@ "item.bloodmagic.experiencebook": "Tome of Peritia", "item.bloodmagic.explosivepowder": "Explosive Powder", "item.bloodmagic.firescribetool": "Inscription Tool: Fire", + "item.bloodmagic.fluidrouterfilterexact": "Standard Fluid Filter", + "item.bloodmagic.fluidrouterfiltermod": "Mod Fluid Filter", + "item.bloodmagic.collectionfilter": "Collection Filter", "item.bloodmagic.fortune_anointment": "Fortuna Extract", "item.bloodmagic.fortune_anointment_2": "Fortuna Extract II", "item.bloodmagic.fortune_anointment_3": "Fortuna Extract III", @@ -651,6 +654,7 @@ "tooltip.bloodmagic.basicnodeupgrade": "Increases a Master Routing Node's speed.", "tooltip.bloodmagic.blockeddoor": "The lock breaks and fizzles out of existence!", "tooltip.bloodmagic.blood_provider.slate.desc": "A simple ampoule containing 500LP.", + "tooltip.bloodmagic.collectionfilter.desc": "Allows to filter different types", "tooltip.bloodmagic.compositefilter.desc": "Filters based off of contained filters.", "tooltip.bloodmagic.config.disabled": "Currently disabled in the Config.", "tooltip.bloodmagic.contained_filters": "Contained Filters:", @@ -694,7 +698,8 @@ "tooltip.bloodmagic.filter.enchant_combination": "%s: %s", "tooltip.bloodmagic.filter.from_mod": "From: %s", "tooltip.bloodmagic.filter.whitelist": "Allow:", - "tooltip.bloodmagic.ghost.amount": "Ghost item amount: %d.", + "tooltip.bloodmagic.fluidfilter.desc": "Will make sure the fluids match.", + "tooltip.bloodmagic.ghost.amount": "Ghost amount: %d.", "tooltip.bloodmagic.ghost.everything": "Everything", "tooltip.bloodmagic.hellforgedparts": "These parts are currently beyond your crafting capabilities...", "tooltip.bloodmagic.holdShiftForInfo": "Press shift for extra info.", diff --git a/src/generated/resources/assets/bloodmagic/models/item/fluidrouterfilterexact.json b/src/generated/resources/assets/bloodmagic/models/item/fluidrouterfilterexact.json new file mode 100644 index 000000000..5538c471d --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/fluidrouterfilterexact.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/fluidrouterfilterexact" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/alchemytable/collection_filter.json b/src/generated/resources/data/bloodmagic/recipes/alchemytable/collection_filter.json new file mode 100644 index 000000000..6000edf94 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/alchemytable/collection_filter.json @@ -0,0 +1,23 @@ +{ + "type": "bloodmagic:alchemytable", + "input": [ + { + "item": "bloodmagic:componentframeparts" + }, + { + "item": "bloodmagic:infusedslate" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:gems/lapis" + } + ], + "output": { + "item": "bloodmagic:collectionfilter" + }, + "syphon": 500, + "ticks": 100, + "upgradeLevel": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_mod_filter.json b/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_mod_filter.json new file mode 100644 index 000000000..6618cfdc3 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_mod_filter.json @@ -0,0 +1,23 @@ +{ + "type": "bloodmagic:alchemytable", + "input": [ + { + "item": "bloodmagic:componentframeparts" + }, + { + "item": "minecraft:bucket" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dyes/yellow" + } + ], + "output": { + "item": "bloodmagic:fluidrouterfiltermod" + }, + "syphon": 500, + "ticks": 100, + "upgradeLevel": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_router_filter.json b/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_router_filter.json new file mode 100644 index 000000000..91c2a669e --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/alchemytable/fluid_router_filter.json @@ -0,0 +1,23 @@ +{ + "type": "bloodmagic:alchemytable", + "input": [ + { + "item": "bloodmagic:componentframeparts" + }, + { + "item": "minecraft:bucket" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:dyes/red" + } + ], + "output": { + "item": "bloodmagic:fluidrouterfilterexact" + }, + "syphon": 500, + "ticks": 100, + "upgradeLevel": 3 +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/client/button/FilterButtonTogglePress.java b/src/main/java/wayoftime/bloodmagic/client/button/FilterButtonTogglePress.java index 84ea08941..d696c7b5d 100644 --- a/src/main/java/wayoftime/bloodmagic/client/button/FilterButtonTogglePress.java +++ b/src/main/java/wayoftime/bloodmagic/client/button/FilterButtonTogglePress.java @@ -2,7 +2,7 @@ import net.minecraft.client.gui.components.Button; import wayoftime.bloodmagic.common.container.item.ContainerFilter; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; import wayoftime.bloodmagic.network.BloodMagicPacketHandler; import wayoftime.bloodmagic.network.FilterButtonPacket; @@ -23,13 +23,13 @@ public void onPress(Button button) if (button.active) { int currentGhostSlot = container.lastGhostSlotClicked; - if (container.filterStack.getItem() instanceof IItemFilterProvider) + if (container.filterStack.getItem() instanceof IRoutingFilterProvider) { - int currentButtonState = ((IItemFilterProvider) container.filterStack.getItem()).getCurrentButtonState(container.filterStack, buttonKey, currentGhostSlot); + int currentButtonState = ((IRoutingFilterProvider) container.filterStack.getItem()).getCurrentButtonState(container.filterStack, buttonKey, currentGhostSlot); BloodMagicPacketHandler.INSTANCE.sendToServer(new FilterButtonPacket(container.player.getInventory().selected, currentGhostSlot, buttonKey, currentButtonState)); - ((IItemFilterProvider) container.filterStack.getItem()).receiveButtonPress(container.filterStack, buttonKey, currentGhostSlot, currentButtonState); + ((IRoutingFilterProvider) container.filterStack.getItem()).receiveButtonPress(container.filterStack, buttonKey, currentGhostSlot, currentButtonState); } } } diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenFilter.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenFilter.java index 6e27781d6..9f73a059d 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenFilter.java +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenFilter.java @@ -6,6 +6,7 @@ import org.apache.commons.lang3.tuple.Pair; +import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -23,19 +24,27 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.common.container.item.ContainerFilter; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.item.routing.ItemCollectionFilter; +import wayoftime.bloodmagic.common.item.routing.ItemFluidRouterFilter; +import wayoftime.bloodmagic.common.item.routing.ItemItemRouterFilter; import wayoftime.bloodmagic.network.RouterFilterPacket; import wayoftime.bloodmagic.util.GhostItemHelper; public class ScreenFilter extends ScreenBase { - private static final ResourceLocation background = BloodMagic.rl("textures/gui/routingfilter.png"); + private static ResourceLocation background = BloodMagic.rl("textures/gui/routingfilter.png"); public Container filterInventory; private Player player; private int left, top; + // 0 mixed, 1 item, 2 fluid + private int filterType = 0; + private EditBox textBox; private int numberOfAddedButtons = 0; @@ -71,10 +80,18 @@ public void init() buttonKeyList.clear(); ItemStack filterStack = this.container.filterStack; + this.filterType = filterStack.getItem() instanceof ItemFluidRouterFilter ? 2 : filterStack.getItem() instanceof ItemItemRouterFilter ? 1 : 0; - if (filterStack.getItem() instanceof IItemFilterProvider) + if (filterStack.getItem() instanceof ItemCollectionFilter) { - IItemFilterProvider provider = (IItemFilterProvider) filterStack.getItem(); + this.textBox.setVisible(false); + this.background = BloodMagic.rl("textures/gui/routingfilter_notext.png"); + return; + } + + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + IRoutingFilterProvider provider = (IRoutingFilterProvider) filterStack.getItem(); List> buttonActionList = provider.getButtonAction(this.container); for (Pair pair : buttonActionList) @@ -206,9 +223,9 @@ private void setValueOfGhostItemInSlot(int ghostItemSlot, int amount) { GhostItemHelper.setItemGhostAmount(ghostStack, amount); GhostItemHelper.setItemGhostAmount(container.inventoryFilter.getItem(ghostItemSlot), amount); - if (container.filterStack.getItem() instanceof IItemFilterProvider) + if (container.filterStack.getItem() instanceof IRoutingFilterProvider) { - ((IItemFilterProvider) container.filterStack.getItem()).setGhostItemAmount(container.filterStack, ghostItemSlot, amount); + ((IRoutingFilterProvider) container.filterStack.getItem()).setGhostItemAmount(container.filterStack, ghostItemSlot, amount); } } @@ -274,13 +291,13 @@ protected void renderLabels(PoseStack stack, int mouseX, int mouseY) this.font.draw(stack, new TranslatableComponent("container.inventory"), 8, 93, 4210752); this.font.draw(stack, container.filterStack.getHoverName(), 8, 4, 4210752); - if (container.filterStack.getItem() instanceof IItemFilterProvider) + if (container.filterStack.getItem() instanceof IRoutingFilterProvider) { for (int i = 0; i < numberOfAddedButtons; i++) { - int currentButtonState = ((IItemFilterProvider) container.filterStack.getItem()).getCurrentButtonState(container.filterStack, buttonKeyList.get(i), container.lastGhostSlotClicked); + int currentButtonState = ((IRoutingFilterProvider) container.filterStack.getItem()).getCurrentButtonState(container.filterStack, buttonKeyList.get(i), container.lastGhostSlotClicked); Pair buttonLocation = getButtonLocation(i); - Pair textureLocation = ((IItemFilterProvider) container.filterStack.getItem()).getTexturePositionForState(container.filterStack, buttonKeyList.get(i), currentButtonState); + Pair textureLocation = ((IRoutingFilterProvider) container.filterStack.getItem()).getTexturePositionForState(container.filterStack, buttonKeyList.get(i), currentButtonState); int w = 20; int h = 20; @@ -333,6 +350,30 @@ protected void renderBg(PoseStack stack, float partialTicks, int mouseX, int mou } + @Override + public List getTooltipFromItem(ItemStack itemStack) + { + List list = super.getTooltipFromItem(itemStack); + if (filterType == 1) + { + return list; + } + + Optional opt = FluidUtil.getFluidContained(itemStack); + if (opt.isPresent()) + { + List newlist = Lists.newArrayList(); + newlist.add(opt.get().getDisplayName()); + if (list.size() > 1) + { + newlist.add(list.get(1)); + } + list = newlist; + } + + return list; + } + @Override public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { @@ -343,7 +384,7 @@ public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialT List tooltip = new ArrayList<>(); - if (container.filterStack.getItem() instanceof IItemFilterProvider) + if (container.filterStack.getItem() instanceof IRoutingFilterProvider) { for (int i = 0; i < numberOfAddedButtons; i++) { @@ -356,7 +397,7 @@ public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialT if (mouseX >= x && mouseX < x + w && mouseY >= y && mouseY < y + h) { - List components = ((IItemFilterProvider) container.filterStack.getItem()).getTextForHoverItem(container.filterStack, buttonKeyList.get(i), container.lastGhostSlotClicked); + List components = ((IRoutingFilterProvider) container.filterStack.getItem()).getTextForHoverItem(container.filterStack, buttonKeyList.get(i), container.lastGhostSlotClicked); if (components != null && !components.isEmpty()) tooltip.addAll(components); } @@ -368,4 +409,8 @@ public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialT // GuiUtils.drawHoveringText(matrixStack, tooltip, mouseX, mouseY, width, height, -1, font); } + public int getFilterType() + { + return this.filterType; + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/container/item/ContainerFilter.java b/src/main/java/wayoftime/bloodmagic/common/container/item/ContainerFilter.java index 6114c16b5..17742d97a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/item/ContainerFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/item/ContainerFilter.java @@ -1,5 +1,7 @@ package wayoftime.bloodmagic.common.container.item; +import java.util.Optional; + import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Inventory; @@ -8,10 +10,14 @@ import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.util.thread.EffectiveSide; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.item.routing.ItemCollectionFilter; +import wayoftime.bloodmagic.common.item.routing.ItemFluidRouterFilter; import wayoftime.bloodmagic.util.GhostItemHelper; public class ContainerFilter extends AbstractContainerMenu @@ -42,17 +48,26 @@ public ContainerFilter(int windowId, Player player, Inventory playerInventory, I public void setup(Inventory inventory, int currentSlotHeldIn) { -// for (int columnIndex = 0; columnIndex < ItemRouterFilter.inventorySize; ++columnIndex) -// { -// this.addSlot(new SlotGhostItem(this, inventoryFilter, player, columnIndex, 8 + columnIndex * 36, 17)); -// } + // for (int columnIndex = 0; columnIndex < ItemRouterFilter.inventorySize; + // ++columnIndex) + // { + // this.addSlot(new SlotGhostItem(this, inventoryFilter, player, columnIndex, 8 + // + columnIndex * 36, 17)); + // } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - this.addSlot(new SlotGhostItem(this, inventoryFilter, player, j + i * 3, 110 + j * 21, 15 + i * 21)); -// addSlot(new SlotGhostItem(itemInventory, j + i * 3, 26 + j * 18, 15 + i * 18)); + if (filterStack.getItem() instanceof ItemCollectionFilter) + { + this.addSlot(new SlotCollectionFilter(this, inventoryFilter, player, j + i * 3, 110 + j * 21, 15 + i * 21)); + } else + { + this.addSlot(new SlotGhostItem(this, inventoryFilter, player, j + i * 3, 110 + j * 21, 15 + i * 21)); + } + // addSlot(new SlotGhostItem(itemInventory, j + i * 3, 26 + j * 18, 15 + i * + // 18)); } } @@ -80,62 +95,64 @@ public void setup(Inventory inventory, int currentSlotHeldIn) @Override public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player player) { - - Inventory inventoryPlayer = player.getInventory(); -// if (!player.worldObj.isRemote) + if (slotId >= 0) { - if (slotId >= 0) - { - Slot slot = this.slots.get(slotId); + Slot slot = this.slots.get(slotId); - if (slot instanceof SlotGhostItem) // TODO: make the slot clicking work! + if (slot instanceof SlotGhostItem) // TODO: make the slot clicking work! + { + lastGhostSlotClicked = slot.getSlotIndex(); + if ((dragType == 0 || dragType == 1)) { - lastGhostSlotClicked = slot.getSlotIndex(); - if ((dragType == 0 || dragType == 1)) - { - ItemStack slotStack = slot.getItem(); - ItemStack heldStack = this.getCarried(); + ItemStack slotStack = slot.getItem(); + ItemStack heldStack = this.getCarried(); - if (dragType == 0) // Left mouse click-eth + if (dragType == 0) // Left mouse click-eth + { + if (heldStack.isEmpty() && !slotStack.isEmpty()) + { + // I clicked on the slot with an empty hand. Selecting! + // Return here to not save the server-side inventory + // return ItemStack.EMPTY; + return; + } else if (!heldStack.isEmpty() && slotStack.isEmpty()) { + if (!((SlotGhostItem) slot).canBeAccessed()) + { + super.clicked(slotId, dragType, clickTypeIn, player); + return; + } + + ItemStack copyStack = heldStack.copy(); + if (filterStack.getItem() instanceof ItemFluidRouterFilter) { - if (heldStack.isEmpty() && !slotStack.isEmpty()) + Optional optional = FluidUtil.getFluidHandler(copyStack).resolve(); + if (!optional.isPresent()) { - // I clicked on the slot with an empty hand. Selecting! - // Return here to not save the server-side inventory -// return ItemStack.EMPTY; + super.clicked(slotId, dragType, clickTypeIn, player); return; - } else if (!heldStack.isEmpty() && slotStack.isEmpty()) - { - if (!((SlotGhostItem) slot).canBeAccessed()) - { - super.clicked(slotId, dragType, clickTypeIn, player); - return; - } - - ItemStack copyStack = heldStack.copy(); - GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.setCount(1); - slot.set(copyStack); - -// ItemStack filterStack = this.filterStack; - if (filterStack.getItem() instanceof IRoutingFilterProvider) - { - ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); - slot.set(filterCopy); - } } } - } else - // Right mouse click-eth away - { - slot.set(ItemStack.EMPTY); + + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.setCount(1); + slot.set(copyStack); + + // ItemStack filterStack = this.filterStack; + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForType(filterStack, heldStack); + slot.set(filterCopy); + } } + } else + // Right mouse click-eth away + { + slot.set(ItemStack.EMPTY); } } } } - super.clicked(slotId, dragType, clickTypeIn, player); } @@ -180,7 +197,7 @@ public ItemStack quickMoveStack(Player entityPlayer, int slotIndex) if (slotIndex >= 0) { -// return null; + // return null; if (itemstack1.getItem() instanceof IRoutingFilterProvider) // Change to check item is a filter { if (!this.moveItemStackTo(itemstack1, 0, 1, false)) @@ -277,4 +294,51 @@ public boolean mayPickup(Player player) return false; } } + + public class SlotCollectionFilter extends Slot + { + private final Player player; + private ContainerFilter containerHolding; + + public SlotCollectionFilter(ContainerFilter containerHolding, Container inventory, Player player, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + this.player = player; + this.containerHolding = containerHolding; + } + + @Override + public int getMaxStackSize() + { + return 1; + } + + @Override + public void setChanged() + { + super.setChanged(); + + if (EffectiveSide.get().isServer()) + { + containerHolding.saveInventory(player); + } + } + + @Override + public boolean mayPlace(ItemStack stack) + { + return stack.getItem() instanceof IRoutingFilterProvider; + } + + @Override + public boolean mayPickup(Player playerIn) + { + return true; + } + + public boolean canBeAccessed() + { + return containerHolding.inventoryFilter.canInventoryBeManipulated(); + } + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemicalReactionChamber.java index 49ba85a55..2819a1356 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemicalReactionChamber.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemicalReactionChamber.java @@ -193,4 +193,4 @@ public boolean mayPlace(ItemStack stack) return false; } } -} \ No newline at end of file +} diff --git a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemyTable.java index 0c96dad79..b7bb88b7b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemyTable.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerAlchemyTable.java @@ -171,4 +171,4 @@ public boolean mayPlace(ItemStack stack) return false; } } -} \ No newline at end of file +} diff --git a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerItemRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerItemRoutingNode.java index f58108a63..f86d79fde 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerItemRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerItemRoutingNode.java @@ -191,4 +191,4 @@ public int getActiveSlot() return inventory.getCurrentActiveSlot(); } } -} \ No newline at end of file +} diff --git a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerMasterRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerMasterRoutingNode.java index 0e84469e9..1ca7785f7 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerMasterRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerMasterRoutingNode.java @@ -116,4 +116,4 @@ public boolean mayPlace(ItemStack itemStack) return itemStack.getItem() instanceof IRouterUpgrade; } } -} \ No newline at end of file +} diff --git a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerTeleposer.java b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerTeleposer.java index 7eb11c989..d72f96a88 100644 --- a/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerTeleposer.java +++ b/src/main/java/wayoftime/bloodmagic/common/container/tile/ContainerTeleposer.java @@ -116,4 +116,4 @@ public boolean mayPlace(ItemStack itemStack) return itemStack.getItem() instanceof ITeleposerFocus; } } -} \ No newline at end of file +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java index 448ad20fd..c1c38a905 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -132,13 +132,15 @@ protected void addTranslations() add("key.bloodmagic.category", "Blood Magic"); add("tooltip.bloodmagic.ghost.everything", "Everything"); - add("tooltip.bloodmagic.ghost.amount", "Ghost item amount: %d."); + add("tooltip.bloodmagic.ghost.amount", "Ghost amount: %d."); add("tooltip.bloodmagic.basicfilter.desc", "Will make sure the items match."); add("tooltip.bloodmagic.tagfilter.desc", "Filters based off of an item's ItemTags."); add("tooltip.bloodmagic.enchantfilter.desc", "Filters based off of enchantments."); add("tooltip.bloodmagic.modfilter.desc", "Filters based off of the source mod."); add("tooltip.bloodmagic.compositefilter.desc", "Filters based off of contained filters."); + add("tooltip.bloodmagic.fluidfilter.desc", "Will make sure the fluids match."); + add("tooltip.bloodmagic.collectionfilter.desc", "Allows to filter different types"); add("tooltip.bloodmagic.hellforgedparts", "These parts are currently beyond your crafting capabilities..."); @@ -783,6 +785,8 @@ protected void addTranslations() addItem(BloodMagicItems.ITEM_ENCHANT_FILTER, "Enchantments Item Filter"); addItem(BloodMagicItems.ITEM_MOD_FILTER, "Mod Item Filter"); addItem(BloodMagicItems.ITEM_COMPOSITE_FILTER, "Composite Item Filter"); + addItem(BloodMagicItems.FLUID_ROUTER_FILTER, "Standard Fluid Filter"); + addItem(BloodMagicItems.FLUID_MOD_FILTER, "Mod Fluid Filter"); addItem(BloodMagicItems.FRAME_PARTS, "Filter Parts"); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index f0bb740f2..f5d5c5c2c 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -20,8 +20,11 @@ import wayoftime.bloodmagic.common.item.potion.ItemAlchemyFlask; import wayoftime.bloodmagic.common.item.potion.ItemAlchemyFlaskLingering; import wayoftime.bloodmagic.common.item.potion.ItemAlchemyFlaskThrowable; +import wayoftime.bloodmagic.common.item.routing.ItemCollectionFilter; import wayoftime.bloodmagic.common.item.routing.ItemCompositeFilter; import wayoftime.bloodmagic.common.item.routing.ItemEnchantFilterCore; +import wayoftime.bloodmagic.common.item.routing.ItemFluidModFilter; +import wayoftime.bloodmagic.common.item.routing.ItemFluidRouterFilter; import wayoftime.bloodmagic.common.item.routing.ItemModFilter; import wayoftime.bloodmagic.common.item.routing.ItemNodeRouter; import wayoftime.bloodmagic.common.item.routing.ItemStandardFilter; @@ -55,8 +58,10 @@ public class BloodMagicItems { -// public static Item.ToolMaterial SOUL_TOOL_MATERIAL = EnumHelper.addToolMaterial("demonic", 4, 520, 7, 8, 50); -// public static final BloodOrb WEAK_ORB_INSTANCE = new BloodOrb(new ResourceLocation(BloodMagic.MODID, "weakbloodorb"), 0, 5000, 10); + // public static Item.ToolMaterial SOUL_TOOL_MATERIAL = + // EnumHelper.addToolMaterial("demonic", 4, 520, 7, 8, 50); + // public static final BloodOrb WEAK_ORB_INSTANCE = new BloodOrb(new + // ResourceLocation(BloodMagic.MODID, "weakbloodorb"), 0, 5000, 10); public static final BloodOrbDeferredRegister BLOOD_ORBS = new BloodOrbDeferredRegister(BloodMagic.MODID); public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BloodMagic.MODID); public static final DeferredRegister BASICITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BloodMagic.MODID); @@ -66,9 +71,13 @@ public class BloodMagicItems public static final BloodOrbRegistryObject ORB_MAGICIAN = BLOOD_ORBS.register("magicianbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "magicianbloodorb"), 3, 150000, 15)); public static final BloodOrbRegistryObject ORB_MASTER = BLOOD_ORBS.register("masterbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "masterbloodorb"), 4, 1000000, 25)); public static final BloodOrbRegistryObject ORB_ARCHMAGE = BLOOD_ORBS.register("archmagebloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "archmagebloodorb"), 5, 10000000, 50)); -// public static final DeferredRegister BLOOD_ORBS = DeferredRegister.create(RegistrarBloodMagic.BLOOD_ORBS, BloodMagic.MODID); + // public static final DeferredRegister BLOOD_ORBS = + // DeferredRegister.create(RegistrarBloodMagic.BLOOD_ORBS, BloodMagic.MODID); -// public static final RegistryObject BLOODSTONE_ITEM = ITEMS.register("ruby_block", () -> new BlockItem(BloodMagicBlocks.BLOODSTONE.get(), new Item.Properties().group(BloodMagic.TAB))); + // public static final RegistryObject BLOODSTONE_ITEM = + // ITEMS.register("ruby_block", () -> new + // BlockItem(BloodMagicBlocks.BLOODSTONE.get(), new + // Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject SOUL_FORGE_ITEM = ITEMS.register("soulforge", () -> new BlockItem(BloodMagicBlocks.SOUL_FORGE.get(), new Item.Properties().tab(BloodMagic.TAB))); public static final RegistryObject BLANK_RUNE_ITEM = ITEMS.register("blankrune", () -> new BlockItem(BloodMagicBlocks.BLANK_RUNE.get(), new Item.Properties().tab(BloodMagic.TAB))); public static final RegistryObject SPEED_RUNE_ITEM = ITEMS.register("speedrune", () -> new BlockItem(BloodMagicBlocks.SPEED_RUNE.get(), new Item.Properties().tab(BloodMagic.TAB))); @@ -146,8 +155,11 @@ public class BloodMagicItems // TODO: Need to rework the above instantiations for the ItemBlocks so that it's // done with the Blocks. -// public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", ItemBloodOrb::new); -// public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", () -> new ItemBloodOrb(WEAK_ORB_INSTANCE)); + // public static final RegistryObject WEAK_BLOOD_ORB = + // BASICITEMS.register("weakbloodorb", ItemBloodOrb::new); + // public static final RegistryObject WEAK_BLOOD_ORB = + // BASICITEMS.register("weakbloodorb", () -> new + // ItemBloodOrb(WEAK_ORB_INSTANCE)); public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", () -> new ItemBloodOrb(ORB_WEAK)); public static final RegistryObject APPRENTICE_BLOOD_ORB = BASICITEMS.register("apprenticebloodorb", () -> new ItemBloodOrb(ORB_APPRENTICE)); public static final RegistryObject MAGICIAN_BLOOD_ORB = BASICITEMS.register("magicianbloodorb", () -> new ItemBloodOrb(ORB_MAGICIAN)); @@ -269,6 +281,10 @@ public class BloodMagicItems public static final RegistryObject NODE_ROUTER = BASICITEMS.register("noderouter", ItemNodeRouter::new); public static final RegistryObject MASTER_NODE_UPGRADE = BASICITEMS.register("mastercore", ItemBasicNodeUpgrade::new); + public static final RegistryObject FLUID_ROUTER_FILTER = BASICITEMS.register("fluidrouterfilterexact", ItemFluidRouterFilter::new); + public static final RegistryObject FLUID_MOD_FILTER = BASICITEMS.register("fluidrouterfiltermod", ItemFluidModFilter::new); + public static final RegistryObject COLLECTION_FILTER = BASICITEMS.register("collectionfilter", ItemCollectionFilter::new); + public static final RegistryObject FRAME_PARTS = BASICITEMS.register("componentframeparts", ItemBase::new); // Misc @@ -324,8 +340,10 @@ public class BloodMagicItems public static final RegistryObject STEADFAST_CRYSTAL_CATALYST = BASICITEMS.register("steadfastcatalyst", () -> new ItemCrystalCatalyst(EnumDemonWillType.STEADFAST, 200, 10, 25, 400)); public static final RegistryObject VENGEFUL_CRYSTAL_CATALYST = BASICITEMS.register("vengefulcatalyst", () -> new ItemCrystalCatalyst(EnumDemonWillType.VENGEFUL, 200, 10, 25, 400)); -// public static final RegistryObject STRENGTHENED_CATALYST = BASICITEMS.register("strengthenedcatalyst", () -> new ItemBase()); -// public static final RegistryObject CONCENTRATED_CATALYST = BASICITEMS.register("concentratedcatalyst", () -> new ItemBase()); + // public static final RegistryObject STRENGTHENED_CATALYST = + // BASICITEMS.register("strengthenedcatalyst", () -> new ItemBase()); + // public static final RegistryObject CONCENTRATED_CATALYST = + // BASICITEMS.register("concentratedcatalyst", () -> new ItemBase()); // Anointments public static final RegistryObject SLATE_VIAL = ITEMS.register("slate_vial", () -> new ItemBase(16, "slate_vial")); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/inventory/InventoryFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/inventory/InventoryFilter.java index 71f176f42..0147de0a5 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/inventory/InventoryFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/inventory/InventoryFilter.java @@ -5,7 +5,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import wayoftime.bloodmagic.common.item.routing.ItemRouterFilter; +import wayoftime.bloodmagic.common.item.routing.ItemItemRouterFilter; import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.Utils; @@ -13,7 +13,7 @@ public class InventoryFilter extends ItemInventory { public InventoryFilter(ItemStack itemStack) { - super(itemStack, ItemRouterFilter.inventorySize, "RoutingFilter"); + super(itemStack, ItemItemRouterFilter.inventorySize, "RoutingFilter"); } public void onGuiSaved(Player entityPlayer) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/BasicFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/BasicFilterKey.java index c59a1e2e9..940376523 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/BasicFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/BasicFilterKey.java @@ -2,7 +2,7 @@ import net.minecraft.world.item.ItemStack; -public class BasicFilterKey implements IFilterKey +public class BasicFilterKey implements IFilterKey { private ItemStack keyStack; private int count; @@ -48,4 +48,10 @@ public boolean isEmpty() { return count == 0 || keyStack.isEmpty(); } + + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionEnchantFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionEnchantFilterKey.java index 1b1bb4688..84ad345b0 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionEnchantFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionEnchantFilterKey.java @@ -8,7 +8,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -public class CollectionEnchantFilterKey implements IFilterKey +public class CollectionEnchantFilterKey implements IFilterKey { private Map enchantMap; private boolean isFuzzy; @@ -89,4 +89,10 @@ public boolean isEmpty() { return count == 0; } + + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionTagFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionTagFilterKey.java index 0dfbee684..35ffc3eab 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionTagFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/CollectionTagFilterKey.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -public class CollectionTagFilterKey implements IFilterKey +public class CollectionTagFilterKey implements IFilterKey { private List> itemTags; private int count; @@ -17,6 +17,12 @@ public CollectionTagFilterKey(List> tagList, int count) this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + @Override public boolean doesStackMatch(ItemStack testStack) { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/CompositeFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/CompositeFilterKey.java index 2e181fe1a..d6abefc1b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/CompositeFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/CompositeFilterKey.java @@ -5,7 +5,7 @@ import net.minecraft.world.item.ItemStack; -public class CompositeFilterKey implements IFilterKey +public class CompositeFilterKey implements IFilterKey { private List keyList = new ArrayList(); private int count; @@ -15,6 +15,12 @@ public CompositeFilterKey(int count) this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + public void addFilterKey(IFilterKey key) { if (!(key instanceof CompositeFilterKey)) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/EnchantFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/EnchantFilterKey.java index e60aa719a..55993acd8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/EnchantFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/EnchantFilterKey.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -public class EnchantFilterKey implements IFilterKey +public class EnchantFilterKey implements IFilterKey { private Enchantment enchantment; private int enchantLevel; @@ -22,6 +22,12 @@ public EnchantFilterKey(Enchantment enchantment, int enchantLevel, boolean isFuz this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + @Override public boolean doesStackMatch(ItemStack testStack) { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidFilterKey.java new file mode 100644 index 000000000..474f9bf6c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidFilterKey.java @@ -0,0 +1,59 @@ +package wayoftime.bloodmagic.common.item.routing; + +import net.minecraftforge.fluids.FluidStack; + +public class FluidFilterKey implements IFilterKey +{ + + private FluidStack keyStack; + private int amount; + + public FluidFilterKey(FluidStack keyStack, int amount) + { + this.amount = amount; + this.keyStack = keyStack; + } + + @Override + public FluidStack getType() + { + return FluidStack.EMPTY; + } + + @Override + public boolean doesStackMatch(FluidStack testStack) + { + return keyStack.isFluidEqual(testStack) && !testStack.isEmpty() && !keyStack.isEmpty(); + } + + @Override + public int getCount() + { + return amount; + } + + @Override + public void setCount(int count) + { + this.amount = count; + } + + @Override + public void grow(int changeAmount) + { + this.amount += changeAmount; + } + + @Override + public boolean isEmpty() + { + return this.amount == 0 || keyStack.isEmpty(); + } + + @Override + public void shrink(int changeAmount) + { + this.amount -= changeAmount; + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidModFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidModFilterKey.java new file mode 100644 index 000000000..d0da23825 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/FluidModFilterKey.java @@ -0,0 +1,59 @@ +package wayoftime.bloodmagic.common.item.routing; + +import net.minecraftforge.fluids.FluidStack; + +public class FluidModFilterKey implements IFilterKey +{ + + private String namespace; + private int amount; + + public FluidModFilterKey(String namespace, int amount) + { + this.amount = amount; + this.namespace = namespace; + } + + @Override + public FluidStack getType() + { + return FluidStack.EMPTY; + } + + @Override + public boolean doesStackMatch(FluidStack testStack) + { + return !testStack.isEmpty() && testStack.getFluid().getRegistryName().getNamespace().equals(namespace); + } + + @Override + public int getCount() + { + return amount; + } + + @Override + public void setCount(int count) + { + this.amount = count; + } + + @Override + public void grow(int changeAmount) + { + this.amount += changeAmount; + } + + @Override + public boolean isEmpty() + { + return this.amount == 0; + } + + @Override + public void shrink(int changeAmount) + { + this.amount -= changeAmount; + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ICompositeItemFilterProvider.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ICompositeItemFilterProvider.java index 42748c721..e21a9d0b3 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ICompositeItemFilterProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ICompositeItemFilterProvider.java @@ -2,7 +2,7 @@ import net.minecraft.world.item.ItemStack; -public interface ICompositeItemFilterProvider extends IItemFilterProvider +public interface ICompositeItemFilterProvider extends IRoutingFilterProvider { ItemStack nestFilter(ItemStack mainFilterStack, ItemStack nestedFilterStack); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/IFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/IFilterKey.java index 4c5e123c6..cec3b9492 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/IFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/IFilterKey.java @@ -1,10 +1,10 @@ package wayoftime.bloodmagic.common.item.routing; -import net.minecraft.world.item.ItemStack; - -public interface IFilterKey +public interface IFilterKey { - public boolean doesStackMatch(ItemStack testStack); + public T getType(); + + public boolean doesStackMatch(T testStack); public int getCount(); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/IItemFilterProvider.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/IItemFilterProvider.java deleted file mode 100644 index 1d98fe6fe..000000000 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/IItemFilterProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -package wayoftime.bloodmagic.common.item.routing; - -import java.util.List; - -import org.apache.commons.lang3.tuple.Pair; - -import net.minecraft.client.gui.components.Button; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.IItemHandler; -import wayoftime.bloodmagic.common.container.item.ContainerFilter; -import wayoftime.bloodmagic.common.routing.IItemFilter; - -public interface IItemFilterProvider extends IRoutingFilterProvider -{ - IItemFilter getInputItemFilter(ItemStack stack, BlockEntity tile, IItemHandler handler); - - IItemFilter getOutputItemFilter(ItemStack stack, BlockEntity tile, IItemHandler handler); - - // Only used for filters that check ItemStacks and do not transfer items to/from - // a connected inventory. - IItemFilter getUninitializedItemFilter(ItemStack stack); - - void setGhostItemAmount(ItemStack filterStack, int ghostItemSlot, int amount); - - List getTextForHoverItem(ItemStack filterStack, String buttonKey, int ghostItemSlot); - - // -1 equals an invalid button input; - int getCurrentButtonState(ItemStack filterStack, String buttonKey, int ghostItemSlot); - - @OnlyIn(Dist.CLIENT) - List> getButtonAction(ContainerFilter container); - - Pair getTexturePositionForState(ItemStack filterStack, String buttonKey, int currentButtonState); - - // -1 equals an invalid button input; - int receiveButtonPress(ItemStack filterStack, String buttonKey, int ghostItemSlot, int currentButtonState); - - boolean isButtonGlobal(ItemStack filterStack, String buttonKey); - - IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount); -} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/INestableItemFilterProvider.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/INestableItemFilterProvider.java index e0f98f11b..7958e440a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/INestableItemFilterProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/INestableItemFilterProvider.java @@ -7,7 +7,7 @@ * @author WayofTime * */ -public interface INestableItemFilterProvider extends IItemFilterProvider +public interface INestableItemFilterProvider extends IRoutingFilterProvider { } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/IRoutingFilterProvider.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/IRoutingFilterProvider.java index baa3c0153..5f17ccee1 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/IRoutingFilterProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/IRoutingFilterProvider.java @@ -1,15 +1,50 @@ package wayoftime.bloodmagic.common.item.routing; +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; + +import net.minecraft.client.gui.components.Button; +import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.common.container.item.ContainerFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; public interface IRoutingFilterProvider { - /** - * Translates the inputed keyStack into the proper filtered key - * - * @param filterStack - * @param keyStack - * @return A new ItemStack which modifies the keyStack - */ - ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack); + + ItemStack getContainedStackForType(ItemStack filterStack, ItemStack keyStack); + + List getInputFilter(ItemStack filterStack, BlockEntity tile, Direction side); + + List getOutputFilter(ItemStack filterStack, BlockEntity tile, Direction side); + + // Only used for filters that check ItemStacks and do not transfer items to/from + // a connected inventory. + IRoutingFilter getUninitializedItemFilter(ItemStack filterStack); + + void setGhostItemAmount(ItemStack filterStack, int ghostItemSlot, int amount); + + List getTextForHoverItem(ItemStack filterStack, String buttonKey, int ghostItemSlot); + + // -1 equals an invalid button input; + int getCurrentButtonState(ItemStack filterStack, String buttonKey, int ghostItemSlot); + + @OnlyIn(Dist.CLIENT) + List> getButtonAction(ContainerFilter container); + + Pair getTexturePositionForState(ItemStack filterStack, String buttonKey, int currentButtonState); + + // -1 equals an invalid button input; + int receiveButtonPress(ItemStack filterStack, String buttonKey, int ghostItemSlot, int currentButtonState); + + boolean isButtonGlobal(ItemStack filterStack, String buttonKey); + + IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack); + + IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount); } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCollectionFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCollectionFilter.java new file mode 100644 index 000000000..281f46aff --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCollectionFilter.java @@ -0,0 +1,299 @@ +package wayoftime.bloodmagic.common.item.routing; + +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.Lists; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.Button.OnPress; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +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.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.network.NetworkHooks; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.client.button.FilterButtonTogglePress; +import wayoftime.bloodmagic.common.container.item.ContainerFilter; +import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; +import wayoftime.bloodmagic.common.item.inventory.ItemInventory; +import wayoftime.bloodmagic.common.routing.BasicItemFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.GhostItemHelper; +import wayoftime.bloodmagic.util.Utils; + +public class ItemCollectionFilter extends Item implements MenuProvider, IRoutingFilterProvider +{ + + public ItemCollectionFilter() + { + super(new Item.Properties().stacksTo(16).tab(BloodMagic.TAB)); + } + + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack filterStack, Level world, List tooltip, TooltipFlag flag) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.collectionfilter.desc").withStyle(ChatFormatting.ITALIC).withStyle(ChatFormatting.GRAY)); + + if (filterStack.getTag() == null) + { + return; + } + + boolean isSneaking = Screen.hasShiftDown(); + if (!isSneaking) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.extraInfo").withStyle(ChatFormatting.BLUE)); + } else + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.contained_filters").withStyle(ChatFormatting.BLUE)); + ItemInventory inv = new InventoryFilter(filterStack); + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack containedFilterStack = inv.getItem(i); + if (containedFilterStack.isEmpty()) + { + continue; + } + tooltip.add(containedFilterStack.getHoverName()); + } + } + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) + { + ItemStack stack = player.getItemInHand(hand); + if (!world.isClientSide) + { + Utils.setUUID(stack); + if (player instanceof ServerPlayer) + { + NetworkHooks.openGui((ServerPlayer) player, this, buf -> buf.writeItemStack(stack, false)); + } + } + + return new InteractionResultHolder(InteractionResult.SUCCESS, stack); + } + + @Override + public ItemStack getContainedStackForType(ItemStack filterStack, ItemStack keyStack) + { + return ItemStack.EMPTY; + } + + @Override + public List getInputFilter(ItemStack mainFilterStack, BlockEntity tile, Direction side) + { + ItemInventory inv = new InventoryFilter(mainFilterStack); + List filterList = Lists.newArrayList(); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack filterStack = inv.getItem(i); + if (filterStack.isEmpty()) + { + continue; + } + + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + List sublist = ((IRoutingFilterProvider) filterStack.getItem()).getInputFilter(filterStack, tile, side); + sublist.forEach(filterList::add); + } + } + + return filterList; + } + + @Override + public List getOutputFilter(ItemStack mainFilterStack, BlockEntity tile, Direction side) + { + ItemInventory inv = new InventoryFilter(mainFilterStack); + List filterList = Lists.newArrayList(); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack filterStack = inv.getItem(i); + if (filterStack.isEmpty()) + { + continue; + } + + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + List sublist = ((IRoutingFilterProvider) filterStack.getItem()).getOutputFilter(filterStack, tile, side); + sublist.forEach(filterList::add); + } + } + return filterList; + } + + @Override + public IRoutingFilter getUninitializedItemFilter(ItemStack filterStack) + { + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); + + List filteredList = new ArrayList<>(); + ItemInventory inv = new InventoryFilter(filterStack); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + int amount = GhostItemHelper.getItemGhostAmount(stack); + ItemStack ghostStack = GhostItemHelper.getSingleStackFromGhost(stack); + + IFilterKey key = getFilterKey(filterStack, i, ghostStack, amount); + + filteredList.add(key); + } + + testFilter.initializeFilter(filteredList); + + return testFilter; + } + + @Override + public void setGhostItemAmount(ItemStack filterStack, int ghostItemSlot, int amount) + { + } + + @Override + public List getTextForHoverItem(ItemStack filterStack, String buttonKey, int ghostItemSlot) + { + List componentList = new ArrayList(); + + return componentList; + } + + @Override + public int getCurrentButtonState(ItemStack filterStack, String buttonKey, int ghostItemSlot) + { + CompoundTag tag = filterStack.getTag(); + if (tag != null) + { + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + int state = tag.getInt(Constants.NBT.BLACKWHITELIST); + return state; + } + } + + return -1; + } + + @Override + @OnlyIn(Dist.CLIENT) + public List> getButtonAction(ContainerFilter container) + { + List> buttonList = new ArrayList>(); + + buttonList.add(Pair.of(Constants.BUTTONID.BLACKWHITELIST, new FilterButtonTogglePress(Constants.BUTTONID.BLACKWHITELIST, container))); + + return buttonList; + } + + @Override + public Pair getTexturePositionForState(ItemStack filterStack, String buttonKey, int currentButtonState) + { + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + switch (currentButtonState) + { + case 1: + return Pair.of(176, 20); + + default: + return Pair.of(176, 0); + } + } + + return Pair.of(0, 0); + } + + @Override + public int receiveButtonPress(ItemStack filterStack, String buttonKey, int ghostItemSlot, int currentButtonState) + { + CompoundTag tag = filterStack.getTag(); + if (tag == null) + { + filterStack.setTag(new CompoundTag()); + tag = filterStack.getTag(); + } + + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + int nextState = 0; + switch (currentButtonState) + { + case 0: + nextState = 1; + break; + + default: + nextState = 0; + } + + tag.putInt(Constants.NBT.BLACKWHITELIST, nextState); + return nextState; + } + + return -1; + } + + @Override + public boolean isButtonGlobal(ItemStack filterStack, String buttonKey) + { + return buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST); + } + + @Override + public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount) + { + return new BasicFilterKey(ItemStack.EMPTY, 42); + } + + @Override + public AbstractContainerMenu createMenu(int windowId, Inventory inventory, Player player) + { + assert player.getCommandSenderWorld() != null; + return new ContainerFilter(windowId, player, inventory, player.getMainHandItem()); + } + + @Override + public Component getDisplayName() + { + return new TextComponent("Collection Filter"); + } + + @Override + public IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack) + { + return new BasicItemFilter(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCompositeFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCompositeFilter.java index db363fcbe..fdd9a74f8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCompositeFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemCompositeFilter.java @@ -5,7 +5,10 @@ import org.apache.commons.lang3.tuple.Pair; +import com.google.common.collect.Lists; + import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.Direction; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button.OnPress; import net.minecraft.world.item.TooltipFlag; @@ -23,18 +26,15 @@ import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.IItemHandler; import wayoftime.bloodmagic.client.button.FilterButtonTogglePress; import wayoftime.bloodmagic.common.container.item.ContainerFilter; import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; import wayoftime.bloodmagic.common.item.inventory.ItemInventory; -import wayoftime.bloodmagic.common.routing.BasicItemFilter; -import wayoftime.bloodmagic.common.routing.BlacklistItemFilter; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.GhostItemHelper; -public class ItemCompositeFilter extends ItemRouterFilter implements MenuProvider, ICompositeItemFilterProvider +public class ItemCompositeFilter extends ItemItemRouterFilter implements MenuProvider, ICompositeItemFilterProvider { public ItemCompositeFilter() { @@ -121,16 +121,16 @@ public InteractionResultHolder use(Level world, Player player, Intera return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } - protected IItemFilter getFilterTypeFromConfig(ItemStack filterStack) - { - int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); - if (state == 1) - { - return new BlacklistItemFilter(); - } - - return new BasicItemFilter(); - } +// protected IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack) +// { +// int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); +// if (state == 1) +// { +// return new BlacklistItemFilter(); +// } +// +// return new BasicItemFilter(); +// } @Override public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount) @@ -139,9 +139,9 @@ public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostS } @Override - public IItemFilter getInputItemFilter(ItemStack filterStack, BlockEntity tile, IItemHandler handler) + public List getInputFilter(ItemStack filterStack, BlockEntity tile, Direction side) { - IItemFilter testFilter = getFilterTypeFromConfig(filterStack); + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); List filteredList = new ArrayList<>(); ItemInventory inv = new InventoryFilter(filterStack); @@ -180,14 +180,16 @@ public IItemFilter getInputItemFilter(ItemStack filterStack, BlockEntity tile, I } } - testFilter.initializeFilter(filteredList, tile, handler, false); - return testFilter; + testFilter.initializeFilter(filteredList, tile, side, false); + List list = Lists.newArrayList(); + list.add(testFilter); + return list; } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, BlockEntity tile, IItemHandler handler) + public List getOutputFilter(ItemStack filterStack, BlockEntity tile, Direction side) { - IItemFilter testFilter = getFilterTypeFromConfig(filterStack); + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); List filteredList = new ArrayList<>(); ItemInventory inv = new InventoryFilter(filterStack); // TODO: Change to grab the filter from the Item @@ -231,9 +233,11 @@ public IItemFilter getOutputItemFilter(ItemStack filterStack, BlockEntity tile, } } - testFilter.initializeFilter(filteredList, tile, handler, true); + testFilter.initializeFilter(filteredList, tile, side, true); - return testFilter; + List list = Lists.newArrayList(); + list.add(testFilter); + return list; } @Override diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemEnchantFilterCore.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemEnchantFilterCore.java index bbbf7ee98..caa7acbd9 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemEnchantFilterCore.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemEnchantFilterCore.java @@ -27,7 +27,7 @@ import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.GhostItemHelper; -public class ItemEnchantFilterCore extends ItemRouterFilter implements INestableItemFilterProvider +public class ItemEnchantFilterCore extends ItemItemRouterFilter implements INestableItemFilterProvider { public ItemEnchantFilterCore() { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidModFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidModFilter.java new file mode 100644 index 000000000..4d6e371f2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidModFilter.java @@ -0,0 +1,93 @@ +package wayoftime.bloodmagic.common.item.routing; + +import java.util.List; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; +import wayoftime.bloodmagic.common.item.inventory.ItemInventory; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.GhostItemHelper; + +public class ItemFluidModFilter extends ItemFluidRouterFilter +{ + public ItemFluidModFilter() + { + super(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack filterStack, Level world, List tooltip, TooltipFlag flag) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.modfilter.desc").withStyle(ChatFormatting.ITALIC).withStyle(ChatFormatting.GRAY)); + + if (filterStack.getTag() == null) + { + return; + } + + boolean sneaking = Screen.hasShiftDown(); + if (!sneaking) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.extraInfo").withStyle(ChatFormatting.BLUE)); + } else + { + int whitelistState = this.getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); + boolean isWhitelist = whitelistState == 0; + + if (isWhitelist) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.whitelist").withStyle(ChatFormatting.GRAY)); + } else + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.blacklist").withStyle(ChatFormatting.GRAY)); + } + ItemInventory inv = new InventoryFilter(filterStack); + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + FluidStack fluidStack = FluidUtil.getFluidContained(stack).get(); + TranslatableComponent modText = new TranslatableComponent("tooltip.bloodmagic.filter.from_mod", fluidStack.getFluid().getRegistryName().getNamespace()); + + if (isWhitelist) + { + int amount = GhostItemHelper.getItemGhostAmount(stack); + if (amount > 0) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.count", amount, modText)); + } else + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.all", modText)); + } + + } else + { + tooltip.add(modText); + } + } + } + } + + @Override + public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount) + { + String namespace = FluidUtil.getFluidContained(ghostStack).get().getFluid().getRegistryName().getNamespace(); + + return new FluidModFilterKey(namespace, amount); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidRouterFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidRouterFilter.java new file mode 100644 index 000000000..4fb4f740e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemFluidRouterFilter.java @@ -0,0 +1,376 @@ +package wayoftime.bloodmagic.common.item.routing; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.Lists; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.Button.OnPress; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +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.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.network.NetworkHooks; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.client.button.FilterButtonTogglePress; +import wayoftime.bloodmagic.common.container.item.ContainerFilter; +import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; +import wayoftime.bloodmagic.common.item.inventory.ItemInventory; +import wayoftime.bloodmagic.common.routing.BasicFluidFilter; +import wayoftime.bloodmagic.common.routing.BlacklistFluidFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.GhostItemHelper; +import wayoftime.bloodmagic.util.Utils; + +public class ItemFluidRouterFilter extends Item implements MenuProvider, IRoutingFilterProvider +{ + + public ItemFluidRouterFilter() + { + super(new Item.Properties().stacksTo(16).tab(BloodMagic.TAB)); + } + + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack filterStack, Level world, List tooltip, TooltipFlag flag) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.fluidfilter.desc").withStyle(ChatFormatting.ITALIC).withStyle(ChatFormatting.GRAY)); + + if (filterStack.getTag() == null) + { + return; + } + + int whitelistState = this.getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); + boolean isWhitelist = whitelistState == 0; + + if (isWhitelist) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.whitelist").withStyle(ChatFormatting.GRAY)); + } else + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.blacklist").withStyle(ChatFormatting.GRAY)); + } + + ItemInventory inv = new InventoryFilter(filterStack); + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + FluidStack fluidStack = FluidUtil.getFluidContained(stack).get(); + if (isWhitelist) + { + int amount = GhostItemHelper.getItemGhostAmount(stack); + if (amount > 0) + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.count", amount, fluidStack.getDisplayName())); + } else + { + tooltip.add(new TranslatableComponent("tooltip.bloodmagic.filter.all", fluidStack.getDisplayName())); + } + } else + { + tooltip.add(fluidStack.getDisplayName()); + } + } + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) + { + ItemStack stack = player.getItemInHand(hand); + if (!world.isClientSide) + { + Utils.setUUID(stack); + if (player instanceof ServerPlayer) + { + NetworkHooks.openGui((ServerPlayer) player, this, buf -> buf.writeItemStack(stack, false)); + } + } + + return new InteractionResultHolder(InteractionResult.SUCCESS, stack); + } + + @Override + public ItemStack getContainedStackForType(ItemStack filterStack, ItemStack keyStack) + { + ItemStack copyStack = keyStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.setCount(1); + return copyStack; + } + + @Override + public List getInputFilter(ItemStack filterStack, BlockEntity tile, Direction side) + { + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); + + List filteredList = new ArrayList<>(); + ItemInventory inv = new InventoryFilter(filterStack); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + int amount = GhostItemHelper.getItemGhostAmount(stack); + ItemStack ghostStack = GhostItemHelper.getSingleStackFromGhost(stack); + + IFilterKey key = getFilterKey(filterStack, i, ghostStack, amount); + + filteredList.add(key); + } + + testFilter.initializeFilter(filteredList, tile, side, false); + List filterList = Lists.newArrayList(); + filterList.add(testFilter); + return filterList; + } + + @Override + public List getOutputFilter(ItemStack filterStack, BlockEntity tile, Direction side) + { + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); + + List filteredList = new ArrayList<>(); + ItemInventory inv = new InventoryFilter(filterStack); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + int amount = GhostItemHelper.getItemGhostAmount(stack); + ItemStack ghostStack = GhostItemHelper.getSingleStackFromGhost(stack); + if (amount == 0) + { + amount = Integer.MAX_VALUE; + } + + IFilterKey key = getFilterKey(filterStack, i, ghostStack, amount); + + filteredList.add(key); + } + + testFilter.initializeFilter(filteredList, tile, side, true); + List filterList = Lists.newArrayList(); + filterList.add(testFilter); + return filterList; + } + + @Override + public IRoutingFilter getUninitializedItemFilter(ItemStack filterStack) + { + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); + + List filteredList = new ArrayList<>(); + ItemInventory inv = new InventoryFilter(filterStack); + + for (int i = 0; i < inv.getContainerSize(); i++) + { + ItemStack stack = inv.getItem(i); + if (stack.isEmpty()) + { + continue; + } + + int amount = GhostItemHelper.getItemGhostAmount(stack); + ItemStack ghostStack = GhostItemHelper.getSingleStackFromGhost(stack); + + IFilterKey key = getFilterKey(filterStack, i, ghostStack, amount); + + filteredList.add(key); + } + + testFilter.initializeFilter(filteredList); + + return testFilter; + } + + @Override + public void setGhostItemAmount(ItemStack filterStack, int ghostItemSlot, int amount) + { + ItemInventory inv = new InventoryFilter(filterStack); + ItemStack stack = inv.getItem(ghostItemSlot); + if (!stack.isEmpty()) + { + GhostItemHelper.setItemGhostAmount(stack, amount); + + inv.writeToStack(filterStack); + } + } + + @Override + public List getTextForHoverItem(ItemStack filterStack, String buttonKey, int ghostItemSlot) + { + List componentList = new ArrayList(); + + int currentState = getCurrentButtonState(filterStack, buttonKey, ghostItemSlot); + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + switch (currentState) + { + case 1: + componentList.add(new TranslatableComponent("filter.bloodmagic.blacklist")); + break; + + default: + componentList.add(new TranslatableComponent("filter.bloodmagic.whitelist")); + } + } + + return componentList; + } + + @Override + public int getCurrentButtonState(ItemStack filterStack, String buttonKey, int ghostItemSlot) + { + CompoundTag tag = filterStack.getTag(); + if (tag != null) + { + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + int state = tag.getInt(Constants.NBT.BLACKWHITELIST); + return state; + } + } + + return -1; + } + + @Override + @OnlyIn(Dist.CLIENT) + public List> getButtonAction(ContainerFilter container) + { + List> buttonList = new ArrayList>(); + + buttonList.add(Pair.of(Constants.BUTTONID.BLACKWHITELIST, new FilterButtonTogglePress(Constants.BUTTONID.BLACKWHITELIST, container))); + + return buttonList; + } + + @Override + public Pair getTexturePositionForState(ItemStack filterStack, String buttonKey, int currentButtonState) + { + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + switch (currentButtonState) + { + case 1: + return Pair.of(176, 20); + + default: + return Pair.of(176, 0); + } + } + + return Pair.of(0, 0); + } + + @Override + public int receiveButtonPress(ItemStack filterStack, String buttonKey, int ghostItemSlot, int currentButtonState) + { + CompoundTag tag = filterStack.getTag(); + if (tag == null) + { + filterStack.setTag(new CompoundTag()); + tag = filterStack.getTag(); + } + + if (buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST)) + { + int nextState = 0; + switch (currentButtonState) + { + case 0: + nextState = 1; + break; + + default: + nextState = 0; + } + + tag.putInt(Constants.NBT.BLACKWHITELIST, nextState); + return nextState; + } + + return -1; + } + + @Override + public boolean isButtonGlobal(ItemStack filterStack, String buttonKey) + { + return buttonKey.equals(Constants.BUTTONID.BLACKWHITELIST); + } + + @Override + public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostStack, int amount) + { + Optional handler = FluidUtil.getFluidHandler(ghostStack).resolve(); + if (handler.isPresent()) + { + FluidStack stack = handler.get().getFluidInTank(0); + return new FluidFilterKey(stack, amount); + } + return new FluidFilterKey(FluidStack.EMPTY, amount); + } + + @Override + public AbstractContainerMenu createMenu(int p_39954_, Inventory p_39955_, Player player) + { + assert player.getCommandSenderWorld() != null; + return new ContainerFilter(p_39954_, player, p_39955_, player.getMainHandItem()); + } + + @Override + public Component getDisplayName() + { + return new TextComponent("Fluid Filter"); + } + + @Override + public IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack) + { + int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); + if (state == 1) + { + return new BlacklistFluidFilter(); + } + + return new BasicFluidFilter(); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemRouterFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemItemRouterFilter.java similarity index 86% rename from src/main/java/wayoftime/bloodmagic/common/item/routing/ItemRouterFilter.java rename to src/main/java/wayoftime/bloodmagic/common/item/routing/ItemItemRouterFilter.java index f65e03dc4..7a95124f8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemRouterFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemItemRouterFilter.java @@ -5,8 +5,11 @@ import org.apache.commons.lang3.tuple.Pair; +import com.google.common.collect.Lists; + import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button.OnPress; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -25,7 +28,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.IItemHandler; import net.minecraftforge.network.NetworkHooks; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.button.FilterButtonTogglePress; @@ -34,19 +36,19 @@ import wayoftime.bloodmagic.common.item.inventory.ItemInventory; import wayoftime.bloodmagic.common.routing.BasicItemFilter; import wayoftime.bloodmagic.common.routing.BlacklistItemFilter; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.GhostItemHelper; import wayoftime.bloodmagic.util.Utils; -public class ItemRouterFilter extends Item implements MenuProvider, IItemFilterProvider +public class ItemItemRouterFilter extends Item implements MenuProvider, IRoutingFilterProvider { public static final int inventorySize = 9; public static final int maxUpgrades = 9; public static final String FILTER_INV = "filterInventory"; - public ItemRouterFilter() + public ItemItemRouterFilter() { super(new Item.Properties().stacksTo(16).tab(BloodMagic.TAB)); } @@ -84,7 +86,7 @@ public Component getDisplayName() } @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + public ItemStack getContainedStackForType(ItemStack filterStack, ItemStack keyStack) { ItemStack copyStack = keyStack.copy(); GhostItemHelper.setItemGhostAmount(copyStack, 0); @@ -92,7 +94,8 @@ public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keySt return copyStack; } - protected IItemFilter getFilterTypeFromConfig(ItemStack filterStack) + @Override + public IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack) { int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); if (state == 1) @@ -110,9 +113,9 @@ public IFilterKey getFilterKey(ItemStack filterStack, int slot, ItemStack ghostS } @Override - public IItemFilter getInputItemFilter(ItemStack filterStack, BlockEntity tile, IItemHandler handler) + public List getInputFilter(ItemStack filterStack, BlockEntity tile, Direction side) { - IItemFilter testFilter = getFilterTypeFromConfig(filterStack); + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); List filteredList = new ArrayList<>(); ItemInventory inv = new InventoryFilter(filterStack); @@ -133,14 +136,16 @@ public IItemFilter getInputItemFilter(ItemStack filterStack, BlockEntity tile, I filteredList.add(key); } - testFilter.initializeFilter(filteredList, tile, handler, false); - return testFilter; + testFilter.initializeFilter(filteredList, tile, side, false); + List list = Lists.newArrayList(); + list.add(testFilter); + return list; } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, BlockEntity tile, IItemHandler handler) + public List getOutputFilter(ItemStack filterStack, BlockEntity tile, Direction side) { - IItemFilter testFilter = getFilterTypeFromConfig(filterStack); + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); List filteredList = new ArrayList<>(); ItemInventory inv = new InventoryFilter(filterStack); // TODO: Change to grab the filter from the Item @@ -165,9 +170,10 @@ public IItemFilter getOutputItemFilter(ItemStack filterStack, BlockEntity tile, filteredList.add(key); } - testFilter.initializeFilter(filteredList, tile, handler, true); - - return testFilter; + testFilter.initializeFilter(filteredList, tile, side, true); + List list = Lists.newArrayList(); + list.add(testFilter); + return list; } @Override @@ -285,9 +291,9 @@ public boolean isButtonGlobal(ItemStack filterStack, String buttonKey) } @Override - public IItemFilter getUninitializedItemFilter(ItemStack filterStack) + public IRoutingFilter getUninitializedItemFilter(ItemStack filterStack) { - IItemFilter testFilter = getFilterTypeFromConfig(filterStack); + IRoutingFilter testFilter = getFilterTypeFromConfig(filterStack); List filteredList = new ArrayList<>(); ItemInventory inv = new InventoryFilter(filterStack); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemModFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemModFilter.java index 6366abc45..2bc1f07ba 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemModFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemModFilter.java @@ -16,7 +16,7 @@ import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.GhostItemHelper; -public class ItemModFilter extends ItemRouterFilter implements INestableItemFilterProvider +public class ItemModFilter extends ItemItemRouterFilter implements INestableItemFilterProvider { public ItemModFilter() { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemTagFilter.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemTagFilter.java index 6eb98561c..97990532f 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemTagFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ItemTagFilter.java @@ -25,24 +25,21 @@ import wayoftime.bloodmagic.common.container.item.ContainerFilter; import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; import wayoftime.bloodmagic.common.item.inventory.ItemInventory; -import wayoftime.bloodmagic.common.routing.BasicItemFilter; -import wayoftime.bloodmagic.common.routing.BlacklistItemFilter; -import wayoftime.bloodmagic.common.routing.IItemFilter; import wayoftime.bloodmagic.util.Constants; import wayoftime.bloodmagic.util.GhostItemHelper; -public class ItemTagFilter extends ItemRouterFilter implements INestableItemFilterProvider +public class ItemTagFilter extends ItemItemRouterFilter implements INestableItemFilterProvider { - protected IItemFilter getFilterTypeFromConfig(ItemStack filterStack) - { - int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); - if (state == 1) - { - return new BlacklistItemFilter(); - } - - return new BasicItemFilter(); - } +// protected IRoutingFilter getFilterTypeFromConfig(ItemStack filterStack) +// { +// int state = getCurrentButtonState(filterStack, Constants.BUTTONID.BLACKWHITELIST, 0); +// if (state == 1) +// { +// return new BlacklistItemFilter(); +// } +// +// return new BasicItemFilter(); +// } @Override @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/ModFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/ModFilterKey.java index 18e8d84cb..5df44e0a2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/ModFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/ModFilterKey.java @@ -2,7 +2,7 @@ import net.minecraft.world.item.ItemStack; -public class ModFilterKey implements IFilterKey +public class ModFilterKey implements IFilterKey { private String namespace; private int count; @@ -13,6 +13,12 @@ public ModFilterKey(String namespace, int count) this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + @Override public boolean doesStackMatch(ItemStack testStack) { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/NoEnchantsFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/NoEnchantsFilterKey.java index 6447536b7..a8502c4bf 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/NoEnchantsFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/NoEnchantsFilterKey.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.ItemStack; -public class NoEnchantsFilterKey implements IFilterKey +public class NoEnchantsFilterKey implements IFilterKey { private int count; @@ -15,6 +15,12 @@ public NoEnchantsFilterKey(int count) this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + @Override public boolean doesStackMatch(ItemStack testStack) { diff --git a/src/main/java/wayoftime/bloodmagic/common/item/routing/TagFilterKey.java b/src/main/java/wayoftime/bloodmagic/common/item/routing/TagFilterKey.java index 21b350fa6..736a61d91 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/routing/TagFilterKey.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/routing/TagFilterKey.java @@ -4,7 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -public class TagFilterKey implements IFilterKey +public class TagFilterKey implements IFilterKey { private TagKey itemTag; private int count; @@ -15,6 +15,12 @@ public TagFilterKey(TagKey tag, int count) this.count = count; } + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + @Override public boolean doesStackMatch(ItemStack testStack) { diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyTableRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyTableRecipeProvider.java index 82339188f..baee3436c 100644 --- a/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyTableRecipeProvider.java +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyTableRecipeProvider.java @@ -132,6 +132,10 @@ public void addRecipes(Consumer consumer) AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.ITEM_ENCHANT_FILTER.get()), 500, 100, 3).addIngredient(Ingredient.of(BloodMagicItems.FRAME_PARTS.get())).addIngredient(Ingredient.of(Items.ENCHANTED_BOOK)).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(Items.PAPER)).build(consumer, BloodMagic.rl(basePath + "enchant_router_filter")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.ITEM_COMPOSITE_FILTER.get()), 1000, 200, 3).addIngredient(Ingredient.of(BloodMagicItems.FRAME_PARTS.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_GLOWSTONE)).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(BloodMagicItems.IMBUED_SLATE.get())).build(consumer, BloodMagic.rl(basePath + "composite_router_filter")); + AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.FLUID_ROUTER_FILTER.get()), 500, 100, 3).addIngredient(Ingredient.of(BloodMagicItems.FRAME_PARTS.get())).addIngredient(Ingredient.of(Items.BUCKET)).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(Tags.Items.DYES_RED)).build(consumer, BloodMagic.rl(basePath + "fluid_router_filter")); + AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.FLUID_MOD_FILTER.get()), 500, 100, 3).addIngredient(Ingredient.of(BloodMagicItems.FRAME_PARTS.get())).addIngredient(Ingredient.of(Items.BUCKET)).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(Tags.Items.DYES_YELLOW)).build(consumer, BloodMagic.rl(basePath + "fluid_mod_filter")); + AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.COLLECTION_FILTER.get()), 500, 100, 3).addIngredient(Ingredient.of(BloodMagicItems.FRAME_PARTS.get())).addIngredient(Ingredient.of(BloodMagicItems.IMBUED_SLATE.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(Tags.Items.GEMS_LAPIS)).build(consumer, BloodMagic.rl(basePath + "collection_filter")); + AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.TAU_OIL.get()), 500, 200, 3).addIngredient(Ingredient.of(BloodMagicItems.WEAK_TAU_ITEM.get())).addIngredient(Ingredient.of(BloodMagicItems.WEAK_TAU_ITEM.get())).addIngredient(Ingredient.of(BloodMagicItems.WEAK_TAU_ITEM.get())).addIngredient(Ingredient.of(Items.BONE_MEAL)).build(consumer, BloodMagic.rl(basePath + "tau_oil")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.INTERMEDIATE_CUTTING_FLUID.get()), 2000, 200, 3).addIngredient(Ingredient.of(BloodMagicItems.TAU_OIL.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_GLOWSTONE)).addIngredient(Ingredient.of(Tags.Items.GUNPOWDER)).addIngredient(Ingredient.of(Items.SUGAR)).addIngredient(Ingredient.of(BloodMagicTags.DUST_SULFUR)).addIngredient(Ingredient.of(waterbottleStack)).build(consumer, BloodMagic.rl(basePath + "intermediate_cutting_fluid")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.INTERMEDIATE_CUTTING_FLUID.get()), 2100, 200, 3).addIngredient(Ingredient.of(BloodMagicItems.TAU_OIL.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_GLOWSTONE)).addIngredient(Ingredient.of(Tags.Items.GUNPOWDER)).addIngredient(Ingredient.of(Items.SUGAR)).addIngredient(Ingredient.of(BloodMagicTags.DUST_SULFUR)).addIngredient(Ingredient.of(BloodMagicItems.WATER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "intermediate_cutting_fluid_sigil")); @@ -156,7 +160,10 @@ public void addRecipes(Consumer consumer) AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.AVERAGE_POWER_CATALYST.get()), 2000, 100, 4).addIngredient(Ingredient.of(BloodMagicItems.STRONG_TAU_ITEM.get())).addIngredient(Ingredient.of(BloodMagicItems.STRENGTHENED_CATALYST.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_GLOWSTONE)).addIngredient(Ingredient.of(BloodMagicTags.DUST_HELLFORGED)).build(consumer, BloodMagic.rl(basePath + "average_power")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.AVERAGE_LENGTHENING_CATALYST.get()), 2000, 100, 4).addIngredient(Ingredient.of(BloodMagicItems.WEAK_TAU_ITEM.get())).addIngredient(Ingredient.of(BloodMagicItems.STRENGTHENED_CATALYST.get())).addIngredient(Ingredient.of(Tags.Items.DUSTS_REDSTONE)).addIngredient(Ingredient.of(BloodMagicTags.DUST_HELLFORGED)).build(consumer, BloodMagic.rl(basePath + "average_lengthening")); -// AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.HELLFORGED_SAND.get(), 2), 1000, 100, 5).addIngredient(Ingredient.of(BloodMagicItems.HELLFORGED_SAND.get())).addIngredient(Ingredient.of(BloodMagicItems.CORRUPTED_DUST.get())).addIngredient(Ingredient.of(BloodMagicTags.DUST_COPPER)).addIngredient(Ingredient.of(BloodMagicTags.DUST_GOLD)).build(consumer, BloodMagic.rl(basePath + "hellforged_sand")); + // AlchemyTableRecipeBuilder.alchemyTable(new + // ItemStack(BloodMagicItems.HELLFORGED_SAND.get(), 2), 1000, 100, + // 5).addIngredient(Ingredient.of(BloodMagicItems.HELLFORGED_SAND.get())).addIngredient(Ingredient.of(BloodMagicItems.CORRUPTED_DUST.get())).addIngredient(Ingredient.of(BloodMagicTags.DUST_COPPER)).addIngredient(Ingredient.of(BloodMagicTags.DUST_GOLD)).build(consumer, + // BloodMagic.rl(basePath + "hellforged_sand")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.IRON_GRAVEL.get(), 2), 100, 50, 3).addIngredient(Ingredient.of(BloodMagicTags.FRAGMENT_IRON)).addIngredient(Ingredient.of(BloodMagicItems.CORRUPTED_DUST.get())).build(consumer, BloodMagic.rl(basePath + "corrupted_iron")); AlchemyTableRecipeBuilder.alchemyTable(new ItemStack(BloodMagicItems.GOLD_GRAVEL.get(), 2), 300, 50, 3).addIngredient(Ingredient.of(BloodMagicTags.FRAGMENT_GOLD)).addIngredient(Ingredient.of(BloodMagicItems.CORRUPTED_DUST.get())).build(consumer, BloodMagic.rl(basePath + "corrupted_gold")); diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/BasicFluidFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/BasicFluidFilter.java new file mode 100644 index 000000000..b5421efdd --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/BasicFluidFilter.java @@ -0,0 +1,247 @@ +package wayoftime.bloodmagic.common.routing; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import wayoftime.bloodmagic.common.item.routing.IFilterKey; + +/** + * This particular implementation of IItemFilter checks to make sure that a) as + * an output filter it will fill until the requested amount and b) as an input + * filter it will only syphon until the requested amount. + * + * @author WayofTime + */ +public class BasicFluidFilter implements IRoutingFilter +{ + protected List requestList; + protected BlockEntity accessedTile; + protected IFluidHandler fluidHandler; + + @Override + public FluidStack getType() + { + return FluidStack.EMPTY; + } + + @Override + public void initializeFilter(List filteredList, BlockEntity tile, Direction side, boolean isFilterOutput) + { + this.accessedTile = tile; + this.fluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).resolve().orElse(null); + if (isFilterOutput) + { + requestList = filteredList; + + for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack checkedStack = fluidHandler.getFluidInTank(tank); + if (checkedStack.isEmpty()) + { + continue; + } + + int stackSize = checkedStack.getAmount(); + + for (IFilterKey filterStack : requestList) + { + if (filterStack.getCount() == 0) + { + continue; + } + + if (doStacksMatch(filterStack, checkedStack)) + { + filterStack.setCount(Math.max(filterStack.getCount() - stackSize, 0)); + continue; + } + } + } + } else + { + requestList = filteredList; + for (IFilterKey filterStack : requestList) + { + filterStack.setCount(filterStack.getCount() * -1); // Invert the stack size so that + } + + for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack checkedStack = fluidHandler.getFluidInTank(tank); + if (checkedStack.isEmpty()) + { + continue; + } + + int stackSize = checkedStack.getAmount(); + + for (IFilterKey filterStack : filteredList) + { + if (doStacksMatch(filterStack, checkedStack)) + { + filterStack.grow(stackSize); + continue; + } + } + } + } + + requestList.removeIf(IFilterKey::isEmpty); + } + + @Override + public FluidStack transferStackThroughOutputFilter(FluidStack inputStack) + { + int allowedAmount = 0; + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, inputStack)) + { + allowedAmount = Math.min(filterStack.getCount(), inputStack.getAmount()); + break; + } + } + + if (allowedAmount <= 0) + { + return inputStack; + } + + FluidStack testStack = inputStack.copy(); + testStack.setAmount(allowedAmount); + int changeAmount = fluidHandler.fill(testStack, FluidAction.EXECUTE); + + testStack = inputStack.copy(); + testStack.shrink(changeAmount); + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + IFilterKey filterStack = itr.next(); + if (doStacksMatch(filterStack, inputStack)) + { + filterStack.shrink(changeAmount); + if (filterStack.isEmpty()) + { + itr.remove(); + } + } + } + + Level world = accessedTile.getLevel(); + BlockPos pos = accessedTile.getBlockPos(); + world.sendBlockUpdated(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + return testStack; + } + + @Override + public int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer) + { + int totalChange = 0; + for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack availableStack = fluidHandler.getFluidInTank(tank); + FluidStack inputStack = fluidHandler.drain(availableStack, FluidAction.SIMULATE); + if (inputStack.isEmpty()) + { + continue; + } + + int allowedAmount = 0; + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, inputStack)) + { + allowedAmount = Math.min(maxTransfer, Math.min(filterStack.getCount(), inputStack.getAmount())); + break; + } + } + + if (allowedAmount <= 0) + { + continue; + } + + FluidStack testStack = inputStack.copy(); + testStack.setAmount(allowedAmount); + FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getAmount()); + + if (!remainderStack.isEmpty() && remainderStack.getAmount() == allowedAmount) + { + // Nothing has changed. Moving on! + continue; + } + + fluidHandler.drain(changeAmount, FluidAction.EXECUTE); + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + IFilterKey filterStack = itr.next(); + if (doStacksMatch(filterStack, inputStack)) + { + filterStack.shrink(changeAmount); + if (filterStack.isEmpty()) + { + itr.remove(); + } + } + } + + Level world = accessedTile.getLevel(); + BlockPos pos = accessedTile.getBlockPos(); + world.sendBlockUpdated(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + maxTransfer -= changeAmount; + totalChange += changeAmount; + if (maxTransfer <= 0) + { + return totalChange; + } + } + + return totalChange; + } + + @Override + public boolean doesStackPassFilter(FluidStack testStack) + { + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, testStack)) + { + return true; + } + } + + return false; + } + + @Override + public boolean doStacksMatch(IFilterKey filterStack, FluidStack testStack) + { + return filterStack.doesStackMatch(testStack); + } + + @Override + public void initializeFilter(List filteredList) + { + this.requestList = filteredList; + } + + @Override + public List getFilterList() + { + return this.requestList; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/BasicItemFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/BasicItemFilter.java index 4822d1be9..8df88c0dd 100644 --- a/src/main/java/wayoftime/bloodmagic/common/routing/BasicItemFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/routing/BasicItemFilter.java @@ -4,6 +4,7 @@ import java.util.List; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -18,7 +19,7 @@ * * @author WayofTime */ -public class BasicItemFilter implements IItemFilter +public class BasicItemFilter implements IRoutingFilter { /* * This list acts as the way the filter keeps track of its contents. For the @@ -30,22 +31,28 @@ public class BasicItemFilter implements IItemFilter protected BlockEntity accessedTile; protected IItemHandler itemHandler; + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + /** * Initializes the filter so that it knows what it wants to fulfill. * * @param filteredList - The list of ItemStacks that the filter is set to. * @param tile - The inventory that is being accessed. This inventory * is either being pulled from or pushed to. - * @param itemHandler - The item handler + * @param fluidHandler - The item handler * @param isFilterOutput - Tells the filter what actions to expect. If true, it * should be initialized as an output filter. If false, it * should be initialized as an input filter. */ @Override - public void initializeFilter(List filteredList, BlockEntity tile, IItemHandler itemHandler, boolean isFilterOutput) + public void initializeFilter(List filteredList, BlockEntity tile, Direction side, boolean isFilterOutput) { this.accessedTile = tile; - this.itemHandler = itemHandler; + this.itemHandler = Utils.getInventory(tile, side); if (isFilterOutput) { requestList = filteredList; @@ -167,7 +174,7 @@ public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) * input inventory to the output inventory. */ @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) + public int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer) { int totalChange = 0; for (int slot = 0; slot < itemHandler.getSlots(); slot++) diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistFluidFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistFluidFilter.java new file mode 100644 index 000000000..df03383bd --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistFluidFilter.java @@ -0,0 +1,232 @@ +package wayoftime.bloodmagic.common.routing; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import wayoftime.bloodmagic.common.item.routing.IFilterKey; + +public class BlacklistFluidFilter implements IRoutingFilter +{ + protected List requestList; + protected BlockEntity accessedTile; + protected IFluidHandler fluidHandler; + + @Override + public FluidStack getType() + { + return FluidStack.EMPTY; + } + + @Override + public void initializeFilter(List filteredList, BlockEntity tile, Direction side, boolean isFilterOutput) + { + this.accessedTile = tile; + this.fluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).resolve().orElse(null); + if (isFilterOutput) + { + requestList = filteredList; + + for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack checkedStack = fluidHandler.getFluidInTank(tank); + if (checkedStack.isEmpty()) + { + continue; + } + + int stackSize = checkedStack.getAmount(); + + for (IFilterKey filterStack : requestList) + { + if (filterStack.getCount() == 0) + { + continue; + } + + if (doStacksMatch(filterStack, checkedStack)) + { + filterStack.setCount(Math.max(filterStack.getCount() - stackSize, 0)); + continue; + } + } + } + } else + { + requestList = filteredList; + for (IFilterKey filterStack : requestList) + { + filterStack.setCount(filterStack.getCount() * -1); // Invert the stack size so that + } + + for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack checkedStack = fluidHandler.getFluidInTank(tank); + if (checkedStack.isEmpty()) + { + continue; + } + + int stackSize = checkedStack.getAmount(); + + for (IFilterKey filterStack : filteredList) + { + if (doStacksMatch(filterStack, checkedStack)) + { + filterStack.grow(stackSize); + continue; + } + } + } + } + } + + @Override + public FluidStack transferStackThroughOutputFilter(FluidStack inputStack) + { + int allowedAmount = inputStack.getAmount(); + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, inputStack)) + { + // If the stacks match, then we don't want to pull this item at all. + return inputStack; + } + } + + if (allowedAmount <= 0) + { + return inputStack; + } + + FluidStack testStack = inputStack.copy(); + testStack.setAmount(allowedAmount); + int changeAmount = fluidHandler.fill(testStack, FluidAction.EXECUTE); + + testStack = inputStack.copy(); + testStack.shrink(changeAmount); + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + IFilterKey filterStack = itr.next(); + if (!doStacksMatch(filterStack, inputStack)) + { + filterStack.shrink(changeAmount); + if (filterStack.isEmpty()) + { + itr.remove(); + } + } + } + + Level world = accessedTile.getLevel(); + BlockPos pos = accessedTile.getBlockPos(); + world.sendBlockUpdated(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + return testStack; + } + + @Override + public int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer) + { + int totalChange = 0; + tanks: for (int tank = 0; tank < fluidHandler.getTanks(); tank++) + { + FluidStack availableStack = fluidHandler.getFluidInTank(tank); + FluidStack inputStack = fluidHandler.drain(availableStack, FluidAction.SIMULATE); + if (inputStack.isEmpty()) + { + continue; + } + + int allowedAmount = Math.min(inputStack.getAmount(), maxTransfer); + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, inputStack)) + { + continue tanks; + } + } + + if (allowedAmount <= 0) + { + continue; + } + + FluidStack testStack = inputStack.copy(); + testStack.setAmount(allowedAmount); + FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); + int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getAmount()); + + if (!remainderStack.isEmpty() && remainderStack.getAmount() == allowedAmount) + { + continue; + } + + fluidHandler.drain(changeAmount, FluidAction.EXECUTE); + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + IFilterKey filterStack = itr.next(); + if (!doStacksMatch(filterStack, inputStack)) + { + filterStack.shrink(changeAmount); + } + } + + Level world = accessedTile.getLevel(); + BlockPos pos = accessedTile.getBlockPos(); + world.sendBlockUpdated(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + maxTransfer -= changeAmount; + totalChange += changeAmount; + if (maxTransfer <= 0) + { + return totalChange; + } + } + + return totalChange; + } + + @Override + public boolean doesStackPassFilter(FluidStack testStack) + { + for (IFilterKey filterStack : requestList) + { + if (doStacksMatch(filterStack, testStack)) + { + return false; + } + } + + return true; + } + + @Override + public boolean doStacksMatch(IFilterKey filterStack, FluidStack testStack) + { + return filterStack.doesStackMatch(testStack); + } + + @Override + public void initializeFilter(List filteredList) + { + this.requestList = filteredList; + } + + @Override + public List getFilterList() + { + return this.requestList; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistItemFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistItemFilter.java index da65d44b3..2842a58e1 100644 --- a/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistItemFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/routing/BlacklistItemFilter.java @@ -4,6 +4,7 @@ import java.util.List; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -18,7 +19,7 @@ * * @author WayofTime */ -public class BlacklistItemFilter implements IItemFilter +public class BlacklistItemFilter implements IRoutingFilter { /* * This list acts as the way the filter keeps track of its contents. For the @@ -30,22 +31,28 @@ public class BlacklistItemFilter implements IItemFilter protected BlockEntity accessedTile; protected IItemHandler itemHandler; + @Override + public ItemStack getType() + { + return ItemStack.EMPTY; + } + /** * Initializes the filter so that it knows what it wants to fulfill. * * @param filteredList - The list of ItemStacks that the filter is set to. * @param tile - The inventory that is being accessed. This inventory * is either being pulled from or pushed to. - * @param itemHandler - The item handler + * @param fluidHandler - The item handler * @param isFilterOutput - Tells the filter what actions to expect. If true, it * should be initialized as an output filter. If false, it * should be initialized as an input filter. */ @Override - public void initializeFilter(List filteredList, BlockEntity tile, IItemHandler itemHandler, boolean isFilterOutput) + public void initializeFilter(List filteredList, BlockEntity tile, Direction side, boolean isFilterOutput) { this.accessedTile = tile; - this.itemHandler = itemHandler; + this.itemHandler = Utils.getInventory(tile, side); if (isFilterOutput) { requestList = filteredList; @@ -169,7 +176,7 @@ public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) * input inventory to the output inventory. */ @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) + public int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer) { int totalChange = 0; slots: for (int slot = 0; slot < itemHandler.getSlots(); slot++) diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IInputItemRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/routing/IInputItemRoutingNode.java deleted file mode 100644 index 85fbf0aaa..000000000 --- a/src/main/java/wayoftime/bloodmagic/common/routing/IInputItemRoutingNode.java +++ /dev/null @@ -1,10 +0,0 @@ -package wayoftime.bloodmagic.common.routing; - -import net.minecraft.core.Direction; - -public interface IInputItemRoutingNode extends IItemRoutingNode -{ - boolean isInput(Direction side); - - IItemFilter getInputFilterForSide(Direction side); -} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IInputRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/routing/IInputRoutingNode.java new file mode 100644 index 000000000..159fffd26 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/IInputRoutingNode.java @@ -0,0 +1,12 @@ +package wayoftime.bloodmagic.common.routing; + +import java.util.List; + +import net.minecraft.core.Direction; + +public interface IInputRoutingNode extends IItemRoutingNode +{ + boolean isInput(Direction side); + + List getInputFilterForSide(Direction side); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IItemFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/IItemFilter.java deleted file mode 100644 index aca45a5c9..000000000 --- a/src/main/java/wayoftime/bloodmagic/common/routing/IItemFilter.java +++ /dev/null @@ -1,42 +0,0 @@ -package wayoftime.bloodmagic.common.routing; - -import java.util.List; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -import wayoftime.bloodmagic.common.item.routing.IFilterKey; - -public interface IItemFilter extends IRoutingFilter -{ - void initializeFilter(List filteredList, BlockEntity tile, IItemHandler itemHandler, boolean isFilterOutput); - - void initializeFilter(List filteredList); - - /** - * This method is only called when the output inventory this filter is managing - * receives an ItemStack. Should only really be called by the Input filter via - * it's transfer method. - * - * @param inputStack - The stack to filter - * @return - The remainder of the stack after it has been absorbed into the - * inventory. - */ - ItemStack transferStackThroughOutputFilter(ItemStack inputStack); - - /** - * This method is only called on an input filter to transfer ItemStacks from the - * input inventory to the output inventory. - */ - int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer); - - boolean doesStackPassFilter(ItemStack testStack); - - boolean doStacksMatch(IFilterKey filterStack, ItemStack testStack); - - /** - * Called to get the filter list directly for testing from outside sources. No - * items within this list, nor the list itself, may be modified! - */ - List getFilterList(); -} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IOutputItemRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/routing/IOutputItemRoutingNode.java deleted file mode 100644 index 8e2d053d8..000000000 --- a/src/main/java/wayoftime/bloodmagic/common/routing/IOutputItemRoutingNode.java +++ /dev/null @@ -1,10 +0,0 @@ -package wayoftime.bloodmagic.common.routing; - -import net.minecraft.core.Direction; - -public interface IOutputItemRoutingNode extends IItemRoutingNode -{ - boolean isOutput(Direction side); - - IItemFilter getOutputFilterForSide(Direction side); -} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IOutputRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/routing/IOutputRoutingNode.java new file mode 100644 index 000000000..52b1593ae --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/IOutputRoutingNode.java @@ -0,0 +1,12 @@ +package wayoftime.bloodmagic.common.routing; + +import java.util.List; + +import net.minecraft.core.Direction; + +public interface IOutputRoutingNode extends IItemRoutingNode +{ + boolean isOutput(Direction side); + + List getOutputFilterForSide(Direction side); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java index 68b595065..182b280f7 100644 --- a/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java +++ b/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java @@ -1,6 +1,43 @@ package wayoftime.bloodmagic.common.routing; -public interface IRoutingFilter +import java.util.List; + +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; +import wayoftime.bloodmagic.common.item.routing.IFilterKey; + +public interface IRoutingFilter { + T getType(); + + void initializeFilter(List filteredList, BlockEntity tile, Direction side, boolean isFilterOutput); + + void initializeFilter(List filteredList); + + /** + * This method is only called when the output inventory this filter is managing + * receives an ItemStack. Should only really be called by the Input filter via + * it's transfer method. + * + * @param inputStack - The stack to filter + * @return - The remainder of the stack after it has been absorbed into the + * inventory. + */ + T transferStackThroughOutputFilter(T inputStack); + + /** + * This method is only called on an input filter to transfer ItemStacks from the + * input inventory to the output inventory. + */ + int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer); + + boolean doesStackPassFilter(T testStack); + + boolean doStacksMatch(IFilterKey filterStack, T testStack); + /** + * Called to get the filter list directly for testing from outside sources. No + * items within this list, nor the list itself, may be modified! + */ + List getFilterList(); } diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileInputRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileInputRoutingNode.java index c272852b2..af028b531 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileInputRoutingNode.java @@ -1,5 +1,7 @@ package wayoftime.bloodmagic.common.tile.routing; +import java.util.List; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -12,15 +14,17 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; import wayoftime.bloodmagic.common.container.tile.ContainerItemRoutingNode; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; -import wayoftime.bloodmagic.common.routing.IInputItemRoutingNode; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.routing.IInputRoutingNode; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.common.tile.BloodMagicTileEntities; import wayoftime.bloodmagic.util.Utils; -public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, MenuProvider +public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputRoutingNode, MenuProvider { public TileInputRoutingNode(BlockEntityType type, BlockPos pos, BlockState state) { @@ -39,23 +43,24 @@ public boolean isInput(Direction side) } @Override - public IItemFilter getInputFilterForSide(Direction side) + public List getInputFilterForSide(Direction side) { BlockEntity tile = getLevel().getBlockEntity(worldPosition.relative(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) + IFluidHandler fluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).resolve().orElse(null); + if (handler != null || fluidHandler != null) { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IRoutingFilterProvider)) { return null; } - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - return filter.getInputItemFilter(filterStack, tile, handler); + IRoutingFilterProvider filter = (IRoutingFilterProvider) filterStack.getItem(); + return filter.getInputFilter(filterStack, tile, side); } } @@ -75,29 +80,33 @@ public Component getDisplayName() return new TextComponent("Input Routing Node"); } -// @Override -// public boolean isFluidInput(Direction side) { -// return true; -// } -// -// @Override -// public IFluidFilter getInputFluidFilterForSide(Direction side) { -// TileEntity tile = getWorld().getTileEntity(pos.offset(side)); -// if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { -// IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); -// ItemStack filterStack = this.getFilterStack(side); -// if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) { -// return null; -// } -// -// return ((IFluidFilterProvider) filterStack.getItem()).getInputFluidFilter(filterStack, tile, handler); -// } -// -// return null; -// } -// -// @Override -// public boolean isTankConnectedToSide(Direction side) { -// return true; -// } + // @Override + // public boolean isFluidInput(Direction side) { + // return true; + // } + // + // @Override + // public IFluidFilter getInputFluidFilterForSide(Direction side) { + // TileEntity tile = getWorld().getTileEntity(pos.offset(side)); + // if (tile != null && + // tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + // IFluidHandler handler = + // tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); + // ItemStack filterStack = this.getFilterStack(side); + // if (filterStack == null || !(filterStack.getItem() instanceof + // IFluidFilterProvider)) { + // return null; + // } + // + // return ((IFluidFilterProvider) + // filterStack.getItem()).getInputFluidFilter(filterStack, tile, handler); + // } + // + // return null; + // } + // + // @Override + // public boolean isTankConnectedToSide(Direction side) { + // return true; + // } } diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileMasterRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileMasterRoutingNode.java index b89b55e5b..7740cc5c2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileMasterRoutingNode.java @@ -29,14 +29,15 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.CapabilityItemHandler; import wayoftime.bloodmagic.api.compat.EnumDemonWillType; import wayoftime.bloodmagic.common.container.tile.ContainerMasterRoutingNode; import wayoftime.bloodmagic.common.item.routing.IRouterUpgrade; -import wayoftime.bloodmagic.common.routing.IInputItemRoutingNode; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.routing.IInputRoutingNode; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.common.routing.IMasterRoutingNode; -import wayoftime.bloodmagic.common.routing.IOutputItemRoutingNode; +import wayoftime.bloodmagic.common.routing.IOutputRoutingNode; import wayoftime.bloodmagic.common.routing.IRoutingNode; import wayoftime.bloodmagic.common.routing.NodeHelper; import wayoftime.bloodmagic.common.tile.BloodMagicTileEntities; @@ -74,10 +75,10 @@ public void tick() // changed inventory cause the Master to recheck? if (!getLevel().isClientSide) { -// currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); + // currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); currentInput = getLevel().getDirectSignalTo(worldPosition); -// System.out.println(currentInput); + // System.out.println(currentInput); } if (getLevel().isClientSide || getLevel().getGameTime() % tickRate != 0) // Temporary tick rate solver @@ -85,18 +86,18 @@ public void tick() return; } -// System.out.println("Size of input list: " + inputNodeList.size()); - Map> outputMap = new TreeMap<>(); -// Map> outputFluidMap = new TreeMap<>(); + // System.out.println("Size of input list: " + inputNodeList.size()); + Map> outputMap = new TreeMap<>(); + // Map> outputFluidMap = new TreeMap<>(); for (BlockPos outputPos : outputNodeList) { BlockEntity outputTile = getLevel().getBlockEntity(outputPos); if (this.isConnected(new LinkedList<>(), outputPos)) { - if (outputTile instanceof IOutputItemRoutingNode) + if (outputTile instanceof IOutputRoutingNode) { - IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; + IOutputRoutingNode outputNode = (IOutputRoutingNode) outputTile; for (Direction facing : Direction.values()) { @@ -105,58 +106,60 @@ public void tick() continue; } - IItemFilter filter = outputNode.getOutputFilterForSide(facing); + List filter = outputNode.getOutputFilterForSide(facing); if (filter != null) { int priority = outputNode.getPriority(facing); if (outputMap.containsKey(TREE_OFFSET - priority)) { - outputMap.get(TREE_OFFSET - priority).add(filter); + List mapKey = outputMap.get(TREE_OFFSET - priority); + filter.forEach(mapKey::add); } else { - List filterList = new LinkedList<>(); - filterList.add(filter); + List filterList = new LinkedList<>(); + filter.forEach(filterList::add); outputMap.put(TREE_OFFSET - priority, filterList); } } } } -// if (outputTile instanceof IOutputFluidRoutingNode) { -// IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; -// -// for (Direction facing : Direction.VALUES) { -// if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { -// continue; -// } -// -// IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); -// if (filter != null) { -// int priority = outputNode.getPriority(facing); -// if (outputFluidMap.containsKey(priority)) { -// outputFluidMap.get(priority).add(filter); -// } else { -// List filterList = new LinkedList<>(); -// filterList.add(filter); -// outputFluidMap.put(priority, filterList); -// } -// } -// } -// } + // if (outputTile instanceof IOutputFluidRoutingNode) { + // IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; + // + // for (Direction facing : Direction.VALUES) { + // if (!outputNode.isTankConnectedToSide(facing) || + // !outputNode.isFluidOutput(facing)) { + // continue; + // } + // + // IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); + // if (filter != null) { + // int priority = outputNode.getPriority(facing); + // if (outputFluidMap.containsKey(priority)) { + // outputFluidMap.get(priority).add(filter); + // } else { + // List filterList = new LinkedList<>(); + // filterList.add(filter); + // outputFluidMap.put(priority, filterList); + // } + // } + // } + // } } } - Map> inputMap = new TreeMap<>(); -// Map> inputFluidMap = new TreeMap<>(); + Map> inputMap = new TreeMap<>(); + // Map> inputFluidMap = new TreeMap<>(); for (BlockPos inputPos : inputNodeList) { BlockEntity inputTile = getLevel().getBlockEntity(inputPos); if (this.isConnected(new LinkedList<>(), inputPos)) { - if (inputTile instanceof IInputItemRoutingNode) + if (inputTile instanceof IInputRoutingNode) { - IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; + IInputRoutingNode inputNode = (IInputRoutingNode) inputTile; for (Direction facing : Direction.values()) { @@ -165,68 +168,83 @@ public void tick() continue; } - IItemFilter filter = inputNode.getInputFilterForSide(facing); + List filter = inputNode.getInputFilterForSide(facing); if (filter != null) { int priority = inputNode.getPriority(facing); if (inputMap.containsKey(TREE_OFFSET - priority)) { - inputMap.get(TREE_OFFSET - priority).add(filter); + List mapKey = inputMap.get(TREE_OFFSET - priority); + filter.forEach(mapKey::add); } else { - List filterList = new LinkedList<>(); - filterList.add(filter); + List filterList = new LinkedList<>(); + filter.forEach(filterList::add); inputMap.put(TREE_OFFSET - priority, filterList); } } } } -// if (in + // if (in } } int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getLevel(), worldPosition, EnumDemonWillType.DEFAULT)); - int maxFluidTransfer = 1000; - -// Set>> outputSet = outputMap.entrySet(); -// for(int i = outputSet.size()-1; i == 0; i--) -// { -// Entry> outputEntry = outputSet. -// List outputList = outputEntry.getValue(); -// for (IItemFilter outputFilter : outputList) -// { -// for (Entry> inputEntry : inputMap.entrySet()) -// { -// List inputList = inputEntry.getValue(); -// for (IItemFilter inputFilter : inputList) -// { -// int amountTransfered = inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); -// maxTransfer -= amountTransfered; -//// System.out.println("Trying to add through the filters: " + amountTransfered); -// if (maxTransfer <= 0) -// { -// return; -// } -// } -// } -// } -// } - - for (Entry> outputEntry : outputMap.entrySet()) + int maxFluidTransfer = (maxTransfer / 16) * 1000; // TODO: idk but this seems hacky + + // Set>> outputSet = outputMap.entrySet(); + // for(int i = outputSet.size()-1; i == 0; i--) + // { + // Entry> outputEntry = outputSet. + // List outputList = outputEntry.getValue(); + // for (IItemFilter outputFilter : outputList) + // { + // for (Entry> inputEntry : inputMap.entrySet()) + // { + // List inputList = inputEntry.getValue(); + // for (IItemFilter inputFilter : inputList) + // { + // int amountTransfered = inputFilter.transferThroughInputFilter(outputFilter, + // maxTransfer); + // maxTransfer -= amountTransfered; + //// System.out.println("Trying to add through the filters: " + + // amountTransfered); + // if (maxTransfer <= 0) + // { + // return; + // } + // } + // } + // } + // } + + for (Entry> outputEntry : outputMap.entrySet()) { - List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) + List outputList = outputEntry.getValue(); + for (IRoutingFilter outputFilter : outputList) { - for (Entry> inputEntry : inputMap.entrySet()) + if ((outputFilter.getType() == ItemStack.EMPTY && maxTransfer <= 0) || (outputFilter.getType() == FluidStack.EMPTY && maxFluidTransfer <= 0)) { - List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) + continue; + } + + for (Entry> inputEntry : inputMap.entrySet()) + { + List inputList = inputEntry.getValue(); + for (IRoutingFilter inputFilter : inputList) { - int amountTransfered = inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - maxTransfer -= amountTransfered; + if (inputFilter.getType() != outputFilter.getType()) + { + continue; + } + int amountTransfered = inputFilter.transferThroughInputFilter(outputFilter, inputFilter.getType() == ItemStack.EMPTY + ? maxTransfer + : maxFluidTransfer); + maxTransfer -= inputFilter.getType() == ItemStack.EMPTY ? amountTransfered : 0; + maxFluidTransfer -= inputFilter.getType() == FluidStack.EMPTY ? amountTransfered : 0; - if (maxTransfer <= 0) + if (maxTransfer <= 0 && maxFluidTransfer <= 0) { return; } @@ -235,20 +253,23 @@ public void tick() } } -// for (Entry> outputEntry : outputFluidMap.entrySet()) { -// List outputList = outputEntry.getValue(); -// for (IFluidFilter outputFilter : outputList) { -// for (Entry> inputEntry : inputFluidMap.entrySet()) { -// List inputList = inputEntry.getValue(); -// for (IFluidFilter inputFilter : inputList) { -// maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); -// if (maxFluidTransfer <= 0) { -// return; -// } -// } -// } -// } -// } + // for (Entry> outputEntry : + // outputFluidMap.entrySet()) { + // List outputList = outputEntry.getValue(); + // for (IFluidFilter outputFilter : outputList) { + // for (Entry> inputEntry : + // inputFluidMap.entrySet()) { + // List inputList = inputEntry.getValue(); + // for (IFluidFilter inputFilter : inputList) { + // maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, + // maxFluidTransfer); + // if (maxFluidTransfer <= 0) { + // return; + // } + // } + // } + // } + // } } public int getMaxTransferForDemonWill(double will) @@ -336,20 +357,20 @@ public void deserialize(CompoundTag tag) public boolean isConnected(List path, BlockPos nodePos) { // TODO: Figure out how to make it so the path is obtained -// if (!connectionMap.containsKey(nodePos)) -// { -// return false; -// } + // if (!connectionMap.containsKey(nodePos)) + // { + // return false; + // } BlockEntity tile = getLevel().getBlockEntity(nodePos); if (!(tile instanceof IRoutingNode)) { -// connectionMap.remove(nodePos); + // connectionMap.remove(nodePos); return false; } IRoutingNode node = (IRoutingNode) tile; List connectionList = node.getConnected(); -// List testPath = path.subList(0, path.size()); + // List testPath = path.subList(0, path.size()); path.add(nodePos); for (BlockPos testPos : connectionList) { @@ -360,15 +381,15 @@ public boolean isConnected(List path, BlockPos nodePos) if (testPos.equals(this.getBlockPos()) && node.isConnectionEnabled(testPos)) { -// path.clear(); -// path.addAll(testPath); + // path.clear(); + // path.addAll(testPath); return true; } else if (NodeHelper.isNodeConnectionEnabled(getLevel(), node, testPos)) { if (isConnected(path, testPos)) { -// path.clear(); -// path.addAll(testPath); + // path.clear(); + // path.addAll(testPath); return true; } } @@ -391,11 +412,11 @@ public void addNodeToList(IRoutingNode node) { generalNodeList.add(newPos); } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) + if (node instanceof IInputRoutingNode && !inputNodeList.contains(newPos)) { inputNodeList.add(newPos); } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) + if (node instanceof IOutputRoutingNode && !outputNodeList.contains(newPos)) { outputNodeList.add(newPos); } diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileOutputRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileOutputRoutingNode.java index c75e88f45..1c969d703 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileOutputRoutingNode.java @@ -1,5 +1,7 @@ package wayoftime.bloodmagic.common.tile.routing; +import java.util.List; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -12,15 +14,17 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; import wayoftime.bloodmagic.common.container.tile.ContainerItemRoutingNode; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; -import wayoftime.bloodmagic.common.routing.IItemFilter; -import wayoftime.bloodmagic.common.routing.IOutputItemRoutingNode; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.routing.IOutputRoutingNode; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.common.tile.BloodMagicTileEntities; import wayoftime.bloodmagic.util.Utils; -public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, MenuProvider +public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputRoutingNode, MenuProvider { public TileOutputRoutingNode(BlockEntityType type, BlockPos pos, BlockState state) { @@ -39,23 +43,24 @@ public boolean isOutput(Direction side) } @Override - public IItemFilter getOutputFilterForSide(Direction side) + public List getOutputFilterForSide(Direction side) { BlockEntity tile = getLevel().getBlockEntity(worldPosition.relative(side)); if (tile != null) { IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) + IFluidHandler fluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).resolve().orElse(null); + if (handler != null || fluidHandler != null) { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IRoutingFilterProvider)) { return null; } - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - return filter.getOutputItemFilter(filterStack, tile, handler); + IRoutingFilterProvider filter = (IRoutingFilterProvider) filterStack.getItem(); + return filter.getOutputFilter(filterStack, tile, side); } } @@ -75,34 +80,38 @@ public Component getDisplayName() return new TextComponent("Output Routing Node"); } -// @Override -// public boolean isFluidOutput(Direction side) -// { -// return true; -// } -// -// @Override -// public IFluidFilter getOutputFluidFilterForSide(Direction side) -// { -// TileEntity tile = getWorld().getTileEntity(pos.offset(side)); -// if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) -// { -// IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); -// ItemStack filterStack = this.getFilterStack(side); -// if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) -// { -// return null; -// } -// -// return ((IFluidFilterProvider) filterStack.getItem()).getOutputFluidFilter(filterStack, tile, handler); -// } -// -// return null; -// } -// -// @Override -// public boolean isTankConnectedToSide(Direction side) -// { -// return true; -// } + // @Override + // public boolean isFluidOutput(Direction side) + // { + // return true; + // } + // + // @Override + // public IFluidFilter getOutputFluidFilterForSide(Direction side) + // { + // TileEntity tile = getWorld().getTileEntity(pos.offset(side)); + // if (tile != null && + // tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) + // { + // IFluidHandler handler = + // tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); + // ItemStack filterStack = this.getFilterStack(side); + // if (filterStack == null || !(filterStack.getItem() instanceof + // IFluidFilterProvider)) + // { + // return null; + // } + // + // return ((IFluidFilterProvider) + // filterStack.getItem()).getOutputFluidFilter(filterStack, tile, handler); + // } + // + // return null; + // } + // + // @Override + // public boolean isTankConnectedToSide(Direction side) + // { + // return true; + // } } diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileRoutingNode.java b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileRoutingNode.java index fe2a6f8d6..b2361f30d 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileRoutingNode.java +++ b/src/main/java/wayoftime/bloodmagic/common/tile/routing/TileRoutingNode.java @@ -49,7 +49,7 @@ public void tick() if (!getLevel().isClientSide) { currentInput = getLevel().getBestNeighborSignal(worldPosition); -// currentInput = getWorld().getStrongPower(pos); + // currentInput = getWorld().getStrongPower(pos); } } @@ -186,8 +186,8 @@ public Triple, List> recheckConnectionToMa return checkResult; } -// alreadyChecked.addAll(checkResult.getMiddle()); -// nodeList.addAll(checkResult.getRight()); + // alreadyChecked.addAll(checkResult.getMiddle()); + // nodeList.addAll(checkResult.getRight()); } nodeList.add(this); @@ -294,12 +294,12 @@ public int getPriority(Direction side) return 0; } -// @Override -// @OnlyIn(Dist.CLIENT) -// public double getViewDistance() -// { -// return 10000; -// } + // @Override + // @OnlyIn(Dist.CLIENT) + // public double getViewDistance() + // { + // return 10000; + // } @Override public AABB getRenderBoundingBox() diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/ghostingredienthandlers/GhostFilter.java b/src/main/java/wayoftime/bloodmagic/compat/jei/ghostingredienthandlers/GhostFilter.java index 780c43782..a80edebe3 100644 --- a/src/main/java/wayoftime/bloodmagic/compat/jei/ghostingredienthandlers/GhostFilter.java +++ b/src/main/java/wayoftime/bloodmagic/compat/jei/ghostingredienthandlers/GhostFilter.java @@ -3,10 +3,15 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; + import mezz.jei.api.gui.handlers.IGhostIngredientHandler; import net.minecraft.client.renderer.Rect2i; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.screens.ScreenFilter; import wayoftime.bloodmagic.common.container.item.ContainerFilter; @@ -20,7 +25,6 @@ public class GhostFilter implements IGhostIngredientHandler public List> getTargets(ScreenFilter gui, I ingredient, boolean doStart) { List> targets = new ArrayList<>(); - for (Slot slot : gui.getMenu().slots) { if (!slot.isActive()) @@ -30,7 +34,7 @@ public List> getTargets(ScreenFilter gui, I ingredient, boolean do Rect2i bounds = new Rect2i(gui.getGuiLeft() + slot.x, gui.getGuiTop() + slot.y, 16, 16); - if (ingredient instanceof ItemStack && (slot instanceof ContainerFilter.SlotGhostItem)) + if (ingredient instanceof ItemStack && (slot instanceof ContainerFilter.SlotGhostItem) && gui.getFilterType() == 1) { targets.add(new Target() { @@ -53,6 +57,60 @@ public void accept(I ingredient) } }); } + + Optional optional = Optional.empty(); + if (ingredient instanceof ItemStack) + optional = FluidUtil.getFluidHandler((ItemStack) ingredient).resolve(); + + if ((ingredient instanceof FluidStack || (ingredient instanceof ItemStack && optional.isPresent())) && (slot instanceof ContainerFilter.SlotGhostItem) && gui.getFilterType() == 2) + { + if (ingredient instanceof ItemStack) + { + IFluidHandlerItem handler = optional.get(); + boolean hasFluid = false; + for (int i = 0; i < handler.getTanks(); i++) + { + FluidStack testStack = handler.getFluidInTank(i); + if (!testStack.isEmpty()) + { + hasFluid = true; + break; + } + } + + if (!hasFluid) + { + continue; + } + } + + targets.add(new Target() + { + @Override + public Rect2i getArea() + { + return bounds; + } + + @Override + public void accept(I ingredient) + { + ItemStack stack = ItemStack.EMPTY; + if (ingredient instanceof FluidStack) + { + stack = ((FluidStack) ingredient).getFluid().getBucket().getDefaultInstance(); + } else if (ingredient instanceof ItemStack) + { + stack = (ItemStack) ingredient; + } + BloodMagic.packetHandler.sendToServer(new FilterGhostSlotPacket(slot.index, stack)); + + GhostItemHelper.setItemGhostAmount(stack, 0); + stack.setCount(1); + slot.set(stack); + } + }); + } } return targets; diff --git a/src/main/java/wayoftime/bloodmagic/network/FilterButtonPacket.java b/src/main/java/wayoftime/bloodmagic/network/FilterButtonPacket.java index 827f390a8..381e40793 100644 --- a/src/main/java/wayoftime/bloodmagic/network/FilterButtonPacket.java +++ b/src/main/java/wayoftime/bloodmagic/network/FilterButtonPacket.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent.Context; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; public class FilterButtonPacket { @@ -57,9 +57,9 @@ public static void sendKeyToServer(FilterButtonPacket msg, Player playerEntity) itemStack = playerEntity.getInventory().getItem(msg.slot); } - if (!itemStack.isEmpty() && itemStack.getItem() instanceof IItemFilterProvider) + if (!itemStack.isEmpty() && itemStack.getItem() instanceof IRoutingFilterProvider) { - ((IItemFilterProvider) itemStack.getItem()).receiveButtonPress(itemStack, msg.buttonKey, msg.ghostSlot, msg.currentButtonState); + ((IRoutingFilterProvider) itemStack.getItem()).receiveButtonPress(itemStack, msg.buttonKey, msg.ghostSlot, msg.currentButtonState); } } } diff --git a/src/main/java/wayoftime/bloodmagic/network/FilterGhostSlotPacket.java b/src/main/java/wayoftime/bloodmagic/network/FilterGhostSlotPacket.java index e26de3664..992a2102f 100644 --- a/src/main/java/wayoftime/bloodmagic/network/FilterGhostSlotPacket.java +++ b/src/main/java/wayoftime/bloodmagic/network/FilterGhostSlotPacket.java @@ -10,6 +10,7 @@ import net.minecraftforge.network.NetworkEvent.Context; import wayoftime.bloodmagic.common.container.item.ContainerFilter; import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.item.routing.ItemItemRouterFilter; import wayoftime.bloodmagic.util.GhostItemHelper; public class FilterGhostSlotPacket @@ -64,7 +65,7 @@ public static void handle(FilterGhostSlotPacket message, Supplier conte // ItemStack filterStack = this.filterStack; if (filterStack.getItem() instanceof IRoutingFilterProvider) { - ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, message.stack); + ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForType(filterStack, message.stack); slot.set(filterCopy); } } diff --git a/src/main/java/wayoftime/bloodmagic/network/RouterFilterPacket.java b/src/main/java/wayoftime/bloodmagic/network/RouterFilterPacket.java index a0eeb48b9..8d5e0fdbf 100644 --- a/src/main/java/wayoftime/bloodmagic/network/RouterFilterPacket.java +++ b/src/main/java/wayoftime/bloodmagic/network/RouterFilterPacket.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent.Context; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; public class RouterFilterPacket { @@ -54,9 +54,9 @@ public static void sendKeyToServer(RouterFilterPacket msg, Player playerEntity) itemStack = playerEntity.getInventory().getItem(msg.slot); } - if (!itemStack.isEmpty() && itemStack.getItem() instanceof IItemFilterProvider) + if (!itemStack.isEmpty() && itemStack.getItem() instanceof IRoutingFilterProvider) { - ((IItemFilterProvider) itemStack.getItem()).setGhostItemAmount(itemStack, msg.ghostSlot, msg.amount); + ((IRoutingFilterProvider) itemStack.getItem()).setGhostItemAmount(itemStack, msg.ghostSlot, msg.amount); } } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrafting.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrafting.java index 08c678fa1..23154fe9a 100644 --- a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrafting.java +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrafting.java @@ -26,8 +26,9 @@ import wayoftime.bloodmagic.api.compat.EnumDemonWillType; import wayoftime.bloodmagic.common.item.inventory.InventoryFilter; import wayoftime.bloodmagic.common.item.routing.IFilterKey; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.item.routing.ItemItemRouterFilter; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.common.tile.TileAlchemyTable; import wayoftime.bloodmagic.common.tile.TileSoulForge; import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; @@ -248,7 +249,7 @@ public int attemptAlchemyTableCrafting(IMasterRitualStone masterRitualStone, Lev List insertionList = new ArrayList<>(); // insertionList.add(resultStack); - IItemFilter itemRecipeFilter = ((IItemFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); + IRoutingFilter itemRecipeFilter = ((IRoutingFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); List filterKeyList = itemRecipeFilter.getFilterList(); // int filterKeyIndex = 0; @@ -292,7 +293,7 @@ public int attemptAlchemyTableCrafting(IMasterRitualStone masterRitualStone, Lev if (!outputFilterStack.isEmpty()) { - IItemFilter outputFilter = ((IItemFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); + IRoutingFilter outputFilter = ((IRoutingFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); List keyList = outputFilter.getFilterList(); for (IFilterKey outputKey : keyList) @@ -462,7 +463,7 @@ public int attemptHellforgedCrafting(IMasterRitualStone masterRitualStone, Level List insertionList = new ArrayList<>(); // insertionList.add(resultStack); - IItemFilter itemRecipeFilter = ((IItemFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); + IRoutingFilter itemRecipeFilter = ((IRoutingFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); List filterKeyList = itemRecipeFilter.getFilterList(); // int filterKeyIndex = 0; @@ -506,7 +507,7 @@ public int attemptHellforgedCrafting(IMasterRitualStone masterRitualStone, Level if (!outputFilterStack.isEmpty()) { - IItemFilter outputFilter = ((IItemFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); + IRoutingFilter outputFilter = ((IRoutingFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); List keyList = outputFilter.getFilterList(); for (IFilterKey outputKey : keyList) @@ -649,7 +650,7 @@ public void attemptVanillaCrafting(IMasterRitualStone masterRitualStone, Level l if (!outputFilterStack.isEmpty()) { - IItemFilter outputFilter = ((IItemFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); + IRoutingFilter outputFilter = ((IRoutingFilterProvider) outputFilterStack.getItem()).getUninitializedItemFilter(outputFilterStack); if (craftingRecipes.size() > 1) { @@ -692,7 +693,7 @@ public void attemptVanillaCrafting(IMasterRitualStone masterRitualStone, Level l } } - IItemFilter itemRecipeFilter = ((IItemFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); + IRoutingFilter itemRecipeFilter = ((IRoutingFilterProvider) filterStack.getItem()).getUninitializedItemFilter(filterStack); // Map that stores the slots that are going to be syphoned from. Map selectedMap = new HashMap<>(); @@ -846,7 +847,7 @@ public ItemStack getRecipeFilterStack(IMasterRitualStone masterRitualStone, Leve { ItemStack frameStack = frame.getItem(); // System.out.println("Frames aren't empty. Found: " + frameStack.getItem()); - if (!frameStack.isEmpty() && frameStack.getItem() instanceof IItemFilterProvider) + if (!frameStack.isEmpty() && (ItemItemRouterFilter) frameStack.getItem() instanceof IRoutingFilterProvider) { filterStack = frameStack; } @@ -866,7 +867,7 @@ public ItemStack getRecipeFilterStack(IMasterRitualStone masterRitualStone, Leve for (int i = 0; i < inv.getSlots(); i++) { ItemStack frameStack = inv.getStackInSlot(i); - if (!frameStack.isEmpty() && frameStack.getItem() instanceof IItemFilterProvider) + if (!frameStack.isEmpty() && (ItemItemRouterFilter) frameStack.getItem() instanceof IRoutingFilterProvider) { filterStack = frameStack; break; @@ -908,7 +909,7 @@ public ItemStack getOutputFilterStack(IMasterRitualStone masterRitualStone, Leve for (ItemFrame frame : outputFrames) { ItemStack frameStack = frame.getItem(); - if (!frameStack.isEmpty() && frameStack.getItem() instanceof IItemFilterProvider) + if (!frameStack.isEmpty() && (ItemItemRouterFilter) frameStack.getItem() instanceof IRoutingFilterProvider) { outputFilterStack = frameStack; } @@ -928,7 +929,7 @@ public ItemStack getOutputFilterStack(IMasterRitualStone masterRitualStone, Leve for (int i = 0; i < inv.getSlots(); i++) { ItemStack frameStack = inv.getStackInSlot(i); - if (!frameStack.isEmpty() && frameStack.getItem() instanceof IItemFilterProvider) + if (!frameStack.isEmpty() && (ItemItemRouterFilter) frameStack.getItem() instanceof IRoutingFilterProvider) { outputFilterStack = frameStack; break; diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualYawningVoid.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualYawningVoid.java index 2389267d5..b3dd9e013 100644 --- a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualYawningVoid.java +++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualYawningVoid.java @@ -16,8 +16,8 @@ import net.minecraftforge.items.IItemHandler; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.api.compat.EnumDemonWillType; -import wayoftime.bloodmagic.common.item.routing.IItemFilterProvider; -import wayoftime.bloodmagic.common.routing.IItemFilter; +import wayoftime.bloodmagic.common.item.routing.IRoutingFilterProvider; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; import wayoftime.bloodmagic.ritual.AreaDescriptor; import wayoftime.bloodmagic.ritual.EnumRuneType; @@ -185,13 +185,13 @@ public void performRitual(IMasterRitualStone masterRitualStone) for (int n = 0; n < inventory.getSlots(); n++) { ItemStack filterStack = inventory.getStackInSlot(n); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IRoutingFilterProvider)) { continue; } - IItemFilterProvider filterItem = (IItemFilterProvider) filterStack.getItem(); - IItemFilter filter = filterItem.getUninitializedItemFilter(filterStack); + IRoutingFilterProvider filterItem = (IRoutingFilterProvider) filterStack.getItem(); + IRoutingFilter filter = filterItem.getUninitializedItemFilter(filterStack); if (filter.doesStackPassFilter(checkStack)) { destroy = true; diff --git a/src/main/resources/assets/bloodmagic/textures/gui/routingfilter_notext.png b/src/main/resources/assets/bloodmagic/textures/gui/routingfilter_notext.png new file mode 100644 index 000000000..1482a911c Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/routingfilter_notext.png differ