From c4d5add5f1b725623e4cd4831cec3a319a713938 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Wed, 19 Oct 2022 18:05:04 -0300 Subject: [PATCH] allow part interfaces to be copied --- src/main/java/appeng/parts/AEBasePart.java | 6 +- .../java/appeng/parts/PartBasicState.java | 1 + .../java/appeng/parts/misc/PartInterface.java | 62 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/main/java/appeng/parts/AEBasePart.java b/src/main/java/appeng/parts/AEBasePart.java index b990f4cd5..79008af57 100644 --- a/src/main/java/appeng/parts/AEBasePart.java +++ b/src/main/java/appeng/parts/AEBasePart.java @@ -309,7 +309,7 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, * @param from source of settings * @param compound compound of source */ - private void uploadSettings(final SettingsFrom from, final NBTTagCompound compound) { + public void uploadSettings(final SettingsFrom from, final NBTTagCompound compound, EntityPlayer player) { if (compound != null) { final IConfigManager cm = this.getConfigManager(); if (cm != null) { @@ -359,7 +359,7 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, * @param from source of settings * @return compound of source */ - private NBTTagCompound downloadSettings(final SettingsFrom from) { + protected NBTTagCompound downloadSettings(final SettingsFrom from) { final NBTTagCompound output = new NBTTagCompound(); final IConfigManager cm = this.getConfigManager(); @@ -428,7 +428,7 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, final String storedName = memoryCard.getSettingsName(memCardIS); final NBTTagCompound data = memoryCard.getData(memCardIS); if (name.equals(storedName)) { - this.uploadSettings(SettingsFrom.MEMORY_CARD, data); + this.uploadSettings(SettingsFrom.MEMORY_CARD, data, player); memoryCard.notifyUser(player, MemoryCardMessages.SETTINGS_LOADED); } else { memoryCard.notifyUser(player, MemoryCardMessages.INVALID_MACHINE); diff --git a/src/main/java/appeng/parts/PartBasicState.java b/src/main/java/appeng/parts/PartBasicState.java index ffec8764a..37b73e83a 100644 --- a/src/main/java/appeng/parts/PartBasicState.java +++ b/src/main/java/appeng/parts/PartBasicState.java @@ -113,4 +113,5 @@ public abstract class PartBasicState extends AEBasePart implements IPowerChannel private void setClientFlags(final int clientFlags) { this.clientFlags = clientFlags; } + } diff --git a/src/main/java/appeng/parts/misc/PartInterface.java b/src/main/java/appeng/parts/misc/PartInterface.java index 1e9e6f61f..87c79919a 100644 --- a/src/main/java/appeng/parts/misc/PartInterface.java +++ b/src/main/java/appeng/parts/misc/PartInterface.java @@ -22,6 +22,7 @@ package appeng.parts.misc; import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Upgrades; +import appeng.api.definitions.IMaterials; import appeng.api.networking.IGridNode; import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -42,15 +43,19 @@ import appeng.api.storage.data.IAEStack; import appeng.api.util.AECableType; import appeng.api.util.IConfigManager; import appeng.core.AppEng; +import appeng.core.localization.PlayerMessages; import appeng.core.sync.GuiBridge; import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; import appeng.helpers.Reflected; +import appeng.items.misc.ItemEncodedPattern; import appeng.items.parts.PartModels; import appeng.parts.PartBasicState; import appeng.parts.PartModel; +import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.Platform; +import appeng.util.SettingsFrom; import appeng.util.inv.IAEAppEngInventory; import appeng.util.inv.IInventoryDestination; import appeng.util.inv.InvOperation; @@ -66,6 +71,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import java.util.EnumSet; import java.util.List; @@ -275,4 +281,60 @@ public class PartInterface extends PartBasicState implements IGridTickable, ISto public GuiBridge getGuiBridge() { return GuiBridge.GUI_INTERFACE; } + + @Override + public NBTTagCompound downloadSettings(SettingsFrom from) { + NBTTagCompound output = super.downloadSettings(from); + if (from == SettingsFrom.MEMORY_CARD) { + final IItemHandler inv = this.getInventoryByName("patterns"); + if (inv instanceof AppEngInternalInventory) { + ((AppEngInternalInventory) inv).writeToNBT(output, "patterns"); + } + } + return output; + } + + @Override + public void uploadSettings(SettingsFrom from, NBTTagCompound compound, EntityPlayer player) { + super.uploadSettings(from, compound, player); + final IItemHandler inv = this.getInventoryByName("patterns"); + if (inv instanceof AppEngInternalInventory) { + final AppEngInternalInventory target = (AppEngInternalInventory) inv; + AppEngInternalInventory tmp = new AppEngInternalInventory(null, target.getSlots()); + tmp.readFromNBT(compound, "patterns"); + PlayerMainInvWrapper playerInv = new PlayerMainInvWrapper(player.inventory); + final IMaterials materials = AEApi.instance().definitions().materials(); + int missingPatternsToEncode = 0; + + for (int i = 0; i < inv.getSlots(); i++) { + if (target.getStackInSlot(i).getItem() instanceof ItemEncodedPattern) { + ItemStack blank = materials.blankPattern().maybeStack(target.getStackInSlot(i).getCount()).get(); + if (!player.addItemStackToInventory(blank)) { + player.dropItem(blank, true); + } + target.setStackInSlot(i, ItemStack.EMPTY); + } + } + + for (int x = 0; x < tmp.getSlots(); x++) { + if (!tmp.getStackInSlot(x).isEmpty()) { + boolean found = false; + for (int i = 0; i < playerInv.getSlots(); i++) { + if (materials.blankPattern().isSameAs(playerInv.getStackInSlot(i))) { + target.setStackInSlot(x, tmp.getStackInSlot(x)); + playerInv.getStackInSlot(i).shrink(1); + found = true; + break; + } + } + if (!found) { + missingPatternsToEncode++; + } + } + } + if (Platform.isServer() && missingPatternsToEncode > 0) { + player.sendMessage(PlayerMessages.MissingPatternsToEncode.get()); + } + } + } }