diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java index a5fe2d98b..81392277d 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java @@ -8,6 +8,9 @@ package com.dfsek.terra.addons.sponge; import com.dfsek.seismic.type.vector.Vector3Int; + +import com.dfsek.terra.api.error.Invalid; + import net.querz.nbt.io.NBTDeserializer; import net.querz.nbt.tag.ByteArrayTag; import net.querz.nbt.tag.CompoundTag; @@ -129,7 +132,7 @@ public class SpongeSchematicAddon implements AddonInitializer { for(int y = 0; y < hei; y++) { String block = data.get((int) arr[x + z * wid + y * wid * len]); if(block.startsWith("minecraft:structure_void")) continue; - states[x][z][y] = platform.getWorldHandle().createBlockState(block); + states[x][z][y] = platform.getWorldHandle().createBlockState(block).collectThrow(Invalid::toIllegal); } } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index e8e466588..2b327f7e7 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -10,6 +10,10 @@ package com.dfsek.terra.addons.terrascript.script.functions; import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.type.vector.Vector2; import com.dfsek.seismic.type.vector.Vector3; + +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.api.handle.WorldHandle; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +89,11 @@ public class BlockFunction implements Function { } protected BlockState getBlockState(ImplementationArguments arguments, Scope scope) { - return data.computeIfAbsent(blockData.apply(arguments, scope), platform.getWorldHandle()::createBlockState); + WorldHandle handle = platform.getWorldHandle(); + return data.computeIfAbsent(blockData.apply(arguments, scope), s -> handle.createBlockState(s).collect(left -> { + logger.error("Invalid block state \"" + s + "\": " + left.message()); + return handle.air(); + }, java.util.function.Function.identity())); } @@ -95,7 +103,8 @@ public class BlockFunction implements Function { public Constant(Returnable x, Returnable y, Returnable z, StringConstant blockData, Returnable overwrite, Returnable physics, Platform platform, Position position) { super(x, y, z, blockData, overwrite, physics, platform, position); - this.state = platform.getWorldHandle().createBlockState(blockData.getConstant()); + this.state = platform.getWorldHandle().createBlockState(blockData.getConstant()).collectThrow( + left -> new ParseException("Invalid block state: \"" + blockData.getConstant() + "\": " + left.message(), position)); } @Override diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index bb2646aba..3745ce3b7 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -33,7 +33,9 @@ public class PullFunction implements Function { this.position = position; if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); - this.data = platform.getWorldHandle().createBlockState(((ConstantExpression) data).getConstant()); + String constant = ((ConstantExpression) data).getConstant(); + this.data = platform.getWorldHandle().createBlockState(constant).collectThrow( + left -> new ParseException("Invalid block state: \"" + constant + "\": " + left.message(), position)); this.x = x; this.y = y; this.z = z; diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java index 2bb27b2ec..c5b01540d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java @@ -9,4 +9,8 @@ public interface Invalid { default Either left() { return Either.left(this); } + + default IllegalArgumentException toIllegal() { + return new IllegalArgumentException(message()); + } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 8bf077207..58f5272ee 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -24,6 +24,8 @@ import com.dfsek.tectonic.api.TypeRegistry; import java.util.LinkedHashMap; +import com.dfsek.tectonic.api.exception.LoadException; + import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.block.BlockType; @@ -61,9 +63,9 @@ public class GenericLoaders implements LoaderRegistrar { if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform - .getWorldHandle().createBlockState((String) object).blockType()) + .getWorldHandle().createBlockState((String) object).collectThrow(left -> new LoadException(left.message(), depthTracker)).blockType()) .registerLoader(BlockState.class, (type, object, configLoader, depthTracker) -> platform - .getWorldHandle().createBlockState((String) object)); + .getWorldHandle().createBlockState((String) object).collectThrow(left -> new LoadException("Invalid BlockState \"" + object + "\": " + left.message(), depthTracker))); } } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index c93616731..a85e912fc 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -1,6 +1,7 @@ package com.dfsek.terra.minestom; import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.type.TypeLoader; import net.kyori.adventure.key.Key; import net.kyori.adventure.util.RGBLike; @@ -81,7 +82,7 @@ public final class TerraMinestomPlatform extends AbstractPlatform { .registerLoader(EntityType.class, (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o)) .registerLoader(BlockState.class, - (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o)) + (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o).collectThrow(left -> new LoadException("Invalid BlockState \"" + o + "\": " + left.message(), depthTracker))) .registerLoader(BiomeEffects.Particle.class, BiomeParticleConfigTemplate::new) .registerLoader(BiomeEffects.MoodSound.class, BiomeMoodSoundTemplate::new) .registerLoader(BiomeEffects.AdditionsSound.class, BiomeAdditionsSoundTemplate::new)