From 2a14a715bbf6f71af215967e972c15f6585892c4 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 14:26:06 +0530 Subject: [PATCH 01/11] Shapeless recipes --- build.gradle | 30 ++++++++++- .../textile/api/util/GameInstanceUtils.java | 27 ++++++++++ .../mixin/base/MinecraftAppletMixin.java | 44 ++++++++++++++++ .../src/main/resources/fabric.mod.json | 5 +- .../resources/textile-api-base.mixins.json | 11 ++++ .../recipe/event/v1/CraftingRecipeType.java | 46 +++++++++++++++++ .../api/recipe/event/v1/Dispatcher.java | 14 +++++ .../recipe/event/v1/ShapedRecipeCallback.java | 2 +- .../api/recipe/event/v1/ShapelessRecipe.java | 51 +++++++++++++++++++ .../api/recipe/event/v1/SimpleDispatcher.java | 34 +++++++++++++ .../recipe/CraftingInventoryAccessor.java | 13 +++++ .../mixin/recipe/MinecraftAppletAccessor.java | 13 +++++ .../textile-recipe-api-v1.mixins.json | 3 ++ 13 files changed, 290 insertions(+), 3 deletions(-) create mode 100644 textile-api-base/src/main/java/net/textilemc/textile/api/util/GameInstanceUtils.java create mode 100644 textile-api-base/src/main/java/net/textilemc/textile/mixin/base/MinecraftAppletMixin.java create mode 100644 textile-api-base/src/main/resources/textile-api-base.mixins.json create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/Dispatcher.java create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/CraftingInventoryAccessor.java create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/MinecraftAppletAccessor.java diff --git a/build.gradle b/build.gradle index 3b32023..6ac54b3 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,9 @@ plugins { project.version = "0.0.1-SNAPSHOT" +import net.fabricmc.loom.task.RunClientTask +import net.fabricmc.loom.task.RunServerTask + allprojects { project.group = "textile-api" @@ -31,6 +34,21 @@ allprojects { } } + sourceSets { + testmod { + compileClasspath += main.compileClasspath + runtimeClasspath += main.runtimeClasspath + } + } + + task runTestmodClient(type: RunClientTask) { + classpath sourceSets.testmod.runtimeClasspath + } + + task runTestmodServer(type: RunServerTask) { + classpath sourceSets.testmod.runtimeClasspath + } + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" @@ -104,6 +122,16 @@ allprojects { } } +subprojects { + dependencies { + testmodCompile sourceSets.main.output + } +} + +sourceSets { + testmod +} + javadoc { options { source = "8" @@ -114,7 +142,7 @@ javadoc { 'https://guava.dev/releases/21.0/api/docs/', 'https://asm.ow2.io/javadoc/', 'https://docs.oracle.com/javase/8/docs/api/', - 'http://jenkins.liteloader.com/job/Mixin/javadoc/', + 'https://jenkins.liteloader.com/job/Mixin/javadoc/', 'https://logging.apache.org/log4j/2.x/log4j-api/apidocs/' // Need to add minecraft jd publication etc once there is one available ) diff --git a/textile-api-base/src/main/java/net/textilemc/textile/api/util/GameInstanceUtils.java b/textile-api-base/src/main/java/net/textilemc/textile/api/util/GameInstanceUtils.java new file mode 100644 index 0000000..176c496 --- /dev/null +++ b/textile-api-base/src/main/java/net/textilemc/textile/api/util/GameInstanceUtils.java @@ -0,0 +1,27 @@ +package net.textilemc.textile.api.util; + +import java.util.Objects; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.client.MinecraftApplet; +import net.minecraft.client.MinecraftClient; + +/** + * Utilities to get game instances. + */ +@SuppressWarnings("FieldMayBeFinal") +public class GameInstanceUtils { + private static MinecraftClient CLIENT = null; + private static MinecraftApplet APPLET = null; + + @NotNull + public static MinecraftClient getMinecraftClient() { + return Objects.requireNonNull(CLIENT, "Requested Minecraft client too early!"); + } + + @NotNull + public static MinecraftApplet getMinecraftApplet() { + return Objects.requireNonNull(APPLET, "Requested Minecraft applet too early!"); + } +} diff --git a/textile-api-base/src/main/java/net/textilemc/textile/mixin/base/MinecraftAppletMixin.java b/textile-api-base/src/main/java/net/textilemc/textile/mixin/base/MinecraftAppletMixin.java new file mode 100644 index 0000000..e996e40 --- /dev/null +++ b/textile-api-base/src/main/java/net/textilemc/textile/mixin/base/MinecraftAppletMixin.java @@ -0,0 +1,44 @@ +package net.textilemc.textile.mixin.base; + +import java.lang.reflect.Field; + +import net.textilemc.textile.api.util.GameInstanceUtils; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.MinecraftApplet; +import net.minecraft.client.MinecraftClient; + +@Mixin(MinecraftApplet.class) +public class MinecraftAppletMixin { + @Shadow + private MinecraftClient client; + + @Inject(method = "init", at = @At("HEAD")) + public void preInit(CallbackInfo ci) { + try { + //noinspection JavaReflectionMemberAccess + Field f = GameInstanceUtils.class.getField("APPLET"); + f.setAccessible(true); + f.set(null, this); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new AssertionError(); + } + } + + @Inject(method = "init", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/MinecraftClient;field_969:Z")) + public void afterInit(CallbackInfo ci) { + try { + //noinspection JavaReflectionMemberAccess + Field f = GameInstanceUtils.class.getField("CLIENT"); + f.setAccessible(true); + f.set(null, this.client); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new AssertionError(); + } + } +} diff --git a/textile-api-base/src/main/resources/fabric.mod.json b/textile-api-base/src/main/resources/fabric.mod.json index d7182aa..5cb3855 100644 --- a/textile-api-base/src/main/resources/fabric.mod.json +++ b/textile-api-base/src/main/resources/fabric.mod.json @@ -16,5 +16,8 @@ "depends": { "fabricloader": ">=0.4.0" }, - "description": "Contains the essentials for Textile API modules." + "description": "Contains the essentials for Textile API modules.", + "mixins": [ + "textile-api-base.mixins.json" + ] } diff --git a/textile-api-base/src/main/resources/textile-api-base.mixins.json b/textile-api-base/src/main/resources/textile-api-base.mixins.json new file mode 100644 index 0000000..dc41c30 --- /dev/null +++ b/textile-api-base/src/main/resources/textile-api-base.mixins.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "net.textilemc.textile.mixin.base", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "MinecraftAppletMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java new file mode 100644 index 0000000..6824191 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java @@ -0,0 +1,46 @@ +package net.textilemc.textile.api.recipe.event.v1; + +import java.util.Arrays; +import java.util.List; + +import net.textilemc.textile.mixin.recipe.CraftingInventoryAccessor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.item.ItemStack; +import net.minecraft.storage.CraftingInventory; +import net.minecraft.world.World; + +/** + * Base class for custom crafting recipe types. + */ +public interface CraftingRecipeType { + /** + * @param inventory The inventory. May be null + * @return Output stack + */ + ItemStack getOutput(List inventory); + + /** + * @param inventory The inventory + * @return Whether the inventory's stacks match + */ + default boolean matches(CraftingInventory inventory, World world) { + //noinspection ConstantConditions + return this.matches(Arrays.asList(((CraftingInventoryAccessor) (Object) inventory).getField_871().clone()), world); + } + + /** + * @param stacks The item stacks + * @return Whether the inventory's stacks match + */ + boolean matches(List stacks, World world); + + /** + * Called after this recipe has been matched and consumed. + * + *

This can be used to add recipe remainders, damage items, etc.

+ */ + default void afterEvaluate(@NotNull CraftingInventory inventory, World world) { + } +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/Dispatcher.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/Dispatcher.java new file mode 100644 index 0000000..8c76a27 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/Dispatcher.java @@ -0,0 +1,14 @@ +package net.textilemc.textile.api.recipe.event.v1; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +/** + * Stores a bunch of recipes + */ +public interface Dispatcher { + void accept(T recipe); + + ItemStack getOutput(List stacks); +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java index 36ef972..50d3d6d 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java @@ -41,6 +41,6 @@ public interface ShapedRecipeCallback { @FunctionalInterface interface ShapedRecipeConsumer { - void addShapedRecipe(ItemStack var1, Object... args); + void addShapedRecipe(ItemStack output, Object... args); } } diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java new file mode 100644 index 0000000..e2bfe84 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java @@ -0,0 +1,51 @@ +package net.textilemc.textile.api.recipe.event.v1; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.google.common.base.Preconditions; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Recipe type for recipes that do not have any specific shape. + */ +public class ShapelessRecipe implements CraftingRecipeType { + public static final Dispatcher DISPATCHER = new SimpleDispatcher<>(); + private final ItemStack output; + private final ArrayList ingredients; + + /** + * @param output The output stack + * @param ingredients The ingredients + * @throws IllegalArgumentException If the size of ingredients is 0 + */ + private ShapelessRecipe(ItemStack output, ArrayList ingredients) { + Preconditions.checkArgument(ingredients.size() > 0); + this.output = output; + this.ingredients = ingredients; + } + + @Override + public ItemStack getOutput(List stacks) { + return this.output; + } + @Override + public boolean matches(List items, World world) { + //noinspection unchecked + ArrayList stacks = (ArrayList) this.ingredients.clone(); + + for (ItemStack stack : items) { + for (ItemStack itemStack : stacks) { + if (stack != null && stack.id == itemStack.id && (itemStack.meta == 32767 || stack.meta == itemStack.meta)) { + stacks.remove(itemStack); + break; + } + } + } + + return stacks.isEmpty(); + } +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java new file mode 100644 index 0000000..92ba805 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java @@ -0,0 +1,34 @@ +package net.textilemc.textile.api.recipe.event.v1; + +import java.util.ArrayList; +import java.util.List; + +import net.textilemc.textile.api.util.GameInstanceUtils; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.item.ItemStack; + +/** + * A simple dispatcher implementation. + * @param The recipe type + */ +public class SimpleDispatcher implements Dispatcher { + private final List recipes = new ArrayList<>(); + + @Override + public void accept(T recipe) { + this.recipes.add(recipe); + } + + @Nullable + @Override + public ItemStack getOutput(List stacks) { + for (T recipe : this.recipes) { + if (recipe.matches(stacks, GameInstanceUtils.getMinecraftClient().world)) { + return recipe.getOutput(stacks); + } + } + + return null; + } +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/CraftingInventoryAccessor.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/CraftingInventoryAccessor.java new file mode 100644 index 0000000..0f7db46 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/CraftingInventoryAccessor.java @@ -0,0 +1,13 @@ +package net.textilemc.textile.mixin.recipe; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.item.ItemStack; +import net.minecraft.storage.CraftingInventory; + +@Mixin(CraftingInventory.class) +public interface CraftingInventoryAccessor { + @Accessor + ItemStack[] getField_871(); +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/MinecraftAppletAccessor.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/MinecraftAppletAccessor.java new file mode 100644 index 0000000..08c2af8 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/MinecraftAppletAccessor.java @@ -0,0 +1,13 @@ +package net.textilemc.textile.mixin.recipe; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.MinecraftApplet; +import net.minecraft.client.MinecraftClient; + +@Mixin(MinecraftApplet.class) +public interface MinecraftAppletAccessor { + @Accessor + MinecraftClient getClient(); +} diff --git a/textile-recipe-api-v1/src/main/resources/textile-recipe-api-v1.mixins.json b/textile-recipe-api-v1/src/main/resources/textile-recipe-api-v1.mixins.json index 6f16d35..d98d618 100644 --- a/textile-recipe-api-v1/src/main/resources/textile-recipe-api-v1.mixins.json +++ b/textile-recipe-api-v1/src/main/resources/textile-recipe-api-v1.mixins.json @@ -3,6 +3,9 @@ "package": "net.textilemc.textile.mixin.recipe", "compatibilityLevel": "JAVA_8", "mixins": [ + "CraftingInventoryAccessor", + "CraftingInventoryMixin", + "MinecraftAppletAccessor", "RecipeDispatcherMixin" ], "injectors": { From a71cacc0a43e97e108963675e7a64d1e38eb5700 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 14:32:20 +0530 Subject: [PATCH 02/11] Start testmod work --- .../api/recipe/event/v1/test/RecipeTest.java | 11 +++++++++++ .../src/testmod/resources/fabric.mod.json | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java create mode 100644 textile-recipe-api-v1/src/testmod/resources/fabric.mod.json diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java new file mode 100644 index 0000000..5dabd3d --- /dev/null +++ b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java @@ -0,0 +1,11 @@ +package net.textilemc.textile.api.recipe.event.v1.test; + +import net.textilemc.textile.api.recipe.event.v1.ShapelessRecipe; + +import net.fabricmc.api.ModInitializer; + +public class RecipeTest implements ModInitializer { + @Override + public void onInitialize() { + } +} diff --git a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json new file mode 100644 index 0000000..7d768f2 --- /dev/null +++ b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "id": "textile-recipe-api-v1-test", + "version": "0.1.0", + "name": "Textile Recipe API (v1) Testmod", + "authors": [ + "TextileMC" + ], + "contact": { + "issues": "https://github.com/TextileMC/textile-api/issues", + "sources": "https://github.com/TextileMC/textile-api" + }, + "entrypoints": { + "main": [ + "net.textilemc.textile.api.recipe.event.v1.test.RecipeTest" + ] + } +} From 51343e614ff46b0adb0cb3dcd60913915756ec0e Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 14:36:47 +0530 Subject: [PATCH 03/11] Builder --- .../api/recipe/event/v1/ShapelessRecipe.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java index e2bfe84..3a69914 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java @@ -3,9 +3,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import com.google.common.base.Preconditions; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -48,4 +50,39 @@ public boolean matches(List items, World world) { return stacks.isEmpty(); } + + public static Builder builder(ItemStack output) { + return new Builder(output); + } + + /** + * Helper class for creating shapeless recipes + */ + public static class Builder { + private final ItemStack output; + private final ArrayList stacks = new ArrayList<>(); + + private Builder(ItemStack output) { + this.output = output; + } + + public Builder add(ItemStack stack) { + this.stacks.add(Objects.requireNonNull(stack)); + return this; + } + + public Builder add(Item item) { + return this.add(new ItemStack(Objects.requireNonNull(item))); + } + + /** + * Converts this builder to a recipe + * @return a shapeless recipe + */ + @SuppressWarnings("unchecked") + public ShapelessRecipe build() { + Preconditions.checkArgument(this.stacks.size() > 0, "Empty Shapeless Recipe"); + return new ShapelessRecipe(this.output, (ArrayList) this.stacks.clone()); + } + } } From 8df0232a64bcb098b5b9b0ec0c504ffc80fd9136 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 15:23:49 +0530 Subject: [PATCH 04/11] Yeet some parts --- build.gradle | 9 ++++++++- .../textile/api/recipe/event/v1/test/RecipeTest.java | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6ac54b3..8a1c5bd 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,14 @@ allprojects { mappings "net.textilemc:yarrn:inf-20100618+build20d332:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" +// modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // IMPORTANT + // Until a certain pr is merged, make sure you + // add -Dfabric.gameVersion=20100618 to your run + // config's vm arguments otherwise bad + + modImplementation "com.github.sfPlayer1:fabric-loader:adad4b3" // Some dependencies aren't gotten by the loader, so we add them ourselves implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.8.1' diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java index 5dabd3d..45cc68c 100644 --- a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java +++ b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java @@ -2,10 +2,21 @@ import net.textilemc.textile.api.recipe.event.v1.ShapelessRecipe; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + import net.fabricmc.api.ModInitializer; public class RecipeTest implements ModInitializer { @Override public void onInitialize() { + ShapelessRecipe.DISPATCHER.accept(ShapelessRecipe.builder(new ItemStack(Item.COAL)) + .add(new ItemStack(Block.LOG)) + .add(new ItemStack(Block.DIRT)) + .add(new ItemStack(Block.DIRT)) + .add(new ItemStack(Block.DIRT)) + .add(new ItemStack(Block.DIRT)) + .build()); } } From fdc5c703b36bee33fed101edb03ff5287948ee7a Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 15:29:23 +0530 Subject: [PATCH 05/11] Yeet server run --- build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index 8a1c5bd..4dfce04 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ plugins { project.version = "0.0.1-SNAPSHOT" import net.fabricmc.loom.task.RunClientTask -import net.fabricmc.loom.task.RunServerTask allprojects { project.group = "textile-api" @@ -45,10 +44,6 @@ allprojects { classpath sourceSets.testmod.runtimeClasspath } - task runTestmodServer(type: RunServerTask) { - classpath sourceSets.testmod.runtimeClasspath - } - dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" From 3a1d34dc3b5e38afb33199308190b46e04ec7a21 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 19:15:53 +0530 Subject: [PATCH 06/11] Repackage + Builder improvements --- .DS_Store | Bin 0 -> 8196 bytes .../api/recipe/event/v1/Dispatcher.java | 14 ------ .../{event => }/v1/CraftingRecipeType.java | 2 +- .../textile/api/recipe/v1/Dispatcher.java | 26 +++++++++++ .../{event => }/v1/ShapelessRecipe.java | 41 +++++++----------- .../api/recipe/v1/ShapelessRecipeBuilder.java | 33 ++++++++++++++ .../{event => }/v1/SimpleDispatcher.java | 2 +- .../v1 => v1/event}/ShapedRecipeCallback.java | 2 +- .../textile/impl/recipe/DispatcherHolder.java | 9 ++++ .../mixin/recipe/RecipeDispatcherMixin.java | 2 +- .../{event => }/v1/test/RecipeTest.java | 4 +- .../src/testmod/resources/fabric.mod.json | 2 +- 12 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 .DS_Store delete mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/Dispatcher.java rename textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/{event => }/v1/CraftingRecipeType.java (96%) create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/Dispatcher.java rename textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/{event => }/v1/ShapelessRecipe.java (63%) create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipeBuilder.java rename textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/{event => }/v1/SimpleDispatcher.java (93%) rename textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/{event/v1 => v1/event}/ShapedRecipeCallback.java (96%) create mode 100644 textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java rename textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/{event => }/v1/test/RecipeTest.java (81%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d3da24fe2239f7931e26be42d75c8c56e372b760 GIT binary patch literal 8196 zcmeHM-Hy^g6g~qiTUZq~(MV!UdgI+LfnD9i3ll^(aW72FV)R1IE``cA>9&Lxa77IF zK7n5N3OrD);3rm=%Rz z=QUL_>dZDg1D~jOm;NMUHYc?;&nsr}Z)mAH@75Fa| z;O_?$mHUSBbLqva14e8C;Bz=F3fkBQ2#%?IL;1P%f{K`O_rMgDsVxSRbX+$%9KNCa zTzW|-Ch5df&rI!5nCKlmQ^1Keq}Ns}pcP0f!1wMOWYLHma%1~<{vbU>t^O26P_HbJ zRHZ%*sY5;R?8v^K^S&l{`SnUg1GM(-n)OO7M zd$rk)IlaG!_TBx1*{opPyi>wEkL zaCC_Rq(CTA!NaW!ewT87nmo8A{h-@0;j0bFhagC{-h>DboMZJ-VIusEd z@n|h)n2N;HZW(DVZ-cmRFnaxm9=d1+E~5fjIp_-C{~xaZ{(l*#rpK%m& { - void accept(T recipe); - - ItemStack getOutput(List stacks); -} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/CraftingRecipeType.java similarity index 96% rename from textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java rename to textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/CraftingRecipeType.java index 6824191..4fef469 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/CraftingRecipeType.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/CraftingRecipeType.java @@ -1,4 +1,4 @@ -package net.textilemc.textile.api.recipe.event.v1; +package net.textilemc.textile.api.recipe.v1; import java.util.Arrays; import java.util.List; diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/Dispatcher.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/Dispatcher.java new file mode 100644 index 0000000..413fc38 --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/Dispatcher.java @@ -0,0 +1,26 @@ +package net.textilemc.textile.api.recipe.v1; + +import java.util.Collections; +import java.util.List; + +import net.textilemc.textile.impl.recipe.DispatcherHolder; + +import net.minecraft.item.ItemStack; + +/** + * Stores a bunch of recipes + */ +public interface Dispatcher { + void accept(T recipe); + + ItemStack getOutput(List stacks); + + static void register(Dispatcher dispatcher) { + DispatcherHolder.DISPATCHERS.add(dispatcher); + } + + static List> getAll() { + return Collections.unmodifiableList(DispatcherHolder.DISPATCHERS); + } + +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java similarity index 63% rename from textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java rename to textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java index 3a69914..70cb68a 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapelessRecipe.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java @@ -1,9 +1,7 @@ -package net.textilemc.textile.api.recipe.event.v1; +package net.textilemc.textile.api.recipe.v1; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Objects; import com.google.common.base.Preconditions; @@ -24,7 +22,7 @@ public class ShapelessRecipe implements CraftingRecipeType { * @param ingredients The ingredients * @throws IllegalArgumentException If the size of ingredients is 0 */ - private ShapelessRecipe(ItemStack output, ArrayList ingredients) { + public ShapelessRecipe(ItemStack output, ArrayList ingredients) { Preconditions.checkArgument(ingredients.size() > 0); this.output = output; this.ingredients = ingredients; @@ -52,37 +50,30 @@ public boolean matches(List items, World world) { } public static Builder builder(ItemStack output) { - return new Builder(output); + return new ShapelessRecipeBuilder(output); } /** * Helper class for creating shapeless recipes */ - public static class Builder { - private final ItemStack output; - private final ArrayList stacks = new ArrayList<>(); - - private Builder(ItemStack output) { - this.output = output; - } - - public Builder add(ItemStack stack) { - this.stacks.add(Objects.requireNonNull(stack)); - return this; - } + public interface Builder { + /** + * @param stack The item stack to be added to the shapeless recipe + * @return This builder + */ + Builder add(ItemStack stack); - public Builder add(Item item) { - return this.add(new ItemStack(Objects.requireNonNull(item))); - } + /** + * @param item The item to be added to the shapeless recipe + * @return This builder + */ + Builder add(Item item); /** * Converts this builder to a recipe + * * @return a shapeless recipe */ - @SuppressWarnings("unchecked") - public ShapelessRecipe build() { - Preconditions.checkArgument(this.stacks.size() > 0, "Empty Shapeless Recipe"); - return new ShapelessRecipe(this.output, (ArrayList) this.stacks.clone()); - } + ShapelessRecipe build(); } } diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipeBuilder.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipeBuilder.java new file mode 100644 index 0000000..8afb54e --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipeBuilder.java @@ -0,0 +1,33 @@ +package net.textilemc.textile.api.recipe.v1; + +import java.util.ArrayList; +import java.util.Objects; + +import com.google.common.base.Preconditions; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ShapelessRecipeBuilder implements ShapelessRecipe.Builder { + private final ItemStack output; + private final ArrayList stacks = new ArrayList<>(); + + ShapelessRecipeBuilder(ItemStack output) { + this.output = output; + } + + public ShapelessRecipeBuilder add(ItemStack stack) { + this.stacks.add(Objects.requireNonNull(stack)); + return this; + } + + public ShapelessRecipeBuilder add(Item item) { + return this.add(new ItemStack(Objects.requireNonNull(item))); + } + + @SuppressWarnings("unchecked") + public ShapelessRecipe build() { + Preconditions.checkArgument(this.stacks.size() > 0, "Empty Shapeless Recipe"); + return new ShapelessRecipe(this.output, (ArrayList) this.stacks.clone()); + } +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/SimpleDispatcher.java similarity index 93% rename from textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java rename to textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/SimpleDispatcher.java index 92ba805..0936516 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/SimpleDispatcher.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/SimpleDispatcher.java @@ -1,4 +1,4 @@ -package net.textilemc.textile.api.recipe.event.v1; +package net.textilemc.textile.api.recipe.v1; import java.util.ArrayList; import java.util.List; diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/event/ShapedRecipeCallback.java similarity index 96% rename from textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java rename to textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/event/ShapedRecipeCallback.java index 50d3d6d..91f0323 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/event/v1/ShapedRecipeCallback.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/event/ShapedRecipeCallback.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package net.textilemc.textile.api.recipe.event.v1; +package net.textilemc.textile.api.recipe.v1.event; import net.textilemc.textile.api.event.Event; import net.textilemc.textile.api.event.EventFactory; diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java new file mode 100644 index 0000000..a7fb36b --- /dev/null +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java @@ -0,0 +1,9 @@ +package net.textilemc.textile.impl.recipe; + +import java.util.LinkedList; + +import net.textilemc.textile.api.recipe.v1.Dispatcher; + +public class DispatcherHolder { + public static final LinkedList> DISPATCHERS = new LinkedList<>(); +} diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java index 762966f..d0294ca 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java @@ -21,7 +21,7 @@ import java.util.Comparator; import java.util.List; -import net.textilemc.textile.api.recipe.event.v1.ShapedRecipeCallback; +import net.textilemc.textile.api.recipe.v1.event.ShapedRecipeCallback; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java similarity index 81% rename from textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java rename to textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java index 45cc68c..ceca833 100644 --- a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/event/v1/test/RecipeTest.java +++ b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java @@ -1,6 +1,6 @@ -package net.textilemc.textile.api.recipe.event.v1.test; +package net.textilemc.textile.api.recipe.v1.test; -import net.textilemc.textile.api.recipe.event.v1.ShapelessRecipe; +import net.textilemc.textile.api.recipe.v1.ShapelessRecipe; import net.minecraft.block.Block; import net.minecraft.item.Item; diff --git a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json index 7d768f2..cb8d442 100644 --- a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json +++ b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json @@ -12,7 +12,7 @@ }, "entrypoints": { "main": [ - "net.textilemc.textile.api.recipe.event.v1.test.RecipeTest" + "net.textilemc.textile.api.recipe.v1.test.RecipeTest" ] } } From db52895e929aaeb7770ca0710944a152a3c88a61 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 19:45:34 +0530 Subject: [PATCH 07/11] Actually implement it --- .../mixin/recipe/RecipeDispatcherMixin.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java index d0294ca..17089ec 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/mixin/recipe/RecipeDispatcherMixin.java @@ -17,15 +17,21 @@ package net.textilemc.textile.mixin.recipe; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; +import net.textilemc.textile.api.recipe.v1.Dispatcher; import net.textilemc.textile.api.recipe.v1.event.ShapedRecipeCallback; +import net.textilemc.textile.impl.recipe.DispatcherHolder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeDispatcher; @@ -41,4 +47,15 @@ public void interceptSort(List list, Comparator c) { //noinspection Java8ListSort Collections.sort(list, c); } + + @Inject(method = "method_304", at = @At("RETURN"), cancellable = true) + public void beforeReturn(int[] is, CallbackInfoReturnable cir) { + for (Dispatcher dispatcher : DispatcherHolder.DISPATCHERS) { + ItemStack out = dispatcher.getOutput(Arrays.stream(is).mapToObj(ItemStack::new).collect(Collectors.toList())); + if (out != null) { + cir.setReturnValue(out); + break; + } + } + } } From 34ae402487412ef11d4d292793b15430e2849d09 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 20:17:29 +0530 Subject: [PATCH 08/11] Println --- .../net/textilemc/textile/api/recipe/v1/test/RecipeTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java index ceca833..ed4de8b 100644 --- a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java +++ b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java @@ -11,6 +11,7 @@ public class RecipeTest implements ModInitializer { @Override public void onInitialize() { + System.out.println("Shapeless Recipes"); ShapelessRecipe.DISPATCHER.accept(ShapelessRecipe.builder(new ItemStack(Item.COAL)) .add(new ItemStack(Block.LOG)) .add(new ItemStack(Block.DIRT)) From 8b1e658947c83610077756d44d79d70eaec382fc Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 20:25:03 +0530 Subject: [PATCH 09/11] prelaunch --- .../textilemc/textile/api/recipe/v1/test/RecipeTest.java | 6 +++--- textile-recipe-api-v1/src/testmod/resources/fabric.mod.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java index ed4de8b..e344d4f 100644 --- a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java +++ b/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java @@ -6,11 +6,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -public class RecipeTest implements ModInitializer { +public class RecipeTest implements PreLaunchEntrypoint { @Override - public void onInitialize() { + public void onPreLaunch() { System.out.println("Shapeless Recipes"); ShapelessRecipe.DISPATCHER.accept(ShapelessRecipe.builder(new ItemStack(Item.COAL)) .add(new ItemStack(Block.LOG)) diff --git a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json index cb8d442..21a5e07 100644 --- a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json +++ b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json @@ -11,7 +11,7 @@ "sources": "https://github.com/TextileMC/textile-api" }, "entrypoints": { - "main": [ + "preLaunch": [ "net.textilemc.textile.api.recipe.v1.test.RecipeTest" ] } From e3401ed033c44dd0f757108911e93cb6ca63b508 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 20:34:21 +0530 Subject: [PATCH 10/11] Register the dispatcher :concern: --- .../net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java | 4 ++++ .../net/textilemc/textile/impl/recipe/DispatcherHolder.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java index 70cb68a..b97b459 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/api/recipe/v1/ShapelessRecipe.java @@ -53,6 +53,10 @@ public static Builder builder(ItemStack output) { return new ShapelessRecipeBuilder(output); } + static { + Dispatcher.register(DISPATCHER); + } + /** * Helper class for creating shapeless recipes */ diff --git a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java index a7fb36b..2b54f93 100644 --- a/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/DispatcherHolder.java @@ -3,6 +3,8 @@ import java.util.LinkedList; import net.textilemc.textile.api.recipe.v1.Dispatcher; +import net.textilemc.textile.api.recipe.v1.ShapelessRecipe; +import net.textilemc.textile.api.recipe.v1.SimpleDispatcher; public class DispatcherHolder { public static final LinkedList> DISPATCHERS = new LinkedList<>(); From 448c1d916520d346ff74b7a43d325f659392de89 Mon Sep 17 00:00:00 2001 From: SD Date: Wed, 6 Jan 2021 20:46:52 +0530 Subject: [PATCH 11/11] temperory test --- .../java/net/textilemc/textile/impl/recipe}/RecipeTest.java | 2 +- textile-recipe-api-v1/src/main/resources/fabric.mod.json | 5 +++++ textile-recipe-api-v1/src/testmod/resources/fabric.mod.json | 5 ----- 3 files changed, 6 insertions(+), 6 deletions(-) rename textile-recipe-api-v1/src/{testmod/java/net/textilemc/textile/api/recipe/v1/test => main/java/net/textilemc/textile/impl/recipe}/RecipeTest.java (92%) diff --git a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/RecipeTest.java similarity index 92% rename from textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java rename to textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/RecipeTest.java index e344d4f..43f9c2d 100644 --- a/textile-recipe-api-v1/src/testmod/java/net/textilemc/textile/api/recipe/v1/test/RecipeTest.java +++ b/textile-recipe-api-v1/src/main/java/net/textilemc/textile/impl/recipe/RecipeTest.java @@ -1,4 +1,4 @@ -package net.textilemc.textile.api.recipe.v1.test; +package net.textilemc.textile.impl.recipe; import net.textilemc.textile.api.recipe.v1.ShapelessRecipe; diff --git a/textile-recipe-api-v1/src/main/resources/fabric.mod.json b/textile-recipe-api-v1/src/main/resources/fabric.mod.json index cf3558b..8fb2822 100644 --- a/textile-recipe-api-v1/src/main/resources/fabric.mod.json +++ b/textile-recipe-api-v1/src/main/resources/fabric.mod.json @@ -20,5 +20,10 @@ "depends": { "fabricloader": "*", "minecraft": "20100618" + }, + "entrypoints": { + "preLaunch": [ + "net.textilemc.textile.impl.recipe.RecipeTest" + ] } } diff --git a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json index 21a5e07..df4ee51 100644 --- a/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json +++ b/textile-recipe-api-v1/src/testmod/resources/fabric.mod.json @@ -9,10 +9,5 @@ "contact": { "issues": "https://github.com/TextileMC/textile-api/issues", "sources": "https://github.com/TextileMC/textile-api" - }, - "entrypoints": { - "preLaunch": [ - "net.textilemc.textile.api.recipe.v1.test.RecipeTest" - ] } }