diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeBase.java b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeBase.java index ee83da691..5e16c281d 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeBase.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeBase.java @@ -8,9 +8,11 @@ import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.impl.PlatformHelper; import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import javax.annotation.Nonnull; import java.util.Objects; /** @@ -50,6 +52,14 @@ public interface UpgradeBase { */ ItemStack getCraftingItem(); + default @Nonnull ItemStack produceCraftingItem(@Nonnull CompoundTag upgradeData) { + return getCraftingItem(); + } + + default @Nonnull CompoundTag produceUpgradeData(@Nonnull ItemStack stack) { + return new CompoundTag(); + } + /** * Determine if an item is suitable for being used for this upgrade. *
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
index e1b1cb0ad..091d97407 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
@@ -61,17 +61,21 @@ public class PocketAPI implements ILuaAPI {
// Attempt to find the upgrade, starting in the main segment, and then looking in the opposite
// one. We start from the position the item is currently in and loop round to the start.
- var newUpgrade = findUpgrade(inventory.items, inventory.selected, previousUpgrade);
- if (newUpgrade == null) {
- newUpgrade = findUpgrade(inventory.offhand, 0, previousUpgrade);
+ var newUpgradeItem = findUpgrade(inventory.items, inventory.selected, previousUpgrade);
+ if (newUpgradeItem == null) {
+ newUpgradeItem = findUpgrade(inventory.offhand, 0, previousUpgrade);
}
+ if (newUpgradeItem == null) return new Object[]{ false, "Cannot find a valid upgrade" };
+ // Unpack new upgrade here and ensure some mystical error is not happened
+ var newUpgrade = PocketUpgrades.instance().get(newUpgradeItem);
if (newUpgrade == null) return new Object[]{ false, "Cannot find a valid upgrade" };
// Remove the current upgrade
- if (previousUpgrade != null) storeItem(player, previousUpgrade.getCraftingItem().copy());
+ if (previousUpgrade != null) storeItem(player, previousUpgrade.produceCraftingItem(computer.getUpgradeNBTData()).copy());
// Set the new upgrade
computer.setUpgrade(newUpgrade);
+ computer.getUpgradeNBTData().merge(newUpgrade.produceUpgradeData(newUpgradeItem));
return new Object[]{ true };
}
@@ -105,7 +109,7 @@ public class PocketAPI implements ILuaAPI {
}
}
- private static @Nullable IPocketUpgrade findUpgrade(NonNullList