Added wrapper for commands

This commit is contained in:
ThePython10110 2024-05-27 07:39:08 -07:00
parent e2e1657b65
commit c0db2e3301
21 changed files with 32 additions and 501 deletions

View File

@ -182,7 +182,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
if selector_data[3]:sub(1,1) ~= "@" then
local player = minetest.get_player_by_name(selector_data[3])
if not player then
return nil, S("Player @1 not found", selector_data[3])
return nil, S("No player was found")
else
return {player}
end
@ -247,19 +247,19 @@ function better_commands.parse_selector(selector_data, context, require_one)
for _, arg in ipairs(arg_table) do
local key, value = unpack(arg)
if better_commands.supported_keys[key] == nil then
return nil, S("Invalid key: @1", key)
return nil, S("Unknown option '@1'", key)
elseif key == "x" or key == "y" or key == "z" then
if checked[key] then
return nil, S("Duplicate key: @1", key)
return nil, S("Duplicate option '@1'", key)
end
if value:sub(1,1) == "~" then
if value:sub(1,1) == "!" then
value = value:sub(2,-1)
if value == "" then value = 0 end
end
checked[key] = true
pos[key] = tonumber(value)
if not pos[key] then
return nil, S("Invalid value for @1", key)
return nil, S("Expected number for option '@1'", key)
end
checked[key] = true
elseif key == "sort" then
@ -288,7 +288,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
local key, value = unpack(arg)
if better_commands.supported_keys[key] == true then
if checked[key] then
return nil, S("Duplicate key: @1", key)
return nil, S("Duplicate option '@1'", key)
end
checked[key] = true
end
@ -315,7 +315,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
end
else
if checked.type then
return nil, S("Duplicate key: @1", key)
return nil, S("Duplicate option '@1'", key)
end
checked.type = true
if not type_table[value] then
@ -330,7 +330,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
end
else
if checked.name then
return nil, S("Duplicate key: @1", key)
return nil, S("Duplicate option '@1'", key)
end
checked.name = true
if obj_name ~= value then
@ -339,11 +339,11 @@ function better_commands.parse_selector(selector_data, context, require_one)
end
elseif key == "r" then
value = tonumber(value)
if not value then return nil, S("@1 must be a number", key) end
if not value then return nil, S("Expected number for option '@1'", key) end
matches = vector.distance(obj:get_pos(), pos) <= value
elseif key == "rm" then
value = tonumber(value)
if not value then return nil, S("@1 must be a number", key) end
if not value then return nil, S("Expected number for option '@1'", key) end
matches = vector.distance(obj:get_pos(), pos) >= value
elseif key == "level" then
if not (obj.is_player and obj:is_player()) then
@ -357,7 +357,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
end
elseif key == "l" then
value = tonumber(value)
if not value then return nil, S("@1 must be a number", key) end
if not value then return nil, S("Expected number for option '@1'", key) end
if not (obj.is_player and obj:is_player()) then
matches = false
else
@ -367,7 +367,7 @@ function better_commands.parse_selector(selector_data, context, require_one)
end
elseif key == "lm" then
value = tonumber(value)
if not value then return nil, S("@1 must be a number", key) end
if not value then return nil, S("Expected number for option '@1'", key) end
if not (obj.is_player and obj:is_player()) then
matches = false
else
@ -386,10 +386,10 @@ function better_commands.parse_selector(selector_data, context, require_one)
local gamemode = better_commands.gamemode_aliases[value] or value
if better_commands.mcl then
if table.indexof(mcl_gamemode.gamemodes, gamemode) == -1 then
return nil, S("Invalid gamemode @1", gamemode)
return nil, S("Unknown game mode: @1", gamemode)
end
elseif gamemode ~= "creative" and gamemode ~= "survival" then
return nil, S("Invalid gamemode @1", gamemode)
return nil, S("Unknown game mode: @1", gamemode)
end
matches = better_commands.get_gamemode(obj) == gamemode
end
@ -444,9 +444,6 @@ end
---@return string? err
---@nodiscard
function better_commands.parse_pos(data, start, context)
if not context then
return nil, S("Missing context")
end
local axes = {"x","y","z"}
local result = table.copy(context.pos)
local look
@ -474,7 +471,7 @@ function better_commands.parse_pos(data, start, context)
result[axes[i+1]] = tonumber(coordinate:sub(2,-1)) or 0
look = true
else
return nil, S("Invalid coordinate: @1", coordinate)
return nil, S("Invalid coordinate '@1'", coordinate)
end
end
if look then
@ -500,7 +497,7 @@ end
---@nodiscard
function better_commands.parse_item(item_data, ignore_count)
if not better_commands.handle_alias(item_data[3]) then
return nil, S("Invalid item: @1", item_data[3])
return nil, S("Invalid item '@1'", item_data[3])
end
if item_data.type == "item" and not item_data.extra_data then
local stack = ItemStack(item_data[3])
@ -521,7 +518,6 @@ function better_commands.parse_item(item_data, ignore_count)
if arg_table then
local meta = stack:get_meta()
for key, value in pairs(arg_table) do
minetest.log(S("@1 = @2", key, value))
if key == "wear" then
stack:set_wear(tonumber(value) or 0)
else
@ -535,7 +531,7 @@ function better_commands.parse_item(item_data, ignore_count)
stack:set_wear(tonumber(item_data[6]) or stack:get_wear())
return stack
end
return nil, S("Invalid item: @1", item_data[3])
return nil, S("Invalid item: '@1'", item_data[3])
end
---Parses node data, returns node and metadata table
@ -550,10 +546,10 @@ function better_commands.parse_node(item_data)
end
local itemstring = better_commands.handle_alias(item_data[3])
if not itemstring then
return nil, nil, S("Invalid item: @1", item_data[3])
return nil, nil, S("Unknown node '@1'", item_data[3])
end
if not minetest.registered_nodes[itemstring] then
return nil, nil, S("Not a node: @1", itemstring)
return nil, nil, S("'@1' is not a node", itemstring)
end
if item_data.type == "item" and not item_data.extra_data then
return {name = itemstring}
@ -573,7 +569,7 @@ function better_commands.parse_node(item_data)
end
return node_table, meta_table
end
return nil, nil, S("Invalid item: @1", item_data[3])
return nil, nil, S("Invalid item '@1'", item_data[3])
end
---Parses a time string and returns a time (between 0 and 1)
@ -597,7 +593,7 @@ function better_commands.parse_time_string(time, absolute)
if unit == "" then unit = "t" end
amount = tonumber(amount)
end
-- Don't think it's even possible to be negative but just in case
-- The pattern shouldn't let through any negative numbers... but just in case
if amount < 0 then return nil, S("Amount must not be negative") end
if unit == "s" then
local second_multiplier = tonumber(minetest.settings:get("time_speed")) or 72
@ -605,7 +601,7 @@ function better_commands.parse_time_string(time, absolute)
elseif unit == "d" then
amount = amount * 24000
elseif unit ~= "t" then
return nil, S("Unit must be either t (default), s, or d, not @1", unit)
return nil, S("Invalid unit '@1'", unit)
end
if not absolute then
@ -647,7 +643,7 @@ function better_commands.expand_selectors(str, split_param, index, context)
end
for j, obj in ipairs(targets) do
if j > 1 then next_part = next_part.." " end
if not obj.is_player then
if not obj.is_player then -- this should only happen with @s
next_part = next_part..S("Command Block")
break
end

View File

@ -13,7 +13,7 @@ function better_commands.get_scoreboard_names(selector, context, objective, requ
local result = {}
local objectives = better_commands.scoreboard.objectives
if objective and not objectives[objective] then
return nil, S("Invalid objective: @1", objective)
return nil, S("Invalid objective '@1'", objective)
end
if selector[3] == "*" then
if objective then

View File

@ -28,6 +28,8 @@ Initial release. Missing *lots* of commands, several `execute` subcommands, lots
* Added `/teammsg` command
* Added `/gamerule` and `/changesetting` commands
* Command results are now shown to other players as well, unless `better_commands.send_command_feedback` is disabled
* Error messages are now red
* Command outputs now match Minecraft's
### Bugfixes
* Fixed a bug with the `/kill` command (it should work now).
* The `rm`/`r` selector arguments now actually treat their values as numbers (not strings), and are now inclusive as intended.

View File

@ -6,9 +6,6 @@ better_commands.register_command("ability", {
description = S("Sets <priv> of <player> to [value] (true/false). If [value] is not supplied, returns the existing value of <priv>"),
privs = {privs = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then
return false, nil, 0
@ -46,12 +43,12 @@ better_commands.register_command("ability", {
if minetest.registered_privileges[priv] then
return true, S("@1 = @2", priv, tostring(privs[priv])), 1
else
return false, minetest.colorize("red", S("Invalid privilege: @1", priv)), 0
return false, minetest.colorize("red", S("Invalid privilege '@1'", priv)), 0
end
end
else
if not minetest.registered_privileges[priv] then
return false, minetest.colorize("red", S("Invalid privilege: @1", priv)), 0
return false, minetest.colorize("red", S("Invalid privilege '@1'", priv)), 0
else
if set == "true" then
privs[priv] = true

View File

@ -3,12 +3,9 @@ local S = minetest.get_translator(minetest.get_current_modname())
better_commands.register_command("say", {
params = S("<message>"),
description = S("Says <message> to all players (which can include selectors such as @@a if you have the server priv)"),
description = S("Says <message> to all players (which can include selectors such as @@a if you have the 'server' priv)"),
privs = {shout = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then return false, nil, 0 end
local message
@ -26,12 +23,9 @@ better_commands.register_command("say", {
better_commands.register_command("msg", {
params = S("<target> <message>"),
description = S("Sends <message> privately to <target> (which can include selectors like @@a if you have the server priv)"),
description = S("Sends <message> privately to <target> (which can include selectors like @@a if you have the 'server' priv)"),
privs = {shout = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] and split_param[2] then
return false, nil, 0
@ -65,13 +59,10 @@ better_commands.register_command_alias("w", "msg")
better_commands.register_command_alias("tell", "msg")
better_commands.register_command("me", {
description = S("Broadcasts a message about yourself (which can include selectors like @@a if you have the server priv)"),
description = S("Broadcasts a message about yourself (which can include selectors like @@a if you have the 'server' priv)"),
params = S("<action>"),
privs = {shout = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then return false, nil, 0 end
local message
@ -89,12 +80,9 @@ better_commands.register_command("me", {
better_commands.register_command("teammsg", {
params = S("<message>"),
description = S("Sends <message> privately to all team members (which can include selectors like @@a if you have the server priv)"),
description = S("Sends <message> privately to all team members (which can include selectors like @@a if you have the 'server' priv)"),
privs = {shout = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then
return false, nil, 0

View File

@ -5,8 +5,6 @@ better_commands.register_command("clear", {
privs = { server = true },
params = S("[targets] [items] [maxCount]"),
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
local split_param = better_commands.parse_params(param)
local selector = split_param[1]
local targets, err

View File

@ -6,9 +6,6 @@ better_commands.register_command("bc", {
description = S("Runs any Better Commands command, so Better Commands don't have to override existing commands"),
privs = {},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local command, command_param = param:match("^%/?([%S]+)%s*(.-)$")
local def = better_commands.commands[command]
if def then
@ -31,9 +28,6 @@ better_commands.register_command("old", {
description = S("Runs any command that Better Commands has overridden"),
privs = {},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local command, command_param = param:match("^%/?([%S]+)%s*(.-)$")
local def = better_commands.old_commands[command]
if def then

View File

@ -291,9 +291,6 @@ better_commands.register_command("execute", {
description = S("Run any Better Command (not other commands) after changing the context"),
privs = {server = true, ban = true, privs = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then return false, nil, 0 end
local branch = 1

View File

@ -14,9 +14,6 @@ better_commands.register_command("gamemode", {
params = S("<gamemode> [player]"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param, err = better_commands.parse_params(param)
if err then return false, minetest.colorize("red", err), 0 end
local gamemode = split_param[1] and split_param[1][3]

View File

@ -46,9 +46,6 @@ better_commands.register_command("give", {
description = S("Gives [count] of <item> to <target>"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not (split_param[1] and split_param[2]) then
return false, nil, 0

View File

@ -6,9 +6,6 @@ better_commands.register_command("kill", {
description = S("Kills [target] or self"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
if param == "" then param = "@s" end
local split_param = better_commands.parse_params(param)
local targets, err = better_commands.parse_selector(split_param[1], context)

View File

@ -6,8 +6,6 @@ better_commands.register_command("playsound", {
description = S("Plays a sound"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
local split_param = better_commands.parse_params(param)
if not (split_param[1] and split_param[2]) then
return false, nil, 0

View File

@ -20,8 +20,6 @@ better_commands.register_command("scoreboard", {
description = S("Manupulates the scoreboard"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
local split_param = better_commands.parse_params(param)
if not (split_param[1] and split_param[2]) then
return false, minetest.colorize("red", S("Missing arguments")), 0
@ -581,9 +579,6 @@ better_commands.register_command("trigger", {
privs = {},
param = "<objective> [add|set <value>]",
func = function (name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
if not (context.executor.is_player and context.executor:is_player()) then
return false, minetest.colorize("red", S("/trigger can only be used by players")), 0
end

View File

@ -5,9 +5,6 @@ better_commands.register_command("setblock", {
params = S("<pos> <block> [keep|replace]"),
description = S("Places <block> at <pos>. If keep, only replace air"),
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] and split_param[2] and split_param[3] and split_param[4] then
return false, nil, 0

View File

@ -6,8 +6,6 @@ better_commands.register_command("gamerule", {
params = S("<setting> [value]"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then return false, nil, 0 end
local setting = split_param[1][3]

View File

@ -5,9 +5,6 @@ better_commands.register_command("spawnpoint", {
privs = {server = true},
params = S("[targets]"),
func = function (name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param, err = better_commands.parse_params(param)
if err then return false, minetest.colorize("red", err), 0 end
local selector = split_param[1]
@ -46,9 +43,6 @@ better_commands.register_command("clearspawnpoint", {
privs = {server = true},
params = S("[targets]"),
func = function (name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param, err = better_commands.parse_params(param)
if err then return false, minetest.colorize("red", err), 0 end
local selector = split_param[1]

View File

@ -6,9 +6,6 @@ better_commands.register_command("summon", {
params = S("<entity> [pos] [ (<yRot> [xRot]) | (facing <entity>) ])"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
local entity = split_param[1]
if not entity then return false, minetest.colorize("red", S("Missing entity")), 0 end

View File

@ -6,9 +6,6 @@ better_commands.register_command("team", {
description = S("Controls teams"),
privs = {server = true},
func = function (name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param, err = better_commands.parse_params(param)
if err then return false, minetest.colorize("red", err), 0 end
if not split_param[1] then return false, minetest.colorize("red", S("Missing subcommand")), 0 end

View File

@ -7,9 +7,6 @@ better_commands.register_command("teleport", {
description = S("Teleports and rotates things"),
privs = {server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not split_param[1] then return false, nil, 0 end
if split_param[1].type == "selector" then

View File

@ -15,9 +15,6 @@ better_commands.register_command("time", {
description = S("Sets or gets the time"),
privs = {settime = true, server = true},
func = function(name, param, context)
context = better_commands.complete_context(name, context)
if not context then return false, minetest.colorize("red", S("Missing context")), 0 end
if not context.executor then return false, minetest.colorize("red", S("Missing executor")), 0 end
local split_param = better_commands.parse_params(param)
if not (split_param[1] and split_param[2]) then return false, nil, 0 end
local action = split_param[1][3]:lower()

View File

@ -1,402 +0,0 @@
# textdomain: better_commands
Unknown Falling Node=
Falling @1=
Command Block=
???=
Player @1 not found=
Invalid key: @1=
Duplicate key: @1=
Invalid value for @1=
Only 1 of keys c and limit can exist=
@1 must be a non-zero integer=
@1 must be a number=
Only 1 of keys m and gamemode can exist=
Multiple matching entities found=
Missing coordinate=
Cannot mix local and global coordinates=
Invalid coordinate: @1=
Invalid item: @1=
Invalid item=
Not a node: @1=
Invalid amount=
Amount must not be negative=
Unit must be either t (default), s, or d, not @1=
Missing context=
No entity was found=
@1 @= @2=
Invalid gamemode @1=
No targets found=
Multiple targets found=
Invalid objective: @1=
<player> <priv> [value]=
Sets <priv> of <player> to [value] (true/false). If [value] is not supplied, returns the existing value of <priv>=
[value] must be true or false (or missing), not '@1'=
Invalid privilege: @1=
@1 privilege @2 by @3=
@1 privilege @2 for @3=
Missing executor=
<message>=
Says <message> to all players (which can include selectors such as @@a if you have the server priv)=
<target> <message>=
Sends <message> privately to <target> (which can include selectors like @@a if you have the server priv)=
@1 whispers to you: =
You whisper to @1: =
Broadcasts a message about yourself (which can include selectors like @@a if you have the server priv)=
<action>=
Sends <message> privately to all team members (which can include selectors like @@a if you have the server priv)=
An entity is required to run this command here=
You must be on a team to message your team=
[@1] <@2> =
Clears player inventories=
[targets] [items] [maxCount]=
maxCount must be a number=
No items were found on player @1=
Found @1 matching items(s) on player @2=
Removed all items from player @1=
Removed @1 item(s) from player @2=
No items were found on @1 players=
Found @1 matching items(s) on @2 players=
Removed all items from @1 players=
Removed @1 items from @2 players=
No player was found=
<command data>=
Runs any Better Commands command, so Better Commands don't have to override existing commands=
You don't have permission to run this command (missing privileges: @1)=
Invalid command: @1=
Runs any command that Better Commands has overridden=
Missing argument for subcommand @1=
Invalid swizzle, expected combination of 'x', 'y', and 'z'=
Invalid entity anchor position @1=
Invalid target: @1=
Invalid argument for @1=
Invalid argument for rotated=
Missing argument(s)) for rotated=
Missing command=
Invalid command or privs: @1=
<align|anchored|as|at|facing|positioned|rotated|run> ...=
Run any Better Command (not other commands) after changing the context=
Invalid subcommand: @1=
Successfully executed @1 times=
Sets a player's gamemode=
<gamemode> [player]=
Missing gamemode=
Set own gamemode to @1=
Set gamemode of @1 to @2=
Set gamemode of @1 players to @2=
Cannot give an empty item=
Unknown item '@1'=
Giving 'ignore' is not allowed=
Gave [@1] to @2=
<target> <item> [count] [wear]=
Gives [count] of <item> to <target>=
Gave item(s) to @1 players=
<item> [count] [wear]=
Gives [count] of <item> to yourself=
[target]=
Kills [target] or self=
Killed @1=
Killed @1 entities=
=
Kills self=
Unexpected argument: @1=
<sound> <targets|pos> [volume] [pitch] [maxDistance]=
Plays a sound=
Must be a number, not @1=
Sound played=
objectives|players ...=
Manupulates the scoreboard=
Missing arguments=
Missing name=
Objective @1 already exists=
Missing criterion=
Invalid criterion @1=
Added objective @1=
There are no objectives=
There are @1 objective(s): @2=
Missing objective=
Unknown scoreboard objective '@1'=
Must be 'displayname' or 'numberformat'=
Missing display name=
@1 set to @2=
Cleared numberformat for @1=
Missing argument=
Invalid color=
Must be 'blank', 'fixed', or 'styled'=
Removed objective @1=
`list` support has not been added yet.=
`below_name` support has not been added yet.=
Must be 'list', 'below_name', 'sidebar', or 'sidebar.team.<color>=
Expected ascending|descending, got @1=
Display slot @1 does not support sorting.=
Set display slot @1 to show objective @2=
Expected 'add', 'list', 'modify', 'remove', or 'setdisplay', got '@1'=
Missing target=
Missing score=
No scores found=
Set score for @1=
Set score for @1 entities=
Must be 'name' or 'numberformat'=
Set display name of @1 to @2=
Set display name of @1 entities to @2=
Cleared format for @1=
Must be 'name' or 'numberformat', not @1=
@1 is not a trigger objective=
No players found=
Enabled trigger [@1] for @2=
Enabled trigger [@1] for @2 players=
@1 has @2 [@3]=
@1 does not have a score for @2=
There are no tracked players=
There are @1 tracked player(s): @2=
@1 has no scores=
@1 has @2 score(s): @3=
Missing source selector=
Missing source objective=
Invalid source objective=
Missing operator=
Invalid operator: @1=
Missing target selector=
Missing target objective=
Invalid target objective=
Skipping attempt to divide by zero=
@1 [@2] score of @3 @4 [@5] score of @6=
Changed @1 scores (@2 total operations)=
Missing selector=
Invalid objective=
Missing min=
Must be a number=
Missing max=
Randomized score for @1=
Randomized @2 scores=
Reset score for @1=
Reset @2 scores=
Player @1 has no scores recorded=
Score @1 is in range @2 to @3=
Score @1 is NOT in range @2 to @3=
Expected 'add', 'display', 'enable', 'get', 'list', 'operation', 'random', 'reset', 'set', or 'test', got @1=
Allows players to set their own scores in certain conditions=
/trigger can only be used by players=
You can only trigger objectives that are 'trigger' type=
You cannot trigger this objective yet=
Triggered [@1]=
Missing value=
Value must be a number=
Triggered [@1] (added @2 to value)=
Triggered [@1] (set value to @2)=
Expected 'add' or 'set', got @1=
Invalid color: @1=
No target entities found=
No entities found=
<pos> <block> [keep|replace]=
Places <block> at <pos>. If keep, only replace air=
Last argument ust be either 'replace' (default)), 'keep', or missing, not @1=
Position is not empty=
Node set=
Sets or queries settings=
<setting> [value]=
Failed. Cannot modify secure settings. Edit the settings file manually=
Set @1 to @2 (new setting)=
Set @1 to @2=
Setting @1 has not been set=
Sets players' spawnpoints=
[targets]=
Spawn point set=
Non-player entities are not supported by this command=
No player was found.=
Set spawn point to @1 for @2=
Set spawn point to @1 for @2 players=
Clear players' spawnpoints=
Spawn point cleared=
Cleared spawn point for @2=
Set spawn point for @2 players=
Summons an entity=
<entity> [pos] [ (<yRot> [xRot]) | (facing <entity>) ])=
Missing entity=
Invalid entity: @1=
Could not summon @1=
Summoned @1=
add|empty|join|leave|list|modify|remove ...=
Controls teams=
Missing subcommand=
Missing team name=
Team @1 already exists=
Invalid team name @1: Can only contain letters, numbers, and underscores=
Added team @1=
Removed team [@1]=
Removed all players from team [@1]=
Team @1 does not exist=
Joined team [@1]=
Added @1 to team [@2]=
Added @1 entities to [@2]=
Non-players cannot be on a team=
Removed @1 from any team=
There are @1 team(s): @2=
There are no teams=
Team [@1] has @2 member(s): @3=
There are no members on team [@1]=
Team [@1] does not exist=
Team name is required=
Unknown team '@1'=
Missing key=
Set color of team [@1] to @2=
Reset color of team [@1]=
Set display name of team [@1] to @2=
Reset display name of team [@1]=
Value must be 'true' or 'false', not @1=
Set friendly fire for team [@1] to @2=
Reset name format for team [@1]=
Set name format for team [@1] to @2=
Value must be 'color', 'displayName', 'friendlyFire', or 'nameFormat'=
Must be 'add', 'empty', 'join', 'leave', 'list', 'modify', or 'remove', not @1=
[entity/ies] <location/entity> ([yaw] [pitch] | [facing <location/entity>])=
Teleports and rotates things=
Command blocks can't teleport (although I did consider making it possible)=
Teleported @1 to @2=
Teleported @1 entities to @2=
(add <time>)|(set <time>)|(query daytime|gametime|day)=
Sets or gets the time=
Time set=
Current time: @1=
Time since world creation: @1=
Day count: @1=
Must be 'daytime', 'gametime', or 'day', got @1=
Must be 'add', 'set', or 'query'=
Item=
Falling Node=
Angelfish=
Bat=
Bird=
Blue Tang=
Cat=
Chicken=
Clownfish=
Cow=
Fox=
Frog=
Grizzly Bear=
Horse=
Opossum=
Owl=
Pig=
Rat=
Reindeer=
Sheep=
Song Bird=
Tropical Fish=
Turkey=
Wolf=
Badger=
Butterfly=
Fire Dragon=
Lightning Dragon=
Poison Dragon=
Ice Dragon=
Boss Dragon=
Elephant=
Gnorm=
Golem=
Hedgehog=
Nyan Cat=
Ogre=
Orc=
Morgul Orc=
Panda=
Flying Pig=
Skeleton=
Tortoise=
Treeman=
Wasp=
King of Sting=
Boss Waterdragon=
Waterdragon=
Whale=
Wyvern=
Jungle Wyvern=
Cyst=
Flyingrod=
Lavawalker=
Noodlemaster=
Razorback=
Soka Archer=
Soka Melee=
Tardigrade=
Flesh Whip=
Bee=
Bunny=
Kitten=
Penguin=
Pumba=
Balrog=
Crocodile=
Jellyfish=
Mese Monster=
Dirt Monster=
Dungeon Master=
Fire Spirit=
Land Guard=
Lava Flan=
Obsidian Flan=
Oerkki=
Sand Monster=
Spider=
Stone Monster=
Tree Monster=
Shark=
Skeleton Archer=
Dark Skeleton Archer=
Turtle=
Sea Turtle=
Ant Queen=
Ant Soldier=
Ant Worker=
Black Widow=
Bloco=
Crab=
Daddy Long Legs=
Dolidrosaurus=
Duck=
Duckking=
Echidna=
Enderduck=
Felucco=
Flying Duck=
Giant Sandworm=
Icelamander=
Icesnake=
Kraken=
Larva=
Lava Titan=
Manticore=
Mantis=
Mantis Beast=
Masticone=
Mese Dragon=
Moonheron=
Morbat=
Mordain=
Morde=
Morgre=
Morgut=
Morlu=
Mortick=
Morvalar=
Morvy=
Morwa=
Night Master=
Octopus=
Phoenix=
Pumpboom=
Pumpking=
Sand Bloco=
Sandworm=
Scrausics=
Signosigno=
Snow Biter=
Spiderduck=
Stoneater=
Swimming Duck=
Tarantula=
Uloboros=
Werewolf=
Xgaloctobus=
@1 Sheep=