Compare commits

...
10 Commits
Author SHA1 Message Date
Ben Woo 6c86c41f98 Merge pull request #3445 from Multiverse/chore/26.1.2-platform
Update platform upload version list to include 26.1.2
2026-04-30 22:42:35 +08:00
Ben Woo 0afd4dbb62 Update platform upload version list to include 26.1.2 2026-04-30 22:35:44 +08:00
Ben Woo f527fbd693 Merge pull request #3441 from xiaohuang2004/patch-2
Update multiverse-core_zh.properties
2026-04-16 10:22:04 +08:00
xiaohuang2004 b50687db3b Fix formatting in multiverse-core_zh.properties 2026-04-13 11:50:57 +08:00
xiaohuang2004 a28a071e1e Fix punctuation in Chinese property file 2026-04-13 11:48:04 +08:00
xiaohuang2004 66dc376633 Update multiverse-core_zh.properties
The Chinese translation has been updated based on the latest English file, and some translations have been optimized simultaneously for more precise expression of meaning.
2026-04-10 15:41:53 +08:00
Ben Woo 5e8e9380e3 Merge pull request #3440 from Multiverse/fix/26.1-folders-lowercased
Fix world folder being lowercased due to namespace changes in 26.1
2026-04-08 16:14:28 +08:00
Ben Woo 4a16fa2297 Fix world folder being lowercased due to namespace changes in 26.1 2026-04-08 14:20:01 +08:00
Ben Woo b9e07a85d0 Merge pull request #3439 from Multiverse/fix/papermc-26.1-migration
Add support for detecting PaperMC 26.1 folder migration
2026-04-08 11:11:29 +08:00
Ben Woo 53c7459c1d Add support for detecting PaperMC 26.1 folder migration 2026-04-08 11:00:25 +08:00
5 changed files with 158 additions and 77 deletions

No files matched your search

@@ -107,7 +107,7 @@ jobs:
files: '["${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar"]'
name: ${{ steps.release-info.outputs.tag_name }}
changelog: ${{ steps.release-artifact.outputs.body }}
game_versions: 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2
game_versions: 26.1.2, 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2
version_type: ${{ steps.parse-release-type.outputs.release_type }}
loaders: bukkit, spigot, paper, purpur
dependencies: ${{ inputs.modrinth_dependencies }}
@@ -121,7 +121,7 @@ jobs:
changelog: ${{ steps.release-artifact.outputs.body }}
changelog_type: markdown
display_name: ${{ steps.release-info.outputs.tag_name }}
game_versions: 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2
game_versions: 26.1.2, 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2
release_type: ${{ steps.parse-release-type.outputs.release_type }}
project_relations: ${{ inputs.dbo_project_relations }}
file_path: ${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar
@@ -136,5 +136,5 @@ jobs:
channel: ${{ steps.parse-release-type.outputs.release_type }}
files: '[{"path": "${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar", "platforms": ["PAPER"]}]'
description: ${{ steps.release-artifact.outputs.body }}
platform_dependencies: '{"PAPER": ["1.18.2-26.1.1"]}'
platform_dependencies: '{"PAPER": ["1.18.2-26.1.2"]}'
plugin_dependencies: ${{ inputs.hangar_plugin_dependencies }}
@@ -14,6 +14,8 @@ import java.nio.file.Path;
/**
* Compatibility class used to handle API changes in {@link Bukkit} class.
*
* @since 5.6
*/
@ApiStatus.AvailableSince("5.6")
public final class BukkitCompatibility {
@@ -26,6 +28,23 @@ public final class BukkitCompatibility {
GET_WORLD_NAMESPACED_KEY_METHOD = Option.of(ReflectHelper.getMethod(Bukkit.class, "getWorld", NamespacedKey.class));
}
/**
* Check whether the server is using the new dimension storage system introduced in PaperMC 26.1.
* <br />
* This is based of whether getLevelDirectory method exists in the server class,which is the main API change for
* the new dimension storage system.
*
* @return True if the server is using the new dimension storage system, else false.
*
* @since 5.6
*/
@ApiStatus.AvailableSince("5.6")
public static boolean isUsingNewDimensionStorage() {
return GET_LEVEL_DIRECTORY_METHOD
.flatMap(method -> Option.of(ReflectHelper.invokeMethod(Bukkit.getServer(), method)))
.isDefined();
}
/**
* Gets the folder where all the worlds will be store. Before 26.1, all worlds are stored in the root directory
* of the server, which can be obtained by {@link Server#getWorldContainer()}.
@@ -34,6 +53,8 @@ public final class BukkitCompatibility {
* level directory, which needs to be manually parsed.
*
* @return The location where all the worlds folders should be, depending on server's mc version.
*
* @since 5.6
*/
@ApiStatus.AvailableSince("5.6")
@NotNull
@@ -55,6 +76,8 @@ public final class BukkitCompatibility {
*
* @param nameOrKey Either a name or namespaced key string representation.
* @return The world if it exists
*
* @since 5.6
*/
@ApiStatus.AvailableSince("5.6")
@NotNull
@@ -317,8 +317,17 @@ public final class WorldManager {
String worldName = options.worldName();
if (!worldNameChecker.isValidWorldName(worldName)) {
return worldActionResult(ImportFailureReason.INVALID_WORLDNAME, worldName);
} else if (options.doFolderCheck() && !worldNameChecker.isValidWorldFolder(worldName)) {
return worldActionResult(ImportFailureReason.WORLD_FOLDER_INVALID, worldName);
} else if (options.doFolderCheck()) {
//todo This is a duplicate of folder check in load world
WorldNameChecker.FolderStatus folderStatus = worldNameChecker.checkFolder(options.worldName());
if (!folderStatus.isLoadable()) {
return worldActionResult(ImportFailureReason.WORLD_FOLDER_INVALID, options.worldName());
}
if (folderStatus == WorldNameChecker.FolderStatus.REQUIRES_MIGRATION) {
Logging.info("World '%s' will be automatically migrated by PaperMC to the new dimension " +
"location. If you face any issue with migration, please contact PaperMC support!",
options.worldName());
}
}
return worldActionResult(options);
}
@@ -480,8 +489,16 @@ public final class WorldManager {
return doLoadBukkitWorld(bukkitWorld, mvWorld);
}
if (options.doFolderCheck() && !worldNameChecker.isValidWorldFolder(mvWorld.getName())) {
return worldActionResult(LoadFailureReason.WORLD_FOLDER_INVALID, mvWorld.getName());
if (options.doFolderCheck()) {
WorldNameChecker.FolderStatus folderStatus = worldNameChecker.checkFolder(mvWorld.getName());
if (!folderStatus.isLoadable()) {
return worldActionResult(LoadFailureReason.WORLD_FOLDER_INVALID, mvWorld.getName());
}
if (folderStatus == WorldNameChecker.FolderStatus.REQUIRES_MIGRATION) {
Logging.info("World '%s' will be automatically migrated by PaperMC to the new dimension " +
"location. If you face any issue with migration, please contact PaperMC support!",
mvWorld.getName());
}
}
WorldCreator worldCreator = WorldCreator.name(mvWorld.getName())
@@ -5,8 +5,9 @@ import java.util.List;
import java.util.Locale;
import java.util.Set;
import com.dumptruckman.minecraft.util.Logging;
import io.vavr.control.Option;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jvnet.hk2.annotations.Service;
@@ -95,7 +96,7 @@ public final class WorldNameChecker {
* @return True if check result is valid, else false.
*/
public boolean isValidWorldFolder(@Nullable String worldName) {
return checkFolder(worldName) == FolderStatus.VALID;
return checkFolder(worldName).loadable;
}
/**
@@ -105,7 +106,7 @@ public final class WorldNameChecker {
* @return True if check result is valid, else false.
*/
public boolean isValidWorldFolder(@Nullable File worldFolder) {
return checkFolder(worldFolder) == FolderStatus.VALID;
return checkFolder(worldFolder).loadable;
}
/**
@@ -119,8 +120,16 @@ public final class WorldNameChecker {
if (worldName == null) {
return FolderStatus.DOES_NOT_EXIST;
}
if (BukkitCompatibility.isUsingNewDimensionStorage()) {
File oldWorldFolder = Bukkit.getWorldContainer().toPath().resolve(worldName).toFile();
if (checkFolder(oldWorldFolder) == FolderStatus.VALID) {
return FolderStatus.REQUIRES_MIGRATION;
}
worldName = worldName.toLowerCase(Locale.ENGLISH); // namespace is case-insensitive and stored as lowercase
}
File worldFolder = BukkitCompatibility.getWorldFoldersDirectory().resolve(worldName).toFile();
Logging.finer("Checking valid folder for world '%s' at: '%s'", worldName, worldFolder.getPath());
return checkFolder(worldFolder);
}
@@ -230,16 +239,39 @@ public final class WorldNameChecker {
/**
* Folder is valid.
*/
VALID,
VALID(true),
/**
* This folder will cause PaperMC to migrate to new dimension world folder in 26.1+
*/
REQUIRES_MIGRATION(true),
/**
* Folder exist, but contents in it doesnt look like a world.
*/
NOT_A_WORLD,
NOT_A_WORLD(false),
/**
* Folder does not exist.
*/
DOES_NOT_EXIST
DOES_NOT_EXIST(false),
;
private final boolean loadable;
FolderStatus(boolean loadable) {
this.loadable = loadable;
}
/**
* Whether this folder status is loadable, meaning it has the basic world data and can be loaded as a world.
* Note that this does not guarantee the server will definitely load the world with no errors.
*
* @return True if folder probably is loadable by the server, else false.
*/
@ApiStatus.AvailableSince("5.6")
public boolean isLoadable() {
return loadable;
}
}
}
@@ -1,6 +1,6 @@
# configuration
mv-core.config.save.failed=保存 Multiverse-Core 的 config.yml 文件失败,所有操作都将是临时的!
mv-core.config.node.notfound=在配置文件中无法找到节点: {node}
mv-core.config.save.failed=保存 Multiverse-Core 的 config.yml 文件失败,所有修改都将是临时的!
mv-core.config.node.notfound=在配置文件中无法找到节点: {node}
# /mv check
mv-core.check.description=检查某位玩家是否可以将自己传送至某个地方。
@@ -8,7 +8,7 @@ mv-core.check.player.description=要检查的玩家。
mv-core.check.destination.description=目标的地址,例如某个世界的名字。
mv-core.check.haspermission=&a{player} 可以传送至 {destination}
mv-core.check.nopermission=&c{player} 不能传送至 {destination}
mv-core.check.location=目标的地址是: &f{location}
mv-core.check.location=目标的地址是: &f{location}
# /mv clone
mv-core.clone.description=复制一个世界。
@@ -19,7 +19,7 @@ mv-core.clone.success=&a已将世界复制到 '{world}'!
# /mv config
mv-core.config.description=查看或设置某个配置的值。
mv-core.config.name.description=需要查看或设置的配置。
mv-core.config.name.description=需要设置或查看的配置。
mv-core.config.value.description=需要设置的值。如果没有指定,将显示当前配置的值。
mv-core.config.show.success=&a配置 '&6{name}&a' 已被设置为 '&6{value}&a'。
mv-core.config.show.error=&c获取配置 '&6{name}&c' 的值失败。\n&c{error}
@@ -30,29 +30,29 @@ mv-core.config.set.error=&c将配置 '&6{name}&c' 设置为 '&6{value}&c' 失败
mv-core.confirm.description=在执行危险的指令前再一次进行确认。
# /mv coordinates
mv-core.coordinates.description=发送你的坐标信息
mv-core.coordinates.description=直接发送你的坐标
mv-core.coordinates.info.title=&b--- 位置信息 ---
mv-core.coordinates.info.world=&b世界: &f{world}
mv-core.coordinates.info.alias=&b别名: &f{alias}
mv-core.coordinates.info.worldScale=&b世界尺度: &f{scale}
mv-core.coordinates.info.coordinates=&b坐标: &f{coordinates}
mv-core.coordinates.info.direction=&b方向: &f{direction}
mv-core.coordinates.info.world=&b世界: &f{world}
mv-core.coordinates.info.alias=&b别名: &f{alias}
mv-core.coordinates.info.worldScale=&b世界比例: &f{scale}
mv-core.coordinates.info.coordinates=&b坐标: &f{coordinates}
mv-core.coordinates.info.direction=&b方向: &f{direction}
# /mv create
mv-core.create.description=创建一个新的世界并且加载。
mv-core.create.name.description=新世界的名称。
mv-core.create.environment.description=世界的环境。详见:/mv environments
mv-core.create.environment.description=世界的环境。详见: /mv environments
mv-core.create.flags.description=附加的世界设置。在 https://gg.gg/nn8bl 上查看所有可能的标志。
mv-core.create.properties=使用以下属性创建世界 {worldName} :
mv-core.create.properties.environment=- 环境: &f{environment}
mv-core.create.properties.seed=- 种子: &f{seed}
mv-core.create.properties.worldtype=- 世界类型: &f{worldType}
mv-core.create.properties.adjustspawn=- 调节出生点: &f{adjustSpawn}
mv-core.create.properties.biome=- 生物群系: &f{biome}
mv-core.create.properties.generator=- 生成器: &f{generator}
mv-core.create.properties.generatorsettings=- 生成器设置: &f{generatorSettings}
mv-core.create.properties.environment=- 环境: &f{environment}
mv-core.create.properties.seed=- 种子: &f{seed}
mv-core.create.properties.worldtype=- 世界类型: &f{worldType}
mv-core.create.properties.adjustspawn=- 调节出生点: &f{adjustSpawn}
mv-core.create.properties.biome=- 生物群系: &f{biome}
mv-core.create.properties.generator=- 生成器: &f{generator}
mv-core.create.properties.generatorsettings=- 生成器设置: &f{generatorSettings}
mv-core.create.properties.structures=- 结构: &f{structures}
mv-core.create.properties.structures=- 结构: &f{structures}
mv-core.create.loading=创建世界中……
mv-core.create.success=&a世界 '{world}' 已经创建!
@@ -65,14 +65,14 @@ mv-core.debug.change.syntax=等级
mv-core.debug.change.level.description=需要设置的调试等级。
# /mv delete
mv-core.delete.description=在服务器上永久删除某个世界。
mv-core.delete.description=在服务器上“永久”删除某个世界。
mv-core.delete.deleting=正在删除世界 '{world}'……
mv-core.delete.prompt=你确定想要删除世界 '{world}' 吗?
mv-core.delete.success=&a世界 '{world}' 已经删除!
# /mv dumps
mv-core.dumps.description=导出版本信息到控制台或者粘贴服务。
mv-core.dumps.url.list={service}:{link}
mv-core.dumps.url.list={service}:{link}
# /mv gamerule set
mv-core.gamerule.set.description=修改某个世界或某些世界的游戏规则。
@@ -105,24 +105,24 @@ mv-core.generators.empty=&c未找到生成器插件。
# /mv import
mv-core.import.description=导入一个已经存在的世界文件夹。
mv-core.import.name.description=世界文件夹的名称。
mv-core.import.env.description=世界的环境。详见:/mv env
mv-core.import.other.description=其他世界设置。详见:https://gg.gg/nn8c2
mv-core.import.env.description=世界的环境。详见: /mv env
mv-core.import.other.description=其他世界设置。详见: https://gg.gg/nn8c2
mv-core.import.importing=开始导入世界 '{world}'……
mv-core.import.success=&a已导入世界 '{world}'!
# /mv info
mv-core.info.description=显示某个世界所有已配置的属性。
mv-core.info.description.world=需要显示信息的世界。
mv-core.info.header=&a&l---- 世界信息: &f&l{world}&a&l ----
mv-core.info.header=&a&l---- 世界信息: &f&l{world}&a&l ----
mv-core.info.nocontent=&c没有找到这样的世界属性!
# /mv list
mv-core.list.description=显示所有可进入世界的列表。
mv-core.list.description=显示你所有可进入世界的列表。
mv-core.list.header=&6====[ 多世界列表 ]====
mv-core.list.nocontent=&c未找到任何世界,或者你没有权限进入它们!
# /mv load
mv-core.load.description=加载某个世界,世界必须已经在 worlds.yml,或者请使用 /mv import 导入。
mv-core.load.description=加载某个世界。世界必须已经在 worlds.yml 中,或者请使用 /mv import 导入。
mv-core.load.world.description=想要加载的世界名称。
mv-core.load.loading=加载世界 '{world}' 中……
mv-core.load.success=&a已加载世界 '{world}'!
@@ -132,6 +132,7 @@ mv-core.modify.description=修改某个给定世界的属性。
mv-core.modify.world.description=需要修改的世界的名称。
mv-core.modify.property.description=需要修改的属性。
mv-core.modify.value.description=需要修改属性的值。
mv-core.modify.propertyremoved=&c你不能修改 '&3{property}&c',因为它已经改变或被移除。请使用 '&a{replacement}&c'。
mv-core.modify.cannothavevalue=你不能指定一个值来 {action} '{property}'。
mv-core.modify.specifyvalue=你必须指定一个值来 {action} '{property}'。
mv-core.modify.success=&a成功在世界 &9{world}&a 中 {action} '&9{property}&a' 为 '&9{value}&a' 。
@@ -139,12 +140,12 @@ mv-core.modify.failure=&c在世界 &9{world}&c 中 {action} '&9{property}&c' 为
mv-core.modify.failure.novalue=&c在世界 &9{world}&c 中 {action} '&9{property}&c' 失败。\n&c{error}
# /mv regen
mv-core.regen.description=在你的服务器上重新生成一个世界。之前的状态将会被永久丢弃。
mv-core.regen.description=在你的服务器上重新生成一个世界。之前的状态将会“永久”丢失。
mv-core.regen.world.description=你想要重新生成的世界。
mv-core.regen.other.description=其他的世界设置。详见:http://gg.gg/nn8lk
mv-core.regen.other.description=其他的世界设置。详见: http://gg.gg/nn8lk
mv-core.regen.regenerating=重新生成世界 '{world}'……
mv-core.regen.prompt=你确定想要重新生成世界 '{world}' 吗?
mv-core.regen.success=&a已重新生成 世界 '{world}'!
mv-core.regen.success=&a已重新生成世界 '{world}'!
# /mv reload
mv-core.reload.description=重新加载所有 Multiverse 模块的配置文件。
@@ -153,7 +154,7 @@ mv-core.reload.success=&a重新加载完成!
# /mv remove
mv-core.remove.description=从 Multiverse 中卸载某个世界并从 worlds.yml 中移除。这不会删除世界的文件夹。
mv-core.remove.world.description=你想要从MV认知中移除的世界。
mv-core.remove.world.description=你想要从 Multiverse 认知中移除的世界。
mv-core.remove.success=&a已移除世界 '{world}'!
# /mv
@@ -164,10 +165,10 @@ mv-core.root.help=&a查看 &f/mv help&a 了解可以执行的指令。
mv-core.setspawn.description=为某个特定的世界设置出生点。
mv-core.setspawn.location.description=新出生点的位置。
mv-core.setspawn.world.description=需要设置出生点的目标世界(默认为玩家的当前世界)
mv-core.setspawn.unsafe=&c新的生成位置不安全!如果这是有意为之,你可以通过使用&6--unsafe&c标志来禁用安全检查。
mv-core.setspawn.success=&a成功在&6{world}&a中将生成点设置为&6{location}&a!
mv-core.setspawn.failed=&c在&6{world}&c中将生成点设置为&6{location}&c时失败。{error}
mv-core.setspawn.notmvworld=&c无法为&c{world}设置生成点,因为它不是一个Multiverse世界。
mv-core.setspawn.unsafe=&c新出生点不安全!如果是有意为之,你可以通过使用 &6--unsafe&c 标志来禁用安全检查。
mv-core.setspawn.success=&a成功在 &6{world}&a 中将出生点设置为 &6{location}&a!
mv-core.setspawn.failed=&c在 &6{world}&c 中将出生点设置为 &6{location}&c 时失败。{error}
mv-core.setspawn.notmvworld=&c无法为 &c{world} 设置出生点,因为它不是一个 Multiverse 世界。
# /mv spawn
mv-core.spawn.description=传送某个特定的玩家到他们所在世界的出生点。
@@ -184,7 +185,7 @@ mv-core.teleport.success=已传送 {player} 到 {destination}。
mv-core.teleport.failed=传送 {player} 到 {destination}失败。{reason}
# /mv unload
mv-core.unload.description=从 Multiverse 中卸载某个世界。这不会移除世界的文件夹。这不会将它从配置文件中移除。
mv-core.unload.description=从 Multiverse 中卸载某个世界。这“不会”移除世界的文件夹。这“不会”将它从配置文件中移除。
mv-core.unload.world.description=你想要卸载的世界名称。
mv-core.unload.unloading=正在卸载世界 '{world}'……
mv-core.unload.success=&a已卸载 '{world}'!
@@ -196,7 +197,7 @@ mv-core.usage.description=显示 Multiverse-Core 指令的用法。
mv-core.version.description=显示版本和作者。
mv-core.version.mv=Multiverse Core 版本 &fv{version}
mv-core.version.authors=Multiverse Core 作者 &f{authors}
mv-core.version.secretcode=特征码: &fFRN002
mv-core.version.secretcode=特征码: &fFRN002
# /mv who
# /mv whoall
@@ -205,7 +206,7 @@ mv-core.who.all.description=列出所有世界的玩家
mv-core.who.world.description=需要列出玩家的世界名称
mv-core.who.flags.description=筛选 - 仅显示匹配的条目。页码 - 查看的页面序号。
mv-core.who.empty=&7&o空
mv-core.who.header=&b====[ 多世界玩家列表 ]====
mv-core.who.header=&b====[ Multiverse世界玩家列表 ]====
# /mv worldborder
mv-core.worldborder.center.nothingchanged=&c无变化。世界边界的中心在世界 '&6{world}&c' 中已经有相同的设置。
@@ -214,8 +215,8 @@ mv-core.worldborder.center.success=&r已设置世界 '&6{world}&r' 边界的中
mv-core.worldborder.damageamount.nothingchanged=&c无变化。世界边界的伤害在世界 '&6{world}&c' 中已经有相同的设置。
mv-core.worldborder.damageamount.success=&r已设置世界 '&6{world}&r' 的边界伤害为每秒每格 {amount} 点伤害。
mv-core.worldborder.damagebuffer.nothingchanged=&c无变化。世界边界伤害的缓冲在世界 '&6{world}&c' 中已经有相同的设置。
mv-core.worldborder.damagebuffer.success=&r已设置世界 '&6{world}&r' 边界伤害的缓冲为 {distance} 格。
mv-core.worldborder.damagebuffer.nothingchanged=&c无变化。世界边界伤害的缓冲区在世界 '&6{world}&c' 中已经有相同的设置。
mv-core.worldborder.damagebuffer.success=&r已设置世界 '&6{world}&r' 边界伤害的缓冲区为 {distance} 格。
mv-core.worldborder.get.size=&r世界 '&6{world}&r' 的边界宽度目前为 {size} 格。
@@ -232,7 +233,7 @@ mv-core.worldborder.warningtime.success=&r已设置世界 '&6{world}&r' 的边
# commands error
mv-core.commands.error.playersonly=&c该指令仅玩家可以使用。
mv-core.commands.error.multiverseworldonly=&c该指令仅可以在多世界中使用。
mv-core.commands.error.multiverseworldonly=&c该指令仅可以在Multiverse世界中使用。
# entry check
mv-core.entrycheck.blacklisted='{world}' 在黑名单中。
@@ -242,29 +243,29 @@ mv-core.entrycheck.exceedplayerlimit=该世界已经达到最大玩家数量限
mv-core.entrycheck.noworldaccess=你没有权限进入该世界。
# economy
mv-core.economy.item.deposit=&a{price}&f已存入你的背包。
mv-core.economy.item.withdraw=&f你已被收取&a{price}。
mv-core.economy.vault.deposit=&2{price}&f已存入你的账户。
mv-core.economy.vault.withdraw=&f你已被收取&2{price}。
mv-core.economy.item.deposit=&a{price}&f 已存入你的背包。
mv-core.economy.item.withdraw=&f你已被收取 &a{price}。
mv-core.economy.vault.deposit=&2{price}&f 已存入你的账户。
mv-core.economy.vault.withdraw=&f你已被收取 &2{price}。
# multiverse parse destination failure reason
mv-core.destination.anchor.failurereason.anchornotfound=&c锚点 '&6{anchor}&c' 不存在!
mv-core.destination.bed.failurereason.playernotfound=&玩家 '&6{player}&c' 不存在或不在线!如果想传送到自己的床,使用 'playerbed'。
mv-core.destination.cannon.failurereason.invalidformat=&c大炮目标格式是:&6ca:worldname:x,y,z:pitch:yaw:speed
mv-core.destination.exact.failurereason.invalidformat=&c精确目标格式是:&6e:worldname:x,y,z:pitch:yaw
mv-core.destination.cannon.failurereason.invalidformat=&c大炮目标格式是: &6ca:worldname:x,y,z:pitch:yaw:speed
mv-core.destination.exact.failurereason.invalidformat=&c精确目标格式是: &6e:worldname:x,y,z:pitch:yaw
mv-core.destination.player.failurereason.playernotfound=&c玩家 '&6{player}&c' 不存在或不在线!
mv-core.destination.shared.failurereason.invalidcoordinatesformat=你必须指定一个具有以下格式有效的坐标:&6{x},{y},{z}
mv-core.destination.shared.failurereason.invalidnumberformat=给定的值不是一个有效的数字。{error}。
mv-core.destination.shared.failurereason.invalidcoordinatesformat=你必须指定一个具有以下格式有效的坐标: &6{x},{y},{z}
mv-core.destination.shared.failurereason.invalidnumberformat=无效的目标输入。{error}。
mv-core.destination.shared.failurereason.worldnotfound=&c世界 '&6{world}&c' 不存在或着未被加载!
mv-core.destination.parse.failurereason.invaliddestinationid=无效的目标ID:{id}。有效的目标ID有:{ids}
mv-core.destination.parse.failurereason.invaliddestinationid=无效的目标ID: {id}。有效的目标ID有: {ids}
# teleport failure reason
mv-core.teleportfailurereason.null.destination=目标无效!
mv-core.teleportfailurereason.null.location=位置无效!
mv-core.teleportfailurereason.null.world=&c位置所在的世界无效!
mv-core.teleportfailurereason.unsafe.location=位置是不安全的!使用 `--unsafe` 忽视该问题。
mv-core.teleportfailurereason.teleport.failed=出于某些拒绝了该传送。
mv-core.teleportfailurereason.teleport.failed.exception=在传送过程中出现了一个错误。查看控制台获取更多信息。
mv-core.teleportfailurereason.null.world=&c目标世界没有加载或者不存在!
mv-core.teleportfailurereason.unsafe.location=位置被认为是不安全的!如果是有意为之,使用 `--unsafe` 强制执行。
mv-core.teleportfailurereason.teleport.failed=传送被拒绝。请确保其他插件没有阻止传送,并查看服务器的日志获得错误信息。
mv-core.teleportfailurereason.teleport.failed.exception=在传送过程中出现了一个错误。查看服务器日志获取更多信息。
mv-core.teleportfailurereason.event.cancelled=传送被另一个插件取消了。
# world manager result
@@ -272,7 +273,8 @@ mv-core.cloneworld.invalidworldname=世界 '{world}' 包含无效的字符!
mv-core.cloneworld.worldexistfolder=世界 '{world}' 已经存在于服务器的文件中!在复制前你需要先删除它。
mv-core.cloneworld.worldexistunloaded=世界 '{world}' 已经存在并且未被加载!在复制前你需要先删除它。
mv-core.cloneworld.worldexistloaded=世界 '{world}' 已经存在!在复制前你需要先删除它。
mv-core.cloneworld.copyfailed=复制世界到 '{world}' 失败:{error}\n&f查看控制台获取更多信息。
mv-core.cloneworld.fromworldfolderinvalid=源世界 '{world}' 文件夹的内容似乎不是一个有效的世界!请确保它包含正确的世界数据和区域文件夹结构。
mv-core.cloneworld.copyfailed=复制世界到 '{world}' 失败: {error}\n&f查看控制台获取更多信息。
mv-core.createworld.invalidworldname=世界 '{world}' 包含无效的字符!
mv-core.createworld.worldexistfolder=世界 '{world}' 已经存在于服务器的文件中!&f 如果你想要导入它,输入 '&a/mv import {world} <environment>&f'。
@@ -280,35 +282,37 @@ mv-core.createworld.worldexistunloaded=世界 '{world}' 已经存在, 但是未
mv-core.createworld.worldexistloaded=世界 '{world}' 已经存在!
mv-core.deleteworld.worldnonexistent=世界 '{world}' 不存在!
mv-core.deleteworld.loadfailed=不能加载世界 '{world}',请确认世界文件夹是否存在。&f 你可以执行 '&a/mv remove {world}&f' 将它从 Multiverse 中移除,或者使用 '&a/mv load {world}&f' 尝试重新加载。
mv-core.deleteworld.worldfoldernotfound=世界 '{world}' folder not found!
mv-core.deleteworld.failedtodeletefolder=删除世界 '{world}' 的文件夹失败:{error}\n&f查看控制台获取更多信息。
mv-core.deleteworld.loadfailed=不能加载世界 '{world}',请确认世界文件夹是否被删除或者损坏。&f 你可以执行 '&a/mv remove {world}&f' 将它从 Multiverse 中移除,或者使用 '&a/mv load {world}&f' 尝试重新加载。
mv-core.deleteworld.worldfoldernotfound=&c无法定位 '{world}' 文件夹!&f 你可以执行 '&a/mv remove {world}&c' 将它从 Multiverse 中移除,如果存在,也可以手动删除文件夹。
mv-core.deleteworld.failedtodeletefolder=删除世界 '{world}' 的文件夹失败: {error}\n&f查看控制台获取更多信息。
mv-core.importworld.invalidworldname=世界 '{world}' 包含无效的字符!
mv-core.importworld.worldexistunloaded=世界 '{world}' 已经存在, 但是未被加载!&f 如果你想要加载它,输入 '&a/mv load {world}&f'。
mv-core.importworld.worldexistloaded=世界 '{world}' 已经存在!
mv-core.importworld.worldfolderinvalid=世界 '{world}' 文件夹的内容看上去不像是一个有效的世界!
mv-core.importworld.worldfolderinvalid=世界 '{world}' 文件夹的内容似乎不是一个有效的世界!请确保它包含正确的世界数据和区域文件夹结构。\n&c如果服务器软件对世界文件夹的处理方式不同,或者你确信世界是有效的,使用 '&3--skip-folder-check&c' 标志。
mv-core.importworld.bukkitenvironmentmismatch=环境不匹配!&f 世界 '{world}' 已经用环境 '{bukkitEnvironment}' 加载,但 Multiverse 正在尝试用环境 '{mvEnvironment}' 导入它。
mv-core.loadworld.worldalreadyloading=世界 '{world}' 已经正在加载!请稍后……
mv-core.loadworld.worldnonexistent=世界 '{world}' 不存在!使用 '&a/mv create {world} <environment>&f' 来创建。
mv-core.loadworld.worldexistfolder=世界 '{world}' 已经存在于服务器的文件中, 但是未被 Multiverse 识别!&f 如果你想要导入它,输入 '&a/mv import {world} <environment>&f'。
mv-core.loadworld.worldexistloaded=世界 '{world}' 已经存在!
mv-core.loadworld.worldexistloaded=世界 '{world}' 已经加载!
mv-core.loadworld.bukkitenvironmentmismatch=环境不匹配!&f 世界 '{world}' 已经用环境 '{bukkitEnvironment}' 加载,但 Multiverse 正在尝试用环境 '{mvEnvironment}' 加载它。
mv-core.removeworld.worldnonexistent=世界 '{world}' 不存在!
mv-core.unloadworld.worldalreadyunloading=世界 '{world}' 已经在卸载! 请稍后……
mv-core.unloadworld.worldnonexistent=世界 '{world}' 不存在!
mv-core.unloadworld.worldunloaded=世界 '{world}' 已经卸载!
mv-core.unloadworld.bukkitunloadfailed=Bukkit 卸载世界 '{world}' 失败:{error}
mv-core.unloadworld.bukkitunloadfailed=Bukkit 卸载世界 '{world}' 失败: {error}
mv-core.worldcreator.invalidbiomeprovider=&c无效的生物群系 '&6{biome}&c'!{error}\n&c查看控制台获取更多信息。
mv-core.worldcreator.invalidchunkgenerator=&c无效的区块生成器 '&6{generator}&c'! {error}\n&c这更像是生成器插件的问题,而不是 Multiverse。查看控制台获取更多信息。
mv-core.worldcreator.bukkitcreationfailed=&cBukkit 创建世界 '{world}' 失败:{error}\n&c查看控制台获取更多信息。
mv-core.worldcreator.bukkitcreationfailed=&cBukkit 创建世界 '{world}' 失败: {error}\n&c查看控制台获取更多信息。
# queue command result
mv-core.queuecommand.nocommandinqueue=&c你没有任何指令在列队中。
mv-core.queuecommand.invalidotp=&c无效的 OTP 数字 '&6{otp}&c'。请重试……
mv-core.queuecommand.commandexecutionerror=&c在处理列队中命令时发生了错误:{error}\n&f查看控制台获取更多信息。
mv-core.queuecommand.commandexecutionerror=&c在处理列队中命令时发生了错误: {error}\n&f查看控制台获取更多信息。
# content display messages
mv-core.contentdisplay.nocontent=&c没有可显示的内容
@@ -322,7 +326,12 @@ mv-core.contentdisplay.null=&7&o错误
mv-core.exception.multiverseworld.createnull=创建的世界返回为null!
mv-core.exception.multiverseworld.unloaddefaultworld=&c你不能卸载默认的世界!世界 &6{world}&c 是定义在 server.properties '&6level-name&c' 中的默认世界。
mv-core.exception.multiverseworld.unloadplayersinworld=&c目前仍然有 &6{count}&c 位玩家在世界中!在命令中使用 '&6--remove-players&c' 标签将所有的玩家从世界中移除。
mv-core.exception.multiverseworld.unloaderror=&c在卸载世界 &6{world}&c 过程中出现了一个位置的错误。\n&c查看控制台获取更多信息。
mv-core.exception.multiverseworld.unloaderror=&c在卸载世界 &6{world}&c 过程中出现了一个未知的错误。\n&c查看控制台获取更多信息。
# multiverse position parse exception
mv-core.exception.positionparse.invaliddirection=&c无效的方向字符串格式: {format}。预期的格式: <pitch>:<yaw>
mv-core.exception.positionparse.invalidcoordinates=&c无效的坐标格式: {format}。预期的格式: <x>,<y>,<z>
mv-core.exception.positionparse.invalidnumber=&c无效的数字格式: {number}。预期为一个数字值。
# generic
mv-core.generic.success=成功!