Clean up turtle/pocket computer item creation

- Remove ITurtleItem (and ITurtleBlockEntity): this was, AFAIK, mostly
   a relic of the pre-1.13 code where we had multiple turtle items.

   I do like the theory of abstracting everything out behind an
   interface, but given there's only one concrete implementation, I'm
   not convinced it's worth it right now.

 - Remove TurtleItemFactory/PocketComputerItemFactory: we now prefer
   calling the instance .create(...) method where we have the item
   available (for instance upgrade recipes).

   In the cases we don't (creating an item the first time round), we now
   move the static .create(...) method to the actual item class.
This commit is contained in:
Jonathan Coates 2023-06-04 11:24:04 +01:00
parent b691430889
commit 6e7cbf25e8
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
17 changed files with 106 additions and 204 deletions

View File

@ -15,8 +15,8 @@
import dan200.computercraft.shared.platform.PlatformHelper;
import dan200.computercraft.shared.platform.RecipeIngredients;
import dan200.computercraft.shared.platform.RegistryWrappers;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dan200.computercraft.shared.util.ColourUtils;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.advancements.critereon.ItemPredicate;
@ -38,6 +38,7 @@
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
@ -93,20 +94,23 @@ private void diskColours(Consumer<FinishedRecipe> add) {
}
}
private static List<TurtleItem> turtleItems() {
return List.of(ModRegistry.Items.TURTLE_NORMAL.get(), ModRegistry.Items.TURTLE_ADVANCED.get());
}
/**
* Register a crafting recipe for each turtle upgrade.
*
* @param add The callback to add recipes.
*/
private void turtleUpgrades(Consumer<FinishedRecipe> add) {
for (var family : ComputerFamily.values()) {
var base = TurtleItemFactory.create(-1, null, -1, family, null, null, 0, null);
if (base.isEmpty()) continue;
for (var turtleItem : turtleItems()) {
var base = turtleItem.create(-1, null, -1, null, null, 0, null);
var nameId = family.name().toLowerCase(Locale.ROOT);
var nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT);
for (var upgrade : turtleUpgrades.getGeneratedUpgrades()) {
var result = TurtleItemFactory.create(-1, null, -1, family, null, upgrade, -1, null);
var result = turtleItem.create(-1, null, -1, null, upgrade, -1, null);
ShapedRecipeBuilder
.shaped(RecipeCategory.REDSTONE, result.getItem())
.group(String.format("%s:turtle_%s", ComputerCraftAPI.MOD_ID, nameId))
@ -125,20 +129,24 @@ private void turtleUpgrades(Consumer<FinishedRecipe> add) {
}
}
private static List<PocketComputerItem> pocketComputerItems() {
return List.of(ModRegistry.Items.POCKET_COMPUTER_NORMAL.get(), ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get());
}
/**
* Register a crafting recipe for each pocket upgrade.
*
* @param add The callback to add recipes.
*/
private void pocketUpgrades(Consumer<FinishedRecipe> add) {
for (var family : ComputerFamily.values()) {
var base = PocketComputerItemFactory.create(-1, null, -1, family, null);
for (var pocket : pocketComputerItems()) {
var base = pocket.create(-1, null, -1, null);
if (base.isEmpty()) continue;
var nameId = family.name().toLowerCase(Locale.ROOT);
var nameId = pocket.getFamily().name().toLowerCase(Locale.ROOT);
for (var upgrade : pocketUpgrades.getGeneratedUpgrades()) {
var result = PocketComputerItemFactory.create(-1, null, -1, family, upgrade);
var result = pocket.create(-1, null, -1, upgrade);
ShapedRecipeBuilder
.shaped(RecipeCategory.REDSTONE, result.getItem())
.group(String.format("%s:pocket_%s", ComputerCraftAPI.MOD_ID, nameId))
@ -180,11 +188,10 @@ private void turtleOverlays(Consumer<FinishedRecipe> add) {
}
private void turtleOverlay(Consumer<FinishedRecipe> add, String overlay, Consumer<ShapelessRecipeBuilder> build) {
for (var family : ComputerFamily.values()) {
var base = TurtleItemFactory.create(-1, null, -1, family, null, null, 0, null);
if (base.isEmpty()) continue;
for (var turtleItem : turtleItems()) {
var base = turtleItem.create(-1, null, -1, null, null, 0, null);
var nameId = family.name().toLowerCase(Locale.ROOT);
var nameId = turtleItem.getFamily().name().toLowerCase(Locale.ROOT);
var group = "%s:turtle_%s_overlay".formatted(ComputerCraftAPI.MOD_ID, nameId);
var builder = ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, base.getItem())

View File

@ -5,7 +5,6 @@
package dan200.computercraft.shared.computer.inventory;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.config.Config;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.computer.menu.ComputerMenu;
@ -13,6 +12,7 @@
import dan200.computercraft.shared.computer.menu.ServerInputState;
import dan200.computercraft.shared.computer.terminal.NetworkedTerminal;
import dan200.computercraft.shared.computer.terminal.TerminalState;
import dan200.computercraft.shared.config.Config;
import dan200.computercraft.shared.container.SingleContainerData;
import dan200.computercraft.shared.network.container.ComputerContainerData;
import net.minecraft.world.entity.player.Player;

View File

@ -7,21 +7,25 @@
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.impl.PocketUpgrades;
import dan200.computercraft.impl.TurtleUpgrades;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
/**
* Utilities for recipe mod plugins (such as JEI).
*/
public final class RecipeModHelpers {
static final List<ComputerFamily> MAIN_FAMILIES = Arrays.asList(ComputerFamily.NORMAL, ComputerFamily.ADVANCED);
static final List<Supplier<TurtleItem>> TURTLES = List.of(ModRegistry.Items.TURTLE_NORMAL, ModRegistry.Items.TURTLE_ADVANCED);
static final List<Supplier<PocketComputerItem>> POCKET_COMPUTERS = List.of(ModRegistry.Items.POCKET_COMPUTER_NORMAL, ModRegistry.Items.POCKET_COMPUTER_ADVANCED);
private RecipeModHelpers() {
}
@ -49,13 +53,17 @@ public static boolean shouldRemoveRecipe(ResourceLocation id) {
*/
public static List<ItemStack> getExtraStacks() {
List<ItemStack> upgradeItems = new ArrayList<>();
for (var family : MAIN_FAMILIES) {
for (var turtleSupplier : TURTLES) {
var turtle = turtleSupplier.get();
for (var upgrade : TurtleUpgrades.instance().getUpgrades()) {
upgradeItems.add(TurtleItemFactory.create(-1, null, -1, family, null, upgrade, 0, null));
upgradeItems.add(turtle.create(-1, null, -1, null, upgrade, 0, null));
}
}
for (var pocketSupplier : POCKET_COMPUTERS) {
var pocket = pocketSupplier.get();
for (var upgrade : PocketUpgrades.instance().getUpgrades()) {
upgradeItems.add(PocketComputerItemFactory.create(-1, null, -1, family, upgrade));
upgradeItems.add(pocket.create(-1, null, -1, upgrade));
}
}

View File

@ -12,9 +12,7 @@
import dan200.computercraft.impl.PocketUpgrades;
import dan200.computercraft.impl.TurtleUpgrades;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
@ -28,7 +26,8 @@
import java.util.*;
import java.util.function.Function;
import static dan200.computercraft.shared.integration.RecipeModHelpers.MAIN_FAMILIES;
import static dan200.computercraft.shared.integration.RecipeModHelpers.POCKET_COMPUTERS;
import static dan200.computercraft.shared.integration.RecipeModHelpers.TURTLES;
/**
* Provides dynamic recipe and usage information for upgraded turtle and pocket computers. This is intended to be
@ -218,17 +217,16 @@ public List<T> findRecipesWithOutput(ItemStack stack) {
private static ItemStack turtleWith(ItemStack stack, @Nullable ITurtleUpgrade left, @Nullable ITurtleUpgrade right) {
var item = (TurtleItem) stack.getItem();
return TurtleItemFactory.create(
item.getComputerID(stack), item.getLabel(stack), item.getColour(stack), item.getFamily(),
return item.create(
item.getComputerID(stack), item.getLabel(stack), item.getColour(stack),
left, right, item.getFuelLevel(stack), item.getOverlay(stack)
);
}
private static ItemStack pocketWith(ItemStack stack, @Nullable IPocketUpgrade back) {
var item = (PocketComputerItem) stack.getItem();
return PocketComputerItemFactory.create(
item.getComputerID(stack), item.getLabel(stack), item.getColour(stack), item.getFamily(),
back
return item.create(
item.getComputerID(stack), item.getLabel(stack), item.getColour(stack), back
);
}
@ -267,20 +265,25 @@ List<T> getRecipes() {
if (recipes != null) return recipes;
recipes = this.recipes = new ArrayList<>(4);
for (var family : MAIN_FAMILIES) {
if (turtle != null) {
if (turtle != null) {
for (var turtleSupplier : TURTLES) {
var turtleItem = turtleSupplier.get();
recipes.add(turtle(
ingredient, // Right upgrade, recipe on left
Ingredient.of(TurtleItemFactory.create(-1, null, -1, family, null, null, 0, null)),
TurtleItemFactory.create(-1, null, -1, family, null, turtle, 0, null)
Ingredient.of(turtleItem.create(-1, null, -1, null, null, 0, null)),
turtleItem.create(-1, null, -1, null, turtle, 0, null)
));
}
}
if (pocket != null) {
if (pocket != null) {
for (var pocketSupplier : POCKET_COMPUTERS) {
var pocketItem = pocketSupplier.get();
recipes.add(pocket(
ingredient,
Ingredient.of(PocketComputerItemFactory.create(-1, null, -1, family, null)),
PocketComputerItemFactory.create(-1, null, -1, family, pocket)
Ingredient.of(pocketItem.create(-1, null, -1, null)),
pocketItem.create(-1, null, -1, pocket)
));
}
}

View File

@ -10,7 +10,7 @@
import dan200.computercraft.shared.integration.RecipeModHelpers;
import dan200.computercraft.shared.media.items.DiskItem;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.turtle.items.ITurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.RecipeTypes;
@ -71,7 +71,7 @@ public void onRuntimeAvailable(IJeiRuntime runtime) {
*/
private static final IIngredientSubtypeInterpreter<ItemStack> turtleSubtype = (stack, ctx) -> {
var item = stack.getItem();
if (!(item instanceof ITurtleItem turtle)) return IIngredientSubtypeInterpreter.NONE;
if (!(item instanceof TurtleItem turtle)) return IIngredientSubtypeInterpreter.NONE;
var name = new StringBuilder("turtle:");

View File

@ -12,6 +12,7 @@
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.impl.PocketUpgrades;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.core.ServerContext;
@ -45,7 +46,6 @@
public class PocketComputerItem extends Item implements IComputerItem, IMedia, IColouredItem {
private static final String NBT_UPGRADE = "Upgrade";
private static final String NBT_UPGRADE_INFO = "UpgradeInfo";
public static final String NBT_LIGHT = "Light";
public static final String NBT_ON = "On";
private static final String NBT_INSTANCE = "InstanceId";
@ -58,6 +58,14 @@ public PocketComputerItem(Properties settings, ComputerFamily family) {
this.family = family;
}
public static ItemStack create(int id, @Nullable String label, int colour, ComputerFamily family, @Nullable IPocketUpgrade upgrade) {
return switch (family) {
case NORMAL -> ModRegistry.Items.POCKET_COMPUTER_NORMAL.get().create(id, label, colour, upgrade);
case ADVANCED -> ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get().create(id, label, colour, upgrade);
default -> ItemStack.EMPTY;
};
}
public ItemStack create(int id, @Nullable String label, int colour, @Nullable IPocketUpgrade upgrade) {
var result = new ItemStack(this);
if (id >= 0) result.getOrCreateTag().putInt(NBT_ID, id);
@ -234,7 +242,7 @@ public ComputerFamily getFamily() {
@Override
public ItemStack withFamily(ItemStack stack, ComputerFamily family) {
return PocketComputerItemFactory.create(
return create(
getComputerID(stack), getLabel(stack), getColour(stack),
family, getUpgrade(stack)
);

View File

@ -1,25 +0,0 @@
// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
//
// SPDX-License-Identifier: LicenseRef-CCPL
package dan200.computercraft.shared.pocket.items;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import net.minecraft.world.item.ItemStack;
import javax.annotation.Nullable;
public final class PocketComputerItemFactory {
private PocketComputerItemFactory() {
}
public static ItemStack create(int id, @Nullable String label, int colour, ComputerFamily family, @Nullable IPocketUpgrade upgrade) {
return switch (family) {
case NORMAL -> ModRegistry.Items.POCKET_COMPUTER_NORMAL.get().create(id, label, colour, upgrade);
case ADVANCED -> ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get().create(id, label, colour, upgrade);
default -> ItemStack.EMPTY;
};
}
}

View File

@ -7,9 +7,7 @@
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.impl.PocketUpgrades;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.CraftingContainer;
@ -31,7 +29,7 @@ public boolean canCraftInDimensions(int x, int y) {
@Override
public ItemStack getResultItem(RegistryAccess registryAccess) {
return PocketComputerItemFactory.create(-1, null, -1, ComputerFamily.NORMAL, null);
return ModRegistry.Items.POCKET_COMPUTER_NORMAL.get().create(-1, null, -1, null);
}
@Override
@ -86,7 +84,7 @@ public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAc
var computerID = itemComputer.getComputerID(computer);
var label = itemComputer.getLabel(computer);
var colour = itemComputer.getColour(computer);
return PocketComputerItemFactory.create(computerID, label, colour, family, upgrade);
return itemComputer.create(computerID, label, colour, upgrade);
}
@Override

View File

@ -1,32 +0,0 @@
// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
//
// SPDX-License-Identifier: LicenseRef-CCPL
package dan200.computercraft.shared.turtle.blocks;
import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.computer.blocks.IComputerBlockEntity;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.phys.Vec3;
import javax.annotation.Nullable;
public interface ITurtleBlockEntity extends IComputerBlockEntity {
int getColour();
@Nullable
ResourceLocation getOverlay();
@Nullable
ITurtleUpgrade getUpgrade(TurtleSide side);
ITurtleAccess getAccess();
Vec3 getRenderOffset(float f);
float getRenderYaw(float f);
float getToolRenderAngle(TurtleSide side, float f);
}

View File

@ -11,8 +11,7 @@
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.platform.RegistryEntry;
import dan200.computercraft.shared.turtle.core.TurtleBrain;
import dan200.computercraft.shared.turtle.items.ITurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dan200.computercraft.shared.util.BlockEntityHelpers;
import dan200.computercraft.shared.util.WaterloggableHelpers;
import net.minecraft.core.BlockPos;
@ -126,7 +125,7 @@ public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable L
if (!world.isClientSide && tile instanceof TurtleBlockEntity turtle) {
if (entity instanceof Player player) turtle.setOwningPlayer(player.getGameProfile());
if (stack.getItem() instanceof ITurtleItem item) {
if (stack.getItem() instanceof TurtleItem item) {
// Set Upgrades
for (var side : TurtleSide.values()) {
turtle.getAccess().setUpgrade(side, item.getUpgrade(stack, side));
@ -157,7 +156,14 @@ public float getExplosionResistance(BlockState state, BlockGetter world, BlockPo
@Override
protected ItemStack getItem(AbstractComputerBlockEntity tile) {
return tile instanceof TurtleBlockEntity turtle ? TurtleItemFactory.create(turtle) : ItemStack.EMPTY;
if (!(tile instanceof TurtleBlockEntity turtle)) return ItemStack.EMPTY;
var access = turtle.getAccess();
return TurtleItem.create(
turtle.getComputerID(), turtle.getLabel(), access.getColour(), turtle.getFamily(),
access.getUpgrade(TurtleSide.LEFT), access.getUpgrade(TurtleSide.RIGHT),
access.getFuelLevel(), turtle.getOverlay()
);
}
@Override

View File

@ -39,7 +39,7 @@
import javax.annotation.Nullable;
import java.util.Collections;
public class TurtleBlockEntity extends AbstractComputerBlockEntity implements BasicContainer, ITurtleBlockEntity {
public class TurtleBlockEntity extends AbstractComputerBlockEntity implements BasicContainer {
public static final int INVENTORY_SIZE = 16;
public static final int INVENTORY_WIDTH = 4;
public static final int INVENTORY_HEIGHT = 4;
@ -189,39 +189,30 @@ public void setDirection(Direction dir) {
onTileEntityChange();
}
// ITurtleTile
@Override
public @Nullable ITurtleUpgrade getUpgrade(TurtleSide side) {
return brain.getUpgrade(side);
}
@Override
public int getColour() {
return brain.getColour();
}
@Override
public @Nullable ResourceLocation getOverlay() {
return brain.getOverlay();
}
@Override
public ITurtleAccess getAccess() {
return brain;
}
@Override
public Vec3 getRenderOffset(float f) {
return brain.getRenderOffset(f);
}
@Override
public float getRenderYaw(float f) {
return brain.getVisualYaw(f);
}
@Override
public float getToolRenderAngle(TurtleSide side, float f) {
return brain.getToolRenderAngle(side, f);
}

View File

@ -1,24 +0,0 @@
// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
//
// SPDX-License-Identifier: LicenseRef-CCPL
package dan200.computercraft.shared.turtle.items;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.items.IComputerItem;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import javax.annotation.Nullable;
public interface ITurtleItem extends IComputerItem, IColouredItem {
@Nullable
ITurtleUpgrade getUpgrade(ItemStack stack, TurtleSide side);
int getFuelLevel(ItemStack stack);
@Nullable
ResourceLocation getOverlay(ItemStack stack);
}

View File

@ -9,6 +9,7 @@
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.impl.TurtleUpgrades;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.AbstractComputerItem;
@ -24,11 +25,25 @@
import static dan200.computercraft.shared.turtle.core.TurtleBrain.*;
public class TurtleItem extends AbstractComputerItem implements ITurtleItem {
public class TurtleItem extends AbstractComputerItem implements IColouredItem {
public TurtleItem(TurtleBlock block, Properties settings) {
super(block, settings);
}
public static ItemStack create(
int id, @Nullable String label, int colour, ComputerFamily family,
@Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade,
int fuelLevel, @Nullable ResourceLocation overlay
) {
return switch (family) {
case NORMAL ->
ModRegistry.Items.TURTLE_NORMAL.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay);
case ADVANCED ->
ModRegistry.Items.TURTLE_ADVANCED.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay);
default -> ItemStack.EMPTY;
};
}
public ItemStack create(
int id, @Nullable String label, int colour,
@Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade,
@ -99,7 +114,7 @@ public String getCreatorModId(ItemStack stack) {
@Override
public ItemStack withFamily(ItemStack stack, ComputerFamily family) {
return TurtleItemFactory.create(
return create(
getComputerID(stack), getLabel(stack),
getColour(stack), family,
getUpgrade(stack, TurtleSide.LEFT), getUpgrade(stack, TurtleSide.RIGHT),
@ -107,7 +122,6 @@ public ItemStack withFamily(ItemStack stack, ComputerFamily family) {
);
}
@Override
public @Nullable ITurtleUpgrade getUpgrade(ItemStack stack, TurtleSide side) {
var tag = stack.getTag();
if (tag == null) return null;
@ -116,13 +130,11 @@ public ItemStack withFamily(ItemStack stack, ComputerFamily family) {
return tag.contains(key) ? TurtleUpgrades.instance().get(tag.getString(key)) : null;
}
@Override
public @Nullable ResourceLocation getOverlay(ItemStack stack) {
var tag = stack.getTag();
return tag != null && tag.contains(NBT_OVERLAY) ? new ResourceLocation(tag.getString(NBT_OVERLAY)) : null;
}
@Override
public int getFuelLevel(ItemStack stack) {
var tag = stack.getTag();
return tag != null && tag.contains(NBT_FUEL) ? tag.getInt(NBT_FUEL) : 0;

View File

@ -1,44 +0,0 @@
// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
//
// SPDX-License-Identifier: LicenseRef-CCPL
package dan200.computercraft.shared.turtle.items;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.turtle.blocks.ITurtleBlockEntity;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import javax.annotation.Nullable;
public final class TurtleItemFactory {
private TurtleItemFactory() {
}
public static ItemStack create(ITurtleBlockEntity turtle) {
var access = turtle.getAccess();
return create(
turtle.getComputerID(), turtle.getLabel(), turtle.getColour(), turtle.getFamily(),
access.getUpgrade(TurtleSide.LEFT), access.getUpgrade(TurtleSide.RIGHT),
access.getFuelLevel(), turtle.getOverlay()
);
}
public static ItemStack create(
int id, @Nullable String label, int colour, ComputerFamily family,
@Nullable ITurtleUpgrade leftUpgrade, @Nullable ITurtleUpgrade rightUpgrade,
int fuelLevel, @Nullable ResourceLocation overlay
) {
return switch (family) {
case NORMAL ->
ModRegistry.Items.TURTLE_NORMAL.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay);
case ADVANCED ->
ModRegistry.Items.TURTLE_ADVANCED.get().create(id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay);
default -> ItemStack.EMPTY;
};
}
}

View File

@ -9,9 +9,7 @@
import com.google.gson.JsonParseException;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.turtle.items.ITurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import net.minecraft.core.NonNullList;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.FriendlyByteBuf;
@ -22,7 +20,7 @@
import net.minecraft.world.item.crafting.*;
/**
* A {@link ShapelessRecipe} which sets the {@linkplain ITurtleItem#getOverlay(ItemStack)} turtle's overlay} instead.
* A {@link ShapelessRecipe} which sets the {@linkplain TurtleItem#getOverlay(ItemStack)} turtle's overlay} instead.
*/
public class TurtleOverlayRecipe extends ShapelessRecipe {
private final ResourceLocation overlay;
@ -35,12 +33,11 @@ public TurtleOverlayRecipe(ResourceLocation id, String group, CraftingBookCatego
}
private static ItemStack make(ItemStack stack, ResourceLocation overlay) {
var turtle = (ITurtleItem) stack.getItem();
return TurtleItemFactory.create(
var turtle = (TurtleItem) stack.getItem();
return turtle.create(
turtle.getComputerID(stack),
turtle.getLabel(stack),
turtle.getColour(stack),
turtle.getFamily(),
turtle.getUpgrade(stack, TurtleSide.LEFT),
turtle.getUpgrade(stack, TurtleSide.RIGHT),
turtle.getFuelLevel(stack),

View File

@ -8,7 +8,7 @@
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.IComputerItem;
import dan200.computercraft.shared.computer.recipe.ComputerFamilyRecipe;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
@ -31,7 +31,7 @@ protected ItemStack convert(IComputerItem item, ItemStack stack) {
var computerID = item.getComputerID(stack);
var label = item.getLabel(stack);
return TurtleItemFactory.create(computerID, label, -1, getFamily(), null, null, 0, null);
return TurtleItem.create(computerID, label, -1, getFamily(), null, null, 0, null);
}
public static class Serializer extends ComputerFamilyRecipe.Serializer<TurtleRecipe> {

View File

@ -8,9 +8,7 @@
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.impl.TurtleUpgrades;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.turtle.items.ITurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.CraftingContainer;
@ -32,7 +30,7 @@ public boolean canCraftInDimensions(int x, int y) {
@Override
public ItemStack getResultItem(RegistryAccess registryAccess) {
return TurtleItemFactory.create(-1, null, -1, ComputerFamily.NORMAL, null, null, 0, null);
return ModRegistry.Items.TURTLE_NORMAL.get().create(-1, null, -1, null, null, 0, null);
}
@Override
@ -58,7 +56,7 @@ public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAc
return ItemStack.EMPTY;
}
if (item.getItem() instanceof ITurtleItem) {
if (item.getItem() instanceof TurtleItem) {
// Item is a turtle
if (turtle.isEmpty()) {
turtle = item;
@ -105,8 +103,7 @@ public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAc
// At this point we have a turtle + 1 or 2 items
// Get the turtle we already have
var itemTurtle = (ITurtleItem) turtle.getItem();
var family = itemTurtle.getFamily();
var itemTurtle = (TurtleItem) turtle.getItem();
var upgrades = new ITurtleUpgrade[]{
itemTurtle.getUpgrade(turtle, TurtleSide.LEFT),
itemTurtle.getUpgrade(turtle, TurtleSide.RIGHT),
@ -128,7 +125,7 @@ public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAc
var fuelLevel = itemTurtle.getFuelLevel(turtle);
var colour = itemTurtle.getColour(turtle);
var overlay = itemTurtle.getOverlay(turtle);
return TurtleItemFactory.create(computerID, label, colour, family, upgrades[0], upgrades[1], fuelLevel, overlay);
return itemTurtle.create(computerID, label, colour, upgrades[0], upgrades[1], fuelLevel, overlay);
}
@Override