From 7656157b0d0c9f645d4dbfe1c4eb8180f4c7fd62 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 17 Aug 2020 21:49:37 +0200 Subject: [PATCH 1/8] Fixes #4602: Prevent encoding invalid patterns and handle corrupted patterns a little more gracefully. (#4608) --- .../java/appeng/api/crafting/ICraftingHelper.java | 4 ++++ .../implementations/PatternTermContainer.java | 8 +++++++- src/main/java/appeng/core/api/ApiCrafting.java | 7 ++++++- .../java/appeng/items/misc/EncodedPatternItem.java | 13 +++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/api/java/appeng/api/crafting/ICraftingHelper.java b/src/api/java/appeng/api/crafting/ICraftingHelper.java index 909f26353..b55c5caf8 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, ICraftingRecipe 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 23f8d579b..0898e52bc 100644 --- a/src/main/java/appeng/container/implementations/PatternTermContainer.java +++ b/src/main/java/appeng/container/implementations/PatternTermContainer.java @@ -261,13 +261,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 e4f710bc2..b91888998 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 d3e1e504e..e4734d8de 100644 --- a/src/main/java/appeng/items/misc/EncodedPatternItem.java +++ b/src/main/java/appeng/items/misc/EncodedPatternItem.java @@ -307,14 +307,27 @@ public class EncodedPatternItem extends AEBaseItem { final ListNBT tagIn = new ListNBT(); final ListNBT tagOut = new ListNBT(); + 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; From 41b790070635c60b6a1ec2bade47d8e860dc44f3 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 17 Aug 2020 21:58:51 +0200 Subject: [PATCH 2/8] Fixes #4598: Incorrectly rotated face for determining block lightlevel in ME Chest renderer. (#4599) (#4609) (cherry picked from commit 954ce1442e155cd282a59039fa8b44844412e6a3) --- .../java/appeng/client/render/tesr/ChestTileEntityRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java index 981a3ae10..8eb9ea947 100644 --- a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java @@ -142,7 +142,7 @@ public class ChestTileEntityRenderer extends TileEntityRenderer public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { if (side != null) { - side = r.rotate(side); // This fixes the incorrect lightmap position + side = r.resultingRotate(side); // This fixes the incorrect lightmap position } List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData)); From fc0f8eab563b5c017a06b890aec0c09dd5f204c6 Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 18 Aug 2020 01:33:47 +0200 Subject: [PATCH 3/8] Fixes #4611: Use of client-side only method for Tiny TNT explosion. (#4612) --- src/main/java/appeng/entity/TinyTNTPrimedEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java index f90533cce..cebea022f 100644 --- a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java +++ b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java @@ -140,8 +140,8 @@ public final class TinyTNTPrimedEntity extends TNTEntity implements IEntityAddit return; } - final Explosion ex = new Explosion(this.world, this, this.getPosX(), this.getPosY(), this.getPosZ(), 0.2f, - false, Mode.BREAK); + final Explosion ex = new Explosion(this.world, this, null, null, this.getPosX(), this.getPosY(), this.getPosZ(), + 0.2f, false, Explosion.Mode.BREAK); final AxisAlignedBB area = new AxisAlignedBB(this.getPosX() - 1.5, this.getPosY() - 1.5f, this.getPosZ() - 1.5, this.getPosX() + 1.5, this.getPosY() + 1.5, this.getPosZ() + 1.5); final List list = this.world.getEntitiesWithinAABBExcludingEntity(this, area); From 4e42b17e8197776ba95f37580bec3d5273085904 Mon Sep 17 00:00:00 2001 From: shartte Date: Wed, 19 Aug 2020 16:43:45 +0200 Subject: [PATCH 4/8] Fixes #4590: Crystal seeds (other than certus) don't display their growth stages. (#4618) --- .../appeng/core/api/definitions/ApiItems.java | 16 +++------- .../items/misc/CrystalSeedRendering.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/main/java/appeng/items/misc/CrystalSeedRendering.java diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 3ee08e5c1..e28d72876 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -56,6 +56,7 @@ import appeng.hooks.BlockToolDispenseItemBehavior; import appeng.hooks.MatterCannonDispenseItemBehavior; import appeng.items.materials.MaterialType; import appeng.items.misc.CrystalSeedItem; +import appeng.items.misc.CrystalSeedRendering; import appeng.items.misc.EncodedPatternItem; import appeng.items.misc.PaintBallItem; import appeng.items.misc.PaintBallItemRendering; @@ -299,24 +300,15 @@ public final class ApiItems implements IItems { this.certusCrystalSeed = registry .item("certus_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedCertusQuartzCrystal().item())) - .bootstrap(item -> new IClientSetupComponent() { - @Override - @OnlyIn(Dist.CLIENT) - public void setup() { - // Expose the growth of the seed to the model system - ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:growth"), - (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) - / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); - } - }).features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); this.fluixCrystalSeed = registry .item("fluix_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedFluixCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); this.netherQuartzSeed = registry .item("nether_quartz_seed", props -> new CrystalSeedItem(props, materials.purifiedNetherQuartzCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); GrowingCrystalEntity.TYPE = registry .entity("growing_crystal", GrowingCrystalEntity::new, EntityClassification.MISC) diff --git a/src/main/java/appeng/items/misc/CrystalSeedRendering.java b/src/main/java/appeng/items/misc/CrystalSeedRendering.java new file mode 100644 index 000000000..d053ee802 --- /dev/null +++ b/src/main/java/appeng/items/misc/CrystalSeedRendering.java @@ -0,0 +1,29 @@ +package appeng.items.misc; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import appeng.bootstrap.components.IClientSetupComponent; + +/** + * Exposes a predicate "growth", which is used in the item model to + * differentiate the growth stages. + */ +public class CrystalSeedRendering implements IClientSetupComponent { + private final Item item; + + public CrystalSeedRendering(Item item) { + this.item = item; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void setup() { + // Expose the growth of the seed to the model system + ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:growth"), + (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); + } +} From 33d7f023232eef93314b4377ea32eb26eaa52061 Mon Sep 17 00:00:00 2001 From: shartte Date: Wed, 19 Aug 2020 16:43:47 +0200 Subject: [PATCH 5/8] Fixes #4590: Crystal seeds (other than certus) don't display their growth stages. (#4619) --- .../appeng/core/api/definitions/ApiItems.java | 16 +++------- .../items/misc/CrystalSeedRendering.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/main/java/appeng/items/misc/CrystalSeedRendering.java diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 3ee08e5c1..e28d72876 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -56,6 +56,7 @@ import appeng.hooks.BlockToolDispenseItemBehavior; import appeng.hooks.MatterCannonDispenseItemBehavior; import appeng.items.materials.MaterialType; import appeng.items.misc.CrystalSeedItem; +import appeng.items.misc.CrystalSeedRendering; import appeng.items.misc.EncodedPatternItem; import appeng.items.misc.PaintBallItem; import appeng.items.misc.PaintBallItemRendering; @@ -299,24 +300,15 @@ public final class ApiItems implements IItems { this.certusCrystalSeed = registry .item("certus_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedCertusQuartzCrystal().item())) - .bootstrap(item -> new IClientSetupComponent() { - @Override - @OnlyIn(Dist.CLIENT) - public void setup() { - // Expose the growth of the seed to the model system - ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:growth"), - (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) - / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); - } - }).features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); this.fluixCrystalSeed = registry .item("fluix_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedFluixCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); this.netherQuartzSeed = registry .item("nether_quartz_seed", props -> new CrystalSeedItem(props, materials.purifiedNetherQuartzCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(CrystalSeedRendering::new).features(AEFeature.CRYSTAL_SEEDS).build(); GrowingCrystalEntity.TYPE = registry .entity("growing_crystal", GrowingCrystalEntity::new, EntityClassification.MISC) diff --git a/src/main/java/appeng/items/misc/CrystalSeedRendering.java b/src/main/java/appeng/items/misc/CrystalSeedRendering.java new file mode 100644 index 000000000..d053ee802 --- /dev/null +++ b/src/main/java/appeng/items/misc/CrystalSeedRendering.java @@ -0,0 +1,29 @@ +package appeng.items.misc; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import appeng.bootstrap.components.IClientSetupComponent; + +/** + * Exposes a predicate "growth", which is used in the item model to + * differentiate the growth stages. + */ +public class CrystalSeedRendering implements IClientSetupComponent { + private final Item item; + + public CrystalSeedRendering(Item item) { + this.item = item; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void setup() { + // Expose the growth of the seed to the model system + ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:growth"), + (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); + } +} From 423ab818138333e3b25e233b2e5656ec47a2f9fe Mon Sep 17 00:00:00 2001 From: yueh Date: Mon, 17 Aug 2020 22:28:01 +0200 Subject: [PATCH 6/8] Added step to publish to modmaven (#4607) (cherry picked from commit 7e1bfdb5ac44b7dbc0cdb3fa8cdf7b1cd6c0b4dd) --- .github/workflows/release.yml | 10 +++++++++- build.gradle | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5ffe6854..820f4725d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,7 +55,15 @@ jobs: KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew publish --no-daemon --max-workers 1 + 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: Prepare artifact metadata id: prepare_artifact_metadata run: | diff --git a/build.gradle b/build.gradle index 5abf5b3bd..04ce36ad3 100644 --- a/build.gradle +++ b/build.gradle @@ -205,5 +205,13 @@ 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/" + } } } From b7949e4134a824ec5401b9d3ff1b5cc986f5a611 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 22 Aug 2020 19:56:37 +0200 Subject: [PATCH 7/8] Re-Enabled JEI and TOP in dev. --- gradle.properties | 6 +++--- gradle/scripts/dependencies.gradle | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4ff19df19..189497ac4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,9 +16,9 @@ forge_version=33.0.5 ######################################################### # Provided APIs # ######################################################### -jei_minecraft_version=1.16.1 -jei_version=7.0.0.6 -top_version=3.0.1-beta-4 +jei_minecraft_version=1.16.2 +jei_version=7.1.1.15 +top_version=3.0.3-beta-6 hwyla_version=1.10.8-B72_1.15.2 ctm_version=MC1.15.2-1.1.0.9 diff --git a/gradle/scripts/dependencies.gradle b/gradle/scripts/dependencies.gradle index d29dcfc7a..df637187e 100644 --- a/gradle/scripts/dependencies.gradle +++ b/gradle/scripts/dependencies.gradle @@ -33,8 +33,8 @@ dependencies { compileOnly "mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}:api" // Runtime, Mods -// FIXME 1.16.2 runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") -// FIXME 1.16.2 runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}") + runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") + runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}") //runtimeOnly fg.deobf("team.chisel.ctm:CTM:${ctm_version}") // unit test dependencies From 44c0931c02b2ec02cd39e68c3f87bd39794b6f84 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 23 Aug 2020 20:47:05 +0200 Subject: [PATCH 8/8] Fixes #4635: Actually remove requesters when removing requesters. --- src/main/java/appeng/me/Grid.java | 1 - src/main/java/appeng/me/cache/EnergyGridCache.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index 98b22ccf7..3eacf3bb9 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -176,7 +176,6 @@ public class Grid implements IGrid { } gridNode.getGridProxy().gridChanged(); - // postEventTo( gridNode, networkChanged ); } @Override diff --git a/src/main/java/appeng/me/cache/EnergyGridCache.java b/src/main/java/appeng/me/cache/EnergyGridCache.java index 9a2ce7e64..bf2cb10a5 100644 --- a/src/main/java/appeng/me/cache/EnergyGridCache.java +++ b/src/main/java/appeng/me/cache/EnergyGridCache.java @@ -502,7 +502,7 @@ public class EnergyGridCache implements IEnergyGrid { private void removeRequester(IAEPowerStorage requester) { Preconditions.checkState(!ongoingInjectOperation, "Cannot modify energy requesters while energy is being injected."); - this.requesters.add(requester); + this.requesters.remove(requester); } private void addProvider(IAEPowerStorage provider) {