Turtle flags

- Add a new recipe type for turtle overlays, and recipe generator
   support for this recipe.
 - Add trans and rainbow flags.
 - Exclude .license files from the generated jar. I'm not thrilled on
   the whole .license file system, but it's kinda the easiest way.
 - Regenerate data. Yes, this is 90% of the commit :D.
This commit is contained in:
Jonathan Coates 2023-03-31 18:14:44 +01:00
parent a9547d1d6f
commit 081953655c
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
33 changed files with 522 additions and 4 deletions

1
.gitignore vendored
View File

@ -10,6 +10,7 @@
/projects/*/build
/buildSrc/build
/out
/buildSrc/out
/jars
/doc/out/
/node_modules

View File

@ -102,6 +102,10 @@ tasks.withType(JavaCompile::class.java).configureEach {
options.encoding = "UTF-8"
}
tasks.processResources {
exclude("**/*.license")
}
tasks.withType(AbstractArchiveTask::class.java).configureEach {
isPreserveFileTimestamps = false
isReproducibleFileOrder = true

View File

@ -127,6 +127,8 @@ private static void registerItemProperty(String name, ClampedItemPropertyFunctio
// Turtle block renderer
"block/turtle_colour",
"block/turtle_elf_overlay",
"block/turtle_rainbow_overlay",
"block/turtle_trans_overlay",
};
public static void registerExtraModels(Consumer<ResourceLocation> register) {

View File

@ -17,6 +17,7 @@
import dan200.computercraft.shared.platform.RegistryWrappers;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.util.ColourUtils;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.advancements.critereon.ItemPredicate;
import net.minecraft.core.registries.Registries;
@ -60,6 +61,7 @@ public void buildRecipes(Consumer<FinishedRecipe> add) {
diskColours(add);
pocketUpgrades(add);
turtleUpgrades(add);
turtleOverlays(add);
addSpecial(add, ModRegistry.RecipeSerializers.PRINTOUT.get());
addSpecial(add, ModRegistry.RecipeSerializers.DISK.get());
@ -156,6 +158,51 @@ private void pocketUpgrades(Consumer<FinishedRecipe> add) {
}
}
private void turtleOverlays(Consumer<FinishedRecipe> add) {
turtleOverlay(add, "turtle_trans_overlay", x -> x
.unlockedBy("has_dye", inventoryChange(itemPredicate(ingredients.dye())))
.requires(ColourUtils.getDyeTag(DyeColor.LIGHT_BLUE))
.requires(ColourUtils.getDyeTag(DyeColor.PINK))
.requires(ColourUtils.getDyeTag(DyeColor.WHITE))
.requires(Items.STICK)
);
turtleOverlay(add, "turtle_rainbow_overlay", x -> x
.unlockedBy("has_dye", inventoryChange(itemPredicate(ingredients.dye())))
.requires(ColourUtils.getDyeTag(DyeColor.RED))
.requires(ColourUtils.getDyeTag(DyeColor.ORANGE))
.requires(ColourUtils.getDyeTag(DyeColor.YELLOW))
.requires(ColourUtils.getDyeTag(DyeColor.GREEN))
.requires(ColourUtils.getDyeTag(DyeColor.BLUE))
.requires(ColourUtils.getDyeTag(DyeColor.PURPLE))
.requires(Items.STICK)
);
}
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;
var nameId = family.name().toLowerCase(Locale.ROOT);
var group = "%s:turtle_%s_overlay".formatted(ComputerCraftAPI.MOD_ID, nameId);
var builder = ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, base.getItem())
.group(group)
.unlockedBy("has_turtle", inventoryChange(base.getItem()));
build.accept(builder);
builder
.requires(base.getItem())
.save(
RecipeWrapper
.wrap(ModRegistry.RecipeSerializers.TURTLE_OVERLAY.get(), add)
.withExtraData(x -> x.addProperty("overlay", new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/" + overlay).toString())),
new ResourceLocation(ComputerCraftAPI.MOD_ID, "turtle_%s_overlays/%s".formatted(nameId, overlay))
);
}
}
private void basicRecipes(Consumer<FinishedRecipe> add) {
ShapedRecipeBuilder
.shaped(RecipeCategory.REDSTONE, ModRegistry.Items.CABLE.get(), 6)

View File

@ -70,6 +70,7 @@
import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity;
import dan200.computercraft.shared.turtle.inventory.TurtleMenu;
import dan200.computercraft.shared.turtle.items.TurtleItem;
import dan200.computercraft.shared.turtle.recipes.TurtleOverlayRecipe;
import dan200.computercraft.shared.turtle.recipes.TurtleRecipe;
import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe;
import dan200.computercraft.shared.turtle.upgrades.*;
@ -355,6 +356,7 @@ private static <T extends CustomRecipe> RegistryEntry<SimpleCraftingRecipeSerial
public static final RegistryEntry<SimpleCraftingRecipeSerializer<ClearColourRecipe>> DYEABLE_ITEM_CLEAR = simple("clear_colour", ClearColourRecipe::new);
public static final RegistryEntry<TurtleRecipe.Serializer> TURTLE = REGISTRY.register("turtle", TurtleRecipe.Serializer::new);
public static final RegistryEntry<SimpleCraftingRecipeSerializer<TurtleUpgradeRecipe>> TURTLE_UPGRADE = simple("turtle_upgrade", TurtleUpgradeRecipe::new);
public static final RegistryEntry<TurtleOverlayRecipe.Serializer> TURTLE_OVERLAY = REGISTRY.register("turtle_overlay", TurtleOverlayRecipe.Serializer::new);
public static final RegistryEntry<SimpleCraftingRecipeSerializer<PocketComputerUpgradeRecipe>> POCKET_COMPUTER_UPGRADE = simple("pocket_computer_upgrade", PocketComputerUpgradeRecipe::new);
public static final RegistryEntry<SimpleCraftingRecipeSerializer<PrintoutRecipe>> PRINTOUT = simple("printout", PrintoutRecipe::new);
public static final RegistryEntry<SimpleCraftingRecipeSerializer<DiskRecipe>> DISK = simple("disk", DiskRecipe::new);

View File

@ -0,0 +1,122 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.shared.turtle.recipes;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
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;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.*;
/**
* A {@link ShapelessRecipe} which sets the {@linkplain ITurtleItem#getOverlay(ItemStack)} turtle's overlay} instead.
*/
public class TurtleOverlayRecipe extends ShapelessRecipe {
private final ResourceLocation overlay;
private final ItemStack result;
public TurtleOverlayRecipe(ResourceLocation id, String group, CraftingBookCategory category, ItemStack result, NonNullList<Ingredient> ingredients, ResourceLocation overlay) {
super(id, group, category, result, ingredients);
this.overlay = overlay;
this.result = result;
}
private static ItemStack make(ItemStack stack, ResourceLocation overlay) {
var turtle = (ITurtleItem) stack.getItem();
return TurtleItemFactory.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),
overlay
);
}
@Override
public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAccess) {
for (var i = 0; i < inventory.getContainerSize(); i++) {
var stack = inventory.getItem(i);
if (stack.getItem() instanceof TurtleItem) return make(stack, overlay);
}
return ItemStack.EMPTY;
}
@Override
public RecipeSerializer<?> getSerializer() {
return ModRegistry.RecipeSerializers.TURTLE_OVERLAY.get();
}
public static class Serializer implements RecipeSerializer<TurtleOverlayRecipe> {
@Override
public TurtleOverlayRecipe fromJson(ResourceLocation id, JsonObject json) {
var group = GsonHelper.getAsString(json, "group", "");
var category = CraftingBookCategory.CODEC.byName(GsonHelper.getAsString(json, "category", null), CraftingBookCategory.MISC);
var ingredients = readIngredients(GsonHelper.getAsJsonArray(json, "ingredients"));
if (ingredients.isEmpty()) throw new JsonParseException("No ingredients for shapeless recipe");
if (ingredients.size() > 9) {
throw new JsonParseException("Too many ingredients for shapeless recipe the max is 9");
}
var overlay = new ResourceLocation(GsonHelper.getAsString(json, "overlay"));
// We could derive this from the ingredients, but we want to avoid evaluating the ingredients too early, so
// it's easier to do this.
var result = make(ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "result")), overlay);
return new TurtleOverlayRecipe(id, group, category, result, ingredients, overlay);
}
private NonNullList<Ingredient> readIngredients(JsonArray arrays) {
NonNullList<Ingredient> items = NonNullList.create();
for (var i = 0; i < arrays.size(); ++i) {
var ingredient = Ingredient.fromJson(arrays.get(i));
if (!ingredient.isEmpty()) items.add(ingredient);
}
return items;
}
@Override
public TurtleOverlayRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) {
var group = buffer.readUtf();
var category = buffer.readEnum(CraftingBookCategory.class);
var count = buffer.readVarInt();
var items = NonNullList.withSize(count, Ingredient.EMPTY);
for (var j = 0; j < items.size(); j++) items.set(j, Ingredient.fromNetwork(buffer));
var result = buffer.readItem();
var overlay = buffer.readResourceLocation();
return new TurtleOverlayRecipe(id, group, category, result, items, overlay);
}
@Override
public void toNetwork(FriendlyByteBuf buffer, TurtleOverlayRecipe recipe) {
buffer.writeUtf(recipe.getGroup());
buffer.writeEnum(recipe.category());
buffer.writeVarInt(recipe.getIngredients().size());
for (var ingredient : recipe.getIngredients()) ingredient.toNetwork(buffer);
buffer.writeItem(recipe.result);
buffer.writeResourceLocation(recipe.overlay);
}
}
}

View File

@ -19,6 +19,10 @@ public final class ColourUtils {
private ColourUtils() {
}
public static TagKey<Item> getDyeTag(DyeColor color) {
return DYES.get(color.getId());
}
public static @Nullable DyeColor getStackColour(ItemStack stack) {
if (stack.isEmpty()) return null;

View File

@ -0,0 +1,38 @@
{
"parent": "block/block",
"textures": {
"particle": "computercraft:block/turtle_rainbow_overlay",
"texture": "computercraft:block/turtle_rainbow_overlay"
},
"elements": [
{
"name": "Flag",
"from": [1.5, 13, 10.5],
"to": [2, 16.5, 15.5],
"rotation": {"angle": 22.5, "axis": "x", "origin": [2, 11, 10.75]},
"faces": {
"north": {"uv": [0, 0, 1, 6], "texture": "#texture"},
"east": {"uv": [0, 0, 7, 6], "texture": "#texture"},
"south": {"uv": [0, 0, 1, 6], "texture": "#texture"},
"west": {"uv": [0, 0, 7, 6], "texture": "#texture"},
"up": {"uv": [15, 0, 16, 6], "texture": "#texture"},
"down": {"uv": [8, 0, 9, 6], "texture": "#texture"}
}
},
{
"name": "Stick",
"from": [1.5, 10.5, 10.5],
"to": [2, 13, 11],
"rotation": {"angle": 22.5, "axis": "x", "origin": [2, 11, 10.75]},
"faces": {
"north": {"uv": [12, 0, 13, 6], "texture": "#texture"},
"east": {"uv": [13, 0, 14, 6], "texture": "#texture"},
"south": {"uv": [12, 0, 13, 6], "texture": "#texture"},
"west": {"uv": [13, 0, 14, 6], "texture": "#texture"},
"up": {"uv": [12, 6, 13, 7], "texture": "#texture"},
"down": {"uv": [13, 6, 14, 7], "texture": "#texture"}
}
}
],
"display": {}
}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
SPDX-License-Identifier: MPL-2.0

View File

@ -0,0 +1,38 @@
{
"parent": "block/block",
"textures": {
"particle": "computercraft:block/turtle_trans_overlay",
"texture": "computercraft:block/turtle_trans_overlay"
},
"elements": [
{
"name": "Flag",
"from": [1.5, 13.5, 10.5],
"to": [2, 16.5, 15.5],
"rotation": {"angle": 22.5, "axis": "x", "origin": [2, 11, 10.75]},
"faces": {
"north": {"uv": [0, 0, 1, 5], "texture": "#texture"},
"east": {"uv": [0, 0, 7, 5], "texture": "#texture"},
"south": {"uv": [0, 0, 1, 5], "texture": "#texture"},
"west": {"uv": [0, 0, 7, 5], "texture": "#texture"},
"up": {"uv": [15, 0, 16, 5], "texture": "#texture"},
"down": {"uv": [15, 0, 16, 5], "texture": "#texture"}
}
},
{
"name": "Stick",
"from": [1.5, 10.5, 10.5],
"to": [2, 13.5, 11],
"rotation": {"angle": 22.5, "axis": "x", "origin": [2, 11, 10.75]},
"faces": {
"north": {"uv": [12, 0, 13, 6], "texture": "#texture"},
"east": {"uv": [13, 0, 14, 6], "texture": "#texture"},
"south": {"uv": [12, 0, 13, 6], "texture": "#texture"},
"west": {"uv": [13, 0, 14, 6], "texture": "#texture"},
"up": {"uv": [12, 6, 13, 7], "texture": "#texture"},
"down": {"uv": [13, 6, 14, 7], "texture": "#texture"}
}
}
],
"display": {}
}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
SPDX-License-Identifier: MPL-2.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
SPDX-License-Identifier: MPL-2.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
SPDX-License-Identifier: MPL-2.0

View File

@ -196,8 +196,6 @@
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.avg": "%s (avg)",
"tracking_field.computercraft.computer_tasks.name": "Tasks",
"tracking_field.computercraft.coroutines_created.name": "Coroutines created",
"tracking_field.computercraft.coroutines_dead.name": "Coroutines disposed",
"tracking_field.computercraft.count": "%s (count)",
"tracking_field.computercraft.fs.name": "Filesystem operations",
"tracking_field.computercraft.http_download.name": "HTTP download",

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "c:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_advanced_overlays/turtle_rainbow_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_advanced"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_advanced_overlays/turtle_rainbow_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "c:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_advanced_overlays/turtle_trans_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_advanced"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_advanced_overlays/turtle_trans_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "c:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_normal_overlays/turtle_rainbow_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_normal"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_normal_overlays/turtle_rainbow_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "c:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_normal_overlays/turtle_trans_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_normal"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_normal_overlays/turtle_trans_overlay"]}
}

View File

@ -0,0 +1,17 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_advanced_overlay",
"ingredients": [
{"tag": "c:red_dyes"},
{"tag": "c:orange_dyes"},
{"tag": "c:yellow_dyes"},
{"tag": "c:green_dyes"},
{"tag": "c:blue_dyes"},
{"tag": "c:purple_dyes"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_advanced"}
],
"overlay": "computercraft:block/turtle_rainbow_overlay",
"result": {"item": "computercraft:turtle_advanced"}
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_advanced_overlay",
"ingredients": [
{"tag": "c:light_blue_dyes"},
{"tag": "c:pink_dyes"},
{"tag": "c:white_dyes"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_advanced"}
],
"overlay": "computercraft:block/turtle_trans_overlay",
"result": {"item": "computercraft:turtle_advanced"}
}

View File

@ -0,0 +1,17 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_normal_overlay",
"ingredients": [
{"tag": "c:red_dyes"},
{"tag": "c:orange_dyes"},
{"tag": "c:yellow_dyes"},
{"tag": "c:green_dyes"},
{"tag": "c:blue_dyes"},
{"tag": "c:purple_dyes"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_normal"}
],
"overlay": "computercraft:block/turtle_rainbow_overlay",
"result": {"item": "computercraft:turtle_normal"}
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_normal_overlay",
"ingredients": [
{"tag": "c:light_blue_dyes"},
{"tag": "c:pink_dyes"},
{"tag": "c:white_dyes"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_normal"}
],
"overlay": "computercraft:block/turtle_trans_overlay",
"result": {"item": "computercraft:turtle_normal"}
}

View File

@ -196,8 +196,6 @@
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.avg": "%s (avg)",
"tracking_field.computercraft.computer_tasks.name": "Tasks",
"tracking_field.computercraft.coroutines_created.name": "Coroutines created",
"tracking_field.computercraft.coroutines_dead.name": "Coroutines disposed",
"tracking_field.computercraft.count": "%s (count)",
"tracking_field.computercraft.fs.name": "Filesystem operations",
"tracking_field.computercraft.http_download.name": "HTTP download",

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "forge:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_advanced_overlays/turtle_rainbow_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_advanced"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_advanced_overlays/turtle_rainbow_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "forge:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_advanced_overlays/turtle_trans_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_advanced"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_advanced_overlays/turtle_trans_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "forge:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_normal_overlays/turtle_rainbow_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_normal"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_normal_overlays/turtle_rainbow_overlay"]}
}

View File

@ -0,0 +1,16 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_dye": {"conditions": {"items": [{"tag": "forge:dyes"}]}, "trigger": "minecraft:inventory_changed"},
"has_the_recipe": {
"conditions": {"recipe": "computercraft:turtle_normal_overlays/turtle_trans_overlay"},
"trigger": "minecraft:recipe_unlocked"
},
"has_turtle": {
"conditions": {"items": [{"items": ["computercraft:turtle_normal"]}]},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [["has_turtle", "has_dye", "has_the_recipe"]],
"rewards": {"recipes": ["computercraft:turtle_normal_overlays/turtle_trans_overlay"]}
}

View File

@ -0,0 +1,17 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_advanced_overlay",
"ingredients": [
{"tag": "forge:dyes/red"},
{"tag": "forge:dyes/orange"},
{"tag": "forge:dyes/yellow"},
{"tag": "forge:dyes/green"},
{"tag": "forge:dyes/blue"},
{"tag": "forge:dyes/purple"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_advanced"}
],
"overlay": "computercraft:block/turtle_rainbow_overlay",
"result": {"item": "computercraft:turtle_advanced"}
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_advanced_overlay",
"ingredients": [
{"tag": "forge:dyes/light_blue"},
{"tag": "forge:dyes/pink"},
{"tag": "forge:dyes/white"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_advanced"}
],
"overlay": "computercraft:block/turtle_trans_overlay",
"result": {"item": "computercraft:turtle_advanced"}
}

View File

@ -0,0 +1,17 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_normal_overlay",
"ingredients": [
{"tag": "forge:dyes/red"},
{"tag": "forge:dyes/orange"},
{"tag": "forge:dyes/yellow"},
{"tag": "forge:dyes/green"},
{"tag": "forge:dyes/blue"},
{"tag": "forge:dyes/purple"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_normal"}
],
"overlay": "computercraft:block/turtle_rainbow_overlay",
"result": {"item": "computercraft:turtle_normal"}
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:turtle_overlay",
"category": "redstone",
"group": "computercraft:turtle_normal_overlay",
"ingredients": [
{"tag": "forge:dyes/light_blue"},
{"tag": "forge:dyes/pink"},
{"tag": "forge:dyes/white"},
{"item": "minecraft:stick"},
{"item": "computercraft:turtle_normal"}
],
"overlay": "computercraft:block/turtle_trans_overlay",
"result": {"item": "computercraft:turtle_normal"}
}