diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 4e2ae6b4..74e1c18e 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ # -#Sat Apr 02 15:31:00 EDT 2016 +#Tue Dec 13 20:41:11 EST 2016 org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert org.eclipse.jdt.core.formatter.brace_position_for_block=next_line org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert @@ -288,10 +288,10 @@ org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line eclipse.preferences.version=1 -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 diff --git a/changelog.txt b/changelog.txt index 29eca95e..ef5c9955 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.1.1-70 +------------------------------------------------------ +- Added Fluid routing to the routing nodes - this is done by using the Fluid Filter and placing a fluid container as the filter. + ------------------------------------------------------ Version 2.1.0-69 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 626e228b..1d49da31 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -207,6 +207,7 @@ public class Constants NODE_ROUTER("ItemNodeRouter"), RITUAL_DIVINER("ItemRitualDiviner"), ROUTER_FILTER("ItemRouterFilter"), + FLUID_ROUTER_FILTER("ItemFluidRouterFilter"), SACRIFICIAL_DAGGER("ItemSacrificialDagger"), SACRIFICE_PACK("ItemPackSacrifice"), SELF_SACRIFICE_PACK("ItemPackSelfSacrifice"), diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java new file mode 100644 index 00000000..7f107ba3 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java @@ -0,0 +1,13 @@ +package WayofTime.bloodmagic.item.routing; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.capability.IFluidHandler; +import WayofTime.bloodmagic.routing.IFluidFilter; + +public interface IFluidFilterProvider extends IRoutingFilterProvider +{ + IFluidFilter getInputFluidFilter(ItemStack stack, TileEntity tile, IFluidHandler handler); + + IFluidFilter getOutputFluidFilter(ItemStack stack, TileEntity tile, IFluidHandler handler); +} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java index 57e1c19e..9fc55d4b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java @@ -5,7 +5,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.routing.IItemFilter; -public interface IItemFilterProvider +public interface IItemFilterProvider extends IRoutingFilterProvider { IItemFilter getInputItemFilter(ItemStack stack, TileEntity tile, IItemHandler handler); diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java new file mode 100644 index 00000000..05093ff1 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java @@ -0,0 +1,15 @@ +package WayofTime.bloodmagic.item.routing; + +import net.minecraft.item.ItemStack; + +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); +} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java new file mode 100644 index 00000000..0ecdbb24 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java @@ -0,0 +1,151 @@ +package WayofTime.bloodmagic.item.routing; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.item.inventory.ItemInventory; +import WayofTime.bloodmagic.routing.IFluidFilter; +import WayofTime.bloodmagic.routing.RoutingFluidFilter; +import WayofTime.bloodmagic.util.GhostItemHelper; +import WayofTime.bloodmagic.util.helper.TextHelper; + +public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider +{ + public static String[] names = { "exact" }; + + public ItemFluidRouterFilter() + { + super(); + + setUnlocalizedName(Constants.Mod.MODID + ".fluidFilter."); + setHasSubtypes(true); + setCreativeTab(BloodMagic.tabBloodMagic); + } + + @Override + public String getUnlocalizedName(ItemStack stack) + { + return super.getUnlocalizedName(stack) + names[stack.getItemDamage()]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + for (int i = 0; i < names.length; i++) + list.add(new ItemStack(id, 1, i)); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + { + tooltip.add(TextHelper.localize("tooltip.BloodMagic.fluidFilter." + names[stack.getItemDamage()])); + + super.addInformation(stack, player, tooltip, advanced); + } + + @Override + public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) + { + IFluidFilter testFilter = new RoutingFluidFilter(); + + switch (filterStack.getMetadata()) + { + case 0: + testFilter = new RoutingFluidFilter(); + break; + + default: + testFilter = new RoutingFluidFilter(); + } + + List filteredList = new ArrayList(); + ItemInventory inv = new ItemInventory(filterStack, 9, ""); + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack stack = inv.getStackInSlot(i); + if (stack == null) + { + continue; + } + + ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); + + filteredList.add(ghostStack); + } + + testFilter.initializeFilter(filteredList, tile, handler, false); + return testFilter; + } + + @Override + public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) + { + IFluidFilter testFilter = new RoutingFluidFilter(); + + switch (filterStack.getMetadata()) + { + case 0: + testFilter = new RoutingFluidFilter(); + break; + + default: + testFilter = new RoutingFluidFilter(); + } + + List filteredList = new ArrayList(); + ItemInventory inv = new ItemInventory(filterStack, 9, ""); //TODO: Change to grab the filter from the Item later. + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack stack = inv.getStackInSlot(i); + if (stack == null) + { + continue; + } + + ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); + if (ghostStack.stackSize == 0) + { + ghostStack.stackSize = Integer.MAX_VALUE; + } + + filteredList.add(ghostStack); + } + + testFilter.initializeFilter(filteredList, tile, handler, true); + return testFilter; + } + + @Override + public List> getVariants() + { + List> ret = new ArrayList>(); + ret.add(new ImmutablePair(0, "type=exact")); + return ret; + } + + @Override + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { + ItemStack copyStack = keyStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.stackSize = 1; + return copyStack; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index e1fbaea8..06e5c543 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -165,4 +165,13 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari ret.add(new ImmutablePair(3, "type=oredict")); return ret; } + + @Override + public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) + { + ItemStack copyStack = keyStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, 0); + copyStack.stackSize = 1; + return copyStack; + } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java index 6973a278..49a54030 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java @@ -47,6 +47,7 @@ import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; import WayofTime.bloodmagic.item.gear.ItemPackSelfSacrifice; +import WayofTime.bloodmagic.item.routing.ItemFluidRouterFilter; import WayofTime.bloodmagic.item.routing.ItemNodeRouter; import WayofTime.bloodmagic.item.routing.ItemRouterFilter; import WayofTime.bloodmagic.item.sigil.ItemSigilAir; @@ -159,6 +160,7 @@ public class ModItems public static final Item SENTIENT_SHOVEL; public static final Item NODE_ROUTER; public static final Item BASE_ITEM_FILTER; + public static final Item BASE_FLUID_FILTER; public static final Item CUTTING_FLUID; public static final Item SANGUINE_BOOK; public static final Item ITEM_POINTS_UPGRADE; @@ -258,6 +260,7 @@ public class ModItems NODE_ROUTER = registerItem(new ItemNodeRouter(), Constants.BloodMagicItem.NODE_ROUTER.getRegName()); BASE_ITEM_FILTER = registerItem(new ItemRouterFilter(), Constants.BloodMagicItem.ROUTER_FILTER.getRegName()); + BASE_FLUID_FILTER = registerItem(new ItemFluidRouterFilter(), Constants.BloodMagicItem.FLUID_ROUTER_FILTER.getRegName()); CUTTING_FLUID = registerItem(new ItemCuttingFluid(), Constants.BloodMagicItem.CUTTING_FLUID.getRegName()); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java new file mode 100644 index 00000000..8d5f138b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java @@ -0,0 +1,36 @@ +package WayofTime.bloodmagic.routing; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public interface IFluidFilter extends IRoutingFilter +{ + void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput); + + /** + * This method is only called when the output tank this filter is managing + * receives an ItemStack. Should only really be called by the Input filter + * via it's transfer method. + * + * @param fluidStack + * - The stack to filter + * + * @return - The remainder of the stack after it has been absorbed into the + * tank. + */ + FluidStack transferStackThroughOutputFilter(FluidStack fluidStack); + + /** + * This method is only called on an input filter to transfer FluidStacks + * from the input tank to the output tank. + */ + int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer); + + boolean doesStackMatchFilter(FluidStack testStack); + + boolean doStacksMatch(FluidStack filterStack, FluidStack testStack); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java new file mode 100644 index 00000000..4b109eac --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IFluidRoutingNode extends IRoutingNode +{ + boolean isTankConnectedToSide(EnumFacing side); + + int getPriority(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java new file mode 100644 index 00000000..bd01f34f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IInputFluidRoutingNode extends IFluidRoutingNode +{ + boolean isFluidInput(EnumFacing side); + + IFluidFilter getInputFluidFilterForSide(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java index 872057ab..da01785c 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; -public interface IItemFilter +public interface IItemFilter extends IRoutingFilter { void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput); diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java new file mode 100644 index 00000000..85f49736 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java @@ -0,0 +1,10 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.util.EnumFacing; + +public interface IOutputFluidRoutingNode extends IFluidRoutingNode +{ + boolean isFluidOutput(EnumFacing side); + + IFluidFilter getOutputFluidFilterForSide(EnumFacing side); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java new file mode 100644 index 00000000..4de55c21 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java @@ -0,0 +1,6 @@ +package WayofTime.bloodmagic.routing; + +public interface IRoutingFilter +{ + +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java new file mode 100644 index 00000000..0486e29d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java @@ -0,0 +1,212 @@ +package WayofTime.bloodmagic.routing; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; + +public class RoutingFluidFilter implements IFluidFilter +{ + protected List requestList; + protected TileEntity accessedTile; + protected IFluidHandler fluidHandler; + + @Override + public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) + { + this.accessedTile = tile; + this.fluidHandler = fluidHandler; + if (isFilterOutput) + { + //The requestList contains a list of how much can be extracted. + requestList = new ArrayList(); + for (ItemStack filterStack : filteredList) + { + FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); + if (fluidFilterStack != null) + { + requestList.add(fluidFilterStack); + } + } + + IFluidTankProperties[] properties = fluidHandler.getTankProperties(); + + for (IFluidTankProperties property : properties) + { + FluidStack containedStack = property.getContents(); + if (containedStack != null) + { + for (FluidStack fluidFilterStack : requestList) + { + if (doStacksMatch(fluidFilterStack, containedStack)) + { + fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); + } + } + } + } + } else + { + requestList = new ArrayList(); + for (ItemStack filterStack : filteredList) + { + FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); + if (fluidFilterStack != null) + { + fluidFilterStack.amount *= -1; + requestList.add(fluidFilterStack); + } + } + + IFluidTankProperties[] properties = fluidHandler.getTankProperties(); + + for (IFluidTankProperties property : properties) + { + FluidStack containedStack = property.getContents(); + if (containedStack != null) + { + for (FluidStack fluidFilterStack : requestList) + { + if (doStacksMatch(fluidFilterStack, containedStack)) + { + fluidFilterStack.amount += containedStack.amount; + } + } + } + } + } + } + + public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) + { + FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); + fluidStack.amount = inputStack.stackSize; + return fluidStack; + } + + /** + * Gives the remainder~ + */ + @Override + public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) + { + int allowedAmount = 0; + for (FluidStack filterStack : requestList) + { + if (doStacksMatch(filterStack, fluidStack)) + { + allowedAmount = Math.min(filterStack.amount, fluidStack.amount); + break; + } + } + + if (allowedAmount <= 0) + { + return fluidStack; + } + + FluidStack copyStack = fluidStack.copy(); + int filledAmount = fluidHandler.fill(fluidStack, true); + copyStack.amount = fluidStack.amount - filledAmount; + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + FluidStack filterStack = itr.next(); + if (doStacksMatch(filterStack, copyStack)) + { + filterStack.amount -= filledAmount; + if (filterStack.amount <= 0) + { + itr.remove(); + } + } + } + + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + return copyStack.amount <= 0 ? null : copyStack; + } + + @Override + public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) + { + for (FluidStack filterFluidStack : requestList) + { + int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); + if (allowedAmount <= 0) + { + continue; + } + + FluidStack copyStack = filterFluidStack.copy(); + copyStack.amount = allowedAmount; + FluidStack drainStack = fluidHandler.drain(copyStack, false); + if (drainStack != null) //Can't pull this liquid out for some reason if it fails this check + { + FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); + int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); + + if (drained > 0) + { + drainStack.amount = drained; + + fluidHandler.drain(drainStack, true); + maxTransfer -= drained; + } + + Iterator itr = requestList.iterator(); + while (itr.hasNext()) + { + FluidStack filterStack = itr.next(); + if (doStacksMatch(filterStack, copyStack)) + { + filterStack.amount -= drained; + if (filterStack.amount <= 0) + { + itr.remove(); + } + } + } + + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + + return maxTransfer; + } + } + + return 0; + } + + @Override + public boolean doesStackMatchFilter(FluidStack testStack) + { + for (FluidStack filterStack : requestList) + { + if (doStacksMatch(filterStack, testStack)) + { + return true; + } + } + + return false; + } + + @Override + public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) + { + return testStack != null && filterStack.getFluid() == testStack.getFluid(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index 3af3502e..4ebd6109 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -8,6 +8,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.util.GhostItemHelper; import WayofTime.bloodmagic.util.Utils; /** diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java index be325890..2bb8c7a8 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -10,9 +10,8 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; +import WayofTime.bloodmagic.item.routing.IRoutingFilterProvider; import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.util.GhostItemHelper; public class ContainerItemRoutingNode extends Container { @@ -100,6 +99,13 @@ public class ContainerItemRoutingNode extends Container GhostItemHelper.setItemGhostAmount(copyStack, 0); copyStack.setCount(1); slot.putStack(copyStack); + + ItemStack filterStack = this.inventorySlots.get(0).getStack(); + if (filterStack.getItem() instanceof IRoutingFilterProvider) + { + ItemStack copyStack = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); + slot.putStack(copyStack); + } } } } else @@ -136,14 +142,14 @@ public class ContainerItemRoutingNode extends Container { if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) { - return ItemStack.EMPTY; + return null; } slot.onSlotChange(itemstack1, itemstack); } else if (index > 0) { // return null; - if (itemstack1.getItem() instanceof IItemFilterProvider) // Change to check item is a filter + if (itemstack1.getItem() instanceof IRoutingFilterProvider) // Change to check item is a filter { if (!this.mergeItemStack(itemstack1, 0, 1, false)) { @@ -155,7 +161,7 @@ public class ContainerItemRoutingNode extends Container return ItemStack.EMPTY; } - if (itemstack1.getCount() == 0) + if (itemstack1.isEmpty()) { slot.putStack(ItemStack.EMPTY); } else @@ -195,7 +201,7 @@ public class ContainerItemRoutingNode extends Container @Override public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IItemFilterProvider; //TODO: Create a new Item that holds the filter. + return itemStack.getItem() instanceof IRoutingFilterProvider; //TODO: Create a new Item that holds the filter. } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java index a4df1665..66c7b8c2 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -3,14 +3,19 @@ package WayofTime.bloodmagic.tile.routing; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; import WayofTime.bloodmagic.item.routing.IItemFilterProvider; import WayofTime.bloodmagic.routing.DefaultItemFilter; +import WayofTime.bloodmagic.routing.IFluidFilter; +import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; import WayofTime.bloodmagic.routing.IInputItemRoutingNode; import WayofTime.bloodmagic.routing.IItemFilter; import WayofTime.bloodmagic.util.Utils; -public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode +public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, IInputFluidRoutingNode { public TileInputRoutingNode() { @@ -34,11 +39,14 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty()) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, false); return filter; + } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) + { + return null; } IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); @@ -48,4 +56,35 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn return null; } + + @Override + public boolean isFluidInput(EnumFacing side) + { + return true; + } + + @Override + public IFluidFilter getInputFluidFilterForSide(EnumFacing side) + { + TileEntity tile = worldObj.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(EnumFacing side) + { + return true; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java index 074e9117..2344057c 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java @@ -17,9 +17,12 @@ import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.routing.IFluidFilter; +import WayofTime.bloodmagic.routing.IInputFluidRoutingNode; import WayofTime.bloodmagic.routing.IInputItemRoutingNode; import WayofTime.bloodmagic.routing.IItemFilter; import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; import WayofTime.bloodmagic.routing.NodeHelper; @@ -59,33 +62,65 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } Map> outputMap = new TreeMap>(); + Map> outputFluidMap = new TreeMap>(); for (BlockPos outputPos : outputNodeList) { TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (outputTile instanceof IOutputItemRoutingNode && this.isConnected(new LinkedList(), outputPos)) + if (this.isConnected(new LinkedList(), outputPos)) { - IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - - for (EnumFacing facing : EnumFacing.VALUES) + if (outputTile instanceof IOutputItemRoutingNode) { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) - { - continue; - } + IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) + for (EnumFacing facing : EnumFacing.VALUES) { - int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) + if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { - outputMap.get(priority).add(filter); - } else + continue; + } + + IItemFilter filter = outputNode.getOutputFilterForSide(facing); + if (filter != null) { - List filterList = new LinkedList(); - filterList.add(filter); - outputMap.put(priority, filterList); + int priority = outputNode.getPriority(facing); + if (outputMap.containsKey(priority)) + { + outputMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + outputMap.put(priority, filterList); + } + } + } + } + + if (outputTile instanceof IOutputFluidRoutingNode) + { + IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; + + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) + { + continue; + } + + IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); + if (filter != null) + { + int priority = outputNode.getPriority(facing); + if (outputMap.containsKey(priority)) + { + outputFluidMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + outputFluidMap.put(priority, filterList); + } } } } @@ -93,33 +128,65 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } Map> inputMap = new TreeMap>(); + Map> inputFluidMap = new TreeMap>(); for (BlockPos inputPos : inputNodeList) { TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (inputTile instanceof IInputItemRoutingNode && this.isConnected(new LinkedList(), inputPos)) + if (this.isConnected(new LinkedList(), inputPos)) { - IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - - for (EnumFacing facing : EnumFacing.VALUES) + if (inputTile instanceof IInputItemRoutingNode) { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) - { - continue; - } + IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) + for (EnumFacing facing : EnumFacing.VALUES) { - int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) + if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { - inputMap.get(priority).add(filter); - } else + continue; + } + + IItemFilter filter = inputNode.getInputFilterForSide(facing); + if (filter != null) { - List filterList = new LinkedList(); - filterList.add(filter); - inputMap.put(priority, filterList); + int priority = inputNode.getPriority(facing); + if (inputMap.containsKey(priority)) + { + inputMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + inputMap.put(priority, filterList); + } + } + } + } + + if (inputTile instanceof IInputFluidRoutingNode) + { + IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; + + for (EnumFacing facing : EnumFacing.VALUES) + { + if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) + { + continue; + } + + IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); + if (filter != null) + { + int priority = inputNode.getPriority(facing); + if (inputMap.containsKey(priority)) + { + inputFluidMap.get(priority).add(filter); + } else + { + List filterList = new LinkedList(); + filterList.add(filter); + inputFluidMap.put(priority, filterList); + } } } } @@ -127,6 +194,7 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); + int maxFluidTransfer = 1000; for (Entry> outputEntry : outputMap.entrySet()) { @@ -147,6 +215,26 @@ public class TileMasterRoutingNode extends TileInventory implements IMasterRouti } } } + + 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) diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index 135a8a0d..f1345b9b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -3,14 +3,19 @@ package WayofTime.bloodmagic.tile.routing; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; import WayofTime.bloodmagic.item.routing.IItemFilterProvider; import WayofTime.bloodmagic.routing.DefaultItemFilter; +import WayofTime.bloodmagic.routing.IFluidFilter; import WayofTime.bloodmagic.routing.IItemFilter; +import WayofTime.bloodmagic.routing.IOutputFluidRoutingNode; import WayofTime.bloodmagic.routing.IOutputItemRoutingNode; import WayofTime.bloodmagic.util.Utils; -public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode +public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, IOutputFluidRoutingNode { public TileOutputRoutingNode() { @@ -34,11 +39,14 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO { ItemStack filterStack = this.getFilterStack(side); - if (filterStack.isEmpty() || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (filterStack.isEmpty()) { IItemFilter filter = new DefaultItemFilter(); filter.initializeFilter(null, tile, handler, true); return filter; + } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) + { + return null; } IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); @@ -48,4 +56,35 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO return null; } + + @Override + public boolean isFluidOutput(EnumFacing side) + { + return true; + } + + @Override + public IFluidFilter getOutputFluidFilterForSide(EnumFacing side) + { + TileEntity tile = worldObj.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(EnumFacing side) + { + return true; + } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json new file mode 100644 index 00000000..430e8f47 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/ItemFluidRouterFilter.json @@ -0,0 +1,16 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "exact": { + "textures": { + "layer0": "bloodmagic:items/FluidRouterFilterExact" + } + } + } + } +} diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index dab626b3..c7efae3f 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -182,6 +182,7 @@ item.bloodmagic.itemFilter.exact.name=Precise Item Filter item.bloodmagic.itemFilter.ignoreNBT.name=NBT Item Filter item.bloodmagic.itemFilter.modItems.name=Mod Item Filter item.bloodmagic.itemFilter.oreDict.name=Ore Dictionary Item Filter +item.bloodmagic.fluidFilter.exact.name=Fluid Filter item.bloodmagic.experienceTome.name=Tome of Peritia item.bloodmagic.sanguineBook.name=Inspectoris Scandalum @@ -444,7 +445,7 @@ tooltip.bloodmagic.activationCrystal.weak=Activates low-level rituals tooltip.bloodmagic.activationCrystal.awakened=Activates more powerful rituals tooltip.bloodmagic.activationCrystal.creative=Creative Only - Activates any ritual -tooltip.bloodmagic.diviner.currentRitual=Current Ritual: +tooltip.bloodmagic.diviner.currentRitual=Current Ritual: tooltip.bloodmagic.diviner.blankRune=Blank Runes: %d tooltip.bloodmagic.diviner.waterRune=Water Runes: %d tooltip.bloodmagic.diviner.airRune=Air Runes: %d @@ -535,6 +536,7 @@ tooltip.bloodmagic.itemFilter.oreDict=Used to filter through the Ore Dictionary tooltip.bloodmagic.fluid.type=Fluid Contained tooltip.bloodmagic.fluid.amount=Amount tooltip.bloodmagic.fluid.capacity=Capacity +tooltip.bloodmagic.itemFilter.exact=Filters the fluid input/output tooltip.bloodmagic.ghost.everything=Everything tooltip.bloodmagic.ghost.amount=Ghost item amount: %d @@ -697,9 +699,9 @@ ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the ritual.bloodmagic.fullStomachRitual.chest.info=(Chest) The location of the inventory that the ritual will grab food from to feed players in range. ritual.bloodmagic.interdictionRitual.interdictionRange.info=(Push) The area of the ritual where mobs will be pushed. All mobs are pushed away from the master ritual stone, regardless of where this area is. ritual.bloodmagic.containmentRitual.containmentRange.info=(Containment) The area of the ritual where mobs will be pulled. All mobs are pulled towards the master ritual stone, regardless of where this area is. -ritual.bloodmagic.speedRitual.sanicRange.info=(Speed) All entities within this area are launched in the direction of the arrow formed by the ritual. +ritual.bloodmagic.speedRitual.sanicRange.info=(Speed) All entities within this area are launched in the direction of the arrow formed by the ritual. ritual.bloodmagic.suppressionRitual.suppressionRange.info=(Suppress) All liquids within the range are suppressed. -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(Expulsion) +ritual.bloodmagic.expulsionRitual.expulsionRange.info=(Expulsion) ritual.bloodmagic.zephyrRitual.zephyrRange.info=(Suction) Items within this range will be sucked into the linked chest. ritual.bloodmagic.zephyrRitual.chest.info=(Chest) The location of the inventory that the ritual will place the picked up items into. ritual.bloodmagic.animalGrowthRitual.growing.info=(Growth) Animals within this range will grow much faster. @@ -708,7 +710,7 @@ ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in th ritual.bloodmagic.forsakenSoulRitual.damage.info=(Damage) Mobs within this range will be slowly damaged, and when killed will grow the crystals. ritual.bloodmagic.crystalHarvestRitual.crystal.info=(Crystal) All Demon Will crystal clusters have a single crystal broken off, spawning the crystal into the world. If there is only one crystal on the cluster, it will not break it. -ritual.bloodmagic.placerRitual.placerRange.info=(Placement) The range that the ritual will place its blocks in. +ritual.bloodmagic.placerRitual.placerRange.info=(Placement) The range that the ritual will place its blocks in. ritual.bloodmagic.placerRitual.chest.info=(Chest) The location of the inventory that the ritual will grab blocks from to place in the world. ritual.bloodmagic.fellingRitual.fellingRange.info=(Cutting) The range that the ritual will search out logs and leaves in order to cut down. ritual.bloodmagic.fellingRitual.chest.info=(Chest) The location of the inventory that the ritual will place the results into. diff --git a/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png b/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png new file mode 100644 index 00000000..5de1391d Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/items/FluidRouterFilterExact.png differ