From 04f7640cd2af4baff42b01942d512998ea59678a Mon Sep 17 00:00:00 2001 From: SirEdvin Date: Tue, 6 Jun 2023 22:28:43 +0300 Subject: [PATCH] persist turtle upgrade information inside turtle item --- .../computercraft/data/RecipeProvider.java | 6 ++-- .../computercraft/shared/ModRegistry.java | 4 +-- .../shared/integration/RecipeModHelpers.java | 2 +- .../integration/UpgradeRecipeGenerator.java | 7 +++-- .../shared/turtle/blocks/TurtleBlock.java | 7 ++++- .../shared/turtle/items/TurtleItem.java | 30 +++++++++++++++---- .../turtle/recipes/TurtleOverlayRecipe.java | 4 ++- .../shared/turtle/recipes/TurtleRecipe.java | 2 +- .../turtle/recipes/TurtleUpgradeRecipe.java | 7 +++-- 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java index 46854e04d..5ddb14470 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java @@ -105,12 +105,12 @@ class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { */ private void turtleUpgrades(Consumer add) { for (var turtleItem : turtleItems()) { - var base = turtleItem.create(-1, null, -1, null, null, 0, null); + var base = turtleItem.create(-1, null, -1, null, null, 0, null, null, null); var nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT); for (var upgrade : turtleUpgrades.getGeneratedUpgrades()) { - var result = turtleItem.create(-1, null, -1, null, upgrade, -1, null); + var result = turtleItem.create(-1, null, -1, null, upgrade, -1, null, null, null); ShapedRecipeBuilder .shaped(RecipeCategory.REDSTONE, result.getItem()) .group(String.format("%s:turtle_%s", ComputerCraftAPI.MOD_ID, nameId)) @@ -189,7 +189,7 @@ class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { private void turtleOverlay(Consumer add, String overlay, Consumer build) { for (var turtleItem : turtleItems()) { - var base = turtleItem.create(-1, null, -1, null, null, 0, null); + var base = turtleItem.create(-1, null, -1, null, null, 0, null, null, null); var nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT); var group = "%s:turtle_%s_overlay".formatted(ComputerCraftAPI.MOD_ID, nameId); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java index 13ea6d0a6..a893dd338 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java @@ -444,9 +444,9 @@ public final class ModRegistry { } private static void addTurtle(CreativeModeTab.Output out, TurtleItem turtle) { - out.accept(turtle.create(-1, null, -1, null, null, 0, null)); + out.accept(turtle.create(-1, null, -1, null, null, 0, null, null, null)); TurtleUpgrades.getVanillaUpgrades() - .map(x -> turtle.create(-1, null, -1, null, x, 0, null)) + .map(x -> turtle.create(-1, null, -1, null, x, 0, null, null, null)) .forEach(out::accept); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/RecipeModHelpers.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/RecipeModHelpers.java index 1e93c30a9..e8ead0af4 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/integration/RecipeModHelpers.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/RecipeModHelpers.java @@ -56,7 +56,7 @@ public final class RecipeModHelpers { for (var turtleSupplier : TURTLES) { var turtle = turtleSupplier.get(); for (var upgrade : TurtleUpgrades.instance().getUpgrades()) { - upgradeItems.add(turtle.create(-1, null, -1, null, upgrade, 0, null)); + upgradeItems.add(turtle.create(-1, null, -1, null, upgrade, 0, null, null, null)); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java index 0dbe35b5d..c2728034e 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java @@ -219,7 +219,8 @@ public class UpgradeRecipeGenerator { var item = (TurtleItem) stack.getItem(); return item.create( item.getComputerID(stack), item.getLabel(stack), item.getColour(stack), - left, right, item.getFuelLevel(stack), item.getOverlay(stack) + left, right, item.getFuelLevel(stack), item.getOverlay(stack), + null, null ); } @@ -271,8 +272,8 @@ public class UpgradeRecipeGenerator { var turtleItem = turtleSupplier.get(); recipes.add(turtle( ingredient, // Right upgrade, recipe on left - Ingredient.of(turtleItem.create(-1, null, -1, null, null, 0, null)), - turtleItem.create(-1, null, -1, null, turtle, 0, null) + Ingredient.of(turtleItem.create(-1, null, -1, null, null, 0, null, null, null)), + turtleItem.create(-1, null, -1, null, turtle, 0, null, null, null) )); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java index 7e058698e..476c044e7 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java @@ -129,6 +129,10 @@ public class TurtleBlock extends AbstractComputerBlock implem // Set Upgrades for (var side : TurtleSide.values()) { turtle.getAccess().setUpgrade(side, item.getUpgrade(stack, side)); + var updateData = item.getUpgradeData(stack, side); + if (updateData != null && !updateData.isEmpty()) { + turtle.getAccess().getUpgradeNBTData(side).merge(updateData); + } } turtle.getAccess().setFuelLevel(item.getFuelLevel(stack)); @@ -162,7 +166,8 @@ public class TurtleBlock extends AbstractComputerBlock implem return TurtleItem.create( turtle.getComputerID(), turtle.getLabel(), access.getColour(), turtle.getFamily(), access.getUpgrade(TurtleSide.LEFT), access.getUpgrade(TurtleSide.RIGHT), - access.getFuelLevel(), turtle.getOverlay() + access.getFuelLevel(), turtle.getOverlay(), + access.getUpgradeNBTData(TurtleSide.LEFT), access.getUpgradeNBTData(TurtleSide.RIGHT) ); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java index 91bc45717..377fa9531 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java @@ -15,6 +15,7 @@ import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.items.AbstractComputerItem; import dan200.computercraft.shared.turtle.blocks.TurtleBlock; import net.minecraft.core.cauldron.CauldronInteraction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; @@ -33,13 +34,14 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem { public static ItemStack create( int id, @Nullable String label, int colour, ComputerFamily family, @Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade, - int fuelLevel, @Nullable ResourceLocation overlay + int fuelLevel, @Nullable ResourceLocation overlay, + @Nullable CompoundTag leftUpgradeData, @Nullable CompoundTag rightUpdateData ) { return switch (family) { case NORMAL -> - ModRegistry.Items.TURTLE_NORMAL.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay); + ModRegistry.Items.TURTLE_NORMAL.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay, leftUpgradeData, rightUpdateData); case ADVANCED -> - ModRegistry.Items.TURTLE_ADVANCED.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay); + ModRegistry.Items.TURTLE_ADVANCED.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay, leftUpgradeData, rightUpdateData); default -> ItemStack.EMPTY; }; } @@ -47,7 +49,8 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem { public ItemStack create( int id, @Nullable String label, int colour, @Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade, - int fuelLevel, @Nullable ResourceLocation overlay + int fuelLevel, @Nullable ResourceLocation overlay, + @Nullable CompoundTag leftUpgradeData, @Nullable CompoundTag rightUpdateData ) { // Build the stack var stack = new ItemStack(this); @@ -61,10 +64,18 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem { stack.getOrCreateTag().putString(NBT_LEFT_UPGRADE, leftUpgrade.getUpgradeID().toString()); } + if (leftUpgradeData != null && !leftUpgradeData.isEmpty()) { + stack.getOrCreateTag().put(NBT_LEFT_UPGRADE_DATA, leftUpgradeData); + } + if (rightUpgrade != null) { stack.getOrCreateTag().putString(NBT_RIGHT_UPGRADE, rightUpgrade.getUpgradeID().toString()); } + if (rightUpdateData != null && !rightUpdateData.isEmpty()) { + stack.getOrCreateTag().put(NBT_RIGHT_UPGRADE_DATA, rightUpdateData); + } + return stack; } @@ -118,7 +129,8 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem { getComputerID(stack), getLabel(stack), getColour(stack), family, getUpgrade(stack, TurtleSide.LEFT), getUpgrade(stack, TurtleSide.RIGHT), - getFuelLevel(stack), getOverlay(stack) + getFuelLevel(stack), getOverlay(stack), + getUpgradeData(stack, TurtleSide.LEFT), getUpgradeData(stack, TurtleSide.RIGHT) ); } @@ -130,6 +142,14 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem { return tag.contains(key) ? TurtleUpgrades.instance().get(tag.getString(key)) : null; } + public @Nullable CompoundTag getUpgradeData(ItemStack stack, TurtleSide side) { + var tag = stack.getTag(); + if (tag == null) return null; + + var key = side == TurtleSide.LEFT ? NBT_LEFT_UPGRADE_DATA : NBT_RIGHT_UPGRADE_DATA; + return tag.contains(key) ? tag.getCompound(key) : null; + } + public @Nullable ResourceLocation getOverlay(ItemStack stack) { var tag = stack.getTag(); return tag != null && tag.contains(NBT_OVERLAY) ? new ResourceLocation(tag.getString(NBT_OVERLAY)) : null; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleOverlayRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleOverlayRecipe.java index 4076a3662..88e98c0b5 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleOverlayRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleOverlayRecipe.java @@ -41,7 +41,9 @@ public class TurtleOverlayRecipe extends ShapelessRecipe { turtle.getUpgrade(stack, TurtleSide.LEFT), turtle.getUpgrade(stack, TurtleSide.RIGHT), turtle.getFuelLevel(stack), - overlay + overlay, + turtle.getUpgradeData(stack, TurtleSide.LEFT), + turtle.getUpgradeData(stack, TurtleSide.RIGHT) ); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java index 2b786a5db..2e022665f 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java @@ -31,7 +31,7 @@ public final class TurtleRecipe extends ComputerFamilyRecipe { var computerID = item.getComputerID(stack); var label = item.getLabel(stack); - return TurtleItem.create(computerID, label, -1, getFamily(), null, null, 0, null); + return TurtleItem.create(computerID, label, -1, getFamily(), null, null, 0, null, null, null); } public static class Serializer extends ComputerFamilyRecipe.Serializer { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java index 4dcd9e5a2..0105cabcb 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java @@ -30,7 +30,7 @@ public final class TurtleUpgradeRecipe extends CustomRecipe { @Override public ItemStack getResultItem(RegistryAccess registryAccess) { - return ModRegistry.Items.TURTLE_NORMAL.get().create(-1, null, -1, null, null, 0, null); + return ModRegistry.Items.TURTLE_NORMAL.get().create(-1, null, -1, null, null, 0, null, null, null); } @Override @@ -125,7 +125,10 @@ public final class TurtleUpgradeRecipe extends CustomRecipe { var fuelLevel = itemTurtle.getFuelLevel(turtle); var colour = itemTurtle.getColour(turtle); var overlay = itemTurtle.getOverlay(turtle); - return itemTurtle.create(computerID, label, colour, upgrades[0], upgrades[1], fuelLevel, overlay); + return itemTurtle.create( + computerID, label, colour, upgrades[0], upgrades[1], fuelLevel, overlay, + itemTurtle.getUpgradeData(turtle, TurtleSide.LEFT), itemTurtle.getUpgradeData(turtle, TurtleSide.RIGHT) + ); } @Override