diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 999542b..1f8ab8d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,17 +12,18 @@ jobs: # Use these Java versions java: [ 17, # Current Java LTS & minimum supported by Minecraft + 21, # Current Java LTS ] # and run on both Linux and Windows os: [ubuntu-22.04, windows-2022] runs-on: ${{ matrix.os }} steps: - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: validate gradle wrapper uses: gradle/wrapper-validation-action@v1 - name: setup jdk ${{ matrix.java }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.java }} distribution: "microsoft" @@ -32,7 +33,7 @@ jobs: - name: build run: ./gradlew build - name: capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS + if: ${{ runner.os == 'Linux' && matrix.java == '21' }} # Only upload artifacts built from latest java on one OS uses: actions/upload-artifact@v3 with: name: Artifacts diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 7f4d70b..6ce3faa 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -8,12 +8,12 @@ jobs: publish: runs-on: ubuntu-22.04 env: - JAVA_VERSION: 17 + JAVA_VERSION: 21 steps: - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: checkout mcmod repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: Aton-Kish/mcmod ref: maven @@ -22,7 +22,7 @@ jobs: - name: validate gradle wrapper uses: gradle/wrapper-validation-action@v1 - name: setup jdk ${{ env.JAVA_VERSION }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ env.JAVA_VERSION }} distribution: "microsoft" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 05e64f1..4774f44 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -8,16 +8,16 @@ jobs: release: runs-on: ubuntu-22.04 env: - JAVA_VERSION: 17 + JAVA_VERSION: 21 ORG_GRADLE_PROJECT_curseforge_token: ${{ secrets.CURSEFORGE_TOKEN }} ORG_GRADLE_PROJECT_modrinth_token: ${{ secrets.MODRINTH_TOKEN }} steps: - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: validate gradle wrapper uses: gradle/wrapper-validation-action@v1 - name: setup jdk ${{ env.JAVA_VERSION }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ env.JAVA_VERSION }} distribution: "microsoft" diff --git a/build.gradle b/build.gradle index b6ae420..cba672c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.3-SNAPSHOT" + id "fabric-loom" version "1.4-SNAPSHOT" id "maven-publish" id "com.matthewprenger.cursegradle" version "1.4.0" id "com.modrinth.minotaur" version "2.+" @@ -86,6 +86,10 @@ dependencies { modImplementation "com.misterpemodder:shulkerboxtooltip-fabric:${project.shulker_box_tooltip_version}" } +loom { + accessWidenerPath = file("src/main/resources/${project.mod_id}.accesswidener") +} + processResources { inputs.property "version", project.version @@ -150,8 +154,7 @@ curseforge { addGameVersion "Fabric" addGameVersion "Java 17" - addGameVersion "1.20" - addGameVersion "1.20.1" + addGameVersion "1.20.2" relations { requiredDependency "fabric-api" @@ -175,7 +178,7 @@ modrinth { versionType = "release" changelog = "[v${project.version}](https://github.com/Aton-Kish/reinforced-shulker-boxes/releases/tag/v" + java.net.URLEncoder.encode(project.version, "UTF-8") + ")" - gameVersions = ["1.20", "1.20.1"] + gameVersions = ["1.20.2"] loaders = ["fabric"] dependencies { diff --git a/gradle.properties b/gradle.properties index 59c75ad..d663e79 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,22 +4,22 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.20.1 - yarn_mappings=1.20.1+build.10 - loader_version=0.14.22 + minecraft_version=1.20.2 + yarn_mappings=1.20.2+build.2 + loader_version=0.15.1 # Mod Properties - mod_version=2.5.0+1.20 + mod_version=2.5.1+1.20 mod_id=reinfshulker maven_group=atonkish.reinfshulker archives_base_name=reinforced-shulker-boxes # Dependencies - fabric_version=0.87.0+1.20.1 - reinforced_core_version=3.1.2+1.20 - reinforced_chests_version=2.4.2+1.20 + fabric_version=0.91.2+1.20.2 + reinforced_core_version=3.1.3+1.20 + reinforced_chests_version=2.4.3+1.20 quick_shulker_version=1.4.0-1.20 - shulker_box_tooltip_version=4.0.3+1.20 + shulker_box_tooltip_version=4.0.7+1.20.2 # Quick Shulker deps shulkerutils_version=1.0.4-1.19 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 62f495d..1af9e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index fcb6fca..1aa94a4 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/src/main/java/atonkish/reinfshulker/block/ReinforcedShulkerBoxBlock.java b/src/main/java/atonkish/reinfshulker/block/ReinforcedShulkerBoxBlock.java index 39da1fc..8803acb 100644 --- a/src/main/java/atonkish/reinfshulker/block/ReinforcedShulkerBoxBlock.java +++ b/src/main/java/atonkish/reinfshulker/block/ReinforcedShulkerBoxBlock.java @@ -45,7 +45,8 @@ public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { @Nullable public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { - return checkType(type, ModBlockEntityType.REINFORCED_SHULKER_BOX_MAP.get(this.material), + return ReinforcedShulkerBoxBlock.validateTicker(type, + ModBlockEntityType.REINFORCED_SHULKER_BOX_MAP.get(this.material), ReinforcedShulkerBoxBlockEntity::tick); } diff --git a/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxColoringRecipe.java b/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxColoringRecipe.java index bfef0ea..f1e206e 100644 --- a/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxColoringRecipe.java +++ b/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxColoringRecipe.java @@ -10,7 +10,6 @@ import net.minecraft.recipe.SpecialCraftingRecipe; import net.minecraft.recipe.book.CraftingRecipeCategory; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.util.Identifier; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -19,8 +18,8 @@ import atonkish.reinfshulker.block.ReinforcedShulkerBoxBlock; public class ReinforcedShulkerBoxColoringRecipe extends SpecialCraftingRecipe { - public ReinforcedShulkerBoxColoringRecipe(Identifier identifier, CraftingRecipeCategory category) { - super(identifier, category); + public ReinforcedShulkerBoxColoringRecipe(CraftingRecipeCategory craftingRecipeCategory) { + super(craftingRecipeCategory); } @Override diff --git a/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxCraftingRecipe.java b/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxCraftingRecipe.java index 9ca932e..964ac62 100644 --- a/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxCraftingRecipe.java +++ b/src/main/java/atonkish/reinfshulker/recipe/ReinforcedShulkerBoxCraftingRecipe.java @@ -1,16 +1,16 @@ package atonkish.reinfshulker.recipe; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang3.NotImplementedException; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.item.ItemStack; @@ -21,19 +21,18 @@ import net.minecraft.recipe.ShapedRecipe; import net.minecraft.recipe.book.CraftingRecipeCategory; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; public class ReinforcedShulkerBoxCraftingRecipe extends ShapedRecipe { - public ReinforcedShulkerBoxCraftingRecipe(Identifier id, String group, CraftingRecipeCategory category, int width, - int height, DefaultedList input, ItemStack output, boolean showNotification) { - super(id, group, category, width, height, input, output, showNotification); + public ReinforcedShulkerBoxCraftingRecipe(String group, CraftingRecipeCategory category, int width, int height, + DefaultedList ingredients, ItemStack result, boolean showNotification) { + super(group, category, width, height, ingredients, result, showNotification); } - public ReinforcedShulkerBoxCraftingRecipe(Identifier id, String group, CraftingRecipeCategory category, - int width, int height, DefaultedList input, ItemStack output) { - this(id, group, category, width, height, input, output, true); + public ReinforcedShulkerBoxCraftingRecipe(String group, CraftingRecipeCategory category, int width, int height, + DefaultedList ingredients, ItemStack result) { + this(group, category, width, height, ingredients, result, true); + } @Override @@ -43,7 +42,7 @@ public RecipeSerializer getSerializer() { @Override public ItemStack craft(RecipeInputInventory recipeInputInventory, DynamicRegistryManager dynamicRegistryManager) { - ItemStack itemStack = this.getOutput(dynamicRegistryManager).copy(); + ItemStack itemStack = this.getResult(dynamicRegistryManager).copy(); NbtCompound nbtCompound = recipeInputInventory.getStack(4).getNbt(); if (nbtCompound != null) { @@ -53,73 +52,15 @@ public ItemStack craft(RecipeInputInventory recipeInputInventory, DynamicRegistr return itemStack; } - /** - * Compiles a pattern and series of symbols into a list of ingredients (the - * matrix) suitable for matching against a crafting grid. - */ - static DefaultedList createPatternMatrix(String[] pattern, Map symbols, int width, - int height) { - DefaultedList defaultedList = DefaultedList.ofSize(width * height, Ingredient.EMPTY); - HashSet set = Sets.newHashSet(symbols.keySet()); - set.remove(" "); - - for (int i = 0; i < pattern.length; ++i) { - for (int j = 0; j < pattern[i].length(); ++j) { - String string = pattern[i].substring(j, j + 1); - Ingredient ingredient = symbols.get(string); - if (ingredient == null) { - throw new JsonSyntaxException( - "Pattern references symbol '" + string + "' but it's not defined in the key"); - } - - set.remove(string); - defaultedList.set(j + width * i, ingredient); - } - } - - if (!set.isEmpty()) { - throw new JsonSyntaxException("Key defines symbols that aren't used in pattern: " + set); - } - - return defaultedList; - } - - /** - * Removes empty space from around the recipe pattern. - * - *

- * Turns patterns such as: - *

- * - *
-     * {@code
-     * "   o"
-     * "   a"
-     * "    "
-     * }
-     * 
- * - * Into: - * - *
-     * {@code
-     * "o"
-     * "a"
-     * }
-     * 
- * - * @return a new recipe pattern with all leading and trailing empty rows/columns - * removed - */ @VisibleForTesting - static String[] removePadding(String... pattern) { + static String[] removePadding(List pattern) { int i = Integer.MAX_VALUE; int j = 0; int k = 0; int l = 0; - for (int m = 0; m < pattern.length; ++m) { - String string = pattern[m]; + for (int m = 0; m < pattern.size(); ++m) { + String string = pattern.get(m); i = Math.min(i, ReinforcedShulkerBoxCraftingRecipe.findFirstSymbol(string)); int n = ReinforcedShulkerBoxCraftingRecipe.findLastSymbol(string); j = Math.max(j, n); @@ -135,14 +76,14 @@ static String[] removePadding(String... pattern) { l = 0; } - if (pattern.length == l) { + if (pattern.size() == l) { return new String[0]; } - String[] strings = new String[pattern.length - l - k]; + String[] strings = new String[pattern.size() - l - k]; for (int o = 0; o < strings.length; ++o) { - strings[o] = pattern[o + k].substring(i, j + 1); + strings[o] = pattern.get(o + k).substring(i, j + 1); } return strings; @@ -164,86 +105,20 @@ private static int findLastSymbol(String pattern) { return i; } - static String[] getPattern(JsonArray json) { - String[] strings = new String[json.size()]; - if (strings.length > 3) { - throw new JsonSyntaxException("Invalid pattern: too many rows, 3 is maximum"); - } - - if (strings.length == 0) { - throw new JsonSyntaxException("Invalid pattern: empty pattern not allowed"); - } - - for (int i = 0; i < strings.length; ++i) { - String string = JsonHelper.asString(json.get(i), "pattern[" + i + "]"); - if (string.length() > 3) { - throw new JsonSyntaxException("Invalid pattern: too many columns, 3 is maximum"); - } - - if (i > 0 && strings[0].length() != string.length()) { - throw new JsonSyntaxException("Invalid pattern: each row must be the same width"); - } - - strings[i] = string; - } - - return strings; - } - - /** - * Reads the pattern symbols. - * - * @return a mapping from a symbol to the ingredient it represents - */ - static Map readSymbols(JsonObject json) { - HashMap map = Maps.newHashMap(); - - for (Map.Entry entry : json.entrySet()) { - if (entry.getKey().length() != 1) { - throw new JsonSyntaxException( - "Invalid key entry: '" + entry.getKey() + "' is an invalid symbol (must be 1 character only)."); - } - - if (" ".equals(entry.getKey())) { - throw new JsonSyntaxException("Invalid key entry: ' ' is a reserved symbol."); - } - - map.put(entry.getKey(), Ingredient.fromJson(entry.getValue())); - } - - map.put(" ", Ingredient.EMPTY); - - return map; - } - public static class Serializer implements RecipeSerializer { - @Override - public ReinforcedShulkerBoxCraftingRecipe read(Identifier identifier, JsonObject jsonObject) { - String string = JsonHelper.getString(jsonObject, "group", ""); - CraftingRecipeCategory craftingRecipeCategory = CraftingRecipeCategory.CODEC - .byId(JsonHelper.getString(jsonObject, "category", null), CraftingRecipeCategory.MISC); - Map map = ReinforcedShulkerBoxCraftingRecipe - .readSymbols(JsonHelper.getObject(jsonObject, "key")); - String[] strings = ReinforcedShulkerBoxCraftingRecipe.removePadding( - ReinforcedShulkerBoxCraftingRecipe.getPattern(JsonHelper.getArray(jsonObject, "pattern"))); - int i = strings[0].length(); - int j = strings.length; - DefaultedList defaultedList = ReinforcedShulkerBoxCraftingRecipe.createPatternMatrix(strings, - map, i, j); - ItemStack itemStack = ReinforcedShulkerBoxCraftingRecipe - .outputFromJson(JsonHelper.getObject(jsonObject, "result")); - boolean bl = JsonHelper.getBoolean(jsonObject, "show_notification", true); - - return new ReinforcedShulkerBoxCraftingRecipe(identifier, string, craftingRecipeCategory, i, j, - defaultedList, itemStack, bl); + static final Codec> PATTERN_CODEC; + static final Codec KEY_ENTRY_CODEC; + private static final Codec CODEC; + + public Codec codec() { + return CODEC; } - @Override - public ReinforcedShulkerBoxCraftingRecipe read(Identifier identifier, PacketByteBuf packetByteBuf) { + public ReinforcedShulkerBoxCraftingRecipe read(PacketByteBuf packetByteBuf) { int i = packetByteBuf.readVarInt(); int j = packetByteBuf.readVarInt(); String string = packetByteBuf.readString(); - CraftingRecipeCategory craftingRecipeCategory = packetByteBuf + CraftingRecipeCategory craftingRecipeCategory = (CraftingRecipeCategory) packetByteBuf .readEnumConstant(CraftingRecipeCategory.class); DefaultedList defaultedList = DefaultedList.ofSize(i * j, Ingredient.EMPTY); @@ -253,22 +128,109 @@ public ReinforcedShulkerBoxCraftingRecipe read(Identifier identifier, PacketByte ItemStack itemStack = packetByteBuf.readItemStack(); boolean bl = packetByteBuf.readBoolean(); - - return new ReinforcedShulkerBoxCraftingRecipe(identifier, string, craftingRecipeCategory, i, j, - defaultedList, itemStack, bl); + return new ReinforcedShulkerBoxCraftingRecipe(string, craftingRecipeCategory, i, j, defaultedList, + itemStack, bl); } - @Override public void write(PacketByteBuf packetByteBuf, ReinforcedShulkerBoxCraftingRecipe recipe) { packetByteBuf.writeVarInt(recipe.getWidth()); packetByteBuf.writeVarInt(recipe.getHeight()); packetByteBuf.writeString(recipe.getGroup()); packetByteBuf.writeEnumConstant(recipe.getCategory()); - for (Ingredient ingredient : recipe.getIngredients()) { + Iterator ingredientsIterator = recipe.getIngredients().iterator(); + + while (ingredientsIterator.hasNext()) { + Ingredient ingredient = ingredientsIterator.next(); ingredient.write(packetByteBuf); } - packetByteBuf.writeItemStack(recipe.getOutput(null)); + + packetByteBuf.writeItemStack(recipe.getResult(null)); packetByteBuf.writeBoolean(recipe.showNotification()); } + + static { + PATTERN_CODEC = Codec.STRING.listOf().flatXmap((rows) -> { + if (rows.size() > 3) { + return DataResult.error(() -> { + return "Invalid pattern: too many rows, 3 is maximum"; + }); + } else if (rows.isEmpty()) { + return DataResult.error(() -> { + return "Invalid pattern: empty pattern not allowed"; + }); + } else { + int i = ((String) rows.get(0)).length(); + Iterator rowsIterator = rows.iterator(); + + String string; + do { + if (!rowsIterator.hasNext()) { + return DataResult.success(rows); + } + + string = rowsIterator.next(); + if (string.length() > 3) { + return DataResult.error(() -> { + return "Invalid pattern: too many columns, 3 is maximum"; + }); + } + } while (i == string.length()); + + return DataResult.error(() -> { + return "Invalid pattern: each row must be the same width"; + }); + } + }, DataResult::success); + KEY_ENTRY_CODEC = Codec.STRING.flatXmap((keyEntry) -> { + if (keyEntry.length() != 1) { + return DataResult.error(() -> { + return "Invalid key entry: '" + keyEntry + "' is an invalid symbol (must be 1 character only)."; + }); + } else { + return " ".equals(keyEntry) ? DataResult.error(() -> { + return "Invalid key entry: ' ' is a reserved symbol."; + }) : DataResult.success(keyEntry); + } + }, DataResult::success); + CODEC = ShapedRecipe.Serializer.RawShapedRecipe.CODEC.flatXmap((recipe) -> { + String[] strings = ReinforcedShulkerBoxCraftingRecipe.removePadding(recipe.pattern()); + int i = strings[0].length(); + int j = strings.length; + DefaultedList defaultedList = DefaultedList.ofSize(i * j, Ingredient.EMPTY); + Set set = Sets.newHashSet(recipe.key().keySet()); + + for (int k = 0; k < strings.length; ++k) { + String string = strings[k]; + + for (int l = 0; l < string.length(); ++l) { + String string2 = string.substring(l, l + 1); + Ingredient ingredient = string2.equals(" ") ? Ingredient.EMPTY + : (Ingredient) recipe.key().get(string2); + if (ingredient == null) { + return DataResult.error(() -> { + return "Pattern references symbol '" + string2 + "' but it's not defined in the key"; + }); + } + + set.remove(string2); + defaultedList.set(l + i * k, ingredient); + } + } + + if (!set.isEmpty()) { + return DataResult.error(() -> { + return "Key defines symbols that aren't used in pattern: " + set; + }); + } else { + ReinforcedShulkerBoxCraftingRecipe craftingRecipe = new ReinforcedShulkerBoxCraftingRecipe( + recipe.group(), recipe.category(), i, j, defaultedList, + recipe.result(), recipe.showNotification()); + return DataResult.success(craftingRecipe); + } + }, (recipe) -> { + throw new NotImplementedException( + "Serializing ReinforcedShulkerBoxCraftingRecipe is not implemented yet."); + }); + } } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f33f998..34fd676 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -37,11 +37,12 @@ "environment": "client" } ], + "accessWidener": "reinfshulker.accesswidener", "depends": { - "fabricloader": ">=0.14.21", + "fabricloader": ">=0.15.0", "fabric-api": "*", - "minecraft": "~1.20", + "minecraft": "~1.20.2", "java": ">=17" }, "suggests": { diff --git a/src/main/resources/reinfshulker.accesswidener b/src/main/resources/reinfshulker.accesswidener new file mode 100644 index 0000000..c878c2f --- /dev/null +++ b/src/main/resources/reinfshulker.accesswidener @@ -0,0 +1,3 @@ +accessWidener v2 named + +accessible class net/minecraft/recipe/ShapedRecipe$Serializer$RawShapedRecipe