Patch production

- Remove killtps command, it should not be available in built jars
- Added a tooltip for the stock keeper address input
- Fixed crash when re-packaging a duplicated package fragment #7456
- Fixed crash when ctrl-click copying a gauge #7431
- Safety check for unexpected string modifications in address edit boxes #7409
This commit is contained in:
simibubi 2025-03-01 22:00:19 +01:00
parent 93f268419b
commit a088b5b258
7 changed files with 67 additions and 11 deletions

View file

@ -122,16 +122,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);
}
}
@ -217,7 +217,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock
PanelSlot newSlot = getTargetedSlot(pPos, pState, location);
withBlockEntityDo(pLevel, pPos, fpbe -> {
if (!fpbe.addPanel(newSlot, LogisticallyLinkedBlockItem.networkFromStack(item)))
if (!fpbe.addPanel(newSlot, LogisticallyLinkedBlockItem.networkFromStack(FactoryPanelBlockItem.fixCtrlCopiedStack(item))))
return;
pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true);
pLevel.playSound(null, pPos, soundType.getPlaceSound(), SoundSource.BLOCKS);

View file

@ -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;

View file

@ -1,13 +1,21 @@
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.utility.CreateLang;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
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.state.BlockState;
public class FactoryPanelBlockItem extends LogisticallyLinkedBlockItem {
@ -29,5 +37,31 @@ 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.getTagElement(BLOCK_ENTITY_TAG);
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);
stack.getTag().put(BLOCK_ENTITY_TAG, bet);
}
return stack;
}
}

View file

@ -113,7 +113,8 @@ public class PackageDefragmenter {
ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.stack, removedAmount);
targetAmount -= removedAmount;
targetedEntry.count = targetAmount;
if (targetedEntry != null)
targetedEntry.count = targetAmount;
entry.count -= removedAmount;
outputSlots.add(output);
}

View file

@ -38,6 +38,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;
@ -489,9 +490,12 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen<StockK
// Render text input hints
if (addressBox.getValue()
.isBlank())
graphics.drawString(font, addressBox.getMessage(), addressBox.getX(), addressBox.getY(), 0x88dddddd);
.isBlank() && !addressBox.isFocused()) {
graphics.drawString(Minecraft.getInstance().font, CreateLang.translate("gui.stock_keeper.package_adress")
.style(ChatFormatting.ITALIC)
.component(), addressBox.getX(), addressBox.getY(), 0xff_CDBCA8, false);
}
// Render keeper
int entitySizeOffset = 0;
LivingEntity keeper = stockKeeper.get();
@ -807,6 +811,19 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen<StockK
.component()),
mouseX, mouseY);
}
// Render tooltip of address input
if (addressBox.getValue()
.isBlank() && !addressBox.isFocused() && addressBox.isHovered()) {
graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.restocker_address")
.color(ScrollInput.HEADER_RGB)
.component(),
CreateLang.translate("gui.schedule.lmb_edit")
.style(ChatFormatting.DARK_GRAY)
.style(ChatFormatting.ITALIC)
.component()),
mouseX, mouseY);
}
}
private void renderItemEntry(GuiGraphics graphics, float scale, BigItemStack entry, boolean isStackHovered,

View file

@ -47,6 +47,9 @@ public class DestinationSuggestions extends CommandSuggestions {
@Override
public void updateCommandInfo() {
if (textBox.getValue().length() < textBox.getCursorPosition())
return;
String trimmed = textBox.getValue()
.substring(0, textBox.getCursorPosition());

View file

@ -59,7 +59,7 @@ public class AllCommands {
.then(CameraDistanceCommand.register())
.then(CameraAngleCommand.register())
//.then(DebugValueCommand.register())
.then(KillTPSCommand.register())
//.then(KillTPSCommand.register())
.build();
}