Commit 3fca9500 authored by AnimeGitB's avatar AnimeGitB Committed by Luke H-W
Browse files

Make TalentCommand show off new Translate function

parent 95500434
...@@ -2,9 +2,11 @@ package emu.grasscutter.command.commands; ...@@ -2,9 +2,11 @@ package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command; import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler; import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.AvatarSkillDepotData; import emu.grasscutter.data.excels.AvatarSkillDepotData;
import emu.grasscutter.game.avatar.Avatar; import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player; import emu.grasscutter.game.player.Player;
import emu.grasscutter.utils.Language;
import java.util.List; import java.util.List;
...@@ -14,6 +16,16 @@ import java.util.List; ...@@ -14,6 +16,16 @@ import java.util.List;
permission = "player.settalent", permission = "player.settalent",
permissionTargeted = "player.settalent.others") permissionTargeted = "player.settalent.others")
public final class TalentCommand implements CommandHandler { public final class TalentCommand implements CommandHandler {
private void setTalentLevel(Player sender, Avatar avatar, int skillId, int newLevel) {
if (avatar.setSkillLevel(skillId, newLevel)) {
long nameHash = GameData.getAvatarSkillDataMap().get(skillId).getNameTextMapHash();
var name = Language.getTextMapKey(nameHash);
CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_id", skillId, name, newLevel);
} else {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
}
}
@Override @Override
public void execute(Player sender, Player targetPlayer, List<String> args) { public void execute(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 1){ if (args.size() < 1){
...@@ -27,9 +39,6 @@ public final class TalentCommand implements CommandHandler { ...@@ -27,9 +39,6 @@ public final class TalentCommand implements CommandHandler {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_skill_id"); CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_skill_id");
return; return;
} }
int skillIdNorAtk = skillDepot.getSkills().get(0);
int skillIdE = skillDepot.getSkills().get(1);
int skillIdQ = skillDepot.getEnergySkill();
int skillId = 0; int skillId = 0;
int newLevel = -1; int newLevel = -1;
...@@ -57,11 +66,7 @@ public final class TalentCommand implements CommandHandler { ...@@ -57,11 +66,7 @@ public final class TalentCommand implements CommandHandler {
return; return;
} }
if (avatar.setSkillLevel(skillId, newLevel)) { setTalentLevel(sender, avatar, skillId, newLevel);
CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_id", newLevel);
} else {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
}
} }
case "n", "e", "q" -> { case "n", "e", "q" -> {
if (args.size() < 2) { if (args.size() < 2) {
...@@ -76,24 +81,21 @@ public final class TalentCommand implements CommandHandler { ...@@ -76,24 +81,21 @@ public final class TalentCommand implements CommandHandler {
} }
skillId = switch (cmdSwitch) { skillId = switch (cmdSwitch) {
default -> skillIdNorAtk; default -> skillDepot.getSkills().get(0);
case "e" -> skillIdE; case "e" -> skillDepot.getSkills().get(1);
case "q" -> skillIdQ; case "q" -> skillDepot.getEnergySkill();
}; };
if (avatar.setSkillLevel(skillId, newLevel)) { setTalentLevel(sender, avatar, skillId, newLevel);
switch (cmdSwitch) {
default -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_atk", newLevel);
case "e" -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_e", newLevel);
case "q" -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_q", newLevel);
}
} else {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
}
} }
case "getid" -> { case "getid" -> {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.normal_attack_id", skillIdNorAtk); var map = GameData.getAvatarSkillDataMap();
CommandHandler.sendTranslatedMessage(sender, "commands.talent.e_skill_id", skillIdE); skillDepot.getSkillsAndEnergySkill().forEach(id -> {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.q_skill_id", skillIdQ); var talent = map.get(id);
if (talent == null) return;
var talentName = Language.getTextMapKey(talent.getNameTextMapHash());
var talentDesc = Language.getTextMapKey(talent.getDescTextMapHash());
CommandHandler.sendTranslatedMessage(sender, "commands.talent.id_desc", id, talentName, talentDesc);
});
} }
} }
} }
......
package emu.grasscutter.data.excels; package emu.grasscutter.data.excels;
import java.util.List;
import emu.grasscutter.data.GameResource; import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType; import emu.grasscutter.data.ResourceType;
import emu.grasscutter.data.ResourceType.LoadPriority; import emu.grasscutter.data.ResourceType.LoadPriority;
import emu.grasscutter.game.props.ElementType; import emu.grasscutter.game.props.ElementType;
import lombok.Getter;
@ResourceType(name = "AvatarSkillExcelConfigData.json", loadPriority = LoadPriority.HIGHEST) @ResourceType(name = "AvatarSkillExcelConfigData.json", loadPriority = LoadPriority.HIGHEST)
public class AvatarSkillData extends GameResource { public class AvatarSkillData extends GameResource {
private int id; private int id;
private float cdTime; @Getter private float cdTime;
private int costElemVal; @Getter private int costElemVal;
private int maxChargeNum; @Getter private int maxChargeNum;
private int triggerID; @Getter private int triggerID;
private boolean isAttackCameraLock; @Getter private boolean isAttackCameraLock;
private int proudSkillGroupId; @Getter private int proudSkillGroupId;
private ElementType costElemType; @Getter private ElementType costElemType;
private long nameTextMapHash; @Getter private long nameTextMapHash;
private String abilityName; @Getter private long descTextMapHash;
@Getter private String abilityName;
@Override @Override
public int getId(){ public int getId(){
return this.id; return this.id;
} }
public float getCdTime() {
return cdTime;
}
public int getCostElemVal() {
return costElemVal;
}
public int getMaxChargeNum() {
return maxChargeNum;
}
public int getTriggerID() {
return triggerID;
}
public boolean isIsAttackCameraLock() {
return isAttackCameraLock;
}
public int getProudSkillGroupId() {
return proudSkillGroupId;
}
public ElementType getCostElemType() {
return costElemType;
}
public long getNameTextMapHash() {
return nameTextMapHash;
}
public String getAbilityName() {
return abilityName;
}
@Override @Override
public void onLoad() { public void onLoad() {
......
...@@ -253,7 +253,7 @@ public final class Language { ...@@ -253,7 +253,7 @@ public final class Language {
} }
} }
private static final int TEXTMAP_CACHE_VERSION = 0x9CCACE02; private static final int TEXTMAP_CACHE_VERSION = 0x9CCACE03;
@EqualsAndHashCode public static class TextStrings implements Serializable { @EqualsAndHashCode public static class TextStrings implements Serializable {
public static final String[] ARR_LANGUAGES = {"EN", "CHS", "CHT", "JP", "KR", "DE", "ES", "FR", "ID", "PT", "RU", "TH", "VI"}; public static final String[] ARR_LANGUAGES = {"EN", "CHS", "CHT", "JP", "KR", "DE", "ES", "FR", "ID", "PT", "RU", "TH", "VI"};
public static final String[] ARR_GC_LANGUAGES = {"en-US", "zh-CN", "zh-TW", "en-US", "ko-KR", "en-US", "es-ES", "fr-FR", "en-US", "en-US", "ru-RU", "en-US", "en-US"}; // TODO: Update the placeholder en-US entries if we ever add GC translations for the missing client languages public static final String[] ARR_GC_LANGUAGES = {"en-US", "zh-CN", "zh-TW", "en-US", "ko-KR", "en-US", "es-ES", "fr-FR", "en-US", "en-US", "ru-RU", "en-US", "en-US"}; // TODO: Update the placeholder en-US entries if we ever add GC translations for the missing client languages
...@@ -437,6 +437,7 @@ public final class Language { ...@@ -437,6 +437,7 @@ public final class Language {
GameData.getAvatarDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash())); GameData.getAvatarDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash()));
GameData.getAvatarSkillDataMap().forEach((k, v) -> { GameData.getAvatarSkillDataMap().forEach((k, v) -> {
usedHashes.add((int) v.getNameTextMapHash()); usedHashes.add((int) v.getNameTextMapHash());
usedHashes.add((int) v.getDescTextMapHash());
}); });
GameData.getItemDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash())); GameData.getItemDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash()));
GameData.getMonsterDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash())); GameData.getMonsterDataMap().forEach((k, v) -> usedHashes.add((int) v.getNameTextMapHash()));
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"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 %s - \"%s\" to %s.",
"set_atk": "Set talent Normal ATK to %s.", "id_desc": "Talent %s - \"%s\" - \"%s\"",
"set_e": "Set talent E to %s.",
"set_q": "Set talent Q to %s.",
"invalid_skill_id": "Invalid skill ID.", "invalid_skill_id": "Invalid skill ID.",
"invalid_level": "Invalid talent level.", "invalid_level": "Invalid talent level.",
"normal_attack_id": "Normal Attack ID %s.", "normal_attack_id": "Normal Attack ID %s.",
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "Nivel de talento inválido. El nivel debe ser menor que 16.", "lower_16": "Nivel de talento inválido. El nivel debe ser menor que 16.",
"set_id": "Establecido el talento a %s.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "Establecido el talento del ataque normal a %s.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "Establecido el talento E a %s.",
"set_q": "Establecido el talento Q a %s.",
"invalid_skill_id": "ID de habilidad inválido.", "invalid_skill_id": "ID de habilidad inválido.",
"invalid_level": "Nivel de talento inválido.", "invalid_level": "Nivel de talento inválido.",
"normal_attack_id": "ID del ataque normal %s.", "normal_attack_id": "ID del ataque normal %s.",
...@@ -363,23 +361,23 @@ ...@@ -363,23 +361,23 @@
}, },
"documentation": { "documentation": {
"handbook": { "handbook": {
"title": "GM Handbook", "title": "🇺🇸GM Handbook",
"title_commands": "Comandos", "title_commands": "Comandos",
"title_avatars": "Avatares", "title_avatars": "Avatares",
"title_items": "Objetos", "title_items": "Objetos",
"title_scenes": "Escenario", "title_scenes": "Escenario",
"title_monsters": "Monstruos", "title_monsters": "Monstruos",
"header_id": "Id", "header_id": "🇺🇸Id",
"header_command": "Comando", "header_command": "Comando",
"header_description": "Descripción", "header_description": "Descripción",
"header_avatar": "Avatar", "header_avatar": "🇺🇸Avatar",
"header_item": "Objeto", "header_item": "Objeto",
"header_scene": "Escenario", "header_scene": "Escenario",
"header_monster": "Monstruo" "header_monster": "Monstruo"
}, },
"index": { "index": {
"title": "Documentación", "title": "Documentación",
"handbook": "GM Handbook", "handbook": "🇺🇸GM Handbook",
"gacha_mapping": "JSON de mapeo del Gacha" "gacha_mapping": "JSON de mapeo del Gacha"
} }
} }
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "Niveau de talent invalide. Le niveau doit être inférieur a 16.", "lower_16": "Niveau de talent invalide. Le niveau doit être inférieur a 16.",
"set_id": "Talent défini à %s.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "Le talent ATK normale a été défini à %s.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "Le talent E a été défini a %s.",
"set_q": "Le talent A/Q a été défini à %s.",
"invalid_skill_id": "ID de talent invalide.", "invalid_skill_id": "ID de talent invalide.",
"invalid_level": "Niveau de talent invalide.", "invalid_level": "Niveau de talent invalide.",
"normal_attack_id": "ID de l'attaque normale ID %s.", "normal_attack_id": "ID de l'attaque normale ID %s.",
...@@ -383,4 +381,4 @@ ...@@ -383,4 +381,4 @@
"gacha_mapping": "🇺🇸Gacha mapping JSON" "gacha_mapping": "🇺🇸Gacha mapping JSON"
} }
} }
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
"dispatch": { "dispatch": {
"port_bind": "[Dispatch] 디스패치 서버가 포트 %s에서 열렸습니다.", "port_bind": "[Dispatch] 디스패치 서버가 포트 %s에서 열렸습니다.",
"request": "[Dispatch] Client %s %s request: %s", "request": "🇺🇸[Dispatch] Client %s %s request: %s",
"keystore": { "keystore": {
"general_error": "[Dispatch] 키스토어 로딩중 오류가 발생했습니다!", "general_error": "[Dispatch] 키스토어 로딩중 오류가 발생했습니다!",
"password_error": "[Dispatch] 키스토어를 로딩할 수 없습니다. 기본 키스토어 암호로 시도 중...", "password_error": "[Dispatch] 키스토어를 로딩할 수 없습니다. 기본 키스토어 암호로 시도 중...",
...@@ -17,10 +17,10 @@ ...@@ -17,10 +17,10 @@
"default_password": "[Dispatch] 기본 키스토어 암호가 성공적으로 로딩됐습니다. config.json에서 암호를 123456으로 설정해 보십시오." "default_password": "[Dispatch] 기본 키스토어 암호가 성공적으로 로딩됐습니다. config.json에서 암호를 123456으로 설정해 보십시오."
}, },
"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": "디스패치 전용 모드에서는 명령어가 지원되지 않습니다.", "no_commands_error": "디스패치 전용 모드에서는 명령어가 지원되지 않습니다.",
"unhandled_request_error": "[Dispatch] Potential unhandled %s request: %s.", "unhandled_request_error": "🇺🇸[Dispatch] Potential unhandled %s request: %s.",
"account": { "account": {
"login_attempt": "[Dispatch] %s 클라이언트에서 로그인을 시도하고 있습니다.", "login_attempt": "[Dispatch] %s 클라이언트에서 로그인을 시도하고 있습니다.",
"login_success": "[Dispatch] %s 클라이언트가 %s로 로그인 했습니다.", "login_success": "[Dispatch] %s 클라이언트가 %s로 로그인 했습니다.",
...@@ -111,11 +111,10 @@ ...@@ -111,11 +111,10 @@
"status": { "status": {
"enabled": "활성화됨", "enabled": "활성화됨",
"disabled": "비활성화됨", "disabled": "비활성화됨",
"help": "Help", "help": "🇺🇸Help",
"success": "성공" "success": "성공"
}, },
"account": { "account": {
"command_usage": "사용법: account <create|delete> <아이디> [UID]",
"invalid": "잘못된 UID.", "invalid": "잘못된 UID.",
"exists": "이 아이디 또는 UID를 가진 계정이 이미 존재합니다.", "exists": "이 아이디 또는 UID를 가진 계정이 이미 존재합니다.",
"create": "UID %s로 계정이 생성되었습니다.", "create": "UID %s로 계정이 생성되었습니다.",
...@@ -124,7 +123,6 @@ ...@@ -124,7 +123,6 @@
"description": "사용자 계정을 수정합니다" "description": "사용자 계정을 수정합니다"
}, },
"announce": { "announce": {
"command_usage": "사용법: announce|a <\"tpl\" templateId|\"refresh\"|\"revoke\" templateId|content>",
"send_success": "공지 발송에 성공했습니다, 취소하고 싶으면 /a revoke %s를 입력하세요.", "send_success": "공지 발송에 성공했습니다, 취소하고 싶으면 /a revoke %s를 입력하세요.",
"refresh_success": "공지 구성파일을 새로 고쳤습니다. [Total %s]", "refresh_success": "공지 구성파일을 새로 고쳤습니다. [Total %s]",
"revoke_done": "%s공지 취소 시도중.", "revoke_done": "%s공지 취소 시도중.",
...@@ -132,36 +130,32 @@ ...@@ -132,36 +130,32 @@
"description": "모든 온라인 플레이어로부터 공지사항 발표하거나, 서버 공지사항을 관리합니다." "description": "모든 온라인 플레이어로부터 공지사항 발표하거나, 서버 공지사항을 관리합니다."
}, },
"clear": { "clear": {
"command_usage": "사용법: clear <all|wp|art|mat> [lv<최고레벨>] [r<최고 제련레벨>] [<최고 희귀도>*]",
"weapons": "%s의 무기를 초기화했습니다.", "weapons": "%s의 무기를 초기화했습니다.",
"artifacts": "%s의 성유물을 초기화했습니다.", "artifacts": "%s의 성유물을 초기화했습니다.",
"materials": "%s의 재료를 초기화했습니다.", "materials": "%s의 재료를 초기화했습니다.",
"furniture": "%s의 가구를 초기화했습니다.", "furniture": "%s의 가구를 초기화했습니다.",
"displays": "Cleared displays for %s.", "displays": "🇺🇸Cleared displays for %s.",
"virtuals": "Cleared virtuals for %s.", "virtuals": "🇺🇸Cleared virtuals for %s.",
"everything": "%s의 모든 아이템을 초기화했습니다.", "everything": "%s의 모든 아이템을 초기화했습니다.",
"description": "인벤토레에서 잠금된 물건을 제외한 항목을 삭제합니다. 기본적으로 4성, 1레벨, 1재련보다 낮은것만을 기준으로 하지만, 더 높게 설정할 수 있습니다." "description": "인벤토레에서 잠금된 물건을 제외한 항목을 삭제합니다. 기본적으로 4성, 1레벨, 1재련보다 낮은것만을 기준으로 하지만, 더 높게 설정할 수 있습니다."
}, },
"coop": { "coop": {
"usage": "사용법: coop [호스트 UID]",
"success": "%s가 %s의 월드에 소환되었습니다.", "success": "%s가 %s의 월드에 소환되었습니다.",
"description": "누군가를 다른 사람의 월드에 참여하도록 합니다. 목표가 지정되지 않으면 당신을 다인 모드로 진입시킵니다." "description": "누군가를 다른 사람의 월드에 참여하도록 합니다. 목표가 지정되지 않으면 당신을 다인 모드로 진입시킵니다."
}, },
"enter_dungeon": { "enter_dungeon": {
"usage": "사용법: enterdungeon <던전ID>",
"changed": "%s던전으로 전환되었습니다.", "changed": "%s던전으로 전환되었습니다.",
"not_found_error": "던전이 존재하지 않습니다.", "not_found_error": "던전이 존재하지 않습니다.",
"in_dungeon_error": "이미 당신은 그 던전에 있습니다.", "in_dungeon_error": "이미 당신은 그 던전에 있습니다.",
"description": "던전에 진입합니다." "description": "던전에 진입합니다."
}, },
"give": { "give": {
"usage": "사용법: give <아이템ID|캐릭터ID|\"all\"|\"weapons\"|\"mats\"|\"avatars\"> [x<개수>] [lv<레벨>] [r<제련레벨>]",
"usage_relic": "사용법: give <성유물ID> [mainPropID] [<appendPropID>[,<times>]]... [lv<레벨 0-20>]", "usage_relic": "사용법: give <성유물ID> [mainPropID] [<appendPropID>[,<times>]]... [lv<레벨 0-20>]",
"illegal_relic": "이 성유물ID는 블랙리스트 범위에 있습니다. 원하는 ID가 아닐 수 있습니다.", "illegal_relic": "이 성유물ID는 블랙리스트 범위에 있습니다. 원하는 ID가 아닐 수 있습니다.",
"given": "%s개의 %s를 %s에게 지급했습니다.", "given": "%s개의 %s를 %s에게 지급했습니다.",
"given_with_level_and_refinement": "Give %s with level %s, refinement %s %s times to %s.", "given_with_level_and_refinement": "Give %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.",
"given_avatar": "Given %s with level %s to %s.", "given_avatar": "🇺🇸Given %s with level %s to %s.",
"giveall_success": "모든 아이템이 성공적으로 지급되었습니다.", "giveall_success": "모든 아이템이 성공적으로 지급되었습니다.",
"description": "지정된 플레이어가 아이템을 획득합니다. 모든 무기, 캐릭터, 재료를 제공할 수 있으며, 맞춤 성유물을 제공할 수도 있습니다." "description": "지정된 플레이어가 아이템을 획득합니다. 모든 무기, 캐릭터, 재료를 제공할 수 있으며, 맞춤 성유물을 제공할 수도 있습니다."
}, },
...@@ -170,7 +164,6 @@ ...@@ -170,7 +164,6 @@
"description": "파티 내 모든 캐릭터를 치유합니다." "description": "파티 내 모든 캐릭터를 치유합니다."
}, },
"help": { "help": {
"usage": "사용법: ",
"aliases": "별칭: ", "aliases": "별칭: ",
"available_commands": "사용 가능한 명령어: ", "available_commands": "사용 가능한 명령어: ",
"tip_need_permission": "권한: ", "tip_need_permission": "권한: ",
...@@ -185,13 +178,11 @@ ...@@ -185,13 +178,11 @@
"description": "지정된 플레이어를 서버에서 강제퇴장합니다 (WIP)" "description": "지정된 플레이어를 서버에서 강제퇴장합니다 (WIP)"
}, },
"killall": { "killall": {
"usage": "사용법: killall [플레이어UID] [sceneID]",
"scene_not_found_in_player_world": "해당 scene에 플레이어가 없습니다.", "scene_not_found_in_player_world": "해당 scene에 플레이어가 없습니다.",
"kill_monsters_in_scene": "%s마리의 몬스터가 scene %s에서 모두 죽었습니다.", "kill_monsters_in_scene": "%s마리의 몬스터가 scene %s에서 모두 죽었습니다.",
"description": "모든 엔티티를 죽입니다." "description": "모든 엔티티를 죽입니다."
}, },
"killCharacter": { "killCharacter": {
"usage": "사용법: killcharacter [플레이어ID]",
"success": "%s의 캐릭터를 죽였습니다.", "success": "%s의 캐릭터를 죽였습니다.",
"description": "플레이어의 현재 캐릭터를 죽입니다" "description": "플레이어의 현재 캐릭터를 죽입니다"
}, },
...@@ -206,7 +197,6 @@ ...@@ -206,7 +197,6 @@
"description": "온라인 상태의 플레이어를 표시합니다." "description": "온라인 상태의 플레이어를 표시합니다."
}, },
"permission": { "permission": {
"usage": "사용법: permission <add|remove> <아이디> <permission>",
"add": "권한이 추가되었습니다.", "add": "권한이 추가되었습니다.",
"has_error": "이미 해당 권한이 있습니다!", "has_error": "이미 해당 권한이 있습니다!",
"remove": "권한이 삭제되었습니다.", "remove": "권한이 삭제되었습니다.",
...@@ -219,7 +209,6 @@ ...@@ -219,7 +209,6 @@
"description": "좌표를 출력합니다" "description": "좌표를 출력합니다"
}, },
"quest": { "quest": {
"usage": "사용법: quest <add|finish> [questID]",
"added": "%s 퀘스트가 추가되었습니다.", "added": "%s 퀘스트가 추가되었습니다.",
"finished": "%s 퀘스트를 마쳤습니다.", "finished": "%s 퀘스트를 마쳤습니다.",
"not_found": "퀘스트를 찾을 수 없습니다.", "not_found": "퀘스트를 찾을 수 없습니다.",
...@@ -237,15 +226,14 @@ ...@@ -237,15 +226,14 @@
"description": "현재 캐릭터의 별자리를 초기화합니다, 변경 사항을 보려면 명령을 사용한 후 다시 로그인 해야합니다." "description": "현재 캐릭터의 별자리를 초기화합니다, 변경 사항을 보려면 명령을 사용한 후 다시 로그인 해야합니다."
}, },
"resetShopLimit": { "resetShopLimit": {
"usage": "사용법: resetshop <playerID>",
"success": "리셋 완료됨.", "success": "리셋 완료됨.",
"description": "대상 플레이어의 상점의 새로고침 시간을 초기화합니다" "description": "대상 플레이어의 상점의 새로고침 시간을 초기화합니다"
}, },
"sendMail": { "sendMail": {
"usage": "사용법: sendmail <userID|all|help> [templateID]", "give_usage": "🇺🇸Usage: give <player> <itemID|itemName> [amount] [level] [refinement]",
"user_not_exist": "아이디가 '%s'인 사용자가 없습니다.", "user_not_exist": "아이디가 '%s'인 사용자가 없습니다.",
"start_composition": "메세지 작성 시작중.\n계속하려면 '/sendmail <title>'을 입력하십시오.\n'/sendmail stop'도 언제든지 사용할 수 있습니다.", "start_composition": "메세지 작성 시작중.\n계속하려면 '/sendmail <title>'을 입력하십시오.\n'/sendmail stop'도 언제든지 사용할 수 있습니다.",
"templates": "Mail templates coming soon implemented...", "templates": "🇺🇸Mail templates coming soon implemented...",
"invalid_arguments": "잘못된 인수입니다.", "invalid_arguments": "잘못된 인수입니다.",
"send_cancel": "메세지 전송이 취소되었습니다", "send_cancel": "메세지 전송이 취소되었습니다",
"send_done": "%s에게 메세지가 전송되었습니다!", "send_done": "%s에게 메세지가 전송되었습니다!",
...@@ -257,35 +245,42 @@ ...@@ -257,35 +245,42 @@
"set_message_sender": "메세지 발송자가 '%s'으로 설정되었습니다.\n계속하려면 '/sendmail <itemID|itemName|finish> [amount] [level]'을 사용하십시오.", "set_message_sender": "메세지 발송자가 '%s'으로 설정되었습니다.\n계속하려면 '/sendmail <itemID|itemName|finish> [amount] [level]'을 사용하십시오.",
"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>", "title": "🇺🇸<title>",
"message": "<message>", "message": "🇺🇸<message>",
"sender": "<sender>", "sender": "🇺🇸<sender>",
"arguments": "<itemID|itemName|finish> [amount] [level]", "arguments": "🇺🇸<itemID|itemName|finish> [amount] [level]",
"error": "오류: Invalid construction stage %s. Check console for stacktrace.", "error": "오류: Invalid construction stage %s. Check console for stacktrace.",
"description": "지정된 사용자에게 메세지를 보냅니다. 이 명령어의 사용법은 세부 내용에 따라 달라집니다." "description": "지정된 사용자에게 메세지를 보냅니다. 이 명령어의 사용법은 세부 내용에 따라 달라집니다."
}, },
"sendMessage": { "sendMessage": {
"usage": "사용법: sendmessage <메세지>",
"success": "메세지 전송 성공.", "success": "메세지 전송 성공.",
"description": "서버가 플레이어에게 메세지를 전송합니다. 목표를 지정하지 않고 명령어를 사용하는 경우, 서버의 모든 인원에게 메세지가 발송됩니다." "description": "서버가 플레이어에게 메세지를 전송합니다. 목표를 지정하지 않고 명령어를 사용하는 경우, 서버의 모든 인원에게 메세지가 발송됩니다."
}, },
"setConst": {
"range_error": "🇺🇸Constellation level must be between 0 and 6.",
"level_error": "🇺🇸Invalid constellation level.",
"fail": "🇺🇸Failed to set constellation.",
"failed_success": "🇺🇸Constellations for %s have been set to %s. Please reload scene to see changes.",
"success": "🇺🇸Constellations for %s have been set to %s.",
"description": "🇺🇸Sets constellation level for your current active character"
},
"setFetterLevel": { "setFetterLevel": {
"usage": "사용법: setfetterlevel <레벨>",
"range_error": "호감도 지수는 0 과 10 사이에 위치해야합니다.", "range_error": "호감도 지수는 0 과 10 사이에 위치해야합니다.",
"success": "호감도 지수가 %s로 설정되었습니다.", "success": "호감도 지수가 %s로 설정되었습니다.",
"level_error": "잘못된 호감도 지수", "level_error": "잘못된 호감도 지수",
"description": "파티 내 자신의 캐릭터의 호감도를 설정합니다." "description": "파티 내 자신의 캐릭터의 호감도를 설정합니다."
}, },
"setProp": { "setProp": {
"usage": "사용법: setprop|prop <prop> <값>\n\t사용할 수 있는 <prop> 종류: godmode | nostamina | unlimitedenergy | abyss | worldlevel | bplevel\n\t(cont.) see PlayerProperty enum for other possible values, of form PROP_MAX_SPRING_VOLUME -> max_spring_volume",
"description": "계정의 속성을 변경합니다. godmode등이 이를 통해 활성화 될 수 있으며, 나선비경을 잠금해제하거나, 기행의 레벨을 조정하는 등의 명령또한 이를 통해 가능합니다." "description": "계정의 속성을 변경합니다. godmode등이 이를 통해 활성화 될 수 있으며, 나선비경을 잠금해제하거나, 기행의 레벨을 조정하는 등의 명령또한 이를 통해 가능합니다."
}, },
"setStats": { "setStats": {
"usage": "사용법: setstats|stats <stat> <값>\n\t사용할 수 있는 <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", "description": "당신의 현재 캐릭터의 스텟들을 조절합니다.",
"description": "당신의 현재 캐릭터의 스텟들을 조절합니다." "locked_to": "🇺🇸%s locked to %s.",
"locked_for_to": "🇺🇸%s for %s locked to %s.",
"unlocked": "🇺🇸%s unlocked.",
"unlocked_for": "🇺🇸%s for %s unlocked."
}, },
"spawn": { "spawn": {
"usage": "사용법: spawn <엔티티ID> [개체 수] [level(몬스터만)] [<x> <y> <z>(몬스터만 가능, 선택형)]",
"success": " %s 개의 %s 를 소환하는데 성공했습니다.", "success": " %s 개의 %s 를 소환하는데 성공했습니다.",
"limit_reached": "scene당 소환 엔티티 한계입니다. 대신 %s 개의 엔티티를 소환합니다.", "limit_reached": "scene당 소환 엔티티 한계입니다. 대신 %s 개의 엔티티를 소환합니다.",
"description": "엔티티를 당신 근처에 소환합니다" "description": "엔티티를 당신 근처에 소환합니다"
...@@ -295,16 +290,10 @@ ...@@ -295,16 +290,10 @@
"description": "서버를 중지합니다" "description": "서버를 중지합니다"
}, },
"talent": { "talent": {
"usage_1": "특성 레벨을 저잘하기위한 방법으로는: /talent set <특성ID> <값>",
"usage_2": "특성 레벨을 조절하는 다른 방법으로는: /talent <n 또는 e 또는 q> <값>",
"usage_3": "특성 ID를 가지기 위해서는: /talent getid",
"lower_16": "불분명한 특성 레벨. 특성의 레벨은 16 미만이여야합니다.", "lower_16": "불분명한 특성 레벨. 특성의 레벨은 16 미만이여야합니다.",
"set_id": "틀성을 %s 로 조정합니다.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "일반 공격 특성을 %s 로 조정합니다.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "특성 E를 %s 로 조정합니다.",
"set_q": "특성 Q를 %s 로 조정합니다.",
"invalid_skill_id": "잘못된 스킬ID.", "invalid_skill_id": "잘못된 스킬ID.",
"set_this": "이 스킬의 레벨을 %s로 조정합니다.",
"invalid_level": "불분명한 스킬 레벨.", "invalid_level": "불분명한 스킬 레벨.",
"normal_attack_id": "기본공격 ID %s.", "normal_attack_id": "기본공격 ID %s.",
"e_skill_id": "E 스킬 ID %s.", "e_skill_id": "E 스킬 ID %s.",
...@@ -312,17 +301,13 @@ ...@@ -312,17 +301,13 @@
"description": "현재 캐릭터의 특성 레벨을 조정합니다" "description": "현재 캐릭터의 특성 레벨을 조정합니다"
}, },
"team": { "team": {
"usage": "사용법: team <add|remove|set> [캐릭터ID,...] [index|first|last|index-index,...]",
"invalid_usage": "잘못된 사용.", "invalid_usage": "잘못된 사용.",
"add_usage": "Usage (add): team add <캐릭터ID,...> [index]",
"invalid_index": "잘못된 목차.", "invalid_index": "잘못된 목차.",
"add_too_much": "팀에 넣을 수 있는 캐릭터 수의 최대는 %d 명 입니다.", "add_too_much": "팀에 넣을 수 있는 캐릭터 수의 최대는 %d 명 입니다.",
"failed_to_add_avatar": "추가하는데 실패했습니다 캐릭터 ID %s.", "failed_to_add_avatar": "추가하는데 실패했습니다 캐릭터 ID %s.",
"remove_usage": "Usage (remove): team remove <index|first|last|index-index,...>",
"failed_to_parse_index": "분석에 실패함 index: %s", "failed_to_parse_index": "분석에 실패함 index: %s",
"remove_too_much": "팀에는 최소 1명의 캐릭터가 편성 되어야 합니다.", "remove_too_much": "팀에는 최소 1명의 캐릭터가 편성 되어야 합니다.",
"ignore_index": "Ignored index(es): %s", "ignore_index": "🇺🇸Ignored index(es): %s",
"set_usage": "Usage (set): team set <index> <캐릭터ID>",
"index_out_of_range": "지정된 목차는 범위 밖에 있습니다.", "index_out_of_range": "지정된 목차는 범위 밖에 있습니다.",
"failed_parse_avatar_id": "분석에 실패한 캐릭터 ID: %s", "failed_parse_avatar_id": "분석에 실패한 캐릭터 ID: %s",
"avatar_already_in_team": "해당 캐릭터는 이미 팀에 포함되어 있습니다.", "avatar_already_in_team": "해당 캐릭터는 이미 팀에 포함되어 있습니다.",
...@@ -335,9 +320,6 @@ ...@@ -335,9 +320,6 @@
"description": "당신의 월드에 있는 모든 플레이어들을 당신의 위치로 이동시킵니다." "description": "당신의 월드에 있는 모든 플레이어들을 당신의 위치로 이동시킵니다."
}, },
"teleport": { "teleport": {
"usage_server": "사용법: tp @<플레이어ID> <x> <y> <z> [sceneID]",
"usage": "사용법: tp [@<플레이어ID>] <x> <y> <z> [sceneID]",
"specify_player_id": "플레이어 ID를 측정하십시오.",
"invalid_position": "위치가 잘못되었습니다.", "invalid_position": "위치가 잘못되었습니다.",
"exists_error": "scene가 존재하지 않습니다..", "exists_error": "scene가 존재하지 않습니다..",
"success": " %s 을(를) %s, %s, %s 로 이동시켰습니다. scene %s.", "success": " %s 을(를) %s, %s, %s 로 이동시켰습니다. scene %s.",
...@@ -349,7 +331,6 @@ ...@@ -349,7 +331,6 @@
"description": "날씨 ID와 기후를 변경합니다. 날씨 ID들은 ./Resources/ExcelBinOutput/WeatherExcelConfigData.json에서 찾을 수 있습니다.\n날씨 타입: sunny, cloudy, rain, thunderstorm, snow, mist" "description": "날씨 ID와 기후를 변경합니다. 날씨 ID들은 ./Resources/ExcelBinOutput/WeatherExcelConfigData.json에서 찾을 수 있습니다.\n날씨 타입: sunny, cloudy, rain, thunderstorm, snow, mist"
}, },
"ban": { "ban": {
"command_usage": "사용법: ban <@플레이어ID> [timestamp] [reason]",
"success": "성공.", "success": "성공.",
"failure": "실패, 플레이어가 발견되지 않았습니다.", "failure": "실패, 플레이어가 발견되지 않았습니다.",
"invalid_time": "timestamp를 분석할 수 없습니다.", "invalid_time": "timestamp를 분석할 수 없습니다.",
...@@ -360,7 +341,6 @@ ...@@ -360,7 +341,6 @@
"description": "플레이어의 모든 오픈 스탯을 잠금 해제합니다." "description": "플레이어의 모든 오픈 스탯을 잠금 해제합니다."
}, },
"unban": { "unban": {
"command_usage": "사용법: unban <@플레이어ID>",
"success": "성공.", "success": "성공.",
"failure": "실패, 플레이어를 찾을 수 없습니다.", "failure": "실패, 플레이어를 찾을 수 없습니다.",
"description": "플레이어에 대한 밴을 해제합니다" "description": "플레이어에 대한 밴을 해제합니다"
...@@ -387,7 +367,7 @@ ...@@ -387,7 +367,7 @@
"title_items": "아이템", "title_items": "아이템",
"title_scenes": "장면", "title_scenes": "장면",
"title_monsters": "몬스터", "title_monsters": "몬스터",
"header_id": "Id", "header_id": "🇺🇸Id",
"header_command": "명령러", "header_command": "명령러",
"header_description": "설명", "header_description": "설명",
"header_avatar": "캐릭터", "header_avatar": "캐릭터",
...@@ -396,9 +376,9 @@ ...@@ -396,9 +376,9 @@
"header_monster": "몬스터" "header_monster": "몬스터"
}, },
"index": { "index": {
"title": "Documentation", "title": "🇺🇸Documentation",
"handbook": "GM Handbook", "handbook": "🇺🇸GM Handbook",
"gacha_mapping": "Gacha mapping JSON" "gacha_mapping": "🇺🇸Gacha mapping JSON"
} }
} }
} }
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "Błędny poziom talentu. Poziom ten powinien być mniejszy niż 16.", "lower_16": "Błędny poziom talentu. Poziom ten powinien być mniejszy niż 16.",
"set_id": "Ustawiono poziom talentu na %s.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "Ustawiono poziom talentu Atak Podstawowy na %s.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "Ustawiono poziom talentu E na %s.",
"set_q": "Ustawiono poziom talentu Q na %s.",
"invalid_skill_id": "Błędne ID umiejętności.", "invalid_skill_id": "Błędne ID umiejętności.",
"invalid_level": "Błędny poziom talentu.", "invalid_level": "Błędny poziom talentu.",
"normal_attack_id": "ID podstawowego ataku: %s.", "normal_attack_id": "ID podstawowego ataku: %s.",
...@@ -363,7 +361,7 @@ ...@@ -363,7 +361,7 @@
}, },
"documentation": { "documentation": {
"handbook": { "handbook": {
"title": "GM Handbook", "title": "🇺🇸GM Handbook",
"title_commands": "Komendy", "title_commands": "Komendy",
"title_avatars": "Awatary", "title_avatars": "Awatary",
"title_items": "Przedmioty", "title_items": "Przedmioty",
...@@ -379,7 +377,7 @@ ...@@ -379,7 +377,7 @@
}, },
"index": { "index": {
"title": "Dokumentacja", "title": "Dokumentacja",
"handbook": "GM Handbook", "handbook": "🇺🇸GM Handbook",
"gacha_mapping": "Losowanie w formacie JSON" "gacha_mapping": "Losowanie w formacie JSON"
} }
} }
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "Nivel de talent nevalabil. Nivelul trebuie să fie mai mic ca 16.", "lower_16": "Nivel de talent nevalabil. Nivelul trebuie să fie mai mic ca 16.",
"set_id": "Setat nivelul ca %s.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "Setat talentul Normal Attack ca %s.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "Setat talentul E ca %s.",
"set_q": "Setat talentul Q ca %s.",
"invalid_skill_id": "Skill ID nevalabil.", "invalid_skill_id": "Skill ID nevalabil.",
"invalid_level": "Nivel de talent nevalabil.", "invalid_level": "Nivel de talent nevalabil.",
"normal_attack_id": "🇺🇸Normal Attack ID %s.", "normal_attack_id": "🇺🇸Normal Attack ID %s.",
...@@ -383,4 +381,4 @@ ...@@ -383,4 +381,4 @@
"gacha_mapping": "🇺🇸Gacha mapping JSON" "gacha_mapping": "🇺🇸Gacha mapping JSON"
} }
} }
} }
\ No newline at end of file
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "Некорректный уровень таланта. Уровень должен быть ниже 16.", "lower_16": "Некорректный уровень таланта. Уровень должен быть ниже 16.",
"set_id": "Уровень таланта стал равен %s.", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "Уровень таланта стандартной атаки стал равен %s.", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "Уровень таланта способности на E стал равен %s.",
"set_q": "Уровень таланта способности на Q стал равен %s.",
"invalid_skill_id": "Некорректный ID способности.", "invalid_skill_id": "Некорректный ID способности.",
"invalid_level": "Некорректный уровень таланта.", "invalid_level": "Некорректный уровень таланта.",
"normal_attack_id": "ID стандартной атаки: %s.", "normal_attack_id": "ID стандартной атаки: %s.",
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "无效的天赋等级,天赋等级应小于等于15。", "lower_16": "无效的天赋等级,天赋等级应小于等于15。",
"set_id": "将天赋等级设为 %s。", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "将普通攻击等级设为 %s。", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "将元素战技等级设为 %s。",
"set_q": "将元素爆发等级设为 %s。",
"invalid_skill_id": "无效的技能ID。", "invalid_skill_id": "无效的技能ID。",
"invalid_level": "无效的天赋等级。", "invalid_level": "无效的天赋等级。",
"normal_attack_id": "普通攻击的 ID 为 %s。", "normal_attack_id": "普通攻击的 ID 为 %s。",
......
...@@ -291,10 +291,8 @@ ...@@ -291,10 +291,8 @@
}, },
"talent": { "talent": {
"lower_16": "無效的天賦等級,技能等級應低於 16。", "lower_16": "無效的天賦等級,技能等級應低於 16。",
"set_id": "將天賦等級設為%s。", "set_id": "🇺🇸Set talent %s - \"%s\" to %s.",
"set_atk": "將普通攻擊等級設為 %s。", "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"",
"set_e": "設定元素戰技的天賦等級至 %s。",
"set_q": "設定元素爆發的天賦等級至 %s。",
"invalid_skill_id": "無效的技能ID。", "invalid_skill_id": "無效的技能ID。",
"invalid_level": "無效的天賦等級。", "invalid_level": "無效的天賦等級。",
"normal_attack_id": "普通攻擊的 ID 為 %s。", "normal_attack_id": "普通攻擊的 ID 為 %s。",
...@@ -383,4 +381,4 @@ ...@@ -383,4 +381,4 @@
"gacha_mapping": "祈願物品映射到JSON上" "gacha_mapping": "祈願物品映射到JSON上"
} }
} }
} }
\ No newline at end of file
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