diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 38369f98b..6ed5a8eb1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,8 +34,19 @@ jobs: path: build/libs/ - name: Publish to github packages env: + KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} + KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} + KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew publish + run: ./gradlew publishMavenPublicationToGitHubPackagesRepository --no-daemon --max-workers 1 + - name: Publish to modmaven + env: + KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} + KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} + KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} + MODMAVEN_USER: ${{ secrets.MODMAVEN_USER }} + MODMAVEN_PASSWORD: ${{ secrets.MODMAVEN_PASSWORD }} + run: ./gradlew publishMavenPublicationToModmavenRepository --no-daemon --max-workers 1 - name: Upload to curseforge env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/build.gradle b/build.gradle index c541a322c..6702786a8 100644 --- a/build.gradle +++ b/build.gradle @@ -210,6 +210,14 @@ publishing { name = "GitHubPackages" url = "https://maven.pkg.github.com/AppliedEnergistics/Applied-Energistics-2" } + maven { + credentials { + username System.getenv("MODMAVEN_USER") + password System.getenv("MODMAVEN_PASSWORD") + } + name = "modmaven" + url = "https://modmaven.k-4u.nl/artifactory/local-releases/" + } } } diff --git a/src/api/java/appeng/api/crafting/ICraftingHelper.java b/src/api/java/appeng/api/crafting/ICraftingHelper.java index 6e3c55aeb..093f1ccee 100644 --- a/src/api/java/appeng/api/crafting/ICraftingHelper.java +++ b/src/api/java/appeng/api/crafting/ICraftingHelper.java @@ -53,6 +53,8 @@ public interface ICraftingHelper { * @param stack If null, a new item will be created to hold the encoded pattern. * Otherwise the given item must already contains an encoded * pattern that will be overwritten. + * @throws IllegalArgumentException If either in or out contain only empty + * ItemStacks. * @return A new encoded pattern, or the given stack with the pattern encoded in * it. */ @@ -73,6 +75,8 @@ public interface ICraftingHelper { * operation by the ME system. * @param allowSubstitutes Controls whether the ME system will allow the use of * equivalent items to craft this recipe. + * @throws IllegalArgumentException If either in or out contain only empty + * ItemStacks. */ ItemStack encodeCraftingPattern(@Nullable ItemStack stack, CraftingRecipe recipe, ItemStack[] in, ItemStack out, boolean allowSubstitutes); diff --git a/src/main/java/appeng/container/implementations/PatternTermContainer.java b/src/main/java/appeng/container/implementations/PatternTermContainer.java index 6075bb517..55e2e32b6 100644 --- a/src/main/java/appeng/container/implementations/PatternTermContainer.java +++ b/src/main/java/appeng/container/implementations/PatternTermContainer.java @@ -267,13 +267,19 @@ public class PatternTermContainer extends MEMonitorableContainer return new ItemStack[] { out }; } } else { + boolean hasValue = false; final ItemStack[] list = new ItemStack[3]; for (int i = 0; i < this.outputSlots.length; i++) { final ItemStack out = this.outputSlots[i].getStack(); list[i] = out; + if (!out.isEmpty()) { + hasValue = true; + } + } + if (hasValue) { + return list; } - return list; } return null; diff --git a/src/main/java/appeng/core/api/ApiCrafting.java b/src/main/java/appeng/core/api/ApiCrafting.java index d2b6edf23..a89c5816c 100644 --- a/src/main/java/appeng/core/api/ApiCrafting.java +++ b/src/main/java/appeng/core/api/ApiCrafting.java @@ -115,7 +115,12 @@ public class ApiCrafting implements ICraftingHelper { // We use the shared itemstack for an identity lookup. IAEItemStack ais = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(is); - return new CraftingPatternDetails(ais, world); + try { + return new CraftingPatternDetails(ais, world); + } catch (IllegalStateException e) { + AELog.warn("Could not decode an invalid pattern %s: %s", is, e); + return null; + } } private boolean attemptRecovery(EncodedPatternItem patternItem, ItemStack itemStack, World world) { diff --git a/src/main/java/appeng/items/misc/EncodedPatternItem.java b/src/main/java/appeng/items/misc/EncodedPatternItem.java index 36c728938..16b85cac8 100644 --- a/src/main/java/appeng/items/misc/EncodedPatternItem.java +++ b/src/main/java/appeng/items/misc/EncodedPatternItem.java @@ -299,14 +299,27 @@ public class EncodedPatternItem extends AEBaseItem implements AEToolItem { final ListTag tagIn = new ListTag(); final ListTag tagOut = new ListTag(); + boolean hasInput = false; for (final ItemStack i : in) { tagIn.add(createItemTag(i)); + if (!i.isEmpty()) { + hasInput = true; + } } + Preconditions.checkArgument(hasInput, "cannot encode a pattern that has no inputs."); + + boolean hasNonEmptyOutput = false; for (final ItemStack i : out) { tagOut.add(createItemTag(i)); + if (!i.isEmpty()) { + hasNonEmptyOutput = true; + } } + // Patterns without any outputs are corrupt! Never encode such a pattern. + Preconditions.checkArgument(hasNonEmptyOutput, "cannot encode a pattern that has no output."); + encodedValue.put(EncodedPatternItem.NBT_INGREDIENTS, tagIn); encodedValue.put(EncodedPatternItem.NBT_PRODUCTS, tagOut); return encodedValue;