Commit 34ea3089 authored by RDsatan's avatar RDsatan Committed by Melledy
Browse files

Optimize the join and remove commands to team

parent 5ddf67d9
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.ArrayList;
import java.util.List;
import static emu.grasscutter.utils.Language.translate;
@Command(label = "join", usage = "join [AvatarIDs] such as\"join 10000038 10000039\"",
description = "commands.join.description", permission = "player.join")
public class JoinCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
List<Integer> avatarIds = new ArrayList<>();
for (String arg : args) {
try {
int avatarId = Integer.parseInt(arg);
avatarIds.add(avatarId);
} catch (Exception ignored) {
ignored.printStackTrace();
CommandHandler.sendMessage(sender, translate("commands.generic.invalid.avatarId"));
return;
}
}
for (int i = 0; i < args.size(); i++) {
Avatar avatar = targetPlayer.getAvatars().getAvatarById(avatarIds.get(i));
if (avatar == null) {
CommandHandler.sendMessage(sender, translate("commands.generic.invalid.avatarId"));
return;
}
if (targetPlayer.getTeamManager().getCurrentTeamInfo().contains(avatar)){
continue;
}
targetPlayer.getTeamManager().getCurrentTeamInfo().addAvatar(avatar);
}
// Packet
targetPlayer.getTeamManager().updateTeamEntities(new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
}
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static emu.grasscutter.utils.Language.translate;
@Command(label = "remove", usage = "remove [indexOfYourTeams] index start from 1",
description = "commands.remove.description", permission = "player.remove")
public class RemoveCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
List<Integer> avatarIndexList = new ArrayList<>();
for (String arg : args) {
try {
int avatarIndex = Integer.parseInt(arg);
if (!avatarIndexList.contains(avatarIndex)) {
avatarIndexList.add(avatarIndex);
}
} catch (Exception ignored) {
ignored.printStackTrace();
CommandHandler.sendMessage(sender, translate("commands.remove.invalid_index"));
return;
}
}
Collections.sort(avatarIndexList, Collections.reverseOrder());
for (int i = 0; i < avatarIndexList.size(); i++) {
if (avatarIndexList.get(i) > targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars().size() || avatarIndexList.get(i) <= 0) {
CommandHandler.sendMessage(targetPlayer, translate("commands.remove.invalid_index"));
return;
}
targetPlayer.getTeamManager().getCurrentTeamInfo().removeAvatar(avatarIndexList.get(i) - 1);
}
// Packet
targetPlayer.getTeamManager().updateTeamEntities(new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
}
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import static emu.grasscutter.utils.Language.translate;
import static emu.grasscutter.Configuration.*;
@Command(label = "team", usage = "team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]", permission = "player.team",
permissionTargeted = "player.team.others", description = "commands.team.description")
public final class TeamCommand implements CommandHandler {
private static final int BASE_AVATARID = 10000000;
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
if (args.isEmpty()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.usage"));
return;
}
switch (args.get(0)) {
case "add":
if (!addCommand(sender, targetPlayer, args)) return;
break;
case "remove":
if (!removeCommand(sender, targetPlayer, args)) return;
break;
case "set":
if (!setCommand(sender, targetPlayer, args)) return;
break;
default:
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.usage"));
return;
}
targetPlayer.getTeamManager().updateTeamEntities(new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
private boolean addCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 2) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.add_usage"));
return false;
}
int index = -1;
if (args.size() > 2) {
try {
index = Integer.parseInt(args.get(2)) - 1;
if (index < 0) index = 0;
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_index"));
return false;
}
}
var avatarIds = args.get(1).split(",");
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
if (currentTeamAvatars.size() + avatarIds.length > GAME_OPTIONS.avatarLimits.singlePlayerTeam) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.add_too_much", GAME_OPTIONS.avatarLimits.singlePlayerTeam));
return false;
}
for (var avatarId: avatarIds) {
try {
int id = Integer.parseInt(avatarId);
var ret = addAvatar(sender, targetPlayer, id, index);
if (index > 0) ++index;
if (!ret) continue;
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_add_avatar", avatarId));
continue;
}
}
return true;
}
private boolean removeCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 2) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.remove_usage"));
return false;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
var avatarCount = currentTeamAvatars.size();
var metaIndexList = args.get(1).split(",");
var indexes = new HashSet<Integer>();
var ignoreList = new ArrayList<Integer>();
for (var metaIndex: metaIndexList) {
// step 1: parse metaIndex to indexes
var subIndexes = transformToIndexes(metaIndex, avatarCount);
if (subIndexes == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_parse_index", metaIndex));
continue;
}
// step 2: get all of the avatar id through indexes
for (var avatarIndex: subIndexes) {
try {
indexes.add(currentTeamAvatars.get(avatarIndex - 1));
} catch (Exception e) {
ignoreList.add(avatarIndex);
continue;
}
}
}
// step 3: check if user remove all of the avatar
if (indexes.size() >= avatarCount) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.remove_too_much"));
return false;
}
// step 4: hint user for ignore index
if (!ignoreList.isEmpty()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.ignore_index", ignoreList));
}
// step 5: remove
currentTeamAvatars.removeAll(indexes);
return true;
}
private boolean setCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 3) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.set_usage"));
return false;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
int index;
try {
index = Integer.parseInt(args.get(1)) - 1;
if (index < 0) index = 0;
} catch(Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_parse_index", args.get(1)));
return false;
}
if (index + 1 > currentTeamAvatars.size()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.index_out_of_range"));
return false;
}
int avatarId;
try {
avatarId = Integer.parseInt(args.get(2));
} catch(Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_parse_avatar_id", args.get(2)));
return false;
}
if (avatarId < BASE_AVATARID) {
avatarId += BASE_AVATARID;
}
if (currentTeamAvatars.contains(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_already_in_team", avatarId));
return false;
}
if (!targetPlayer.getAvatars().hasAvatar(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_not_found", avatarId));
return false;
}
currentTeamAvatars.set(index, avatarId);
return true;
}
private boolean addAvatar(Player sender, Player targetPlayer, int avatarId, int index) {
if (avatarId < BASE_AVATARID) {
avatarId += BASE_AVATARID;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
if (currentTeamAvatars.contains(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_already_in_team", avatarId));
return false;
}
if (!sender.getAvatars().hasAvatar(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_not_found", avatarId));
return false;
}
if (index < 0) {
currentTeamAvatars.add(avatarId);
} else {
currentTeamAvatars.add(index, avatarId);
}
return true;
}
private List<Integer> transformToIndexes(String metaIndexes, int listLength) {
// step 1: check if metaIndexes is a special constants
if (metaIndexes.equals("first")) {
return List.of(1);
} else if (metaIndexes.equals("last")) {
return List.of(listLength);
}
// step 2: check if metaIndexes is a range
if (metaIndexes.contains("-")) {
var range = metaIndexes.split("-");
if (range.length < 2) {
return null;
}
int min, max;
try {
min = switch (range[0]) {
case "first" -> 1;
case "last" -> listLength;
default -> Integer.parseInt(range[0]);
};
max = switch (range[1]) {
case "first" -> 1;
case "last" -> listLength;
default -> Integer.parseInt(range[1]);
};
} catch (Exception e) {
return null;
}
if (min > max) {
min ^= max;
max ^= min;
min ^= max;
}
var indexes = new ArrayList<Integer>();
for (int i = min; i <= max; ++i) {
indexes.add(i);
}
return indexes;
}
// step 3: index is a value, simply return
try {
int index = Integer.parseInt(metaIndexes);
return List.of(index);
} catch (Exception e) {
return null;
}
}
}
{ {
"messages": { "messages": {
"game": { "game": {
"port_bind": "Game Server started on port %s", "port_bind": "Game Server started on port %s",
"connect": "Client connected from %s", "connect": "Client connected from %s",
"disconnect": "Client disconnected from %s", "disconnect": "Client disconnected from %s",
"game_update_error": "An error occurred during game update.", "game_update_error": "An error occurred during game update.",
"command_error": "Command error:" "command_error": "Command error:"
}, },
"dispatch": { "dispatch": {
"port_bind": "[Dispatch] Dispatch server started on port %s", "port_bind": "[Dispatch] Dispatch server started on port %s",
"request": "[Dispatch] Client %s %s request: %s", "request": "[Dispatch] Client %s %s request: %s",
"keystore": { "keystore": {
"general_error": "[Dispatch] Error while loading keystore!", "general_error": "[Dispatch] Error while loading keystore!",
"password_error": "[Dispatch] Unable to load keystore. Trying default keystore password...", "password_error": "[Dispatch] Unable to load keystore. Trying default keystore password...",
"no_keystore_error": "[Dispatch] No SSL cert found! Falling back to HTTP server.", "no_keystore_error": "[Dispatch] No SSL cert found! Falling back to HTTP server.",
"default_password": "[Dispatch] The default keystore password was loaded successfully. Please consider setting the password to 123456 in config.json." "default_password": "[Dispatch] The default keystore password was loaded successfully. Please consider setting the password to 123456 in config.json."
}, },
"authentication": { "authentication": {
"default_unable_to_verify": "[Authentication] Something called the verifyUser method which is unavailable in the default authentication handler" "default_unable_to_verify": "[Authentication] Something called the verifyUser method which is unavailable in the default authentication handler"
}, },
"no_commands_error": "Commands are not supported in dispatch only mode.", "no_commands_error": "Commands are not supported in dispatch only mode.",
"unhandled_request_error": "[Dispatch] Potential unhandled %s request: %s", "unhandled_request_error": "[Dispatch] Potential unhandled %s request: %s",
"account": { "account": {
"login_attempt": "[Dispatch] Client %s is trying to log in", "login_attempt": "[Dispatch] Client %s is trying to log in",
"login_success": "[Dispatch] Client %s logged in as %s", "login_success": "[Dispatch] Client %s logged in as %s",
"login_token_attempt": "[Dispatch] Client %s is trying to log in via token", "login_token_attempt": "[Dispatch] Client %s is trying to log in via token",
"login_token_error": "[Dispatch] Client %s failed to log in via token", "login_token_error": "[Dispatch] Client %s failed to log in via token",
"login_token_success": "[Dispatch] Client %s logged in via token as %s", "login_token_success": "[Dispatch] Client %s logged in via token as %s",
"combo_token_success": "[Dispatch] Client %s succeed to exchange combo token", "combo_token_success": "[Dispatch] Client %s succeed to exchange combo token",
"combo_token_error": "[Dispatch] Client %s failed to exchange combo token", "combo_token_error": "[Dispatch] Client %s failed to exchange combo token",
"account_login_create_success": "[Dispatch] Client %s failed to log in: Account %s created", "account_login_create_success": "[Dispatch] Client %s failed to log in: Account %s created",
"account_login_create_error": "[Dispatch] Client %s failed to log in: Account create failed", "account_login_create_error": "[Dispatch] Client %s failed to log in: Account create failed",
"account_login_exist_error": "[Dispatch] Client %s failed to log in: Account no found", "account_login_exist_error": "[Dispatch] Client %s failed to log in: Account no found",
"account_cache_error": "Game account cache information error", "account_cache_error": "Game account cache information error",
"session_key_error": "Wrong session key.", "session_key_error": "Wrong session key.",
"username_error": "Username not found.", "username_error": "Username not found.",
"username_create_error": "Username not found, create failed." "username_create_error": "Username not found, create failed."
}, },
"router_error": "[Dispatch] Unable to attach router." "router_error": "[Dispatch] Unable to attach router."
}, },
"status": { "status": {
"free_software": "Grasscutter is FREE software. If you have paid for this, you may have been scammed. Homepage: https://github.com/Grasscutters/Grasscutter", "free_software": "Grasscutter is FREE software. If you have paid for this, you may have been scammed. Homepage: https://github.com/Grasscutters/Grasscutter",
"starting": "Starting Grasscutter...", "starting": "Starting Grasscutter...",
"shutdown": "Shutting down...", "shutdown": "Shutting down...",
"done": "Done! For help, type \"help\"", "done": "Done! For help, type \"help\"",
"error": "An error occurred.", "error": "An error occurred.",
"welcome": "Welcome to Grasscutter", "welcome": "Welcome to Grasscutter",
"run_mode_error": "Invalid server run mode: %s.", "run_mode_error": "Invalid server run mode: %s.",
"run_mode_help": "Server run mode must be 'HYBRID', 'DISPATCH_ONLY', or 'GAME_ONLY'. Unable to start Grasscutter...", "run_mode_help": "Server run mode must be 'HYBRID', 'DISPATCH_ONLY', or 'GAME_ONLY'. Unable to start Grasscutter...",
"create_resources": "Creating resources folder...", "create_resources": "Creating resources folder...",
"resources_error": "Place a copy of 'BinOutput' and 'ExcelBinOutput' in the resources folder.", "resources_error": "Place a copy of 'BinOutput' and 'ExcelBinOutput' in the resources folder.",
"version": "Grasscutter version: %s-%s" "version": "Grasscutter version: %s-%s"
} }
}, },
"commands": { "commands": {
"generic": { "generic": {
"not_specified": "No command specified.", "not_specified": "No command specified.",
"unknown_command": "Unknown command: %s", "unknown_command": "Unknown command: %s",
"permission_error": "You do not have permission to run this command.", "permission_error": "You do not have permission to run this command.",
"console_execute_error": "This command can only be run from the console.", "console_execute_error": "This command can only be run from the console.",
"player_execute_error": "Run this command in-game.", "player_execute_error": "Run this command in-game.",
"command_exist_error": "No command found.", "command_exist_error": "No command found.",
"no_description_specified": "No description specified", "no_description_specified": "No description specified",
"invalid": { "invalid": {
"amount": "Invalid amount.", "amount": "Invalid amount.",
"artifactId": "Invalid artifactId.", "artifactId": "Invalid artifactId.",
"avatarId": "Invalid avatarId.", "avatarId": "Invalid avatarId.",
"avatarLevel": "Invalid avatarLevel.", "avatarLevel": "Invalid avatarLevel.",
"entityId": "Invalid entityId.", "entityId": "Invalid entityId.",
"itemId": "Invalid itemId.", "itemId": "Invalid itemId.",
"itemLevel": "Invalid itemLevel.", "itemLevel": "Invalid itemLevel.",
"itemRefinement": "Invalid itemRefinement.", "itemRefinement": "Invalid itemRefinement.",
"playerId": "Invalid playerId.", "playerId": "Invalid playerId.",
"uid": "Invalid UID." "uid": "Invalid UID."
} }
}, },
"execution": { "execution": {
"uid_error": "Invalid UID.", "uid_error": "Invalid UID.",
"player_exist_error": "Player not found.", "player_exist_error": "Player not found.",
"player_offline_error": "Player is not online.", "player_offline_error": "Player is not online.",
"item_id_error": "Invalid item ID.", "item_id_error": "Invalid item ID.",
"item_player_exist_error": "Invalid item or UID.", "item_player_exist_error": "Invalid item or UID.",
"entity_id_error": "Invalid entity ID.", "entity_id_error": "Invalid entity ID.",
"player_exist_offline_error": "Player not found or is not online.", "player_exist_offline_error": "Player not found or is not online.",
"argument_error": "Invalid arguments.", "argument_error": "Invalid arguments.",
"clear_target": "Target cleared.", "clear_target": "Target cleared.",
"set_target": "Subsequent commands will target @%s by default.", "set_target": "Subsequent commands will target @%s by default.",
"need_target": "This command requires a target UID. Add a <@UID> argument or set a persistent target with /target @UID." "need_target": "This command requires a target UID. Add a <@UID> argument or set a persistent target with /target @UID."
}, },
"status": { "status": {
"enabled": "Enabled", "enabled": "Enabled",
"disabled": "Disabled", "disabled": "Disabled",
"help": "Help", "help": "Help",
"success": "Success" "success": "Success"
}, },
"account": { "account": {
"modify": "Modify user accounts", "modify": "Modify user accounts",
"invalid": "Invalid UID.", "invalid": "Invalid UID.",
"exists": "Account already exists.", "exists": "Account already exists.",
"create": "Account created with UID %s.", "create": "Account created with UID %s.",
"delete": "Account deleted.", "delete": "Account deleted.",
"no_account": "Account not found.", "no_account": "Account not found.",
"command_usage": "Usage: account <create|delete> <username> [uid]", "command_usage": "Usage: account <create|delete> <username> [uid]",
"description": "Modify user accounts" "description": "Modify user accounts"
}, },
"broadcast": { "broadcast": {
"command_usage": "Usage: broadcast <message>", "command_usage": "Usage: broadcast <message>",
"message_sent": "Message sent.", "message_sent": "Message sent.",
"description": "Sends a message to all the players" "description": "Sends a message to all the players"
}, },
"changescene": { "changescene": {
"usage": "Usage: changescene <sceneId>", "usage": "Usage: changescene <sceneId>",
"already_in_scene": "You are already in that scene.", "already_in_scene": "You are already in that scene.",
"success": "Changed to scene %s.", "success": "Changed to scene %s.",
"exists_error": "The specified scene does not exist.", "exists_error": "The specified scene does not exist.",
"description": "Changes your scene" "description": "Changes your scene"
}, },
"clear": { "clear": {
"command_usage": "Usage: clear <all|wp|art|mat>", "command_usage": "Usage: clear <all|wp|art|mat>",
"weapons": "Cleared weapons for %s.", "weapons": "Cleared weapons for %s.",
"artifacts": "Cleared artifacts for %s.", "artifacts": "Cleared artifacts for %s.",
"materials": "Cleared materials for %s.", "materials": "Cleared materials for %s.",
"furniture": "Cleared furniture for %s.", "furniture": "Cleared furniture for %s.",
"displays": "Cleared displays for %s.", "displays": "Cleared displays for %s.",
"virtuals": "Cleared virtuals for %s.", "virtuals": "Cleared virtuals for %s.",
"everything": "Cleared everything for %s.", "everything": "Cleared everything for %s.",
"description": "Deletes unequipped unlocked items, including yellow rarity ones from your inventory" "description": "Deletes unequipped unlocked items, including yellow rarity ones from your inventory"
}, },
"coop": { "coop": {
"usage": "Usage: coop <playerId> <target playerId>", "usage": "Usage: coop <playerId> <target playerId>",
"success": "Summoned %s to %s's world.", "success": "Summoned %s to %s's world.",
"description": "Forces someone to join the world of others" "description": "Forces someone to join the world of others"
}, },
"enter_dungeon": { "enter_dungeon": {
"usage": "Usage: enterdungeon <dungeon id>", "usage": "Usage: enterdungeon <dungeon id>",
"changed": "Changed to dungeon %s", "changed": "Changed to dungeon %s",
"not_found_error": "Dungeon does not exist", "not_found_error": "Dungeon does not exist",
"in_dungeon_error": "You are already in that dungeon", "in_dungeon_error": "You are already in that dungeon",
"description": "Enter a dungeon" "description": "Enter a dungeon"
}, },
"giveAll": { "giveAll": {
"usage": "Usage: giveall [player] [amount]", "usage": "Usage: giveall [player] [amount]",
"started": "Receiving all items...", "started": "Receiving all items...",
"success": "Successfully gave all items to %s.", "success": "Successfully gave all items to %s.",
"invalid_amount_or_playerId": "Invalid amount or player ID.", "invalid_amount_or_playerId": "Invalid amount or player ID.",
"description": "Gives all items" "description": "Gives all items"
}, },
"giveArtifact": { "giveArtifact": {
"usage": "Usage: giveart|gart [player] <artifactId> <mainPropId> [<appendPropId>[,<times>]]... [level]", "usage": "Usage: giveart|gart [player] <artifactId> <mainPropId> [<appendPropId>[,<times>]]... [level]",
"id_error": "Invalid artifact ID.", "id_error": "Invalid artifact ID.",
"success": "Given %s to %s.", "success": "Given %s to %s.",
"description": "Gives the player a specified artifact" "description": "Gives the player a specified artifact"
}, },
"giveChar": { "giveChar": {
"usage": "Usage: givechar <player> <itemId|itemName> [amount]", "usage": "Usage: givechar <player> <itemId|itemName> [amount]",
"given": "Given %s with level %s to %s.", "given": "Given %s with level %s to %s.",
"invalid_avatar_id": "Invalid avatar id.", "invalid_avatar_id": "Invalid avatar id.",
"invalid_avatar_level": "Invalid avatar level.", "invalid_avatar_level": "Invalid avatar level.",
"invalid_avatar_or_player_id": "Invalid avatar or player ID.", "invalid_avatar_or_player_id": "Invalid avatar or player ID.",
"description": "Gives the player a specified character" "description": "Gives the player a specified character"
}, },
"give": { "give": {
"usage": "Usage: give <player> <itemId|itemName> [amount] [level]", "usage": "Usage: give <player> <itemId|itemName> [amount] [level]",
"refinement_only_applicable_weapons": "Refinement is only applicable to weapons.", "refinement_only_applicable_weapons": "Refinement is only applicable to weapons.",
"refinement_must_between_1_and_5": "Refinement must be between 1 and 5.", "refinement_must_between_1_and_5": "Refinement must be between 1 and 5.",
"given": "Given %s of %s to %s.", "given": "Given %s of %s to %s.",
"given_with_level_and_refinement": "Given %s with level %s, refinement %s %s times to %s", "given_with_level_and_refinement": "Given %s with level %s, refinement %s %s times to %s",
"given_level": "Given %s with level %s %s times to %s", "given_level": "Given %s with level %s %s times to %s",
"description": "Gives an item to you or the specified player" "description": "Gives an item to you or the specified player"
}, },
"godmode": { "godmode": {
"success": "Godmode is now %s for %s.", "success": "Godmode is now %s for %s.",
"description": "Prevents you from taking damage. Defaults to toggle." "description": "Prevents you from taking damage. Defaults to toggle."
}, },
"nostamina": { "nostamina": {
"success": "NoStamina is now %s for %s.", "success": "NoStamina is now %s for %s.",
"description": "Keep your endurance to the maximum." "description": "Keep your endurance to the maximum."
}, },
"heal": { "heal": {
"success": "All characters have been healed.", "success": "All characters have been healed.",
"description": "Heal all characters in your current team." "description": "Heal all characters in your current team."
}, },
"join": { "join": {
"usage": "Usage: join [AvatarIDs] such as\"join 10000038 10000039\"", "usage": "Usage: join [AvatarIDs] such as\"join 10000038 10000039\"",
"description": "force join avatar into your team" "description": "force join avatar into your team"
}, },
"kick": { "kick": {
"player_kick_player": "Player [%s:%s] has kicked player [%s:%s]", "player_kick_player": "Player [%s:%s] has kicked player [%s:%s]",
"server_kick_player": "Kicking player [%s:%s]", "server_kick_player": "Kicking player [%s:%s]",
"description": "Kicks the specified player from the server (WIP)" "description": "Kicks the specified player from the server (WIP)"
}, },
"kill": { "kill": {
"usage": "Usage: killall [playerUid] [sceneId]", "usage": "Usage: killall [playerUid] [sceneId]",
"scene_not_found_in_player_world": "Scene not found in player world", "scene_not_found_in_player_world": "Scene not found in player world",
"kill_monsters_in_scene": "Killing %s monsters in scene %s", "kill_monsters_in_scene": "Killing %s monsters in scene %s",
"description": "Kill all entities" "description": "Kill all entities"
}, },
"killCharacter": { "killCharacter": {
"usage": "Usage: /killcharacter [playerId]", "usage": "Usage: /killcharacter [playerId]",
"success": "Killed %s's current character.", "success": "Killed %s's current character.",
"description": "Kills the players current character" "description": "Kills the players current character"
}, },
"language": { "language": {
"current_language": "current language is %s", "current_language": "current language is %s",
"language_changed": "language changed to %s", "language_changed": "language changed to %s",
"language_not_found": "currently, server does not have that language: %s", "language_not_found": "currently, server does not have that language: %s",
"description": "display or change current language" "description": "display or change current language"
}, },
"list": { "list": {
"success": "There are %s player(s) online:", "success": "There are %s player(s) online:",
"description": "List online players" "description": "List online players"
}, },
"permission": { "permission": {
"usage": "Usage: permission <add|remove> <username> <permission>", "usage": "Usage: permission <add|remove> <username> <permission>",
"add": "Permission added.", "add": "Permission added.",
"has_error": "They already have this permission!", "has_error": "They already have this permission!",
"remove": "Permission removed.", "remove": "Permission removed.",
"not_have_error": "They don't have this permission!", "not_have_error": "They don't have this permission!",
"account_error": "The account cannot be found.", "account_error": "The account cannot be found.",
"description": "Grants or removes a permission for a user" "description": "Grants or removes a permission for a user"
}, },
"position": { "position": {
"success": "Coordinates: %s, %s, %s\nScene id: %s", "success": "Coordinates: %s, %s, %s\nScene id: %s",
"description": "Get coordinates." "description": "Get coordinates."
}, },
"quest": { "quest": {
"description": "Add or finish quests", "description": "Add or finish quests",
"usage": "quest <add|finish> [quest id]", "usage": "quest <add|finish> [quest id]",
"added": "Quest %s added", "added": "Quest %s added",
"finished": "Finished quest %s", "finished": "Finished quest %s",
"not_found": "Quest not found", "not_found": "Quest not found",
"invalid_id": "Invalid quest id" "invalid_id": "Invalid quest id"
}, },
"reload": { "reload": {
"reload_start": "Reloading config.", "reload_start": "Reloading config.",
"reload_done": "Reload complete.", "reload_done": "Reload complete.",
"description": "Reload server config" "description": "Reload server config"
}, },
"remove": { "remove": {
"usage": "Usage: remove [indexOfYourTeam] index start from 1", "usage": "Usage: remove [indexOfYourTeam] index start from 1",
"invalid_index": "The index number is illegal. It starts from 1 and the maximum value is the number of roles in the team", "invalid_index": "The index number is illegal. It starts from 1 and the maximum value is the number of roles in the team",
"description": "force remove avatar into your team. Such as `remove 1 2`." "description": "force remove avatar into your team. Such as `remove 1 2`."
}, },
"resetConst": { "resetConst": {
"reset_all": "Reset all avatars' constellations.", "reset_all": "Reset all avatars' constellations.",
"success": "Constellations for %s have been reset. Please relog to see changes.", "success": "Constellations for %s have been reset. Please relog to see changes.",
"description": "Resets the constellation level on your current active character, will need to relog after using the command to see any changes." "description": "Resets the constellation level on your current active character, will need to relog after using the command to see any changes."
}, },
"resetShopLimit": { "resetShopLimit": {
"usage": "Usage: /resetshop <player id>", "usage": "Usage: /resetshop <player id>",
"description": "Reset target player's shop refresh time." "description": "Reset target player's shop refresh time."
}, },
"sendMail": { "sendMail": {
"usage": "Usage: give [player] <itemId|itemName> [amount]", "usage": "Usage: give [player] <itemId|itemName> [amount]",
"user_not_exist": "The user with an id of '%s' does not exist", "user_not_exist": "The user with an id of '%s' does not exist",
"start_composition": "Starting composition of message.\nPlease use `/sendmail <title>` to continue.\nYou can use `/sendmail stop` at any time", "start_composition": "Starting composition of message.\nPlease use `/sendmail <title>` to continue.\nYou can use `/sendmail stop` at any time",
"templates": "Mail templates coming soon implemented...", "templates": "Mail templates coming soon implemented...",
"invalid_arguments": "Invalid arguments.\nUsage `/sendmail <userId|all|help> [templateId]`", "invalid_arguments": "Invalid arguments.\nUsage `/sendmail <userId|all|help> [templateId]`",
"send_cancel": "Message sending cancelled", "send_cancel": "Message sending cancelled",
"send_done": "Message sent to user %s!", "send_done": "Message sent to user %s!",
"send_all_done": "Message sent to all users!", "send_all_done": "Message sent to all users!",
"not_composition_end": "Message composition not at final stage.\nPlease use `/sendmail %s` or `/sendmail stop` to cancel", "not_composition_end": "Message composition not at final stage.\nPlease use `/sendmail %s` or `/sendmail stop` to cancel",
"please_use": "Please use `/sendmail %s`", "please_use": "Please use `/sendmail %s`",
"set_title": "Message title set as '%s'.\nUse '/sendmail <content>' to continue.", "set_title": "Message title set as '%s'.\nUse '/sendmail <content>' to continue.",
"set_contents": "Message contents set as '%s'.\nUse '/sendmail <sender>' to continue.", "set_contents": "Message contents set as '%s'.\nUse '/sendmail <sender>' to continue.",
"set_message_sender": "Message sender set as '%s'.\nUse '/sendmail <itemId|itemName|finish> [amount] [level]' to continue.", "set_message_sender": "Message sender set as '%s'.\nUse '/sendmail <itemId|itemName|finish> [amount] [level]' to continue.",
"send": "Attached %s of %s (level %s) to the message.\nContinue adding more items or use `/sendmail finish` to send the message.", "send": "Attached %s of %s (level %s) to the message.\nContinue adding more items or use `/sendmail finish` to send the message.",
"invalid_arguments_please_use": "Invalid arguments \n Please use `/sendmail %s`", "invalid_arguments_please_use": "Invalid arguments \n Please use `/sendmail %s`",
"title": "<title>", "title": "<title>",
"message": "<message>", "message": "<message>",
"sender": "<sender>", "sender": "<sender>",
"arguments": "<itemId|itemName|finish> [amount] [level]", "arguments": "<itemId|itemName|finish> [amount] [level]",
"error": "ERROR: invalid construction stage %s. Check console for stacktrace.", "error": "ERROR: invalid construction stage %s. Check console for stacktrace.",
"description": "Sends mail to the specified user. The usage of this command changes based on it's composition state." "description": "Sends mail to the specified user. The usage of this command changes based on it's composition state."
}, },
"sendMessage": { "sendMessage": {
"usage": "Usage: sendmessage <player> <message>", "usage": "Usage: sendmessage <player> <message>",
"success": "Message sent.", "success": "Message sent.",
"description": "Sends a message to a player as the server" "description": "Sends a message to a player as the server"
}, },
"setFetterLevel": { "setFetterLevel": {
"usage": "Usage: setfetterlevel <level>", "usage": "Usage: setfetterlevel <level>",
"range_error": "Fetter level must be between 0 and 10.", "range_error": "Fetter level must be between 0 and 10.",
"success": "Fetter level set to %s", "success": "Fetter level set to %s",
"level_error": "Invalid fetter level.", "level_error": "Invalid fetter level.",
"description": "Sets your fetter level for your current active character" "description": "Sets your fetter level for your current active character"
}, },
"setStats": { "setStats": {
"usage_console": "Usage: setstats|stats @<UID> <stat> <value>", "usage_console": "Usage: setstats|stats @<UID> <stat> <value>",
"usage_ingame": "Usage: setstats|stats [@UID] <stat> <value>", "usage_ingame": "Usage: setstats|stats [@UID] <stat> <value>",
"help_message": "\n\tValues for <stat>: hp | maxhp | def | atk | em | er | crate | cdmg | cdr | heal | heali | shield | defi\n\t(cont.) Elemental DMG Bonus: epyro | ecryo | ehydro | egeo | edendro | eelectro | ephys\n\t(cont.) Elemental RES: respyro | rescryo | reshydro | resgeo | resdendro | reselectro | resphys\n", "help_message": "\n\tValues for <stat>: hp | maxhp | def | atk | em | er | crate | cdmg | cdr | heal | heali | shield | defi\n\t(cont.) Elemental DMG Bonus: epyro | ecryo | ehydro | egeo | edendro | eelectro | ephys\n\t(cont.) Elemental RES: respyro | rescryo | reshydro | resgeo | resdendro | reselectro | resphys\n",
"value_error": "Invalid stat value.", "value_error": "Invalid stat value.",
"uid_error": "Invalid UID.", "uid_error": "Invalid UID.",
"player_error": "Player not found or offline.", "player_error": "Player not found or offline.",
"set_self": "%s set to %s.", "set_self": "%s set to %s.",
"set_for_uid": "%s for %s set to %s.", "set_for_uid": "%s for %s set to %s.",
"set_max_hp": "MAX HP set to %s.", "set_max_hp": "MAX HP set to %s.",
"description": "Set fight property for your current active character" "description": "Set fight property for your current active character"
}, },
"setWorldLevel": { "setWorldLevel": {
"usage": "Usage: setworldlevel <level>", "usage": "Usage: setworldlevel <level>",
"value_error": "World level must be between 0-8", "value_error": "World level must be between 0-8",
"success": "World level set to %s.", "success": "World level set to %s.",
"invalid_world_level": "Invalid world level.", "invalid_world_level": "Invalid world level.",
"description": "Sets your world level (Relog to see proper effects)" "description": "Sets your world level (Relog to see proper effects)"
}, },
"spawn": { "spawn": {
"usage": "Usage: spawn <entityId> [amount] [level(monster only)]", "usage": "Usage: spawn <entityId> [amount] [level(monster only)]",
"success": "Spawned %s of %s.", "success": "Spawned %s of %s.",
"description": "Spawns an entity near you" "description": "Spawns an entity near you"
}, },
"stop": { "stop": {
"success": "Server shutting down...", "success": "Server shutting down...",
"description": "Stops the server" "description": "Stops the server"
}, },
"talent": { "talent": {
"usage_1": "To set talent level: /talent set <talentID> <value>", "usage_1": "To set talent level: /talent set <talentID> <value>",
"usage_2": "Another way to set talent level: /talent <n or e or q> <value>", "usage_2": "Another way to set talent level: /talent <n or e or q> <value>",
"usage_3": "To get talent ID: /talent getid", "usage_3": "To get talent ID: /talent getid",
"lower_16": "Invalid talent level. Level should be lower than 16", "lower_16": "Invalid talent level. Level should be lower than 16",
"set_id": "Set talent to %s.", "set_id": "Set talent to %s.",
"set_atk": "Set talent Normal ATK to %s.", "set_atk": "Set talent Normal ATK to %s.",
"set_e": "Set talent E to %s.", "set_e": "Set talent E to %s.",
"set_q": "Set talent Q to %s.", "set_q": "Set talent Q to %s.",
"invalid_skill_id": "Invalid skill ID.", "invalid_skill_id": "Invalid skill ID.",
"set_this": "Set this talent to %s.", "set_this": "Set this talent to %s.",
"invalid_level": "Invalid talent level.", "invalid_level": "Invalid talent level.",
"normal_attack_id": "Normal Attack ID %s.", "normal_attack_id": "Normal Attack ID %s.",
"e_skill_id": "E skill ID %s.", "e_skill_id": "E skill ID %s.",
"q_skill_id": "Q skill ID %s.", "q_skill_id": "Q skill ID %s.",
"description": "Set talent level for your current active character" "description": "Set talent level for your current active character"
}, },
"teleportAll": { "team": {
"success": "Summoned all players to your location.", "usage": "Usage: team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]",
"error": "You only can use this command in MP mode.", "invalid_usage": "invalid usage",
"description": "Teleports all players in your world to your position" "add_usage": "usage(add): team add <avatarId,...> [index]",
}, "invalid_index": "index is invalid",
"teleport": { "add_too_much": "server is only allow you to add %d avatar(s)",
"usage_server": "Usage: /tp @<player id> <x> <y> <z> [scene id]", "failed_to_add_avatar": "failed to add avatar by id: %s",
"usage": "Usage: /tp [@<player id>] <x> <y> <z> [scene id]", "remove_usage": "usage(remove): team remove <index|first|last|index-index,...>",
"specify_player_id": "You must specify a player id.", "failed_parse_index": "failed to parse index: %s",
"invalid_position": "Invalid position.", "remove_too_much": "you can't remove so much avatars",
"success": "Teleported %s to %s, %s, %s in scene %s", "ignore_index": "ignored index(es): %s",
"description": "Change the player's position." "set_usage": "usage(set): team set <index> <avatarId>",
}, "index_out_of_range": "index your specified is out of range",
"tower": { "failed_parse_avatar_id": "failed to parse avatar id: %s",
"unlock_done": "Abyss Corridor's Floors are all unlocked now." "avatar_already_in_team": "avatar is already in team",
}, "avatar_not_found": "avatar not found: %d",
"weather": { "description": "modify your team manually"
"usage": "Usage: weather <weatherId> [climateId]", },
"success": "Changed weather to %s with climate %s", "teleportAll": {
"invalid_id": "Invalid ID.", "success": "Summoned all players to your location.",
"description": "Changes the weather." "error": "You only can use this command in MP mode.",
}, "description": "Teleports all players in your world to your position"
"drop": { },
"command_usage": "Usage: drop <itemId|itemName> [amount]", "teleport": {
"success": "Dropped %s of %s.", "usage_server": "Usage: /tp @<player id> <x> <y> <z> [scene id]",
"description": "Drops an item near you" "usage": "Usage: /tp [@<player id>] <x> <y> <z> [scene id]",
}, "specify_player_id": "You must specify a player id.",
"help": { "invalid_position": "Invalid position.",
"usage": "Usage: ", "success": "Teleported %s to %s, %s, %s in scene %s",
"aliases": "Aliases: ", "description": "Change the player's position."
"available_commands": "Available commands: ", },
"description": "Sends the help message or shows information about a specified command" "tower": {
}, "unlock_done": "Abyss Corridor's Floors are all unlocked now."
"restart": { },
"description": "Restarts the current session" "weather": {
}, "usage": "Usage: weather <weatherId> [climateId]",
"unlocktower": { "success": "Changed weather to %s with climate %s",
"success": "unlock done", "invalid_id": "Invalid ID.",
"description": "Unlock all levels of tower" "description": "Changes the weather."
}, },
"resetshop": { "drop": {
"description": "reset shop" "command_usage": "Usage: drop <itemId|itemName> [amount]",
} "success": "Dropped %s of %s.",
}, "description": "Drops an item near you"
"gacha": { },
"details": { "help": {
"title": "Banner Details", "usage": "Usage: ",
"available_five_stars": "Available 5-star Items", "aliases": "Aliases: ",
"available_four_stars": "Available 4-star Items", "available_commands": "Available commands: ",
"available_three_stars": "Available 3-star Items", "description": "Sends the help message or shows information about a specified command"
"template_missing": "data/gacha_details.html is missing." },
} "restart": {
} "description": "Restarts the current session"
} },
"unlocktower": {
"success": "unlock done",
"description": "Unlock all levels of tower"
},
"resetshop": {
"description": "reset shop"
}
},
"gacha": {
"details": {
"title": "Banner Details",
"available_five_stars": "Available 5-star Items",
"available_four_stars": "Available 4-star Items",
"available_three_stars": "Available 3-star Items",
"template_missing": "data/gacha_details.html is missing."
}
}
}
{ {
"messages": { "messages": {
"game": { "game": {
"port_bind": "游戏服务器已在端口 %s 上启动", "port_bind": "游戏服务器已在端口 %s 上启动",
"connect": "客户端 %s 已连接", "connect": "客户端 %s 已连接",
"disconnect": "客户端 %s 已断开连接", "disconnect": "客户端 %s 已断开连接",
"game_update_error": "游戏更新时发生错误", "game_update_error": "游戏更新时发生错误",
"command_error": "命令发生错误:" "command_error": "命令发生错误:"
}, },
"dispatch": { "dispatch": {
"port_bind": "[Dispatch] 服务器已在端口 %s 上启动", "port_bind": "[Dispatch] 服务器已在端口 %s 上启动",
"request": "[Dispatch] 客户端 %s 请求:%s %s", "request": "[Dispatch] 客户端 %s 请求:%s %s",
"keystore": { "keystore": {
"general_error": "[Dispatch] 加载 keystore 文件时发生错误!", "general_error": "[Dispatch] 加载 keystore 文件时发生错误!",
"password_error": "[Dispatch] 加载 keystore 失败。正在尝试使用 keystore 默认密码...", "password_error": "[Dispatch] 加载 keystore 失败。正在尝试使用 keystore 默认密码...",
"no_keystore_error": "[Dispatch] 未找到 SSL 证书!已降级到 HTTP 模式", "no_keystore_error": "[Dispatch] 未找到 SSL 证书!已降级到 HTTP 模式",
"default_password": "[Dispatch] 成功加载 keystore 默认密码。请考虑将 config.json 的默认密码设置为 123456" "default_password": "[Dispatch] 成功加载 keystore 默认密码。请考虑将 config.json 的默认密码设置为 123456"
}, },
"authentication": { "authentication": {
"default_unable_to_verify": "[Authentication] 称为 verifyUser 的方法在默认验证程序中不可用" "default_unable_to_verify": "[Authentication] 称为 verifyUser 的方法在默认验证程序中不可用"
}, },
"no_commands_error": "此命令不适用于 Dispatch-only 模式", "no_commands_error": "此命令不适用于 Dispatch-only 模式",
"unhandled_request_error": "[Dispatch] 潜在的未处理请求:%s %s", "unhandled_request_error": "[Dispatch] 潜在的未处理请求:%s %s",
"account": { "account": {
"login_attempt": "[Dispatch] 客户端 %s 正在尝试登录", "login_attempt": "[Dispatch] 客户端 %s 正在尝试登录",
"login_success": "[Dispatch] 客户端 %s 已登录,UID 为 %s", "login_success": "[Dispatch] 客户端 %s 已登录,UID 为 %s",
"login_token_attempt": "[Dispatch] 客户端 %s 正在尝试使用 token 登录", "login_token_attempt": "[Dispatch] 客户端 %s 正在尝试使用 token 登录",
"login_token_error": "[Dispatch] 客户端 %s 使用 token 登录失败", "login_token_error": "[Dispatch] 客户端 %s 使用 token 登录失败",
"login_token_success": "[Dispatch] 客户端 %s 已通过 token 登录,UID 为 %s", "login_token_success": "[Dispatch] 客户端 %s 已通过 token 登录,UID 为 %s",
"combo_token_success": "[Dispatch] 客户端 %s 交换 token 成功", "combo_token_success": "[Dispatch] 客户端 %s 交换 token 成功",
"combo_token_error": "[Dispatch] 客户端 %s 交换 token 失败", "combo_token_error": "[Dispatch] 客户端 %s 交换 token 失败",
"account_login_create_success": "[Dispatch] 客户端 %s 登录失败: 已注册 UID 为 %s 的账号", "account_login_create_success": "[Dispatch] 客户端 %s 登录失败: 已注册 UID 为 %s 的账号",
"account_login_create_error": "[Dispatch] 客户端 %s 登录失败:账号创建失败。", "account_login_create_error": "[Dispatch] 客户端 %s 登录失败:账号创建失败。",
"account_login_exist_error": "[Dispatch] 客户端 %s 登录失败:账号不存在", "account_login_exist_error": "[Dispatch] 客户端 %s 登录失败:账号不存在",
"account_cache_error": "游戏账号缓存信息错误", "account_cache_error": "游戏账号缓存信息错误",
"session_key_error": "会话密钥错误。", "session_key_error": "会话密钥错误。",
"username_error": "未找到此用户名。", "username_error": "未找到此用户名。",
"username_create_error": "未找到用户名,建立连接失败。" "username_create_error": "未找到用户名,建立连接失败。"
} }
}, },
"status": { "status": {
"free_software": "Grasscutter 是免费开源软件,遵循 AGPL-3.0 license。如果你是付费购买的,那你已经被骗了。项目地址:https://github.com/Grasscutters/Grasscutter", "free_software": "Grasscutter 是免费开源软件,遵循 AGPL-3.0 license。如果你是付费购买的,那你已经被骗了。项目地址:https://github.com/Grasscutters/Grasscutter",
"starting": "正在启动 Grasscutter...", "starting": "正在启动 Grasscutter...",
"shutdown": "正在关闭...", "shutdown": "正在关闭...",
"done": "加载完成!输入 \"help\" 查看命令列表", "done": "加载完成!输入 \"help\" 查看命令列表",
"error": "发生了一个错误。", "error": "发生了一个错误。",
"welcome": "欢迎使用 Grasscutter!珍惜这段美妙的旅途吧!", "welcome": "欢迎使用 Grasscutter!珍惜这段美妙的旅途吧!",
"run_mode_error": "无效的服务器运行模式:%s。", "run_mode_error": "无效的服务器运行模式:%s。",
"run_mode_help": "服务器运行模式必须为 HYBRID、DISPATCH_ONLY 或 GAME_ONLY。Grasscutter 启动失败...", "run_mode_help": "服务器运行模式必须为 HYBRID、DISPATCH_ONLY 或 GAME_ONLY。Grasscutter 启动失败...",
"create_resources": "正在创建 resources 目录...", "create_resources": "正在创建 resources 目录...",
"resources_error": "请将 BinOutput 和 ExcelBinOutput 复制到 resources 目录。", "resources_error": "请将 BinOutput 和 ExcelBinOutput 复制到 resources 目录。",
"version": "Grasscutter 版本: %s-%s" "version": "Grasscutter 版本: %s-%s"
} }
}, },
"commands": { "commands": {
"generic": { "generic": {
"not_specified": "没有指定命令。", "not_specified": "没有指定命令。",
"unknown_command": "未知的命令:%s", "unknown_command": "未知的命令:%s",
"permission_error": "哼哼哼!你没有执行此命令的权限!请联系服务器管理员解决!", "permission_error": "哼哼哼!你没有执行此命令的权限!请联系服务器管理员解决!",
"console_execute_error": "此命令只能在服务器控制台执行呐~", "console_execute_error": "此命令只能在服务器控制台执行呐~",
"player_execute_error": "此命令只能在游戏内执行哦~", "player_execute_error": "此命令只能在游戏内执行哦~",
"command_exist_error": "这条命令...好像找不到呢?", "command_exist_error": "这条命令...好像找不到呢?",
"no_description_specified": "没有指定说明", "no_description_specified": "没有指定说明",
"invalid": { "invalid": {
"amount": "无效的数量。", "amount": "无效的数量。",
"artifactId": "无效的圣遗物ID。", "artifactId": "无效的圣遗物ID。",
"avatarId": "无效的角色ID。", "avatarId": "无效的角色ID。",
"avatarLevel": "无效的角色等级。", "avatarLevel": "无效的角色等级。",
"entityId": "无效的实体ID。", "entityId": "无效的实体ID。",
"itemId": "无效的物品ID。", "itemId": "无效的物品ID。",
"itemLevel": "无效的物品等级。", "itemLevel": "无效的物品等级。",
"itemRefinement": "无效的物品精炼等级。", "itemRefinement": "无效的物品精炼等级。",
"playerId": "无效的玩家ID。", "playerId": "无效的玩家ID。",
"uid": "无效的UID。" "uid": "无效的UID。"
} }
}, },
"execution": { "execution": {
"uid_error": "无效的UID。", "uid_error": "无效的UID。",
"player_exist_error": "玩家不存在。", "player_exist_error": "玩家不存在。",
"player_offline_error": "玩家已离线。", "player_offline_error": "玩家已离线。",
"item_id_error": "无效的物品ID。", "item_id_error": "无效的物品ID。",
"item_player_exist_error": "无效的物品/玩家UID。", "item_player_exist_error": "无效的物品/玩家UID。",
"entity_id_error": "无效的实体ID。", "entity_id_error": "无效的实体ID。",
"player_exist_offline_error": "玩家不存在或已离线。", "player_exist_offline_error": "玩家不存在或已离线。",
"argument_error": "无效的参数。", "argument_error": "无效的参数。",
"clear_target": "目标已清除。", "clear_target": "目标已清除。",
"set_target": "随后的的命令都会以 @%s 为预设。", "set_target": "随后的的命令都会以 @%s 为预设。",
"need_target": "此命令需要一个目标 UID。添加 <@UID> 参数或使用 /target @UID 来指定默认目标。" "need_target": "此命令需要一个目标 UID。添加 <@UID> 参数或使用 /target @UID 来指定默认目标。"
}, },
"status": { "status": {
"enabled": "已启用", "enabled": "已启用",
"disabled": "未启用", "disabled": "未启用",
"help": "帮助", "help": "帮助",
"success": "成功" "success": "成功"
}, },
"account": { "account": {
"modify": "修改用户账号", "modify": "修改用户账号",
"invalid": "无效的UID。", "invalid": "无效的UID。",
"exists": "账号已存在。", "exists": "账号已存在。",
"create": "已创建账号,UID 为 %s。", "create": "已创建账号,UID 为 %s。",
"delete": "账号已删除。", "delete": "账号已删除。",
"no_account": "账号不存在。", "no_account": "账号不存在。",
"command_usage": "用法:account <create|delete> <用户名> [UID]", "command_usage": "用法:account <create|delete> <用户名> [UID]",
"description": "创建或删除账号" "description": "创建或删除账号"
}, },
"broadcast": { "broadcast": {
"command_usage": "用法:broadcast <消息>", "command_usage": "用法:broadcast <消息>",
"message_sent": "公告已发送。", "message_sent": "公告已发送。",
"description": "向所有玩家发送公告" "description": "向所有玩家发送公告"
}, },
"changescene": { "changescene": {
"usage": "用法:changescene <场景ID>", "usage": "用法:changescene <场景ID>",
"already_in_scene": "你已经在这个场景中了。", "already_in_scene": "你已经在这个场景中了。",
"success": "已切换至场景 %s。", "success": "已切换至场景 %s。",
"exists_error": "此场景不存在。", "exists_error": "此场景不存在。",
"description": "切换指定场景" "description": "切换指定场景"
}, },
"clear": { "clear": {
"command_usage": "用法:clear <all|wp|art|mat>\nall: 所有, wp: 武器, art: 圣遗物, mat: 材料", "command_usage": "用法:clear <all|wp|art|mat>\nall: 所有, wp: 武器, art: 圣遗物, mat: 材料",
"weapons": "已清除 %s 的武器。", "weapons": "已清除 %s 的武器。",
"artifacts": "已清除 %s 的圣遗物。", "artifacts": "已清除 %s 的圣遗物。",
"materials": "已清除 %s 的材料。", "materials": "已清除 %s 的材料。",
"furniture": "已清除 %s 的尘歌壶家具。", "furniture": "已清除 %s 的尘歌壶家具。",
"displays": "已清空 %s 的屏幕。", "displays": "已清空 %s 的屏幕。",
"virtuals": "已清除 %s 的所有货币和经验值。", "virtuals": "已清除 %s 的所有货币和经验值。",
"everything": "已清除 %s 的所有物品。", "everything": "已清除 %s 的所有物品。",
"description": "从你的背包中删除所有未装备且已解锁的物品,包括稀有物品" "description": "从你的背包中删除所有未装备且已解锁的物品,包括稀有物品"
}, },
"coop": { "coop": {
"usage": "用法:coop <玩家ID> <目标玩家ID>", "usage": "用法:coop <玩家ID> <目标玩家ID>",
"success": "已强制传送 %s 到 %s 的世界。", "success": "已强制传送 %s 到 %s 的世界。",
"description": "强制传送指定用户到他人的世界" "description": "强制传送指定用户到他人的世界"
}, },
"enter_dungeon": { "enter_dungeon": {
"usage": "用法:enterdungeon <秘境ID>", "usage": "用法:enterdungeon <秘境ID>",
"changed": "已进入秘境 %s。", "changed": "已进入秘境 %s。",
"not_found_error": "此秘境不存在。", "not_found_error": "此秘境不存在。",
"in_dungeon_error": "你已经在秘境中了。", "in_dungeon_error": "你已经在秘境中了。",
"description": "进入指定秘境" "description": "进入指定秘境"
}, },
"giveAll": { "giveAll": {
"usage": "用法:giveall [玩家] [数量]", "usage": "用法:giveall [玩家] [数量]",
"started": "正在给予全部物品...", "started": "正在给予全部物品...",
"success": "已给予 %s 全部物品。", "success": "已给予 %s 全部物品。",
"invalid_amount_or_playerId": "无效的数量/玩家ID。", "invalid_amount_or_playerId": "无效的数量/玩家ID。",
"description": "给予所有物品" "description": "给予所有物品"
}, },
"nostamina": { "nostamina": {
"success": "NoStamina %s 对于 %s.", "success": "NoStamina %s 对于 %s.",
"description": "保持你的体力处于最高状态。" "description": "保持你的体力处于最高状态。"
}, },
"giveArtifact": { "giveArtifact": {
"usage": "用法:giveart|gart [玩家] <圣遗物ID> <主词条ID> [<副词条ID>[,<强化次数>]]... [等级]", "usage": "用法:giveart|gart [玩家] <圣遗物ID> <主词条ID> [<副词条ID>[,<强化次数>]]... [等级]",
"id_error": "无效的圣遗物ID。", "id_error": "无效的圣遗物ID。",
"success": "已将 %s 给予 %s。", "success": "已将 %s 给予 %s。",
"description": "给予指定圣遗物" "description": "给予指定圣遗物"
}, },
"giveChar": { "giveChar": {
"usage": "用法:givechar <玩家> <角色ID|角色名> [数量]", "usage": "用法:givechar <玩家> <角色ID|角色名> [数量]",
"given": "已将角色 %s [等级 %s] 给与 %s。", "given": "已将角色 %s [等级 %s] 给与 %s。",
"invalid_avatar_id": "无效的角色ID。", "invalid_avatar_id": "无效的角色ID。",
"invalid_avatar_level": "无效的角色等级。", "invalid_avatar_level": "无效的角色等级。",
"invalid_avatar_or_player_id": "无效的角色ID/玩家ID。", "invalid_avatar_or_player_id": "无效的角色ID/玩家ID。",
"description": "给予指定角色" "description": "给予指定角色"
}, },
"give": { "give": {
"usage": "用法:give <玩家> <物品ID|物品名> [数量] [等级] [精炼等级]", "usage": "用法:give <玩家> <物品ID|物品名> [数量] [等级] [精炼等级]",
"refinement_only_applicable_weapons": "只有武器可以设置精炼等级。", "refinement_only_applicable_weapons": "只有武器可以设置精炼等级。",
"refinement_must_between_1_and_5": "精炼等级必须在 1 到 5 之间。", "refinement_must_between_1_and_5": "精炼等级必须在 1 到 5 之间。",
"given": "已将 %s 个 %s 给予 %s。", "given": "已将 %s 个 %s 给予 %s。",
"given_with_level_and_refinement": "已将 %s [等级 %s, 精炼 %s] %s 个给予 %s。", "given_with_level_and_refinement": "已将 %s [等级 %s, 精炼 %s] %s 个给予 %s。",
"given_level": "已将 %s [等级 %s] %s 个给予 %s。", "given_level": "已将 %s [等级 %s] %s 个给予 %s。",
"description": "给予指定物品" "description": "给予指定物品"
}, },
"godmode": { "godmode": {
"success": "上帝模式已设为 %s。[用户:%s]", "success": "上帝模式已设为 %s。[用户:%s]",
"description": "防止你受到伤害" "description": "防止你受到伤害"
}, },
"heal": { "heal": {
"success": "已治疗所有角色。", "success": "已治疗所有角色。",
"description": "治疗当前队伍的角色" "description": "治疗当前队伍的角色"
}, },
"join": { "join": {
"usage": "用法:join <角色IDs> 例如\"join 10000038 10000039\"空格分开", "usage": "用法:join <角色IDs> 例如\"join 10000038 10000039\"空格分开",
"description": "强制将角色加入到当前队伍中" "description": "强制将角色加入到当前队伍中"
}, },
"kick": { "kick": {
"player_kick_player": "玩家 [%s:%s] 已将 [%s:%s] 踢出。", "player_kick_player": "玩家 [%s:%s] 已将 [%s:%s] 踢出。",
"server_kick_player": "正在踢出玩家 [%s:%s]...", "server_kick_player": "正在踢出玩家 [%s:%s]...",
"description": "从服务器内踢出指定玩家" "description": "从服务器内踢出指定玩家"
}, },
"kill": { "kill": {
"usage": "用法:killall [玩家UID] [场景ID]", "usage": "用法:killall [玩家UID] [场景ID]",
"scene_not_found_in_player_world": "未在玩家世界中找到此场景。", "scene_not_found_in_player_world": "未在玩家世界中找到此场景。",
"kill_monsters_in_scene": "已杀死场景 %s 中的 %s 个怪物。", "kill_monsters_in_scene": "已杀死场景 %s 中的 %s 个怪物。",
"description": "杀死所有怪物" "description": "杀死所有怪物"
}, },
"killCharacter": { "killCharacter": {
"usage": "用法:/killcharacter [玩家ID]", "usage": "用法:/killcharacter [玩家ID]",
"success": "已杀死 %s 当前角色。", "success": "已杀死 %s 当前角色。",
"description": "杀死当前角色" "description": "杀死当前角色"
}, },
"language": { "language": {
"current_language": "当前语言是: %s", "current_language": "当前语言是: %s",
"language_changed": "语言切换至: %s", "language_changed": "语言切换至: %s",
"language_not_found": "目前服务端没有这种语言: %s", "language_not_found": "目前服务端没有这种语言: %s",
"description": "显示或切换当前语言" "description": "显示或切换当前语言"
}, },
"list": { "list": {
"success": "目前在线人数:%s", "success": "目前在线人数:%s",
"description": "查看所有玩家" "description": "查看所有玩家"
}, },
"permission": { "permission": {
"usage": "用法:permission <add|remove> <用户名> <权限>", "usage": "用法:permission <add|remove> <用户名> <权限>",
"add": "权限已添加。", "add": "权限已添加。",
"has_error": "此玩家已拥有此权限!", "has_error": "此玩家已拥有此权限!",
"remove": "权限已移除。", "remove": "权限已移除。",
"not_have_error": "此玩家未拥有权限!", "not_have_error": "此玩家未拥有权限!",
"account_error": "账号不存在。", "account_error": "账号不存在。",
"description": "添加或移除指定玩家的权限" "description": "添加或移除指定玩家的权限"
}, },
"position": { "position": {
"success": "坐标:%s, %s, %s\n场景ID:%s", "success": "坐标:%s, %s, %s\n场景ID:%s",
"description": "获取所在位置" "description": "获取所在位置"
}, },
"quest": { "quest": {
"description": "添加或完成任务", "description": "添加或完成任务",
"usage": "quest <add|finish> [任务ID]", "usage": "quest <add|finish> [任务ID]",
"added": "已添加任务 %s", "added": "已添加任务 %s",
"finished": "已完成任务 %s", "finished": "已完成任务 %s",
"not_found": "未找到任务", "not_found": "未找到任务",
"invalid_id": "无效的任务ID" "invalid_id": "无效的任务ID"
}, },
"reload": { "reload": {
"reload_start": "正在重载配置文件和数据。", "reload_start": "正在重载配置文件和数据。",
"reload_done": "重载完成。", "reload_done": "重载完成。",
"description": "重载配置文件和数据" "description": "重载配置文件和数据"
}, },
"remove": { "remove": {
"usage": "用法: remove [多个角色在队伍中的序号] 序号从1开始", "usage": "用法: remove [多个角色在队伍中的序号] 序号从1开始",
"invalid_index": "序号不合法,从1开始,最大值为队内角色数量", "invalid_index": "序号不合法,从1开始,最大值为队内角色数量",
"description": "强制将某个角色从当前队伍中移除。例如`remove 1 2`表示将1号和2号角色从队伍中移除" "description": "强制将某个角色从当前队伍中移除。例如`remove 1 2`表示将1号和2号角色从队伍中移除"
}, },
"resetConst": { "resetConst": {
"reset_all": "重置所有角色的命座。", "reset_all": "重置所有角色的命座。",
"success": "已重置 %s 的命座,重新登录后生效。", "success": "已重置 %s 的命座,重新登录后生效。",
"description": "重置当前角色的命之座,执行命令后需重新登录以生效" "description": "重置当前角色的命之座,执行命令后需重新登录以生效"
}, },
"resetShopLimit": { "resetShopLimit": {
"usage": "用法:/resetshop <玩家ID>", "usage": "用法:/resetshop <玩家ID>",
"description": "重置所选玩家的商店刷新时间" "description": "重置所选玩家的商店刷新时间"
}, },
"sendMail": { "sendMail": {
"usage": "用法:give [玩家] <物品ID|物品名称> [数量]", "usage": "用法:give [玩家] <物品ID|物品名称> [数量]",
"user_not_exist": "ID '%s' 的用户不存在。", "user_not_exist": "ID '%s' 的用户不存在。",
"start_composition": "发送邮件流程。\n请使用`/sendmail <标题>`前进到下一步。\n你可以在任何时间使用`/sendmail stop`来停止发送。", "start_composition": "发送邮件流程。\n请使用`/sendmail <标题>`前进到下一步。\n你可以在任何时间使用`/sendmail stop`来停止发送。",
"templates": "邮件模板尚未实装...", "templates": "邮件模板尚未实装...",
"invalid_arguments": "无效的参数。\n指令使用方法 `/sendmail <用户ID|all|help> [模板ID]`", "invalid_arguments": "无效的参数。\n指令使用方法 `/sendmail <用户ID|all|help> [模板ID]`",
"send_cancel": "取消发送邮件", "send_cancel": "取消发送邮件",
"send_done": "已将邮件发送给 %s!", "send_done": "已将邮件发送给 %s!",
"send_all_done": "邮件已发送给所有人!", "send_all_done": "邮件已发送给所有人!",
"not_composition_end": "现在邮件发送未到最后阶段。\n请使用 `/sendmail %s` 继续发送邮件,或使用 `/sendmail stop` 来停止发送邮件。", "not_composition_end": "现在邮件发送未到最后阶段。\n请使用 `/sendmail %s` 继续发送邮件,或使用 `/sendmail stop` 来停止发送邮件。",
"please_use": "请使用 `/sendmail %s`", "please_use": "请使用 `/sendmail %s`",
"set_title": "成功将邮件标题设置为 '%s'。\n使用 '/sendmail <正文>' 来设置邮件内容。", "set_title": "成功将邮件标题设置为 '%s'。\n使用 '/sendmail <正文>' 来设置邮件内容。",
"set_contents": "成功将邮件内容设置为 '%s'。\n使用 '/sendmail <发件人>' 来设置发件人。", "set_contents": "成功将邮件内容设置为 '%s'。\n使用 '/sendmail <发件人>' 来设置发件人。",
"set_message_sender": "发件人已设置为 '%s'。\n使用 '/sendmail <物品ID|物品名称|finish> [数量] [等级]' 来添加附件。", "set_message_sender": "发件人已设置为 '%s'。\n使用 '/sendmail <物品ID|物品名称|finish> [数量] [等级]' 来添加附件。",
"send": "已添加 %s 个 %s (等级 %s) 邮件附件。\n如果没有要继续添加的附件请使用 `/sendmail finish` 来发送邮件。", "send": "已添加 %s 个 %s (等级 %s) 邮件附件。\n如果没有要继续添加的附件请使用 `/sendmail finish` 来发送邮件。",
"invalid_arguments_please_use": "错误的参数 \n请使用 `/sendmail %s`", "invalid_arguments_please_use": "错误的参数 \n请使用 `/sendmail %s`",
"title": "<标题>", "title": "<标题>",
"message": "<正文>", "message": "<正文>",
"sender": "<发件人>", "sender": "<发件人>",
"arguments": "<物品ID|物品名称|finish> [数量] [等级]", "arguments": "<物品ID|物品名称|finish> [数量] [等级]",
"error": "错误:无效的编写阶段 %s。需要 StackTrace 请查看服务器控制台。", "error": "错误:无效的编写阶段 %s。需要 StackTrace 请查看服务器控制台。",
"description": "向指定用户发送邮件。此命令的用法可根据附加的参数而变化" "description": "向指定用户发送邮件。此命令的用法可根据附加的参数而变化"
}, },
"sendMessage": { "sendMessage": {
"usage": "用法:sendmessage <玩家> <消息>", "usage": "用法:sendmessage <玩家> <消息>",
"success": "消息已发送。", "success": "消息已发送。",
"description": "向指定玩家发送消息" "description": "向指定玩家发送消息"
}, },
"setFetterLevel": { "setFetterLevel": {
"usage": "用法:setfetterlevel <好感度等级>", "usage": "用法:setfetterlevel <好感度等级>",
"range_error": "好感度等级必须在 0 到 10 之间。", "range_error": "好感度等级必须在 0 到 10 之间。",
"success": "好感度已设为 %s 级。", "success": "好感度已设为 %s 级。",
"level_error": "无效的好感度等级。", "level_error": "无效的好感度等级。",
"description": "设置当前角色的好感度等级" "description": "设置当前角色的好感度等级"
}, },
"setStats": { "setStats": {
"usage_console": "用法:setstats|stats @<UID> <属性> <数值>", "usage_console": "用法:setstats|stats @<UID> <属性> <数值>",
"usage_ingame": "用法:setstats|stats [@UID] <属性> <数值>", "usage_ingame": "用法:setstats|stats [@UID] <属性> <数值>",
"help_message": "\n可更改的属性列表:hp (生命值)| maxhp (最大生命值) | def(防御力) | atk (攻击力)| em (元素精通) | er (元素充能效率) | crate(暴击率) | cdmg (暴击伤害)| cdr (冷却缩减) | heal(治疗加成)| heali (受治疗加成)| shield (护盾强效)| defi (无视防御)\n(续) 元素增伤:epyro (火) | ecryo (冰) | ehydro (水) | egeo (岩) | edendro (草) | eelectro (雷) | ephys (物理)\n(续) 元素抗性:respyro (火) | rescryo (冰) | reshydro (水) | resgeo (岩) | resdendro (草) | reselectro (雷) | resphys (物理)\n", "help_message": "\n可更改的属性列表:hp (生命值)| maxhp (最大生命值) | def(防御力) | atk (攻击力)| em (元素精通) | er (元素充能效率) | crate(暴击率) | cdmg (暴击伤害)| cdr (冷却缩减) | heal(治疗加成)| heali (受治疗加成)| shield (护盾强效)| defi (无视防御)\n(续) 元素增伤:epyro (火) | ecryo (冰) | ehydro (水) | egeo (岩) | edendro (草) | eelectro (雷) | ephys (物理)\n(续) 元素抗性:respyro (火) | rescryo (冰) | reshydro (水) | resgeo (岩) | resdendro (草) | reselectro (雷) | resphys (物理)\n",
"value_error": "无效的属性值。", "value_error": "无效的属性值。",
"uid_error": "无效的UID。", "uid_error": "无效的UID。",
"player_error": "玩家不存在或已离线。", "player_error": "玩家不存在或已离线。",
"set_self": "%s 已设为 %s。", "set_self": "%s 已设为 %s。",
"set_for_uid": "%s [来自 %s] 已设为 %s。", "set_for_uid": "%s [来自 %s] 已设为 %s。",
"set_max_hp": "最大生命值已设为 %s。", "set_max_hp": "最大生命值已设为 %s。",
"description": "设置当前角色的属性" "description": "设置当前角色的属性"
}, },
"setWorldLevel": { "setWorldLevel": {
"usage": "用法:setworldlevel <等级>", "usage": "用法:setworldlevel <等级>",
"value_error": "世界等级必须设置在0-8之间。", "value_error": "世界等级必须设置在0-8之间。",
"success": "世界等级已设为 %s。", "success": "世界等级已设为 %s。",
"invalid_world_level": "无效的世界等级。", "invalid_world_level": "无效的世界等级。",
"description": "设置世界等级,执行命令后需重新登录以生效" "description": "设置世界等级,执行命令后需重新登录以生效"
}, },
"spawn": { "spawn": {
"usage": "用法:spawn <实体ID> [数量] [等级(仅怪物)]", "usage": "用法:spawn <实体ID> [数量] [等级(仅怪物)]",
"success": "已生成 %s 个 %s。", "success": "已生成 %s 个 %s。",
"description": "在你附近生成一个生物" "description": "在你附近生成一个生物"
}, },
"stop": { "stop": {
"success": "正在关闭服务器...", "success": "正在关闭服务器...",
"description": "停止服务器" "description": "停止服务器"
}, },
"talent": { "talent": {
"usage_1": "设置天赋等级:/talent set <天赋ID> <数值>", "usage_1": "设置天赋等级:/talent set <天赋ID> <数值>",
"usage_2": "另一种设置天赋等级的方法:/talent <n (普通攻击) | e (元素战技) | q (元素爆发)> <数值>", "usage_2": "另一种设置天赋等级的方法:/talent <n (普通攻击) | e (元素战技) | q (元素爆发)> <数值>",
"usage_3": "获取天赋ID:/talent getid", "usage_3": "获取天赋ID:/talent getid",
"lower_16": "无效的天赋等级,天赋等级应小于等于15。", "lower_16": "无效的天赋等级,天赋等级应小于等于15。",
"set_id": "将天赋等级设为 %s。", "set_id": "将天赋等级设为 %s。",
"set_atk": "将普通攻击等级设为 %s。", "set_atk": "将普通攻击等级设为 %s。",
"set_e": "将元素战技等级设为 %s。", "set_e": "将元素战技等级设为 %s。",
"set_q": "将元素爆发等级设为 %s。", "set_q": "将元素爆发等级设为 %s。",
"invalid_skill_id": "无效的技能ID。", "invalid_skill_id": "无效的技能ID。",
"set_this": "将天赋等级设为 %s。", "set_this": "将天赋等级设为 %s。",
"invalid_level": "无效的天赋等级。", "invalid_level": "无效的天赋等级。",
"normal_attack_id": "普通攻击的 ID 为 %s。", "normal_attack_id": "普通攻击的 ID 为 %s。",
"e_skill_id": "元素战技ID %s。", "e_skill_id": "元素战技ID %s。",
"q_skill_id": "元素爆发ID %s。", "q_skill_id": "元素爆发ID %s。",
"description": "设置当前角色的天赋等级" "description": "设置当前角色的天赋等级"
}, },
"teleportAll": { "team": {
"success": "已将所有玩家传送到你的位置。", "usage": "用法: team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]",
"error": "你只能在多人游戏状态下执行此命令。", "invalid_usage": "无效用法",
"description": "将你世界中的所有玩家传送到你所在的位置" "add_usage": "用法(add): team add <avatarId,...> [index]",
}, "invalid_index": "无效索引",
"teleport": { "add_too_much": "服务端仅支持你添加%d个角色",
"usage_server": "用法:/tp @<玩家ID> <x> <y> <z> [场景ID]", "failed_to_add_avatar": "无法根据id %s 添加角色",
"usage": "用法:/tp [@<玩家ID>] <x> <y> <z> [场景ID]", "remove_usage": "用法(remove): team remove <index|first|last|index-index,...>",
"specify_player_id": "你必须指定一个玩家ID。", "failed_parse_index": "无法解析索引: %s",
"invalid_position": "无效的位置。", "remove_too_much": "你不能删除那么多角色",
"success": "传送 %s 到坐标 %s,%s,%s,场景为 %s。", "ignore_index": "忽略的索引列表: %s",
"description": "改变指定玩家的位置" "set_usage": "用法(set): team set <index> <avatarId>",
}, "index_out_of_range": "你指定的索引超出了范围",
"tower": { "failed_parse_avatar_id": "无法解析的角色id: %s",
"unlock_done": "深境回廊的所有层已全部解锁。" "avatar_already_in_team": "角色已经在你的队伍中了",
}, "avatar_not_found": "无法找到该角色: %d",
"weather": { "description": "手动修改你的队伍"
"usage": "用法:weather <天气ID> [气候ID]", },
"success": "已更改天气为 %s,气候为 %s。", "teleportAll": {
"invalid_id": "无效的天气ID。", "success": "已将所有玩家传送到你的位置。",
"description": "更改天气" "error": "你只能在多人游戏状态下执行此命令。",
}, "description": "将你世界中的所有玩家传送到你所在的位置"
"drop": { },
"command_usage": "用法:drop <物品ID|物品名称> [数量]", "teleport": {
"success": "已丢下 %s 个 %s。", "usage_server": "用法:/tp @<玩家ID> <x> <y> <z> [场景ID]",
"description": "在你附近丢下一个物品" "usage": "用法:/tp [@<玩家ID>] <x> <y> <z> [场景ID]",
}, "specify_player_id": "你必须指定一个玩家ID。",
"help": { "invalid_position": "无效的位置。",
"usage": "用法:", "success": "传送 %s 到坐标 %s,%s,%s,场景为 %s。",
"aliases": "别名:", "description": "改变指定玩家的位置"
"available_commands": "可用命令:", },
"description": "发送帮助信息或显示指定命令的信息" "tower": {
}, "unlock_done": "深境回廊的所有层已全部解锁。"
"restart": { },
"description": "重新启动服务器" "weather": {
}, "usage": "用法:weather <天气ID> [气候ID]",
"unlocktower": { "success": "已更改天气为 %s,气候为 %s。",
"success": "解锁完成。", "invalid_id": "无效的天气ID。",
"description": "解锁深境螺旋的所有层" "description": "更改天气"
}, },
"resetshop": { "drop": {
"description": "重置商店刷新时间" "command_usage": "用法:drop <物品ID|物品名称> [数量]",
} "success": "已丢下 %s 个 %s。",
}, "description": "在你附近丢下一个物品"
"gacha": { },
"details": { "help": {
"title": "祈愿详情", "usage": "用法:",
"available_five_stars": "可获得的5星物品", "aliases": "别名:",
"available_four_stars": "可获得的4星物品", "available_commands": "可用命令:",
"available_three_stars": "可获得的3星物品" "description": "发送帮助信息或显示指定命令的信息"
} },
} "restart": {
} "description": "重新启动服务器"
},
"unlocktower": {
"success": "解锁完成。",
"description": "解锁深境螺旋的所有层"
},
"resetshop": {
"description": "重置商店刷新时间"
}
},
"gacha": {
"details": {
"title": "祈愿详情",
"available_five_stars": "可获得的5星物品",
"available_four_stars": "可获得的4星物品",
"available_three_stars": "可获得的3星物品"
}
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment