how to run random command through datapack?
Solution 1:
1.15+
My solution uses an nbt array, grabs a random number, takes the value at index that was generated, and runs the command in a command block.
Preparation in Minecraft
So in preparation, you will need an array in a storage which we’ll call rcg
with each command as a value. Make sure the commands are in strings. You can do that with the following command.
data modify storage rcg commands set value [<values>]
If you ever want to add another command, the process is simple. All you need to do is append the command. The process is what follows.
data modify storage rcg commands append value “<command>”
Now, we need a Impulse Command Block
set to Needs Redstone
to run the command. We’ll put the command block at coordinate 0 0 0
.
Preparation Outside Minecraft
Now, we need a random number generator. Cloud Wolf has a random number generator that can use a range. The rng comes with trig as well although we won’t need trig for this. The download link is here. Now you need to install the datapack into your world and then you are ready to go.
Core Commands
Now, we get to the commands. So in a new function, we need a command to retrieve the length of the command array and store it in the range max scoreboard value. We’ll call this function main
. You can do that with the following command.
execute store result score in1 math run data get storage rcg commands
Now, we run the function for the rng.
function math:rng/range
Next, we set a new nbt array to the original one to iterate through the array later.
data modify storage rcg itercommands set from storage rcg commands
Now, we need a new function to remove the first value from the itercommands
array, remove 1 from the generated number, then run the function again unless the out value is 0. We’ll name this function findatindex
The following commands does this.
data remove storage rcg itercommands[0]
scoreboard players remove out math 1
execute unless score out math matches 0 run function <namespace>:findatindex
Now, we run this new function unless out is 0.
execute unless score out math matches 0 run function <namespace>:findatindex
Next, we take the first value in the itercommands
array and store it in the command block’s command.
data modify block 0 0 0 Command set from storage rcg itercommands[0]
Next, we power the command block by using one of multiple methods. 1: We modify the command block to set always active on. 2: We modify the command block to set powered to true. 3: We set a redstone block next to it. I will go with the 3rd.
setblock 0 0 -1 redstone_block
Finally, we schedule another function for 1 tick in the future, to remove the redstone block. We’ll call it rcg_end
.
schedule function <namespace>:rcg_end
There you go. You are finished. Please let me know if you have any bugs or questions.