Skip to content

Commit 24574c9

Browse files
authored
Rework machine copy/paste card to support copying pipes, covers, cover settings, and more machine settings (#4272)
1 parent e399fd7 commit 24574c9

28 files changed

Lines changed: 815 additions & 256 deletions

docs/content/Modpacks/Changes/v7.5.0.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ title: "Version 7.5.0"
66
# Updating from `7.4.1` to `7.5.0`
77
## MachineBuilder Generics
88
We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder<?>`, you now need to store a `MachineBuilder<?, ?>`. The same holds for `MultiblockMachineBuilder<?,?>`.
9+
## Machine & Cover Copy/Paste System
10+
A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
title: Adding Copy & Paste support to covers and machines
3+
---
4+
5+
The Machine Memory Card item allows for machine settings and covers to be copied to other machines.
6+
7+
To add extra fields to copy, override the following methods on a machine or cover:
8+
```java
9+
/// Copies the current machine/cover config to a CompoundTag.
10+
public CompoundTag copyConfig(CompoundTag tag);
11+
/// Loads a machine/cover config from a CompoundTag.
12+
public void pasteConfig(ServerPlayer player, CompoundTag tag);
13+
/// Returns a list of items (covers, filters, etc) which are needed to copy and paste this machine.
14+
public List<ItemStack> getItemsRequiredToPaste();
15+
```

src/generated/resources/assets/gtceu/lang/en_ud.json

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,16 @@
6464
"behaviour.lighter.tooltip.description": "ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ",
6565
"behaviour.lighter.tooltip.usage": "ǝsoןɔ/uǝdo oʇ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥS",
6666
"behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ",
67-
"behaviour.meta.machine.config.copy.tooltip": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ʎdoɔ oʇ ʞɔıןƆ-ᴚ + ʞɐǝuSㄥ§",
68-
"behaviour.meta.machine.config.paste.tooltip": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ǝʇsɐd oʇ ʞɔıןƆ-ᴚㄥ§",
67+
"behaviour.memory_card.client_msg.cleared": "pǝɹɐǝןɔ uoıʇɐɹnbıɟuoɔ pǝɹoʇS",
68+
"behaviour.memory_card.client_msg.copied": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıdoƆ",
69+
"behaviour.memory_card.client_msg.pasted": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıןddⱯ",
70+
"behaviour.memory_card.copy_target": "%s :buıʎdoƆ",
71+
"behaviour.memory_card.disabled": "ɹ§pǝןqɐsıᗡɔ§",
72+
"behaviour.memory_card.enabled": "ɹ§pǝןqɐuƎɐ§",
73+
"behaviour.memory_card.tooltip.copy": "˙pǝʇǝbɹɐʇ sı ǝdıd ɹo ǝuıɥɔɐɯ ɐ uɐɥʇ ɹǝɥʇo ʞɔoןq ɐ ɟı ɐʇɐp pǝɹoʇs ɹɐǝןɔ ɹo 'uoıʇɐɹnbıɟuoɔ ʎdoɔ oʇ ʞɔıןƆ-ᴚ + ʞɐǝuSㄥ§",
74+
"behaviour.memory_card.tooltip.items_to_paste": ":uoıʇɐɹnbıɟuoɔ sıɥʇ ǝʇsɐd oʇ pǝpǝǝu ǝɹɐ sɯǝʇı buıʍoןןoɟ ǝɥ⟘",
75+
"behaviour.memory_card.tooltip.paste": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ǝʇsɐd oʇ ʞɔıןƆ-ᴚㄥ§",
76+
"behaviour.memory_card.tooltip.view_stored": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§",
6977
"behaviour.paintspray.black.tooltip": "ʞɔɐןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ",
7078
"behaviour.paintspray.blue.tooltip": "ǝnןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ",
7179
"behaviour.paintspray.brown.tooltip": "uʍoɹᗺ uı sbuıɥʇ ʇuıɐd uɐƆ",
@@ -85,10 +93,15 @@
8593
"behaviour.paintspray.white.tooltip": "ǝʇıɥM uı sbuıɥʇ ʇuıɐd uɐƆ",
8694
"behaviour.paintspray.yellow.tooltip": "ʍoןןǝʎ uı sbuıɥʇ ʇuıɐd uɐƆ",
8795
"behaviour.prospecting": "buıʇɔǝdsoɹԀ ɹoɟ ǝןqɐs∩",
88-
"behaviour.setting.allow.input.from.output.tooltip": "%s sı ǝpıs ʇndʇno ɯoɹɟ ʇnduı %s",
89-
"behaviour.setting.item_auto_output.tooltip": "%s sı ʇndʇno-oʇnɐ %s",
90-
"behaviour.setting.muffled.tooltip": "%s buıןɟɟnW",
91-
"behaviour.setting.output.direction.tooltip": "%s :uoıʇɔǝɹıp ʇndʇno %s",
96+
"behaviour.setting.tooltip.allow_input": "ɹ§ʇnduI ʍoןןⱯᄅ§",
97+
"behaviour.setting.tooltip.auto_output": "ɹ§ʇndʇnO oʇnⱯᄅ§",
98+
"behaviour.setting.tooltip.auto_output_allow_input": "ɹ§ʇnduI ʍoןןⱯ/ʇndʇnO oʇnⱯᄅ§",
99+
"behaviour.setting.tooltip.circuit_config": " :ʇınɔɹıƆ pǝɯɯɐɹboɹԀ",
100+
"behaviour.setting.tooltip.fluid_io": ")%s( %s :ʇndʇnO pınןℲ",
101+
"behaviour.setting.tooltip.item_io": ")%s( %s :ʇndʇnO ɯǝʇI",
102+
"behaviour.setting.tooltip.muffled": "%s buıןɟɟnW",
103+
"behaviour.setting.tooltip.pipe_blocked_connections": "%s :sǝpıs pǝɹǝʇʇnɥs ǝdıԀ",
104+
"behaviour.setting.tooltip.pipe_connections": "%s :suoıʇɔǝuuoɔ ǝdıԀ",
92105
"behaviour.soft_hammer": "sǝuıɥɔɐW sǝʇɐʌıʇɔɐǝᗡ puɐ sǝʇɐʌıʇɔⱯ",
93106
"behaviour.soft_hammer.disabled": "pǝןqɐsıᗡ buıʞɹoM",
94107
"behaviour.soft_hammer.disabled_cycle": "ǝןɔʎɔ ʇuǝɹɹnɔ ɹǝʇɟɐ pǝןqɐsıᗡ buıʞɹoM",
@@ -4978,7 +4991,6 @@
49784991
"item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS",
49794992
"item.invalid.name": "ɯǝʇı pıןɐʌuI",
49804993
"item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN",
4981-
"item.toggle.advanced.info.tooltip": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§",
49824994
"itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁",
49834995
"itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁",
49844996
"itemGroup.gtceu.machine": "sǝuıɥɔɐW nƎƆɥɔǝ⟘bǝɹ⅁",

src/generated/resources/assets/gtceu/lang/en_us.json

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,16 @@
6464
"behaviour.lighter.tooltip.description": "Can light things on fire",
6565
"behaviour.lighter.tooltip.usage": "Shift-right click to open/close",
6666
"behaviour.lighter.uses": "Remaining uses: %d",
67-
"behaviour.meta.machine.config.copy.tooltip": "§7Sneak + R-Click to copy machine configuration",
68-
"behaviour.meta.machine.config.paste.tooltip": "§7R-Click to paste machine configuration",
67+
"behaviour.memory_card.client_msg.cleared": "Stored configuration cleared",
68+
"behaviour.memory_card.client_msg.copied": "Copied machine configuration",
69+
"behaviour.memory_card.client_msg.pasted": "Applied machine configuration",
70+
"behaviour.memory_card.copy_target": "Copying: %s",
71+
"behaviour.memory_card.disabled": "§cDisabled§r",
72+
"behaviour.memory_card.enabled": "§aEnabled§r",
73+
"behaviour.memory_card.tooltip.copy": "§7Sneak + R-Click to copy configuration, or clear stored data if a block other than a machine or pipe is targeted.",
74+
"behaviour.memory_card.tooltip.items_to_paste": "The following items are needed to paste this configuration:",
75+
"behaviour.memory_card.tooltip.paste": "§7R-Click to paste machine configuration",
76+
"behaviour.memory_card.tooltip.view_stored": "§8<Sneak to view stored configuration>",
6977
"behaviour.paintspray.black.tooltip": "Can paint things in Black",
7078
"behaviour.paintspray.blue.tooltip": "Can paint things in Blue",
7179
"behaviour.paintspray.brown.tooltip": "Can paint things in Brown",
@@ -85,10 +93,15 @@
8593
"behaviour.paintspray.white.tooltip": "Can paint things in White",
8694
"behaviour.paintspray.yellow.tooltip": "Can paint things in Yellow",
8795
"behaviour.prospecting": "Usable for Prospecting",
88-
"behaviour.setting.allow.input.from.output.tooltip": "%s input from output side is %s",
89-
"behaviour.setting.item_auto_output.tooltip": "%s auto-output is %s",
90-
"behaviour.setting.muffled.tooltip": "Muffling %s",
91-
"behaviour.setting.output.direction.tooltip": "%s output direction: %s",
96+
"behaviour.setting.tooltip.allow_input": "§2Allow Input§r",
97+
"behaviour.setting.tooltip.auto_output": "§2Auto Output§r",
98+
"behaviour.setting.tooltip.auto_output_allow_input": "§2Auto Output/Allow Input§r",
99+
"behaviour.setting.tooltip.circuit_config": "Programmed Circuit: ",
100+
"behaviour.setting.tooltip.fluid_io": "Fluid Output: %s (%s)",
101+
"behaviour.setting.tooltip.item_io": "Item Output: %s (%s)",
102+
"behaviour.setting.tooltip.muffled": "Muffling %s",
103+
"behaviour.setting.tooltip.pipe_blocked_connections": "Pipe shuttered sides: %s",
104+
"behaviour.setting.tooltip.pipe_connections": "Pipe connections: %s",
92105
"behaviour.soft_hammer": "Activates and Deactivates Machines",
93106
"behaviour.soft_hammer.disabled": "Working Disabled",
94107
"behaviour.soft_hammer.disabled_cycle": "Working Disabled after current cycle",
@@ -4978,7 +4991,6 @@
49784991
"item.gtceu.zpm_voltage_coil.tooltip": "Super Coil",
49794992
"item.invalid.name": "Invalid item",
49804993
"item.netherrack_nether_quartz": "Nether Quartz Ore",
4981-
"item.toggle.advanced.info.tooltip": "§8<Sneak to view stored configuration>",
49824994
"itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks",
49834995
"itemGroup.gtceu.item": "GregTechCEu Items",
49844996
"itemGroup.gtceu.machine": "GregTechCEu Machines",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.gregtechceu.gtceu.api.blockentity;
2+
3+
import net.minecraft.nbt.CompoundTag;
4+
import net.minecraft.server.level.ServerPlayer;
5+
import net.minecraft.world.item.ItemStack;
6+
7+
import java.util.List;
8+
9+
/// An interface for machines and machine traits which have settings that can be copied using the machine memory card.
10+
public interface ICopyable {
11+
12+
/// Saves the current config into a CompoundTag.
13+
default CompoundTag copyConfig(CompoundTag tag) {
14+
return tag;
15+
}
16+
17+
/// Loads a saved config from a CompoundTag and applies it to an existing object.
18+
default void pasteConfig(ServerPlayer player, CompoundTag tag) {}
19+
20+
/// Returns a `List<ItemStack>` of items required to paste the saved config.
21+
default List<ItemStack> getItemsRequiredToPaste() {
22+
return List.of();
23+
}
24+
}

src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import net.minecraft.core.particles.ParticleTypes;
3535
import net.minecraft.nbt.CompoundTag;
3636
import net.minecraft.server.level.ServerLevel;
37+
import net.minecraft.server.level.ServerPlayer;
3738
import net.minecraft.world.InteractionResult;
3839
import net.minecraft.world.entity.player.Player;
3940
import net.minecraft.world.item.ItemStack;
@@ -61,7 +62,8 @@
6162
@MethodsReturnNonnullByDefault
6263
public abstract class PipeBlockEntity<PipeType extends Enum<PipeType> & IPipeType<NodeDataType>, NodeDataType>
6364
extends BlockEntity implements IPipeNode<PipeType, NodeDataType>, IEnhancedManaged,
64-
IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable {
65+
IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable,
66+
ICopyable {
6567

6668
public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PipeBlockEntity.class);
6769
@Getter
@@ -453,4 +455,19 @@ public void load(CompoundTag tag) {
453455
TagFixer.fixFluidTags(tag);
454456
super.load(tag);
455457
}
458+
459+
@Override
460+
public CompoundTag copyConfig(CompoundTag tag) {
461+
return ICopyable.super.copyConfig(tag);
462+
}
463+
464+
@Override
465+
public void pasteConfig(ServerPlayer player, CompoundTag tag) {
466+
ICopyable.super.pasteConfig(player, tag);
467+
}
468+
469+
@Override
470+
public List<ItemStack> getItemsRequiredToPaste() {
471+
return coverContainer.getItemsRequiredToPaste();
472+
}
456473
}

src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package com.gregtechceu.gtceu.api.capability;
22

33
import com.gregtechceu.gtceu.GTCEu;
4+
import com.gregtechceu.gtceu.api.blockentity.ICopyable;
45
import com.gregtechceu.gtceu.api.blockentity.ITickSubscription;
56
import com.gregtechceu.gtceu.api.cover.CoverBehavior;
67
import com.gregtechceu.gtceu.api.cover.CoverDefinition;
8+
import com.gregtechceu.gtceu.api.registry.GTRegistries;
79
import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable;
810
import com.gregtechceu.gtceu.utils.GTUtil;
911

1012
import net.minecraft.core.BlockPos;
1113
import net.minecraft.core.Direction;
14+
import net.minecraft.nbt.CompoundTag;
15+
import net.minecraft.resources.ResourceLocation;
1216
import net.minecraft.server.level.ServerPlayer;
1317
import net.minecraft.world.entity.player.Player;
18+
import net.minecraft.world.item.Item;
1419
import net.minecraft.world.item.ItemStack;
1520
import net.minecraft.world.level.BlockAndTintGetter;
1621
import net.minecraft.world.level.Level;
@@ -25,13 +30,10 @@
2530

2631
import org.jetbrains.annotations.Nullable;
2732

28-
import java.util.ArrayList;
29-
import java.util.Arrays;
30-
import java.util.List;
31-
import java.util.Objects;
33+
import java.util.*;
3234
import java.util.stream.Collectors;
3335

34-
public interface ICoverable extends ITickSubscription {
36+
public interface ICoverable extends ITickSubscription, ICopyable {
3537

3638
Level getLevel();
3739

@@ -219,15 +221,6 @@ default boolean hasDynamicCovers() {
219221
return false;
220222
}
221223

222-
class PrimaryBoxData {
223-
224-
public final boolean usePlacementGrid;
225-
226-
public PrimaryBoxData(boolean usePlacementGrid) {
227-
this.usePlacementGrid = usePlacementGrid;
228-
}
229-
}
230-
231224
@Nullable
232225
static Direction traceCoverSide(@Nullable BlockHitResult result) {
233226
return determineGridSideHit(result);
@@ -273,4 +266,74 @@ default BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level
273266
}
274267
return null;
275268
}
269+
270+
private CompoundTag createCoverConfigTag(@Nullable CoverBehavior cover) {
271+
if (cover == null) return new CompoundTag();
272+
var tag = new CompoundTag();
273+
tag.putString("id", GTRegistries.COVERS.getKey(cover.coverDefinition).toString());
274+
tag.put("item", cover.getAttachItem().serializeNBT());
275+
tag.put("data", cover.copyConfig(new CompoundTag()));
276+
return tag;
277+
}
278+
279+
private void applyCoverConfigTag(ServerPlayer player, Direction dir, CompoundTag tag) {
280+
if (tag.isEmpty()) return;
281+
var def = GTRegistries.COVERS.get(new ResourceLocation(tag.getString("id")));
282+
ItemStack stack = ItemStack.of(tag.getCompound("item"));
283+
if (def == null) return;
284+
285+
placeCoverOnSide(dir, stack, def, player);
286+
287+
CoverBehavior placedCover = getCoverAtSide(dir);
288+
if (placedCover != null && tag.contains("data") && !tag.getCompound("data").isEmpty())
289+
placedCover.pasteConfig(player, tag.getCompound("data"));
290+
}
291+
292+
@Override
293+
default CompoundTag copyConfig(CompoundTag tag) {
294+
for (Direction dir : GTUtil.DIRECTIONS) {
295+
tag.put(dir.getName(), hasCover(dir) ? createCoverConfigTag(getCoverAtSide(dir)) : new CompoundTag());
296+
}
297+
298+
return tag;
299+
}
300+
301+
@Override
302+
default void pasteConfig(ServerPlayer player, CompoundTag tag) {
303+
for (Direction side : GTUtil.DIRECTIONS) {
304+
removeCover(side, player);
305+
}
306+
307+
for (Direction dir : GTUtil.DIRECTIONS) {
308+
applyCoverConfigTag(player, dir, tag.getCompound(dir.getName()));
309+
}
310+
}
311+
312+
@Override
313+
default List<ItemStack> getItemsRequiredToPaste() {
314+
Map<Item, Integer> allDrops = new HashMap<>();
315+
List<ItemStack> rawDrops = new ArrayList<>();
316+
317+
for (Direction side : GTUtil.DIRECTIONS) {
318+
var cover = getCoverAtSide(side);
319+
if (cover != null) rawDrops.add(cover.getAttachItem());
320+
}
321+
322+
for (Direction side : GTUtil.DIRECTIONS) {
323+
var cover = getCoverAtSide(side);
324+
if (cover != null) rawDrops.addAll(cover.getAdditionalDrops());
325+
}
326+
327+
for (var drop : rawDrops) {
328+
if (allDrops.containsKey(drop.getItem())) {
329+
allDrops.put(drop.getItem(), allDrops.get(drop.getItem()) + drop.getCount());
330+
} else {
331+
allDrops.put(drop.getItem(), drop.getCount());
332+
}
333+
}
334+
335+
List<ItemStack> mergedStacks = new ArrayList<>();
336+
allDrops.forEach((k, v) -> mergedStacks.add(new ItemStack(k, v)));
337+
return mergedStacks;
338+
}
276339
}

src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.gregtechceu.gtceu.api.cover;
22

3+
import com.gregtechceu.gtceu.api.blockentity.ICopyable;
34
import com.gregtechceu.gtceu.api.capability.ICoverable;
45
import com.gregtechceu.gtceu.api.gui.GuiTextures;
56
import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory;
@@ -48,7 +49,7 @@
4849
*/
4950
@ParametersAreNonnullByDefault
5051
@MethodsReturnNonnullByDefault
51-
public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight {
52+
public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight, ICopyable {
5253

5354
public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CoverBehavior.class);
5455

src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ public int getSlotLimit(int slot) {
131131
return this.filterSlot;
132132
}
133133

134+
public void setFilterItem(ItemStack item) {
135+
getFilterSlot().setStackInSlot(0, item);
136+
updateFilter();
137+
}
138+
134139
private void updateFilter() {
135140
var filterContainer = getFilterSlot();
136141

src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.gregtechceu.gtceu.GTCEu;
44
import com.gregtechceu.gtceu.api.block.MetaMachineBlock;
55
import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties;
6+
import com.gregtechceu.gtceu.api.blockentity.ICopyable;
67
import com.gregtechceu.gtceu.api.blockentity.IPaintable;
78
import com.gregtechceu.gtceu.api.blockentity.ITickSubscription;
89
import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper;
@@ -50,6 +51,7 @@
5051
import net.minecraft.locale.Language;
5152
import net.minecraft.nbt.CompoundTag;
5253
import net.minecraft.network.chat.Component;
54+
import net.minecraft.server.level.ServerPlayer;
5355
import net.minecraft.util.RandomSource;
5456
import net.minecraft.world.InteractionHand;
5557
import net.minecraft.world.InteractionResult;
@@ -95,7 +97,7 @@
9597
@ParametersAreNonnullByDefault
9698
@MethodsReturnNonnullByDefault
9799
public class MetaMachine implements IEnhancedManaged, IToolable, ITickSubscription, IToolGridHighlight,
98-
IFancyTooltip, IPaintable, IRedstoneSignalMachine {
100+
IFancyTooltip, IPaintable, IRedstoneSignalMachine, ICopyable {
99101

100102
protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MetaMachine.class);
101103
@Getter
@@ -860,4 +862,19 @@ public void onAddFancyInformationTooltip(List<Component> tooltips) {
860862
public int getDefaultPaintingColor() {
861863
return getDefinition().getDefaultPaintingColor();
862864
}
865+
866+
@Override
867+
public CompoundTag copyConfig(CompoundTag tag) {
868+
return ICopyable.super.copyConfig(tag);
869+
}
870+
871+
@Override
872+
public void pasteConfig(ServerPlayer player, CompoundTag tag) {
873+
ICopyable.super.pasteConfig(player, tag);
874+
}
875+
876+
@Override
877+
public List<ItemStack> getItemsRequiredToPaste() {
878+
return coverContainer.getItemsRequiredToPaste();
879+
}
863880
}

0 commit comments

Comments
 (0)