allow part interfaces to be copied

This commit is contained in:
PrototypeTrousers
2022-10-19 18:05:04 -03:00
parent 348e6436b8
commit c4d5add5f1
3 changed files with 66 additions and 3 deletions
@@ -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());
}
}
}
}