diff --git a/build.gradle b/build.gradle index d3d695db..410d19be 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ base { java.toolchain.languageVersion = JavaLanguageVersion.of(21) neoForge { - version = project.neo_version + version = project.neoforge_version parchment { mappingsVersion = project.parchment_mappings_version @@ -105,46 +105,41 @@ dependencies { implementation "curse.maven:glodium-957920:5614731" implementation "curse.maven:applied-energistics-2-223794:5610903" implementation "curse.maven:ex-pattern-provider-892005:5617630" + jarJar(implementation "de.mari_023:ae2wtlib_api:19.1.0-alpha.1") compileOnly "curse.maven:emi-580555:5619579" compileOnly "curse.maven:applied-flux-965012:5614830" - //compileOnly "curse.maven:jade-324717:5427817" - //compileOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" + compileOnly "curse.maven:jade-324717:5427817" + compileOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" // runtime test - //runtimeOnly "curse.maven:applied-flux-965012:5614830" - //runtimeOnly "de.mari_023:ae2wtlib:19.1.0-alpha.1" - //runtimeOnly "curse.maven:mega-cells-622112:5575776" - //runtimeOnly "curse.maven:jade-324717:5427817" + runtimeOnly "curse.maven:applied-flux-965012:5614830" + runtimeOnly "de.mari_023:ae2wtlib:19.1.0-alpha.1" + runtimeOnly "curse.maven:jade-324717:5427817" // setup Xei switch (use_Xei) { case "emi": - //runtimeOnly "dev.emi:emi-neoforge:1.1.10+1.21" + runtimeOnly "dev.emi:emi-neoforge:1.1.10+1.21" break case "rei": - //runtimeOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" - //runtimeOnly "dev.architectury:architectury-neoforge:13.0.1" - //runtimeOnly "curse.maven:cloth-config-348521:5424576" + runtimeOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" + runtimeOnly "dev.architectury:architectury-neoforge:13.0.1" + runtimeOnly "curse.maven:cloth-config-348521:5424576" break } } -var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { +tasks.withType(ProcessResources).configureEach { var replaceProperties = [ - minecraft_version : minecraft_version, - minecraft_version_range: minecraft_version_range, - neo_version : neo_version, - neo_version_range : neo_version_range, - loader_version_range : loader_version_range, - mod_id : mod_id, - mod_name : mod_name, - mod_license : mod_license, - mod_version : mod_version, - mod_authors : mod_authors, - mod_description : mod_description + minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, + neo_version : neoforge_version, neo_version_range: neoforge_version_range, + loader_version_range: loader_version_range, + mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, + mod_authors : mod_authors, mod_description: mod_description, ] inputs.properties replaceProperties - expand replaceProperties - from "src/main/templates" - into "build/generated/sources/modMetadata" + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties + } } publishing { diff --git a/gradle.properties b/gradle.properties index 940fe22e..bb99ac32 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,14 @@ -org.gradle.jvmargs=-Xmx1G -org.gradle.daemon=true +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false org.gradle.parallel=true -org.gradle.caching=true -org.gradle.configuration-cache=true parchment_minecraft_version=1.21 parchment_mappings_version=2024.07.28 ## Environment Properties -minecraft_version=1.21 -minecraft_version_range=[1.21,1.21.1) -neo_version=21.1.1 -neo_version_range=[21.1.0-beta,) +minecraft_release=1.21.1 +minecraft_version=1.21.1 +minecraft_version_range=1.21.1 +neoforge_version=21.1.1 +neoforge_version_range=[21.1.1,) loader_version_range=[4,) ## Mod Properties mod_id=advanced_ae diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c352119..943f0cbf 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e4a5f610..71775d97 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 -validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew index b26d4110..65dcd68d 100644 --- a/gradlew +++ b/gradlew @@ -15,8 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# SPDX-License-Identifier: Apache-2.0 -# ############################################################################## # @@ -57,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -85,9 +83,10 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# 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"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -134,13 +133,10 @@ location of your Java installation." fi else JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi fi # Increase the maximum file descriptors if we can. @@ -148,7 +144,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=SC2039,SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -156,7 +152,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=SC2039,SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,15 +197,11 @@ if "$cygwin" || "$msys" ; then done 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, 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. +# 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. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -249,4 +241,4 @@ eval "set -- $( tr '\n' ' ' )" '"$@"' -exec "$JAVACMD" "$@" \ No newline at end of file +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f46bb527..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,6 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -45,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail @@ -59,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail @@ -91,4 +89,4 @@ exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega \ No newline at end of file +:omega diff --git a/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java b/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java index a87bb448..8cab900a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java @@ -1,17 +1,29 @@ package net.pedroksl.advanced_ae.common; +import appeng.api.AECapabilities; +import appeng.api.implementations.blockentities.ICraftingMachine; +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.api.networking.IInWorldGridNodeHost; import appeng.api.parts.PartModels; import appeng.api.parts.RegisterPartCapabilitiesEvent; import appeng.block.AEBaseBlockItem; import appeng.block.AEBaseEntityBlock; import appeng.blockentity.AEBaseBlockEntity; +import appeng.blockentity.AEBaseInvBlockEntity; import appeng.blockentity.ClientTickingBlockEntity; import appeng.blockentity.ServerTickingBlockEntity; +import appeng.blockentity.powersink.AEBasePoweredBlockEntity; import appeng.items.AEBaseItem; +import appeng.items.tools.powered.powersink.PoweredItemCapabilities; +import com.glodblock.github.extendedae.api.caps.ICrankPowered; +import com.glodblock.github.extendedae.api.caps.IGenericInvHost; +import com.glodblock.github.extendedae.api.caps.IMEStorageAccess; import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; import net.pedroksl.advanced_ae.xmod.appflux.AFCommonLoad; import com.glodblock.github.glodium.registry.RegistryHandler; import com.glodblock.github.glodium.util.GlodUtil; @@ -29,12 +41,25 @@ import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; import org.apache.commons.lang3.tuple.Pair; +import java.util.Collection; + public class AAERegistryHandler extends RegistryHandler { public static final AAERegistryHandler INSTANCE = new AAERegistryHandler(); + @SuppressWarnings("UnstableApiUsage") public AAERegistryHandler() { super(AdvancedAE.MOD_ID); + this.cap(AEBaseInvBlockEntity.class, Capabilities.ItemHandler.BLOCK, AEBaseInvBlockEntity::getExposedItemHandler); + this.cap(AEBasePoweredBlockEntity.class, Capabilities.EnergyStorage.BLOCK, AEBasePoweredBlockEntity::getEnergyStorage); + this.cap(IInWorldGridNodeHost.class, AECapabilities.IN_WORLD_GRID_NODE_HOST, (object, context) -> object); + this.cap(IAEItemPowerStorage.class, Capabilities.EnergyStorage.ITEM, (object, context) -> new PoweredItemCapabilities(object, (IAEItemPowerStorage) object.getItem())); + this.cap(ICrankPowered.class, AECapabilities.CRANKABLE, ICrankPowered::getCrankable); + this.cap(ICraftingMachine.class, AECapabilities.CRAFTING_MACHINE, (object, context) -> object); + this.cap(IGenericInvHost.class, AECapabilities.GENERIC_INTERNAL_INV, IGenericInvHost::getGenericInv); + this.cap(IMEStorageAccess.class, AECapabilities.ME_STORAGE, IMEStorageAccess::getMEStorage); + this.cap(AdvPatternProviderEntity.class, AECapabilities.GENERIC_INTERNAL_INV, + (blockEntity, context) -> blockEntity.getLogic().getReturnInv()); } public void block(String name, AEBaseEntityBlock block, Class clazz, @@ -51,6 +76,10 @@ public void runRegister() { this.onRegisterModels(); // Parts } + public Collection getBlocks() { + return this.blocks.stream().map(Pair::getRight).toList(); + } + @SubscribeEvent public void onRegisterCapability(RegisterPartCapabilitiesEvent event) { AdvPatternProviderPart.registerCapability(event); diff --git a/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java b/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java index ef91d966..a58f6b35 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java @@ -2,8 +2,10 @@ import appeng.api.crafting.PatternDetailsHelper; import appeng.items.parts.PartItem; +import com.glodblock.github.glodium.util.GlodCodecs; import com.glodblock.github.glodium.util.GlodUtil; import net.minecraft.core.component.DataComponentType; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.pedroksl.advanced_ae.common.blocks.AdvPatternProviderBlock; import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; @@ -15,6 +17,8 @@ public class AAESingletons { public static DataComponentType ENCODED_ADV_PROCESSING_PATTERN; + public static DataComponentType STACK_TAG; + public static AdvPatternProviderBlock ADV_PATTERN_PROVIDER; public static PartItem ADV_PATTERN_PROVIDER_PART; @@ -23,6 +27,7 @@ public class AAESingletons { public static AdvPatternEncoderItem ADV_PATTERN_ENCODER; public static void init(AAERegistryHandler handler) { + STACK_TAG = GlodUtil.getComponentType(CompoundTag.CODEC, GlodCodecs.NBT_STREAM_CODEC); ENCODED_ADV_PROCESSING_PATTERN = GlodUtil.getComponentType(EncodedAdvProcessingPattern.CODEC, EncodedAdvProcessingPattern.STREAM_CODEC); ADV_PATTERN_PROVIDER = new AdvPatternProviderBlock(); @@ -30,12 +35,14 @@ public static void init(AAERegistryHandler handler) { AdvPatternProviderPart::new); ADV_PROCESSING_PATTERN = - PatternDetailsHelper.encodedPatternItemBuilder(AdvProcessingPattern::new).invalidPatternTooltip(AdvProcessingPattern::getInvalidPatternTooltip).build(); + PatternDetailsHelper.encodedPatternItemBuilder(AdvProcessingPattern::new) + .invalidPatternTooltip(AdvProcessingPattern::getInvalidPatternTooltip).build(); ADV_PATTERN_ENCODER = new AdvPatternEncoderItem(); handler.comp("encoded_adv_processing_pattern", ENCODED_ADV_PROCESSING_PATTERN); + handler.comp("generic_nbt", STACK_TAG); handler.block("adv_pattern_provider", ADV_PATTERN_PROVIDER, AdvPatternProviderEntity.class, AdvPatternProviderEntity::new); diff --git a/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java index be29e342..aecd876b 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java @@ -1,5 +1,6 @@ package net.pedroksl.advanced_ae.common.blocks; +import appeng.block.crafting.PatternProviderBlock; import appeng.block.crafting.PushDirection; import appeng.menu.locator.MenuLocators; import appeng.util.InteractionUtil; @@ -15,19 +16,21 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.phys.BlockHitResult; import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; +import org.jetbrains.annotations.NotNull; + +import static appeng.block.crafting.PatternProviderBlock.PUSH_DIRECTION; + +import javax.annotation.Nonnull; -@SuppressWarnings("deprecation") public class AdvPatternProviderBlock extends BlockBaseGui { - public static final EnumProperty PUSH_DIRECTION = EnumProperty.create("push_direction", - PushDirection.class); + public static final BooleanProperty CONNECTION_STATE = BooleanProperty.create("connection_state"); public AdvPatternProviderBlock() { super(metalProps()); - registerDefaultState(defaultBlockState().setValue(PUSH_DIRECTION, PushDirection.ALL).setValue(CONNECTION_STATE, false)); + this.registerDefaultState(this.defaultBlockState().setValue(PatternProviderBlock.PUSH_DIRECTION, PushDirection.ALL).setValue(CONNECTION_STATE, false)); } @Override @@ -36,15 +39,15 @@ public void openGui(AdvPatternProviderEntity advPatternProviderEntity, Player pl } @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { + protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); builder.add(PUSH_DIRECTION); builder.add(CONNECTION_STATE); } @Override - public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, - boolean isMoving) { + public void neighborChanged(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, + @NotNull Block block, @NotNull BlockPos fromPos, boolean isMoving) { var be = this.getBlockEntity(level, pos); if (be != null) { be.getLogic().updateRedstoneState(); diff --git a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java new file mode 100644 index 00000000..36315446 --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java @@ -0,0 +1,76 @@ +package net.pedroksl.advanced_ae.common.helpers; + +import com.mojang.serialization.Codec; +import io.netty.buffer.ByteBuf; +import net.minecraft.core.Direction; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ByIdMap; +import net.minecraft.util.StringRepresentable; +import org.jetbrains.annotations.NotNull; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.IntFunction; + +public enum NullableDirection implements StringRepresentable { + + DOWN(0, Direction.DOWN), + UP(1, Direction.UP), + NORTH(2, Direction.NORTH), + SOUTH(3, Direction.SOUTH), + WEST(4, Direction.WEST), + EAST(5, Direction.EAST), + NULLDIR(6, null); + + public static final IntFunction BY_ID = + ByIdMap.continuous(NullableDirection::getIndex, values(), ByIdMap.OutOfBoundsStrategy.WRAP); + private final int index; + private final Direction dir; + + NullableDirection(int index, @Nullable Direction dir) { + this.index = index; + this.dir = dir; + } + + public int getIndex() { + return this.index; + } + + public Direction getDirection() { + return this.dir; + } + + public static NullableDirection fromDirection(Direction dir) { + if (dir == null) + return NULLDIR; + + return switch (dir) { + case Direction.DOWN -> DOWN; + case Direction.UP -> UP; + case Direction.NORTH -> NORTH; + case Direction.SOUTH -> SOUTH; + case Direction.WEST -> WEST; + case Direction.EAST -> EAST; + }; + } + + @SuppressWarnings("deprecation") + public static final StringRepresentable.EnumCodec CODEC = + StringRepresentable.fromEnum(NullableDirection::values); + + public static final StreamCodec STREAM_CODEC = + ByteBufCodecs.idMapper(BY_ID, NullableDirection::getIndex); + + public static final Codec> FAULT_TOLERANT_NULLABLE_LIST_CODEC = new NullableDirectionListCodec(CODEC); + + @Override + public @NotNull String getSerializedName() { + if (this.dir == null) { + return "null"; + } + + return this.dir.name(); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java new file mode 100644 index 00000000..ec57cb39 --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java @@ -0,0 +1,66 @@ +package net.pedroksl.advanced_ae.common.helpers; + +import com.mojang.datafixers.util.Pair; +import com.mojang.datafixers.util.Unit; +import com.mojang.serialization.*; +import org.apache.commons.lang3.mutable.MutableObject; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + +public class NullableDirectionListCodec implements Codec> { + private final Codec innerCodec; + + public NullableDirectionListCodec(Codec innerCodec) { + this.innerCodec = innerCodec; + } + + @Override + public DataResult encode(List<@Nullable NullableDirection> input, DynamicOps ops, T prefix) { + final ListBuilder builder = ops.listBuilder(); + + for (var dir : input) { + if (dir == null) { + builder.add(ops.emptyMap()); + } else { + builder.add(innerCodec.encodeStart(ops, dir)); + } + } + + return builder.build(prefix); + } + + @Override + public DataResult, T>> decode(DynamicOps ops, T input) { + + return ops.getList(input).setLifecycle(Lifecycle.stable()).flatMap(stream -> { + var elements = new ArrayList(); + final Stream.Builder failed = Stream.builder(); + final MutableObject> result = new MutableObject<>( + DataResult.success(Unit.INSTANCE, Lifecycle.stable())); + + stream.accept(t -> { + if (ops.emptyMap().equals(t)) { + elements.add(null); + } else { + DataResult> element = innerCodec.decode(ops, t); + element.error().ifPresent(e -> failed.add(t)); + result.setValue(result.getValue().apply2stable((r, v) -> { + elements.add(v.getFirst()); + return r; + }, element)); + } + }); + + final T errors = ops.createList(failed.build()); + + final Pair, T> pair = Pair.of(Collections.unmodifiableList(elements), errors); + + return result.getValue().map(unit -> pair).setPartial(pair); + }); + } + +} \ No newline at end of file diff --git a/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java b/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java index ad03b69c..96bf6fed 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java @@ -4,9 +4,9 @@ import appeng.menu.locator.ItemMenuHostLocator; import appeng.util.inv.AppEngInternalInventory; import appeng.util.inv.InternalInventoryHost; -import com.glodblock.github.extendedae.common.EAESingletons; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; +import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.items.AdvPatternEncoderItem; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; @@ -18,7 +18,7 @@ public class AdvPatternEncoderHost extends ItemMenuHost i public AdvPatternEncoderHost(AdvPatternEncoderItem item, Player player, ItemMenuHostLocator locator) { super(item, player, locator); - var itemTag = this.getItemStack().get(EAESingletons.STACK_TAG); + var itemTag = this.getItemStack().get(AAESingletons.STACK_TAG); var registry = player.registryAccess(); if (itemTag != null) { this.inOutInventory.readFromNBT(itemTag, "inOutInventory", registry); @@ -30,16 +30,28 @@ public void saveChangedInventory(AppEngInternalInventory inv) { var itemTag = new CompoundTag(); var registry = this.getPlayer().registryAccess(); this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); + + if (!itemTag.isEmpty()) { + this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); + } else { + this.getItemStack().remove(AAESingletons.STACK_TAG); + } } @Override public void onChangeInventory(AppEngInternalInventory inv, int slot) { - var itemTag = this.getItemStack().getOrDefault(EAESingletons.STACK_TAG, new CompoundTag()); + var itemTag = this.getItemStack().getOrDefault(AAESingletons.STACK_TAG, new CompoundTag()); var registry = this.getPlayer().registryAccess(); if (this.inOutInventory == inv) { this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); } + if (!itemTag.isEmpty()) { + this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); + } else { + this.getItemStack().remove(AAESingletons.STACK_TAG); + } + invChangeHandler.handleChange(inv, slot); } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java b/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java index d3602902..27619fb1 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java @@ -10,6 +10,7 @@ import appeng.api.stacks.AEItemKey; import appeng.api.util.AECableType; import appeng.core.AppEngBase; +import appeng.menu.locator.MenuLocators; import appeng.parts.AEBasePart; import appeng.parts.PartModel; import appeng.util.SettingsFrom; @@ -22,6 +23,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.phys.Vec3; import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; @@ -113,6 +115,14 @@ public void onNeighborChanged(BlockGetter level, BlockPos pos, BlockPos neighbor this.logic.updateRedstoneState(); } + @Override + public boolean onUseWithoutItem(Player p, Vec3 pos) { + if (!p.getCommandSenderWorld().isClientSide()) { + this.openMenu(p, MenuLocators.forPart(this)); + } + return true; + } + protected AdvPatternProviderLogic createLogic() { return new AdvPatternProviderLogic(this.getMainNode(), this, 36); } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java index 104443ed..59a95b1a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java @@ -15,6 +15,8 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.pedroksl.advanced_ae.common.AAESingletons; +import net.pedroksl.advanced_ae.common.helpers.NullableDirection; +import org.apache.commons.lang3.ObjectUtils; import javax.annotation.Nullable; import java.util.*; @@ -54,7 +56,7 @@ public AdvProcessingPattern(AEItemKey definition) { var direction = directions.get(x); if (input != null) { - this.dirMap.put(input.what(), direction); + this.dirMap.put(input.what(), direction.getDirection()); } } } @@ -66,13 +68,14 @@ public static void encode(ItemStack stack, List sparseInputs, List } else { Objects.requireNonNull(sparseOutputs.get(0), "The first (primary) output must be non-null."); - List directionList = new ArrayList<>(sparseInputs.size()); + NullableDirection[] nullDirArray = new NullableDirection[sparseInputs.size()]; + Arrays.fill(nullDirArray, NullableDirection.NULLDIR); + List directionList = Arrays.asList(nullDirArray); if (dirMap != null) { - for (var input : sparseInputs) { - if (input == null) { - directionList.add(null); - } else { - directionList.add(dirMap.get(input.what())); + for (var x = 0; x < sparseInputs.size(); x++) { + var input = sparseInputs.get(x); + if (input != null) { + directionList.set(x, NullableDirection.fromDirection(dirMap.get(input.what()))); } } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java index d6598c4d..8521189c 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java @@ -4,11 +4,12 @@ import appeng.core.definitions.AEItems; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.Direction; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.pedroksl.advanced_ae.common.helpers.NullableDirection; +import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -16,7 +17,7 @@ public record EncodedAdvProcessingPattern( List sparseInputs, List sparseOutputs, - List directionList) { + List directionList) { public EncodedAdvProcessingPattern { sparseInputs = Collections.unmodifiableList(sparseInputs); sparseOutputs = Collections.unmodifiableList(sparseOutputs); @@ -28,7 +29,7 @@ public record EncodedAdvProcessingPattern( .forGetter(EncodedAdvProcessingPattern::sparseInputs), GenericStack.FAULT_TOLERANT_NULLABLE_LIST_CODEC.fieldOf("sparseOutputs") .forGetter(EncodedAdvProcessingPattern::sparseOutputs), - Codec.list(Direction.CODEC).fieldOf("directionMap") + NullableDirection.FAULT_TOLERANT_NULLABLE_LIST_CODEC.fieldOf("directionMap") .forGetter(EncodedAdvProcessingPattern::directionList)) .apply(builder, EncodedAdvProcessingPattern::new)); @@ -38,7 +39,7 @@ public record EncodedAdvProcessingPattern( EncodedAdvProcessingPattern::sparseInputs, GenericStack.STREAM_CODEC.apply(ByteBufCodecs.list()), EncodedAdvProcessingPattern::sparseOutputs, - Direction.STREAM_CODEC.apply(ByteBufCodecs.list()), + NullableDirection.STREAM_CODEC.apply(ByteBufCodecs.list()), EncodedAdvProcessingPattern::directionList, EncodedAdvProcessingPattern::new); diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java index 41507ce0..c8fa7835 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java @@ -1,13 +1,10 @@ package net.pedroksl.advanced_ae.datagen; import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.common.AAESingletons; -import java.util.Objects; - public class AAEItemModelProvider extends net.neoforged.neoforge.client.model.generators.ItemModelProvider { public AAEItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { super(output, AdvancedAE.MOD_ID, existingFileHelper); @@ -15,16 +12,16 @@ public AAEItemModelProvider(PackOutput output, ExistingFileHelper existingFileHe @Override protected void registerModels() { - flatSingleLayer(AdvancedAE.id("adv_processing_pattern")); - flatSingleLayer(Objects.requireNonNull(AAESingletons.ADV_PATTERN_ENCODER.getRegistryName())); + flatSingleLayer("adv_processing_pattern"); + flatSingleLayer(AAESingletons.ADV_PATTERN_ENCODER.getRegistryName().getPath()); } - private void flatSingleLayer(ResourceLocation item) { - String id = item.getPath(); + private void flatSingleLayer(String item) { + var id = AdvancedAE.id(item); singleTexture( - id, + id.getPath(), mcLoc("item/generated"), "layer0", - AdvancedAE.id(item.getPath())); + AdvancedAE.id("item/" + item)); } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java index 59da0945..cba8a520 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.common.inventory.AdvPatternEncoderHost; import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetailsEncoder; import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; @@ -27,7 +28,7 @@ public class AdvPatternEncoderContainer extends AEBaseMenu { public static final MenuType TYPE = MenuTypeBuilder .create(AdvPatternEncoderContainer::new, AdvPatternEncoderHost.class) - .build("adv_pattern_encoder"); + .build(AdvancedAE.id("adv_pattern_encoder")); private final RestrictedInputSlot inputSlot; private final OutputSlot outputSlot; diff --git a/src/main/templates/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg similarity index 100% rename from src/main/templates/META-INF/accesstransformer.cfg rename to src/main/resources/META-INF/accesstransformer.cfg diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 100% rename from src/main/templates/META-INF/neoforge.mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index eca79ae4..24d5adfb 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,8 +1,6 @@ { "pack": { - "description": { - "text": "${mod_id} resources" - }, - "pack_format": 15 + "description": "AdvancedAE", + "pack_format": 9 } } \ No newline at end of file