diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index f50f6be5c6..23b4280894 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -145,16 +145,16 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (blockState.is(this) && location != null && fpbe != null) { if (!level.isClientSide()) { PanelSlot targetedSlot = getTargetedSlot(pos, blockState, location); - UUID networkFromStack = LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand()); + ItemStack panelItem = FactoryPanelBlockItem.fixCtrlCopiedStack(pContext.getItemInHand()); + UUID networkFromStack = LogisticallyLinkedBlockItem.networkFromStack(panelItem); Player pPlayer = pContext.getPlayer(); if (fpbe.addPanel(targetedSlot, networkFromStack) && pPlayer != null) { pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); if (!pPlayer.isCreative()) { - ItemStack item = pContext.getItemInHand(); - item.shrink(1); - if (item.isEmpty()) + panelItem.shrink(1); + if (panelItem.isEmpty()) pPlayer.setItemInHand(pContext.getHand(), ItemStack.EMPTY); } } @@ -237,7 +237,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock PanelSlot newSlot = getTargetedSlot(pos, state, location); withBlockEntityDo(level, pos, fpbe -> { - if (!fpbe.addPanel(newSlot, LogisticallyLinkedBlockItem.networkFromStack(stack))) + if (!fpbe.addPanel(newSlot, LogisticallyLinkedBlockItem.networkFromStack(FactoryPanelBlockItem.fixCtrlCopiedStack(stack)))) return; player.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); level.playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 45ee4b495d..29e25dca94 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -133,7 +133,8 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { FactoryPanelBehaviour behaviour = panels.get(slot); if (behaviour != null && !behaviour.isActive()) { behaviour.enable(); - behaviour.setNetwork(frequency); + if (frequency != null) + behaviour.setNetwork(frequency); redraw = true; lastShape = null; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java index 83277f542a..58f84edc43 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java @@ -1,13 +1,26 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.util.UUID; + import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.utility.CreateLang; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; public class FactoryPanelBlockItem extends LogisticallyLinkedBlockItem { @@ -30,4 +43,32 @@ public class FactoryPanelBlockItem extends LogisticallyLinkedBlockItem { return super.place(pContext); } + @Override + protected boolean updateCustomBlockEntityTag(BlockPos pos, Level level, Player player, ItemStack stack, + BlockState state) { + return super.updateCustomBlockEntityTag(pos, level, player, fixCtrlCopiedStack(stack), state); + } + + public static ItemStack fixCtrlCopiedStack(ItemStack stack) { + // Salvage frequency data from one of the panel slots + if (isTuned(stack) && networkFromStack(stack) == null) { + CompoundTag bet = stack.getOrDefault(DataComponents.BLOCK_ENTITY_DATA, CustomData.EMPTY).copyTag(); + UUID frequency = UUID.randomUUID(); + + for (PanelSlot slot : PanelSlot.values()) { + CompoundTag panelTag = bet.getCompound(CreateLang.asId(slot.name())); + if (panelTag.hasUUID("Freq")) + frequency = panelTag.getUUID("Freq"); + } + + bet = new CompoundTag(); + bet.putUUID("Freq", frequency); + + BlockEntity.addEntityType(bet, ((IBE) ((BlockItem) stack.getItem()).getBlock()).getBlockEntityType()); + stack.set(DataComponents.BLOCK_ENTITY_DATA, CustomData.of(bet)); + } + + return stack; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index c3d608756d..4edd84ebec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -37,6 +37,7 @@ import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.ScreenWithStencils; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.model.baked.PartialModel; @@ -487,9 +488,12 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen