User Tools

Site Tools


tutorial:commands

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:commands [2023/11/18 11:21] solidblocktutorial:commands [2025/07/06 07:10] (current) – [Register a basic command] solidblock
Line 3: Line 3:
 ====== Creating Commands ====== ====== Creating Commands ======
  
-Creating commands can allow a mod developer to add functionality that can used through a command. This tutorial will teach you how to register commands, and the general command structure of Brigadier.+Creating commands can allow a mod developer to add functionality that can be used through a command. This tutorial will teach you how to register commands, and the general command structure of Brigadier.
  
 ===== What is Brigadier? ===== ===== What is Brigadier? =====
Line 105: Line 105:
 </code> </code>
  
-**Please ensure you import the correct static method.** The method ''literal'' is ''CommandManager.literal''. You can also alternatively explicitly write ''CommandManager.literal'' instead of using static imports. ''CommandManager.literal("foo")'' tells brigadier this command has one node, a **literal** called ''foo''.+**Please ensure you import the correct static method.** The method ''literal'' is ''CommandManager.literal''. You can also alternatively explicitly write ''CommandManager.literal'' instead of using static imports. ''%%CommandManager.literal("foo")%%'' tells brigadier this command has one node, a **literal** called ''foo''.
  
 In the ''sendFeedback'' method, the first parameter is the text to be sent, which is a ''Text'' in versions below 1.20, or a ''Supplier<Text>'' in 1.20 and above (this is used to avoid instantiating ''Text'' objects when not needed, so please do not use ''Suppliers.ofInstance'' or smiliar methods). The second parameter determines whether to broadcast the feedback to other operators. If the command is to //query// something without actually affecting the world, such as query the current time or some player's score, it should be ''false''. If the command actually //does// something, such as changing the time or modifying someone's score, it should be ''true''. If game rule ''sendCommandFeedback'' is false, you will not accept any feedback. If the sender is modifed through ''/execute as ...'', the feedback is sent to the original sender. In the ''sendFeedback'' method, the first parameter is the text to be sent, which is a ''Text'' in versions below 1.20, or a ''Supplier<Text>'' in 1.20 and above (this is used to avoid instantiating ''Text'' objects when not needed, so please do not use ''Suppliers.ofInstance'' or smiliar methods). The second parameter determines whether to broadcast the feedback to other operators. If the command is to //query// something without actually affecting the world, such as query the current time or some player's score, it should be ''false''. If the command actually //does// something, such as changing the time or modifying someone's score, it should be ''true''. If game rule ''sendCommandFeedback'' is false, you will not accept any feedback. If the sender is modifed through ''/execute as ...'', the feedback is sent to the original sender.
Line 130: Line 130:
  
 ===== Static Imports ===== ===== Static Imports =====
-In the example above, the use of static imports is used for code simplifying. For a literal this would shorten the statement to ''literal("foo")''. This also works for getting the value of an argument. This shortens ''StringArgumentType.getString(ctx, "string")'' to ''getString(ctx, "string")''. This also works for Minecraft's own argument types.+In the example above, the use of static imports is used for code simplifying. For a literal this would shorten the statement to ''%%literal("foo")%%''. This also works for getting the value of an argument. This shortens ''%%StringArgumentType.getString(ctx, "string")%%'' to ''%%getString(ctx, "string")%%''. This also works for Minecraft's own argument types.
  
 Below is an example of some static imports: Below is an example of some static imports:
Line 320: Line 320:
 You can also do this, however it is much less stable than registering commands and could cause unwanted side effects. To keep things simple, you need to use reflection on brigadier and remove the nodes. After this, you need to send the command tree to every player again using ''sendCommandTree(ServerPlayerEntity)''. If you don't send the updated command tree, the client may think a command still exists, even though the server will fail execution. You can also do this, however it is much less stable than registering commands and could cause unwanted side effects. To keep things simple, you need to use reflection on brigadier and remove the nodes. After this, you need to send the command tree to every player again using ''sendCommandTree(ServerPlayerEntity)''. If you don't send the updated command tree, the client may think a command still exists, even though the server will fail execution.
  
 +===== Can I execute command without typing in game? =====
 +Yes! You can. Before trying the next code, take note it works on Fabric 0.91.6+1.20.2 and it was not tested in other versions.
 +
 +Here is the code example
 +
 +<code java>
 +    private void vanillaCommandByPlayer(World world, BlockPos pos, String command) {
 +        PlayerEntity player = world.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 5, false);
 +        if (player != null) {
 +            CommandManager commandManager = Objects.requireNonNull(player.getServer()).getCommandManager();
 +            ServerCommandSource commandSource = player.getServer().getCommandSource();
 +            commandManager.executeWithPrefix(commandSource, command);
 +        }
 +    }
 +</code>
 +
 +First, you need a CommandManager<ServerCommandSource>.
 +Second, you need the ServerCommandSource.
 +Then, u can call some CommandManager public methods like commandeManader.execute. (.execute need ParseResults<ServerCommandSource>)
 +But commandeManader.executeWithPrefix allow you to use String. You can also put the slash (/).
 +
 +So... have fun!
tutorial/commands.1700306513.txt.gz · Last modified: 2023/11/18 11:21 by solidblock