diff --git a/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java b/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java index be2277fe06..e414be5966 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/addldata/ADIotaHolder.java @@ -1,12 +1,13 @@ package at.petrak.hexcasting.api.addldata; import at.petrak.hexcasting.api.casting.iota.Iota; +import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; public interface ADIotaHolder { @Nullable - Iota readIota(); + Iota readIota(ServerLevel world); @Nullable default Iota emptyIota() { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java b/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java index af2198eb1f..03675ce6ba 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/addldata/ItemDelegatingEntityIotaHolder.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.casting.iota.Iota; import at.petrak.hexcasting.common.entities.EntityWallScroll; import at.petrak.hexcasting.xplat.IXplatAbstractions; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; @@ -39,9 +40,9 @@ public boolean writeIota(@Nullable Iota datum, boolean simulate) { } @Override - public @Nullable Iota readIota() { + public @Nullable Iota readIota(ServerLevel world) { var delegate = IXplatAbstractions.INSTANCE.findDataHolder(this.stackSupplier.get()); - return delegate == null ? null : delegate.readIota(); + return delegate == null ? null : delegate.readIota(world); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt index ca19625311..b7ce904742 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt @@ -77,7 +77,11 @@ class CastingVM(var image: CastingImage, val env: CastingEnvironment) { sound = HexEvalSounds.MISHAP, ) } else { - result + result.copy( + newData = result.newData?.copy( + stack = validateIotaList(result.newData.stack, world) + ) + ) } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt index aa4999873b..b927d01f64 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt @@ -317,6 +317,10 @@ fun validateIota(iota: T, serverLevel: ServerLevel): Iota { } } +fun validateIotaNullable(iota: T?, serverLevel: ServerLevel): Iota? { + return iota?.let { validateIota(iota, serverLevel) } +} + fun validateIotaList(iotaList: List, serverLevel: ServerLevel): List { return iotaList.map { validateIota(it, serverLevel) } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java index 3f745ef20d..71ea8201ae 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/impetuses/BlockRedstoneImpetus.java @@ -68,7 +68,7 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev } else { var datumContainer = IXplatAbstractions.INSTANCE.findDataHolder(usedStack); if (datumContainer != null) { - var stored = datumContainer.readIota(); + var stored = datumContainer.readIota(sLevel); if (stored instanceof EntityIota eieio) { var entity = eieio.getEntity(sLevel); if (entity instanceof Player iotaPlayer) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpRead.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpRead.kt index 0c8087b4b3..51791b6d26 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpRead.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpRead.kt @@ -12,7 +12,7 @@ object OpRead : ConstMediaAction { override fun execute(args: List, env: CastingEnvironment): List { val (handStack) = env.getHeldItemToOperateOn { val dataHolder = IXplatAbstractions.INSTANCE.findDataHolder(it) - dataHolder != null && (dataHolder.readIota() != null || dataHolder.emptyIota() != null) + dataHolder != null && (dataHolder.readIota(env.world) != null || dataHolder.emptyIota() != null) } // If there are no data holders that are readable, find a data holder that isn't readable // so that the error message is more helpful. @@ -24,7 +24,7 @@ object OpRead : ConstMediaAction { val datumHolder = IXplatAbstractions.INSTANCE.findDataHolder(handStack) ?: throw MishapBadOffhandItem.of(handStack, "iota.read") - val datum = datumHolder.readIota() + val datum = datumHolder.readIota(env.world) ?: datumHolder.emptyIota() ?: throw MishapBadOffhandItem.of(handStack, "iota.read") diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpReadable.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpReadable.kt index 93d234dfc0..d368b9d87b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpReadable.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpReadable.kt @@ -18,7 +18,7 @@ object OpReadable : ConstMediaAction { ?: return false.asActionResult // If the datum contains no iota, return whether it has a default empty iota. - datumHolder.readIota() + datumHolder.readIota(env.world) ?: return (datumHolder.emptyIota() != null).asActionResult return true.asActionResult diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerRead.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerRead.kt index 060ebe9d77..ce342e0819 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerRead.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerRead.kt @@ -21,7 +21,7 @@ object OpTheCoolerRead : ConstMediaAction { val datumHolder = IXplatAbstractions.INSTANCE.findDataHolder(target) ?: throw MishapBadEntity.of(target, "iota.read") - val datum = datumHolder.readIota() + val datum = datumHolder.readIota(env.world) ?: datumHolder.emptyIota() ?: throw MishapBadEntity.of(target, "iota.read") return listOf(datum) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerReadable.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerReadable.kt index 2b191da486..de3c3fcbd8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerReadable.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/rw/OpTheCoolerReadable.kt @@ -20,7 +20,7 @@ object OpTheCoolerReadable : ConstMediaAction { val datumHolder = IXplatAbstractions.INSTANCE.findDataHolder(target) ?: return false.asActionResult - datumHolder.readIota() + datumHolder.readIota(env.world) ?: datumHolder.emptyIota() ?: return false.asActionResult diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCEntityIotaHolder.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCEntityIotaHolder.java index 7c165dd5ee..be5193f2b8 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCEntityIotaHolder.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCEntityIotaHolder.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.casting.iota.Iota; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,8 +28,8 @@ public Wrapper(ItemDelegatingEntityIotaHolder inner) { @Override - public @Nullable Iota readIota() { - return inner.readIota(); + public @Nullable Iota readIota(ServerLevel world) { + return inner.readIota(world); } @Override diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCItemIotaHolder.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCItemIotaHolder.java index e58ec98222..a035d24fe1 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCItemIotaHolder.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/adimpl/CCItemIotaHolder.java @@ -4,12 +4,15 @@ import at.petrak.hexcasting.api.item.IotaHolderItem; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import org.ladysnake.cca.api.v3.component.Component; import java.util.function.Function; +import static at.petrak.hexcasting.api.utils.HexUtils.validateIotaNullable; + public abstract class CCItemIotaHolder implements CCIotaHolder, Component { final ItemStack stack; public CCItemIotaHolder(ItemStack stack) { @@ -28,8 +31,8 @@ public ItemBased(ItemStack stack) { } @Override - public @Nullable Iota readIota() { - return this.iotaHolder.readIota(this.stack); + public @Nullable Iota readIota(ServerLevel world) { + return validateIotaNullable(this.iotaHolder.readIota(this.stack), world); } @Override @@ -69,7 +72,7 @@ public Static(ItemStack stack, Function provider) { } @Override - public @Nullable Iota readIota() { + public @Nullable Iota readIota(ServerLevel world) { return this.provider.apply(this.stack); } diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapEntityIotaHolder.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapEntityIotaHolder.java index 496228efa0..64ba59bb44 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapEntityIotaHolder.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapEntityIotaHolder.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.addldata.ItemDelegatingEntityIotaHolder; import at.petrak.hexcasting.api.casting.iota.Iota; +import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; public abstract class CapEntityIotaHolder implements ADIotaHolder { @@ -24,8 +25,8 @@ public boolean writeIota(@Nullable Iota iota, boolean simulate) { } @Override - public @Nullable Iota readIota() { - return inner.readIota(); + public @Nullable Iota readIota(ServerLevel world) { + return inner.readIota(world); } @Override diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemIotaHolder.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemIotaHolder.java index 831c11b30d..c41cb637f8 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemIotaHolder.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapItemIotaHolder.java @@ -3,15 +3,18 @@ import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.casting.iota.Iota; import at.petrak.hexcasting.api.item.IotaHolderItem; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; +import static at.petrak.hexcasting.api.utils.HexUtils.validateIotaNullable; + public record CapItemIotaHolder(IotaHolderItem holder, ItemStack stack) implements ADIotaHolder { @Override public @Nullable - Iota readIota() { - return holder.readIota(stack); + Iota readIota(ServerLevel world) { + return validateIotaNullable(holder.readIota(stack), world); } @Override diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticIotaHolder.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticIotaHolder.java index 329ac5b90a..53909909c6 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticIotaHolder.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/adimpl/CapStaticIotaHolder.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.casting.iota.Iota; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; @@ -12,7 +13,7 @@ public record CapStaticIotaHolder(Function provider, @Override public @Nullable - Iota readIota() { + Iota readIota(ServerLevel world) { return provider.apply(stack); } diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java index 50c77dbb71..a147748c09 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/recipe/ForgeUnsealedIngredient.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.casting.iota.NullIota; +import at.petrak.hexcasting.api.item.IotaHolderItem; import at.petrak.hexcasting.common.lib.HexDataComponents; import at.petrak.hexcasting.forge.lib.ForgeHexIngredientTypes; import at.petrak.hexcasting.xplat.IXplatAbstractions; @@ -56,8 +57,8 @@ public boolean test(@Nullable ItemStack input) { } if (this.stack.getItem() == input.getItem() && this.stack.getDamageValue() == input.getDamageValue()) { ADIotaHolder holder = IXplatAbstractions.INSTANCE.findDataHolder(this.stack); - if (holder != null) { - return holder.readIota() != null && holder.writeIota(new NullIota(), true); + if (holder != null && this.stack.getItem() instanceof IotaHolderItem holderItem) { + return holderItem.readIota(this.stack) != null && holder.writeIota(new NullIota(), true); } }