diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d8be4522..1e8215438 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Wireless Transmitters can now be placed on any block and in any direction (raoulvdberge) - Fixed Exporter not exporting anything when using a Stack Upgrade and there isn't space for 64 items in the inventory (raoulvdberge) - Fixed Controller always using the base usage even when turned off (raoulvdberge) +- Added the Regulator Upgrade that can be inserted into a Exporter. This ensures a certain amount of items and fluids is kept in stock in a connected inventory (raoulvdberge) ### 1.8.2 - Add Refined Storage silicon to forge:silicon tag for mod compatibility (jeremiahwinsley) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ExporterNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ExporterNetworkNode.java index 7e69166d3..d871bbeb4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ExporterNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/ExporterNetworkNode.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; import com.raoulvdberge.refinedstorage.inventory.item.BaseItemHandler; import com.raoulvdberge.refinedstorage.inventory.item.UpgradeItemHandler; @@ -36,8 +37,35 @@ public class ExporterNetworkNode extends NetworkNode implements IComparable, ITy private BaseItemHandler itemFilters = new BaseItemHandler(9).addListener(new NetworkNodeInventoryListener(this)); private FluidInventory fluidFilters = new FluidInventory(9).addListener(new NetworkNodeFluidInventoryListener(this)); - private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4, UpgradeItem.Type.SPEED, UpgradeItem.Type.CRAFTING, UpgradeItem.Type.STACK) - .addListener(new NetworkNodeInventoryListener(this)); + private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4, UpgradeItem.Type.SPEED, UpgradeItem.Type.CRAFTING, UpgradeItem.Type.STACK, UpgradeItem.Type.REGULATOR) + .addListener(new NetworkNodeInventoryListener(this)) + .addListener((handler, slot, reading) -> { + if (!getUpgrades().hasUpgrade(UpgradeItem.Type.REGULATOR)) { + boolean changed = false; + + for (int i = 0; i < itemFilters.getSlots(); ++i) { + ItemStack filterSlot = itemFilters.getStackInSlot(i); + + if (filterSlot.getCount() > 1) { + filterSlot.setCount(1); + changed = true; + } + } + + for (int i = 0; i < fluidFilters.getSlots(); ++i) { + FluidStack filterSlot = fluidFilters.getFluid(i); + + if (!filterSlot.isEmpty() && filterSlot.getAmount() != FluidAttributes.BUCKET_VOLUME) { + filterSlot.setAmount(FluidAttributes.BUCKET_VOLUME); + changed = true; + } + } + + if (changed) { + markDirty(); + } + } + }); private int compare = IComparer.COMPARE_NBT; private int type = IType.ITEMS; @@ -79,21 +107,45 @@ public class ExporterNetworkNode extends NetworkNode implements IComparable, ITy if (!slot.isEmpty()) { int stackSize = upgrades.getStackInteractCount(); - ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.SIMULATE); + if (upgrades.hasUpgrade(UpgradeItem.Type.REGULATOR)) { + int found = 0; - if (took.isEmpty()) { - if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { - network.getCraftingManager().request(new SlottedCraftingRequest(this, filterSlot), slot, stackSize); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stackInConnectedHandler = handler.getStackInSlot(i); + + if (API.instance().getComparer().isEqual(slot, stackInConnectedHandler, compare)) { + found += stackInConnectedHandler.getCount(); + } } - } else { - ItemStack remainder = ItemHandlerHelper.insertItem(handler, took, true); - int correctedStackSize = took.getCount() - remainder.getCount(); + int needed = 0; - if (correctedStackSize > 0) { - took = network.extractItem(slot, correctedStackSize, compare, Action.PERFORM); + for (int i = 0; i < itemFilters.getSlots(); ++i) { + if (API.instance().getComparer().isEqualNoQuantity(slot, itemFilters.getStackInSlot(i))) { + needed += itemFilters.getStackInSlot(i).getCount(); + } + } - ItemHandlerHelper.insertItem(handler, took, false); + stackSize = Math.min(stackSize, needed - found); + } + + if (stackSize > 0) { + ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.SIMULATE); + + if (took.isEmpty()) { + if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { + network.getCraftingManager().request(new SlottedCraftingRequest(this, filterSlot), slot, stackSize); + } + } else { + ItemStack remainder = ItemHandlerHelper.insertItem(handler, took, true); + + int correctedStackSize = took.getCount() - remainder.getCount(); + + if (correctedStackSize > 0) { + took = network.extractItem(slot, correctedStackSize, compare, Action.PERFORM); + + ItemHandlerHelper.insertItem(handler, took, false); + } } } } @@ -128,14 +180,38 @@ public class ExporterNetworkNode extends NetworkNode implements IComparable, ITy if (stackInStorage != null) { toExtract = Math.min(toExtract, stackInStorage.getAmount()); - FluidStack took = network.extractFluid(stack, toExtract, compare, Action.SIMULATE); + if (upgrades.hasUpgrade(UpgradeItem.Type.REGULATOR)) { + int found = 0; - int filled = handler.fill(took, IFluidHandler.FluidAction.SIMULATE); + for (int i = 0; i < handler.getTanks(); i++) { + FluidStack stackInConnectedHandler = handler.getFluidInTank(i); - if (filled > 0) { - took = network.extractFluid(stack, filled, compare, Action.PERFORM); + if (API.instance().getComparer().isEqual(stack, stackInConnectedHandler, compare)) { + found += stackInConnectedHandler.getAmount(); + } + } - handler.fill(took, IFluidHandler.FluidAction.EXECUTE); + int needed = 0; + + for (int i = 0; i < fluidFilters.getSlots(); ++i) { + if (API.instance().getComparer().isEqual(stack, fluidFilters.getFluid(i), IComparer.COMPARE_NBT)) { + needed += fluidFilters.getFluid(i).getAmount(); + } + } + + toExtract = Math.min(toExtract, needed - found); + } + + if (toExtract > 0) { + FluidStack took = network.extractFluid(stack, toExtract, compare, Action.SIMULATE); + + int filled = handler.fill(took, IFluidHandler.FluidAction.SIMULATE); + + if (filled > 0) { + took = network.extractFluid(stack, filled, compare, Action.PERFORM); + + handler.fill(took, IFluidHandler.FluidAction.EXECUTE); + } } } else if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { network.getCraftingManager().request(this, stack, toExtract); @@ -215,7 +291,7 @@ public class ExporterNetworkNode extends NetworkNode implements IComparable, ITy } } - public IItemHandler getUpgrades() { + public UpgradeItemHandler getUpgrades() { return upgrades; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java index 9633c2f84..9be546aa7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java @@ -311,6 +311,7 @@ public class ServerConfig { private final ForgeConfigSpec.IntValue fortune1UpgradeUsage; private final ForgeConfigSpec.IntValue fortune2UpgradeUsage; private final ForgeConfigSpec.IntValue fortune3UpgradeUsage; + private final ForgeConfigSpec.IntValue regulatorUpgradeUsage; public Upgrades() { builder.push("upgrades"); @@ -323,6 +324,7 @@ public class ServerConfig { fortune1UpgradeUsage = builder.comment("The additional energy used by the Fortune 1 Upgrade").defineInRange("fortune1UpgradeUsage", 10, 0, Integer.MAX_VALUE); fortune2UpgradeUsage = builder.comment("The additional energy used by the Fortune 2 Upgrade").defineInRange("fortune2UpgradeUsage", 12, 0, Integer.MAX_VALUE); fortune3UpgradeUsage = builder.comment("The additional energy used by the Fortune 3 Upgrade").defineInRange("fortune3UpgradeUsage", 14, 0, Integer.MAX_VALUE); + regulatorUpgradeUsage = builder.comment("The additional energy used by the Regulator Upgrade").defineInRange("regulatorUpgradeUsage", 15, 0, Integer.MAX_VALUE); builder.pop(); } @@ -358,6 +360,10 @@ public class ServerConfig { public int getFortune3UpgradeUsage() { return fortune3UpgradeUsage.get(); } + + public int getRegulatorUpgradeUsage() { + return regulatorUpgradeUsage.get(); + } } public class StorageBlock { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ExporterContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ExporterContainer.java index 321f1d57c..46336d3b1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ExporterContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ExporterContainer.java @@ -3,30 +3,56 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.RSContainers; import com.raoulvdberge.refinedstorage.container.slot.filter.FilterSlot; import com.raoulvdberge.refinedstorage.container.slot.filter.FluidFilterSlot; +import com.raoulvdberge.refinedstorage.item.UpgradeItem; import com.raoulvdberge.refinedstorage.tile.ExporterTile; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.PlayerEntity; import net.minecraftforge.items.SlotItemHandler; public class ExporterContainer extends BaseContainer { + private final ExporterTile exporter; + public ExporterContainer(ExporterTile exporter, PlayerEntity player, int windowId) { super(RSContainers.EXPORTER, exporter, player, windowId); + this.exporter = exporter; + + initSlots(); + } + + public void initSlots() { + this.inventorySlots.clear(); + this.inventoryItemStacks.clear(); + + this.transferManager.clearTransfers(); + for (int i = 0; i < 4; ++i) { addSlot(new SlotItemHandler(exporter.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } for (int i = 0; i < 9; ++i) { - addSlot(new FilterSlot(exporter.getNode().getItemFilters(), i, 8 + (18 * i), 20).setEnableHandler(() -> exporter.getNode().getType() == IType.ITEMS)); + addSlot(new FilterSlot( + exporter.getNode().getItemFilters(), + i, + 8 + (18 * i), + 20, + exporter.getNode().getUpgrades().hasUpgrade(UpgradeItem.Type.REGULATOR) ? FilterSlot.FILTER_ALLOW_SIZE : 0 + ).setEnableHandler(() -> exporter.getNode().getType() == IType.ITEMS)); } for (int i = 0; i < 9; ++i) { - addSlot(new FluidFilterSlot(exporter.getNode().getFluidFilters(), i, 8 + (18 * i), 20).setEnableHandler(() -> exporter.getNode().getType() == IType.FLUIDS)); + addSlot(new FluidFilterSlot( + exporter.getNode().getFluidFilters(), + i, + 8 + (18 * i), + 20, + exporter.getNode().getUpgrades().hasUpgrade(UpgradeItem.Type.REGULATOR) ? FluidFilterSlot.FILTER_ALLOW_SIZE : 0 + ).setEnableHandler(() -> exporter.getNode().getType() == IType.FLUIDS)); } addPlayerInventory(8, 55); - transferManager.addBiTransfer(player.inventory, exporter.getNode().getUpgrades()); - transferManager.addFilterTransfer(player.inventory, exporter.getNode().getItemFilters(), exporter.getNode().getFluidFilters(), exporter.getNode()::getType); + transferManager.addBiTransfer(getPlayer().inventory, exporter.getNode().getUpgrades()); + transferManager.addFilterTransfer(getPlayer().inventory, exporter.getNode().getItemFilters(), exporter.getNode().getFluidFilters(), exporter.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/UpgradeItemHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/UpgradeItemHandler.java index 4b4072886..c1cdcc7a9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/UpgradeItemHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/UpgradeItemHandler.java @@ -69,24 +69,6 @@ public class UpgradeItemHandler extends BaseItemHandler { return usage; } - public int getFortuneLevel() { - int maxFortune = 0; - - for (int i = 0; i < getSlots(); ++i) { - ItemStack slot = getStackInSlot(i); - - if (slot.getItem() instanceof UpgradeItem) { - int fortune = ((UpgradeItem) slot.getItem()).getType().getFortuneLevel(); - - if (fortune > maxFortune) { - maxFortune = fortune; - } - } - } - - return maxFortune; - } - public int getStackInteractCount() { return hasUpgrade(UpgradeItem.Type.STACK) ? 64 : 1; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/UpgradeItem.java b/src/main/java/com/raoulvdberge/refinedstorage/item/UpgradeItem.java index b577b3908..0873af2c0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/UpgradeItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/UpgradeItem.java @@ -22,7 +22,8 @@ public class UpgradeItem extends Item { SILK_TOUCH("silk_touch"), FORTUNE_1("fortune_1"), FORTUNE_2("fortune_2"), - FORTUNE_3("fortune_3"); + FORTUNE_3("fortune_3"), + REGULATOR("regulator"); private final String name; @@ -54,6 +55,8 @@ public class UpgradeItem extends Item { return RS.SERVER_CONFIG.getUpgrades().getFortune2UpgradeUsage(); case FORTUNE_3: return RS.SERVER_CONFIG.getUpgrades().getFortune3UpgradeUsage(); + case REGULATOR: + return RS.SERVER_CONFIG.getUpgrades().getRegulatorUpgradeUsage(); default: throw new IllegalStateException("What even am I?"); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/ExporterScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/ExporterScreen.java index 2316a4ebc..9fdd3d50f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/ExporterScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/ExporterScreen.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.screen; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.container.ExporterContainer; +import com.raoulvdberge.refinedstorage.item.UpgradeItem; import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.ExactModeSideButton; import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.RedstoneModeSideButton; import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.TypeSideButton; @@ -11,8 +12,16 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; public class ExporterScreen extends BaseScreen { + private boolean hasRegulatorMode; + public ExporterScreen(ExporterContainer container, PlayerInventory playerInventory, ITextComponent title) { super(container, 211, 137, playerInventory, title); + + this.hasRegulatorMode = hasRegulatorMode(); + } + + private boolean hasRegulatorMode() { + return ((ExporterTile) container.getTile()).getNode().getUpgrades().hasUpgrade(UpgradeItem.Type.REGULATOR); } @Override @@ -26,6 +35,12 @@ public class ExporterScreen extends BaseScreen { @Override public void tick(int x, int y) { + boolean updatedHasRegulatorMode = hasRegulatorMode(); + if (hasRegulatorMode != updatedHasRegulatorMode) { + hasRegulatorMode = updatedHasRegulatorMode; + + container.initSlots(); + } } @Override diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.json b/src/main/resources/assets/refinedstorage/lang/en_us.json index 7321ac79f..8eddd9be3 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.json +++ b/src/main/resources/assets/refinedstorage/lang/en_us.json @@ -273,6 +273,7 @@ "item.refinedstorage.fortune_1_upgrade": "Fortune Upgrade", "item.refinedstorage.fortune_2_upgrade": "Fortune Upgrade", "item.refinedstorage.fortune_3_upgrade": "Fortune Upgrade", + "item.refinedstorage.regulator_upgrade": "Regulator Upgrade", "item.refinedstorage.storage_housing": "Storage Housing", "item.refinedstorage.filter": "Filter", "item.refinedstorage.network_card": "Network Card", diff --git a/src/main/resources/assets/refinedstorage/models/item/regulator_upgrade.json b/src/main/resources/assets/refinedstorage/models/item/regulator_upgrade.json new file mode 100644 index 000000000..984029973 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/regulator_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:item/regulator_upgrade" + } +} diff --git a/src/main/resources/data/refinedstorage/recipes/regulator_upgrade.json b/src/main/resources/data/refinedstorage/recipes/regulator_upgrade.json new file mode 100644 index 000000000..c69185cd5 --- /dev/null +++ b/src/main/resources/data/refinedstorage/recipes/regulator_upgrade.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ECE", + "RUR", + "EEE" + ], + "key": { + "E": { + "item": "refinedstorage:quartz_enriched_iron" + }, + "R": { + "item": "minecraft:redstone" + }, + "C": { + "item": "minecraft:comparator" + }, + "U": { + "item": "refinedstorage:upgrade" + } + }, + "result": { + "item": "refinedstorage:regulator_upgrade" + } +} \ No newline at end of file