diff --git a/src/main/java/io/github/skippyall/minions/gui/instruction/ConfigureInstructionGui.java b/src/main/java/io/github/skippyall/minions/gui/instruction/ConfigureInstructionGui.java index 74ca975..d8e0834 100644 --- a/src/main/java/io/github/skippyall/minions/gui/instruction/ConfigureInstructionGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/instruction/ConfigureInstructionGui.java @@ -124,16 +124,26 @@ public class ConfigureInstructionGui extends MinionsGui implements ConfiguredIns } private void updateRunSlot() { - if(!instruction.isRunning()) { - gui.setSlot(26, new GuiElementBuilder(Items.ARROW) - .setName(Component.translatable("minions.gui.instruction.run")) - .setCallback(() -> instruction.run(minion.getInstructionManager())) - ); + List errors = instruction.preCheck(); + if(errors.isEmpty()) { + if (!instruction.isRunning()) { + gui.setSlot(26, new GuiElementBuilder(Items.ARROW) + .setName(Component.translatable("minions.gui.instruction.run")) + .setCallback(() -> instruction.run(minion.getInstructionManager())) + ); + } else { + gui.setSlot(26, new GuiElementBuilder(Items.BARRIER) + .setName(Component.translatable("minions.gui.instruction.stop")) + .setCallback(() -> instruction.stop(minion.getInstructionManager())) + ); + } } else { - gui.setSlot(26, new GuiElementBuilder(Items.BARRIER) - .setName(Component.translatable("minions.gui.instruction.stop")) - .setCallback(() -> instruction.stop(minion.getInstructionManager())) - ); + GuiElementBuilder builder = new GuiElementBuilder(Items.RED_WOOL) + .setName(Component.translatable("minions.gui.instruction.errors")); + for(Component error : errors) { + builder.addLoreLine(error); + } + gui.setSlot(26, builder); } } diff --git a/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java b/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java index ed3279a..be08b24 100644 --- a/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java +++ b/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java @@ -51,12 +51,14 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; +@NullMarked public class MinionFakePlayer extends ServerPlayer { public Runnable fixStartingPosition = () -> {}; @@ -310,6 +312,7 @@ public class MinionFakePlayer extends ServerPlayer { public void dropAllDeathLoot(ServerLevel world, DamageSource damageSource) { super.dropAllDeathLoot(world, damageSource); ItemEntity entity = drop(toItemStack(world.getServer()), true, false); + //noinspection ConstantValue (Wrong nullability of drop) if (entity != null) { entity.setUnlimitedLifetime(); } diff --git a/src/main/java/io/github/skippyall/minions/program/conversion/ConverterList.java b/src/main/java/io/github/skippyall/minions/program/conversion/ConverterList.java index 6222e48..54fac0a 100644 --- a/src/main/java/io/github/skippyall/minions/program/conversion/ConverterList.java +++ b/src/main/java/io/github/skippyall/minions/program/conversion/ConverterList.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Objects; +import java.util.function.Consumer; public class ConverterList { public static final Codec CODEC = ValueConverter.CODEC.listOf().xmap(ConverterList::new, l -> l.converters); @@ -55,7 +56,11 @@ public class ConverterList { private Result, Component> convert(TypedValue from, ValueConverter converter, ListIterator> iterator) { Result inter = Casts.castOrError(from, converter.getFrom()); if(inter instanceof Result.Error error) { - return new Result.Error<>(Component.translatable("minions.converter.list.passing_error", iterator.previousIndex(), error.message())); + return new Result.Error<>( + Component.translatable("minions.converter.list.passing_error", iterator.previousIndex()) + .append("\n") + .append(error.message()) + ); } Result to = converter.convert(inter.getOrThrow()); @@ -81,6 +86,24 @@ public class ConverterList { return warning; } + public void check(Consumer errorConsumer, ValueType input, ValueType output) { + Component firstCastWarning = createCastWarning(input, converters.isEmpty() ? output : converters.get(0).getFrom()); + if(firstCastWarning != null) { + errorConsumer.accept(firstCastWarning); + } + for(int i = 0; i < converters.size(); i++) { + ValueConverter converter = converters.get(i); + Component converterWarning = createConverterWarning(converter); + if(converterWarning != null) { + errorConsumer.accept(converterWarning); + } + Component castWarning = createCastWarning(converter.getTo(), i + 1 < converters.size() ? converters.get(i + 1).getFrom() : output); + if(castWarning != null) { + errorConsumer.accept(castWarning); + } + } + } + @Override public boolean equals(Object o) { if (!(o instanceof ConverterList that)) return false; diff --git a/src/main/java/io/github/skippyall/minions/program/supplier/ValueSupplierList.java b/src/main/java/io/github/skippyall/minions/program/supplier/ValueSupplierList.java index 97834f9..4faa2c5 100644 --- a/src/main/java/io/github/skippyall/minions/program/supplier/ValueSupplierList.java +++ b/src/main/java/io/github/skippyall/minions/program/supplier/ValueSupplierList.java @@ -158,9 +158,8 @@ public class ValueSupplierList> { return convertedResult.flatMap(convertedValue -> Casts.castOrError(convertedValue, parameter.type())); } - public @Nullable Component check(Consumer errorConsumer) { - //TODO check it - return null; + public void check(Consumer errorConsumer) { + converters.check(errorConsumer, parameter.type(), supplier.getValueType()); } public static > MapCodec> getCodec(Codec> argumentCodec) { diff --git a/src/main/resources/assets/minions/lang/en_us.json b/src/main/resources/assets/minions/lang/en_us.json index 70d534d..eabe971 100644 --- a/src/main/resources/assets/minions/lang/en_us.json +++ b/src/main/resources/assets/minions/lang/en_us.json @@ -34,6 +34,7 @@ "minions.gui.instruction.configure.delete.confirm": "Delete %s?", "minions.gui.instruction.configure.copy": "Copy Reference", "minions.gui.instruction.configure.copy.description": "Click here and then use a Minion Trigger Block to bind it", + "minions.gui.instruction.errors": "Errors", "minions.gui.instruction.last_errors": "Last Errors", "minions.gui.instruction.run": "Run", "minions.gui.instruction.stop": "Stop",