User Tools

Site Tools



These pages will help you setup a productive development environment and semi-automated releases.


These pages are essential must-reads when modding with Fabric, and modding Minecraft in general, if you are new to modding, it is recommended you read the following.


Blocks and Block Entities

Data Generation

These pages will guide you through the Fabric Data Generation API, which generates JSON files through data generators.

:!: These pages are currently being written, some may not be available.

World Generation


These pages will guide you through Mojang's Brigadier library which allows you to create commands with complex arguments and actions.


These pages will guide you through using the many events included in Fabric API, and how to create your own events for you or other mods to use.



Mixins & ASM

These pages will guide you through the usage of SpongePowered's Mixin library, which is a highly complex topic. We recommend you read these pages thoroughly.



Contribute to Fabric


Command Exceptions

Brigadier supports command exceptions which can be used to end a command such as if an argument didn't parse properly or the command failed to execute, as well as including richer details of the failure.

All the exceptions from Brigadier are based on the CommandSyntaxException. The two main types of exceptions Brigadier provides are Dynamic and Simple exception types, of which you must create() the exception to throw it. These exceptions also allow you to specify the context in which the exception was thrown using createWithContext(ImmutableStringReader), which builds the error message to point to where on the inputted command line the error occured.

Below is a coin flip command to show an example of exceptions in use.

  1. dispatcher.register(literal("coinflip")
  2. .executes(ctx -> {
  3. Random random = new Random();
  5. if(random.nextBoolean()) { // If heads succeed.
  6. ctx.getSource().sendMessage(Text.translatable("coin.flip.heads"))
  7. return Command.SINGLE_SUCCESS;
  8. }
  10. throw new SimpleCommandExceptionType(Text.translatable("coin.flip.tails")).create(); // Oh no tails, you lose.
  11. }));

Though you are not just limited to a single type of exception as Brigadier also supplies Dynamic exceptions which take additional parameters for context.

  1. DynamicCommandExceptionType used_name = new DynamicCommandExceptionType(name -> {
  2. return Text.literal("The name: " + (String) name + " has been used");
  3. });

There are more Dynamic exception types which each take a different amount of arguments into account (Dynamic2CommandExceptionType, Dynamic3CommandExceptionType, Dynamic4CommandExceptionType, DynamicNCommandExceptionType). You should remember that the Dynamic exceptions takes an object as an argument so you may have to cast the argument for your use.

tutorial/command_exceptions.txt · Last modified: 2022/08/08 02:17 by solidblock