Skip to content

Commit

Permalink
feat: ✨ Add support to hopper upgrade to be able to work with composter
Browse files Browse the repository at this point in the history
  • Loading branch information
P3pp3rF1y committed Sep 1, 2023
1 parent d5768b5 commit 2fd4755
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 4 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
org.gradle.daemon=false
minecraft_version=1.19.2
forge_version=43.2.13
mod_version=0.8.41
mod_version=0.8.42
jei_mc_version=1.19.2-forge
jei_version=11.6.0.+
quark_cf_file_id=4463411
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@
import net.minecraft.core.Direction;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.WorldlyContainer;
import net.minecraft.world.WorldlyContainerHolder;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
import net.p3pp3rf1y.sophisticatedcore.inventory.ITrackedContentsItemHandler;
import net.p3pp3rf1y.sophisticatedcore.settings.memory.MemorySettingsCategory;
import net.p3pp3rf1y.sophisticatedcore.upgrades.ContentsFilterLogic;
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogic;
Expand Down Expand Up @@ -64,19 +68,81 @@ public void tick(@Nullable LivingEntity entity, Level level, BlockPos pos) {
}

for (Direction pushDirection : pushDirections) {
if (getItemHandler(level, pos, pushDirection).map(this::pushItems).orElse(false)) {
if (getItemHandler(level, pos, pushDirection).map(this::pushItems)
.orElse(getWorldlyContainer(level, pos, pushDirection).map(container -> pushItemsToContainer(container, pushDirection.getOpposite()))
.orElse(false))) {
break;
}
}

for (Direction pullDirection : pullDirections) {
if (getItemHandler(level, pos, pullDirection).map(this::pullItem).orElse(false)) {
if (getItemHandler(level, pos, pullDirection).map(this::pullItems)
.orElse(getWorldlyContainer(level, pos, pullDirection).map(container -> pullItemsFromContainer(container, pullDirection.getOpposite()))
.orElse(false))) {
break;
}
}

coolDownTime = level.getGameTime() + upgradeItem.getTransferSpeedTicks();
}

private boolean pushItemsToContainer(WorldlyContainer worldlyContainer, Direction face) {
ITrackedContentsItemHandler fromHandler = storageWrapper.getInventoryForUpgradeProcessing();

for (int slot = 0; slot < fromHandler.getSlots(); slot++) {
ItemStack slotStack = fromHandler.getStackInSlot(slot);
if (!slotStack.isEmpty() && outputFilterLogic.matchesFilter(slotStack)) {
ItemStack extractedStack = fromHandler.extractItem(slot, Math.min(worldlyContainer.getMaxStackSize(), upgradeItem.getMaxTransferStackSize()), true);
if (!extractedStack.isEmpty() && pushStackToContainer(worldlyContainer, face, extractedStack, fromHandler, slot)) {
return true;
}
}
}

return false;
}

private boolean pushStackToContainer(WorldlyContainer worldlyContainer, Direction face, ItemStack extractedStack, ITrackedContentsItemHandler fromHandler, int slotToExtractFrom) {
for (int containerSlot = 0; containerSlot < worldlyContainer.getContainerSize(); containerSlot++) {
if (worldlyContainer.canPlaceItemThroughFace(containerSlot, extractedStack, face)) {
ItemStack existingStack = worldlyContainer.getItem(containerSlot);
if (existingStack.isEmpty()) {
worldlyContainer.setItem(containerSlot, extractedStack);
fromHandler.extractItem(slotToExtractFrom, extractedStack.getCount(), false);
return true;
} else if (ItemHandlerHelper.canItemStacksStack(existingStack, extractedStack)) {
int maxStackSize = Math.min(worldlyContainer.getMaxStackSize(), existingStack.getMaxStackSize());
int remainder = maxStackSize - existingStack.getCount();
if (remainder > 0) {
int countToExtract = Math.min(extractedStack.getCount(), remainder);
existingStack.grow(countToExtract);
worldlyContainer.setItem(containerSlot, existingStack);
fromHandler.extractItem(slotToExtractFrom, countToExtract, false);
return true;
}
}
}
}
return false;
}

private boolean pullItemsFromContainer(WorldlyContainer worldlyContainer, Direction face) {
ITrackedContentsItemHandler toHandler = storageWrapper.getInventoryForUpgradeProcessing();
for (int containerSlot = 0; containerSlot < worldlyContainer.getContainerSize(); containerSlot++) {
ItemStack existingStack = worldlyContainer.getItem(containerSlot);
if (!existingStack.isEmpty() && worldlyContainer.canTakeItemThroughFace(containerSlot, existingStack, face) && inputFilterLogic.matchesFilter(existingStack)) {
ItemStack remainingStack = InventoryHelper.insertIntoInventory(existingStack, toHandler, false);

if (remainingStack.getCount() < existingStack.getCount()) {
worldlyContainer.setItem(containerSlot, remainingStack);
return true;
}
}
}

return false;
}

private void initDirections(Level level, BlockPos pos) {
if (upgrade.hasTag()) {
return;
Expand All @@ -89,7 +155,16 @@ private void initDirections(Level level, BlockPos pos) {
}
}

private boolean pullItem(IItemHandler fromHandler) {
private Optional<WorldlyContainer> getWorldlyContainer(Level level, BlockPos pos, Direction direction) {
BlockPos offsetPos = pos.relative(direction);
BlockState state = level.getBlockState(offsetPos);
if (state.getBlock() instanceof WorldlyContainerHolder worldlyContainerHolder) {
return Optional.of(worldlyContainerHolder.getContainer(state, level, offsetPos));
}
return Optional.empty();
}

private boolean pullItems(IItemHandler fromHandler) {
return moveItems(fromHandler, storageWrapper.getInventoryForUpgradeProcessing(), inputFilterLogic);
}

Expand Down

0 comments on commit 2fd4755

Please sign in to comment.