Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/generated/resources/assets/create/lang/en_ud.json
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,8 @@
"create.gui.schematicannon.option.skipBlockEntities.description": "˙sʇsǝɥƆ sɐ ɥɔns sʞɔoןq buıpןoɥ ɐʇɐp buıɔɐןdǝɹ pıoʌɐ ןןıʍ uouuɐɔ ǝɥ⟘",
"create.gui.schematicannon.option.skipMissing": "sʞɔoןᗺ buıssıɯ dıʞS",
"create.gui.schematicannon.option.skipMissing.description": "˙uoıʇɐɔoꞀ ʇxǝu ǝɥʇ ʇɐ ǝnuıʇuoɔ ןןıʍ ʇı 'ʇuǝɯǝɔɐןd ɹoɟ ʞɔoןᗺ pǝɹınbǝɹ ɐ puıɟ ʇouuɐɔ uouuɐɔ ǝɥʇ ɟI",
"create.gui.schematicannon.option.skipMissingFluid": "spınןℲ buıssıɯ dıʞS",
"create.gui.schematicannon.option.skipMissingFluid.description": "˙ʎɹp pǝɔɐןd ǝɹɐ sʞɔoןq buıuıɐʇuoɔ-pınןɟ puɐ pǝddıʞs ǝɹɐ sʞɔoןq pınןɟ ǝǝɹɟ 'ǝןqɐןıɐʌɐun sı pınןɟ ɟI",
"create.gui.schematicannon.optionDisabled": "pǝןqɐsıᗡ ʎןʇuǝɹɹnƆ",
"create.gui.schematicannon.optionEnabled": "pǝןqɐuƎ ʎןʇuǝɹɹnƆ",
"create.gui.schematicannon.shotsRemaining": "%1$s :ʇɟǝן sʇoɥS",
Expand Down Expand Up @@ -2866,6 +2868,7 @@
"create.schematicannon.status.finished": "pǝɥsıuıℲ",
"create.schematicannon.status.idle": "ǝןpI",
"create.schematicannon.status.missingBlock": ":ɯǝʇI buıssıW",
"create.schematicannon.status.missingFluid": ":pınןℲ buıssıW",
"create.schematicannon.status.noGunpowder": "ɹǝpʍodun⅁ ɟo ʇnO",
"create.schematicannon.status.paused": "pǝsnɐԀ",
"create.schematicannon.status.placing": "buıɔɐןԀ",
Expand All @@ -2878,9 +2881,11 @@
"create.schematicannon.status.schematicNotPlaced": "pǝuoıʇısoԀ ʇou ɔıʇɐɯǝɥɔS",
"create.schematicannon.status.searching": "buıɥɔɹɐǝS",
"create.schematicannon.status.skipping": "buıddıʞS",
"create.schematicannon.status.skippingFluid": "pınןℲ buıddıʞS",
"create.schematicannon.status.stopped": "pǝddoʇS",
"create.schematicannon.status.targetNotLoaded": "pǝpɐoן ʇou sı ʇǝbɹɐ⟘",
"create.schematicannon.status.targetOutsideRange": "ʎɐʍɐ ɹɐɟ ooʇ ʇǝbɹɐ⟘",
"create.schematicannon.status.waitingForStructure": "ǝɹnʇɔnɹʇS ɹoɟ buıʇıɐM",
"create.schematics.maxAllowedSize": ":sı ǝzıs ǝןıɟ ɔıʇɐɯǝɥɔs pǝʍoןןɐ ɯnɯıxɐɯ ǝɥ⟘",
"create.schematics.synchronizing": "˙˙˙buıɔuʎS",
"create.schematics.uploadTooLarge": "˙ɹǝʌɹǝs ǝɥʇ ʎq pǝıɟıɔǝds suoıʇɐʇıɯıן spǝǝɔxǝ ɔıʇɐɯǝɥɔs ɹnoʎ",
Expand Down
5 changes: 5 additions & 0 deletions src/generated/resources/assets/create/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,8 @@
"create.gui.schematicannon.option.skipBlockEntities.description": "The cannon will avoid replacing data holding blocks such as Chests.",
"create.gui.schematicannon.option.skipMissing": "Skip missing Blocks",
"create.gui.schematicannon.option.skipMissing.description": "If the cannon cannot find a required Block for placement, it will continue at the next Location.",
"create.gui.schematicannon.option.skipMissingFluid": "Skip missing Fluids",
"create.gui.schematicannon.option.skipMissingFluid.description": "If fluid is unavailable, free fluid blocks are skipped and fluid-containing blocks are placed dry.",
"create.gui.schematicannon.optionDisabled": "Currently Disabled",
"create.gui.schematicannon.optionEnabled": "Currently Enabled",
"create.gui.schematicannon.shotsRemaining": "Shots left: %1$s",
Expand Down Expand Up @@ -2866,6 +2868,7 @@
"create.schematicannon.status.finished": "Finished",
"create.schematicannon.status.idle": "Idle",
"create.schematicannon.status.missingBlock": "Missing Item:",
"create.schematicannon.status.missingFluid": "Missing Fluid:",
"create.schematicannon.status.noGunpowder": "Out of Gunpowder",
"create.schematicannon.status.paused": "Paused",
"create.schematicannon.status.placing": "Placing",
Expand All @@ -2878,9 +2881,11 @@
"create.schematicannon.status.schematicNotPlaced": "Schematic not Positioned",
"create.schematicannon.status.searching": "Searching",
"create.schematicannon.status.skipping": "Skipping",
"create.schematicannon.status.skippingFluid": "Skipping Fluid",
"create.schematicannon.status.stopped": "Stopped",
"create.schematicannon.status.targetNotLoaded": "Target is not loaded",
"create.schematicannon.status.targetOutsideRange": "Target too far away",
"create.schematicannon.status.waitingForStructure": "Waiting for Structure",
"create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:",
"create.schematics.synchronizing": "Syncing...",
"create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import org.jetbrains.annotations.Nullable;

import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.simibubi.create.AllDataComponents;
Expand All @@ -17,51 +18,63 @@
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;

import net.neoforged.neoforge.fluids.FluidStack;

public class ClipboardEntry {
public static final Codec<ClipboardEntry> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.BOOL.fieldOf("checked").forGetter(c -> c.checked),
ComponentSerialization.CODEC.fieldOf("text").forGetter(c -> c.text),
ItemStack.OPTIONAL_CODEC.fieldOf("icon").forGetter(c -> c.icon),
Codec.either(ItemStack.OPTIONAL_CODEC, FluidStack.OPTIONAL_CODEC).fieldOf("icon").forGetter(c -> c.icon),
Codec.INT.fieldOf("item_amount").forGetter(c -> c.itemAmount)
).apply(i, (checked, text, icon, itemAmount) -> {
ClipboardEntry entry = new ClipboardEntry(checked, text.copy());
if (!icon.isEmpty())
entry.displayItem(icon, itemAmount);
entry.icon = icon;
entry.itemAmount = itemAmount;

return entry;
}));

public static final StreamCodec<RegistryFriendlyByteBuf, ClipboardEntry> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.BOOL, c -> c.checked,
ComponentSerialization.STREAM_CODEC, c -> c.text,
ItemStack.OPTIONAL_STREAM_CODEC, c -> c.icon,
ByteBufCodecs.either(ItemStack.OPTIONAL_STREAM_CODEC, FluidStack.OPTIONAL_STREAM_CODEC), c -> c.icon,
ByteBufCodecs.INT, c -> c.itemAmount,
(checked, text, icon, itemAmount) -> {
ClipboardEntry entry = new ClipboardEntry(checked, text.copy());
if (!icon.isEmpty())
entry.displayItem(icon, itemAmount);
entry.icon = icon;
entry.itemAmount = itemAmount;

return entry;
}
);

public boolean checked;
public MutableComponent text;
public ItemStack icon;
public Either<ItemStack, FluidStack> icon;
public int itemAmount;

public ClipboardEntry(boolean checked, MutableComponent text) {
this.checked = checked;
this.text = text;
this.icon = ItemStack.EMPTY;
this.icon = Either.left(ItemStack.EMPTY);
}

public ClipboardEntry displayItem(ItemStack icon, int amount) {
this.icon = icon;
this.icon = Either.left(icon);
this.itemAmount = amount;
return this;
}

public ClipboardEntry displayItem(FluidStack icon, int amount) {
this.icon = Either.right(icon);
this.itemAmount = amount;
return this;
}

public boolean isIconEmpty() {
return icon.map(ItemStack::isEmpty, FluidStack::isEmpty);
}

public static List<List<ClipboardEntry>> readAll(ItemStack clipboardItem) {
return readAll(clipboardItem.getComponents());
}
Expand Down Expand Up @@ -99,14 +112,19 @@ public final boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ClipboardEntry that)) return false;

return checked == that.checked && text.equals(that.text) && ItemStack.isSameItemSameComponents(icon, that.icon);
if (checked != that.checked || itemAmount != that.itemAmount || !text.equals(that.text))
return false;
return icon.map(
stack -> that.icon.map(other -> ItemStack.isSameItemSameComponents(stack, other), fluid -> false),
fluid -> that.icon.map(stack -> false, other -> FluidStack.isSameFluidSameComponents(fluid, other)));
}

@Override
public int hashCode() {
int result = Boolean.hashCode(checked);
result = 31 * result + text.hashCode();
result = 31 * result + ItemStack.hashItemAndComponents(icon);
result = 31 * result + icon.map(ItemStack::hashItemAndComponents, FluidStack::hashFluidAndComponents);
result = 31 * result + itemAmount;
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import net.createmod.catnip.gui.AbstractSimiScreen;
import net.createmod.catnip.gui.element.GuiGameElement;
import net.createmod.catnip.platform.CatnipServices;
import net.minecraft.Util;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -187,7 +188,7 @@ public void tick() {
ClipboardEntry clipboardEntry = currentEntries.get(i);
String text = clipboardEntry.text.getString();
totalHeight +=
Math.max(12, font.split(Component.literal(text), clipboardEntry.icon.isEmpty() ? 150 : 130)
Math.max(12, font.split(Component.literal(text), clipboardEntry.isIconEmpty() ? 150 : 130)
.size() * 9 + 3);

if (totalHeight > my) {
Expand Down Expand Up @@ -287,7 +288,7 @@ protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float
for (int i = 0; i < currentEntries.size(); i++) {
ClipboardEntry clipboardEntry = currentEntries.get(i);
boolean checked = clipboardEntry.checked;
int iconOffset = clipboardEntry.icon.isEmpty() ? 0 : 16;
int iconOffset = clipboardEntry.isIconEmpty() ? 0 : 16;

MutableComponent text = clipboardEntry.text;
String string = text.getString();
Expand All @@ -312,8 +313,12 @@ protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float
continue;
}

if (!clipboardEntry.icon.isEmpty())
graphics.renderItem(clipboardEntry.icon, x + 54, y + 50);
int iconY = y;
clipboardEntry.icon.ifLeft(stack -> graphics.renderItem(stack, x + 54, iconY + 50))
.ifRight(fluid -> GuiGameElement.of(fluid.getFluid())
.<GuiGameElement.GuiRenderBuilder>at(x + 54, iconY + 66, 100)
.scale(16)
.render(graphics));

for (FormattedCharSequence sequence : split) {
if (i != editingIndex)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.phys.AABB;

import net.neoforged.neoforge.fluids.FluidStack;
import net.neoforged.neoforge.fluids.FluidUtil;

public class StockKeeperRequestScreen extends AbstractSimiContainerScreen<StockKeeperRequestMenu> {
public static class CategoryEntry {
boolean hidden;
Expand Down Expand Up @@ -176,7 +179,7 @@ public StockKeeperRequestScreen(StockKeeperRequestMenu container, Inventory inv,
boolean anyItems = false;
for (List<ClipboardEntry> list : clipboardItem)
for (ClipboardEntry entry : list)
if (!entry.icon.isEmpty()) {
if (!entry.isIconEmpty()) {
anyItems = true;
break;
}
Expand Down Expand Up @@ -1530,11 +1533,40 @@ public void requestSchematicList() {
InventorySummary availableItems = blockEntity.getLastClientsideStockSnapshotAsSummary();
for (List<ClipboardEntry> list : clipboardItem) {
for (ClipboardEntry entry : list) {
ItemStack stack = entry.icon;
int toOrder = Math.min(entry.itemAmount, availableItems.getCountOf(stack));
if (toOrder == 0)
Optional<ItemStack> itemIcon = entry.icon.left()
.filter(stack -> !stack.isEmpty());
if (itemIcon.isPresent()) {
ItemStack stack = itemIcon.get();
int toOrder = Math.min(entry.itemAmount, availableItems.getCountOf(stack));
if (toOrder > 0)
itemsToOrder.add(new BigItemStack(stack, toOrder));
continue;
itemsToOrder.add(new BigItemStack(stack, toOrder));
}
entry.icon.right()
.filter(fluid -> !fluid.isEmpty())
.ifPresent(fluid -> {
long remaining = entry.itemAmount;
for (BigItemStack available : availableItems.getStacksByCount()) {
if (remaining <= 0)
break;

ItemStack container = available.stack.copyWithCount(1);
FluidStack contained = FluidUtil.getFluidContained(container)
.orElse(FluidStack.EMPTY);
if (contained.isEmpty() || !contained.getFluid()
.isSame(fluid.getFluid()))
continue;

int amountPerContainer = contained.getAmount();
long containersNeeded = (remaining + amountPerContainer - 1L) / amountPerContainer;
int toOrder = (int) Math.min(containersNeeded, available.count);
if (toOrder <= 0)
continue;

itemsToOrder.add(new BigItemStack(container, toOrder));
remaining -= (long) amountPerContainer * toOrder;
}
});
}
}
}
Expand Down
Loading