1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-07-05 19:42:54 +00:00

persist turtle upgrade information inside turtle item

This commit is contained in:
SirEdvin 2023-06-06 22:28:43 +03:00
parent 84bbc321c4
commit 04f7640cd2
9 changed files with 50 additions and 19 deletions

View File

@ -105,12 +105,12 @@ class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider {
*/ */
private void turtleUpgrades(Consumer<FinishedRecipe> add) { private void turtleUpgrades(Consumer<FinishedRecipe> add) {
for (var turtleItem : turtleItems()) { 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 nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT);
for (var upgrade : turtleUpgrades.getGeneratedUpgrades()) { 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 ShapedRecipeBuilder
.shaped(RecipeCategory.REDSTONE, result.getItem()) .shaped(RecipeCategory.REDSTONE, result.getItem())
.group(String.format("%s:turtle_%s", ComputerCraftAPI.MOD_ID, nameId)) .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<FinishedRecipe> add, String overlay, Consumer<ShapelessRecipeBuilder> build) { private void turtleOverlay(Consumer<FinishedRecipe> add, String overlay, Consumer<ShapelessRecipeBuilder> build) {
for (var turtleItem : turtleItems()) { 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 nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT);
var group = "%s:turtle_%s_overlay".formatted(ComputerCraftAPI.MOD_ID, nameId); var group = "%s:turtle_%s_overlay".formatted(ComputerCraftAPI.MOD_ID, nameId);

View File

@ -444,9 +444,9 @@ public final class ModRegistry {
} }
private static void addTurtle(CreativeModeTab.Output out, TurtleItem turtle) { 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() 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); .forEach(out::accept);
} }

View File

@ -56,7 +56,7 @@ public final class RecipeModHelpers {
for (var turtleSupplier : TURTLES) { for (var turtleSupplier : TURTLES) {
var turtle = turtleSupplier.get(); var turtle = turtleSupplier.get();
for (var upgrade : TurtleUpgrades.instance().getUpgrades()) { 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));
} }
} }

View File

@ -219,7 +219,8 @@ public class UpgradeRecipeGenerator<T> {
var item = (TurtleItem) stack.getItem(); var item = (TurtleItem) stack.getItem();
return item.create( return item.create(
item.getComputerID(stack), item.getLabel(stack), item.getColour(stack), 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<T> {
var turtleItem = turtleSupplier.get(); var turtleItem = turtleSupplier.get();
recipes.add(turtle( recipes.add(turtle(
ingredient, // Right upgrade, recipe on left ingredient, // Right upgrade, recipe on left
Ingredient.of(turtleItem.create(-1, null, -1, null, null, 0, null)), Ingredient.of(turtleItem.create(-1, null, -1, null, null, 0, null, null, null)),
turtleItem.create(-1, null, -1, null, turtle, 0, null) turtleItem.create(-1, null, -1, null, turtle, 0, null, null, null)
)); ));
} }
} }

View File

@ -129,6 +129,10 @@ public class TurtleBlock extends AbstractComputerBlock<TurtleBlockEntity> implem
// Set Upgrades // Set Upgrades
for (var side : TurtleSide.values()) { for (var side : TurtleSide.values()) {
turtle.getAccess().setUpgrade(side, item.getUpgrade(stack, side)); 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)); turtle.getAccess().setFuelLevel(item.getFuelLevel(stack));
@ -162,7 +166,8 @@ public class TurtleBlock extends AbstractComputerBlock<TurtleBlockEntity> implem
return TurtleItem.create( return TurtleItem.create(
turtle.getComputerID(), turtle.getLabel(), access.getColour(), turtle.getFamily(), turtle.getComputerID(), turtle.getLabel(), access.getColour(), turtle.getFamily(),
access.getUpgrade(TurtleSide.LEFT), access.getUpgrade(TurtleSide.RIGHT), access.getUpgrade(TurtleSide.LEFT), access.getUpgrade(TurtleSide.RIGHT),
access.getFuelLevel(), turtle.getOverlay() access.getFuelLevel(), turtle.getOverlay(),
access.getUpgradeNBTData(TurtleSide.LEFT), access.getUpgradeNBTData(TurtleSide.RIGHT)
); );
} }

View File

@ -15,6 +15,7 @@ import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.AbstractComputerItem; import dan200.computercraft.shared.computer.items.AbstractComputerItem;
import dan200.computercraft.shared.turtle.blocks.TurtleBlock; import dan200.computercraft.shared.turtle.blocks.TurtleBlock;
import net.minecraft.core.cauldron.CauldronInteraction; import net.minecraft.core.cauldron.CauldronInteraction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
@ -33,13 +34,14 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem {
public static ItemStack create( public static ItemStack create(
int id, @Nullable String label, int colour, ComputerFamily family, int id, @Nullable String label, int colour, ComputerFamily family,
@Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade, @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) { return switch (family) {
case NORMAL -> 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 -> 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; default -> ItemStack.EMPTY;
}; };
} }
@ -47,7 +49,8 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem {
public ItemStack create( public ItemStack create(
int id, @Nullable String label, int colour, int id, @Nullable String label, int colour,
@Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade, @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 // Build the stack
var stack = new ItemStack(this); 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()); 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) { if (rightUpgrade != null) {
stack.getOrCreateTag().putString(NBT_RIGHT_UPGRADE, rightUpgrade.getUpgradeID().toString()); stack.getOrCreateTag().putString(NBT_RIGHT_UPGRADE, rightUpgrade.getUpgradeID().toString());
} }
if (rightUpdateData != null && !rightUpdateData.isEmpty()) {
stack.getOrCreateTag().put(NBT_RIGHT_UPGRADE_DATA, rightUpdateData);
}
return stack; return stack;
} }
@ -118,7 +129,8 @@ public class TurtleItem extends AbstractComputerItem implements IColouredItem {
getComputerID(stack), getLabel(stack), getComputerID(stack), getLabel(stack),
getColour(stack), family, getColour(stack), family,
getUpgrade(stack, TurtleSide.LEFT), getUpgrade(stack, TurtleSide.RIGHT), 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; 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) { public @Nullable ResourceLocation getOverlay(ItemStack stack) {
var tag = stack.getTag(); var tag = stack.getTag();
return tag != null && tag.contains(NBT_OVERLAY) ? new ResourceLocation(tag.getString(NBT_OVERLAY)) : null; return tag != null && tag.contains(NBT_OVERLAY) ? new ResourceLocation(tag.getString(NBT_OVERLAY)) : null;

View File

@ -41,7 +41,9 @@ public class TurtleOverlayRecipe extends ShapelessRecipe {
turtle.getUpgrade(stack, TurtleSide.LEFT), turtle.getUpgrade(stack, TurtleSide.LEFT),
turtle.getUpgrade(stack, TurtleSide.RIGHT), turtle.getUpgrade(stack, TurtleSide.RIGHT),
turtle.getFuelLevel(stack), turtle.getFuelLevel(stack),
overlay overlay,
turtle.getUpgradeData(stack, TurtleSide.LEFT),
turtle.getUpgradeData(stack, TurtleSide.RIGHT)
); );
} }

View File

@ -31,7 +31,7 @@ public final class TurtleRecipe extends ComputerFamilyRecipe {
var computerID = item.getComputerID(stack); var computerID = item.getComputerID(stack);
var label = item.getLabel(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<TurtleRecipe> { public static class Serializer extends ComputerFamilyRecipe.Serializer<TurtleRecipe> {

View File

@ -30,7 +30,7 @@ public final class TurtleUpgradeRecipe extends CustomRecipe {
@Override @Override
public ItemStack getResultItem(RegistryAccess registryAccess) { 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 @Override
@ -125,7 +125,10 @@ public final class TurtleUpgradeRecipe extends CustomRecipe {
var fuelLevel = itemTurtle.getFuelLevel(turtle); var fuelLevel = itemTurtle.getFuelLevel(turtle);
var colour = itemTurtle.getColour(turtle); var colour = itemTurtle.getColour(turtle);
var overlay = itemTurtle.getOverlay(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 @Override