diff --git a/gradle.properties b/gradle.properties index e8a88cda4..353f337d6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.internal.publish.checksums.insecure=true org.gradle.daemon=false minecraft_version=1.18.2 forge_version=40.1.30 -mod_version=0.8.39 +mod_version=0.8.42 jei_mc_version=1.18.2 jei_version=9.7.0+ balm_cf_file_id=3914491 diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/client/ClientEventHandler.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/client/ClientEventHandler.java index a815854bb..27244a52f 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/client/ClientEventHandler.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/client/ClientEventHandler.java @@ -14,6 +14,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.Slot; @@ -25,6 +26,7 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.gui.OverlayRegistry; @@ -33,7 +35,6 @@ import net.minecraftforge.client.settings.IKeyConflictContext; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.AddPackFindersEvent; -import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; @@ -112,18 +113,13 @@ public static void registerHandlers() { modBus.addListener(ClientEventHandler::registerEntityRenderers); modBus.addListener(ModParticles::registerFactories); modBus.addListener(ClientEventHandler::registerStorageLayerLoader); + modBus.addListener(ClientEventHandler::onRegisterReloadListeners); IEventBus eventBus = MinecraftForge.EVENT_BUS; eventBus.addListener(ClientStorageContentsTooltip::onWorldLoad); eventBus.addListener(EventPriority.HIGH, ClientEventHandler::handleGuiMouseKeyPress); eventBus.addListener(EventPriority.HIGH, ClientEventHandler::handleGuiKeyPress); eventBus.addListener(ClientEventHandler::onLimitedBarrelClicked); eventBus.addListener(ClientEventHandler::onMouseScrolled); - eventBus.addListener(ClientEventHandler::onResourceReload); - } - - private static void onResourceReload(AddReloadListenerEvent event) { - BarrelDynamicModelBase.invalidateCache(); - BarrelBakedModelBase.invalidateCache(); } private static void onMouseScrolled(InputEvent.MouseScrollEvent evt) { @@ -214,6 +210,13 @@ private static void addBarrelPartModelsToBake() { }); } + private static void onRegisterReloadListeners(RegisterClientReloadListenersEvent event) { + event.registerReloadListener((ResourceManagerReloadListener) resourceManager -> { + BarrelDynamicModelBase.invalidateCache(); + BarrelBakedModelBase.invalidateCache(); + }); + } + public static void registerLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(CHEST_LAYER, () -> ChestRenderer.createSingleBodyLayer(true)); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/compression/CompressionUpgradeItem.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/compression/CompressionUpgradeItem.java index 8c03c17e1..31c52a42b 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/compression/CompressionUpgradeItem.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/compression/CompressionUpgradeItem.java @@ -9,6 +9,7 @@ import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryHandler; import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryPartRegistry; import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryPartitioner; +import net.p3pp3rf1y.sophisticatedcore.settings.itemdisplay.ItemDisplaySettingsCategory; import net.p3pp3rf1y.sophisticatedcore.settings.memory.MemorySettingsCategory; import net.p3pp3rf1y.sophisticatedcore.upgrades.UpgradeItemBase; import net.p3pp3rf1y.sophisticatedcore.upgrades.UpgradeType; @@ -105,6 +106,7 @@ public void onAdded() { setFirstInventorySlot(slotRange.firstSlot()); inventoryPartitioner.addInventoryPart(slotRange.firstSlot(), slotRange.numberOfSlots(), new CompressionInventoryPart(storageWrapper.getInventoryHandler(), slotRange, () -> storageWrapper.getSettingsHandler().getTypeCategory(MemorySettingsCategory.class))); }); + storageWrapper.getSettingsHandler().getTypeCategory(ItemDisplaySettingsCategory.class).itemsChanged(); } private void setFirstInventorySlot(int firstInventorySlot) { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/hopper/HopperUpgradeWrapper.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/hopper/HopperUpgradeWrapper.java index f6b5ddcf5..b63e151be 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/hopper/HopperUpgradeWrapper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorage/upgrades/hopper/HopperUpgradeWrapper.java @@ -4,6 +4,8 @@ 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; @@ -11,7 +13,9 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; 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; @@ -64,12 +68,17 @@ 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; } } @@ -77,6 +86,63 @@ public void tick(@Nullable LivingEntity entity, Level level, BlockPos pos) { 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; @@ -89,7 +155,16 @@ private void initDirections(Level level, BlockPos pos) { } } - private boolean pullItem(IItemHandler fromHandler) { + private Optional 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); }