Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f8bf11660
|
||
|
|
f8dcf33fcb
|
||
|
|
116976d8e8 | ||
|
|
800a4fa743 | ||
|
|
3124d52e3b | ||
|
|
b973781649 | ||
|
|
107bb79474 | ||
|
|
f35cb20714 | ||
|
|
aab04df0b6 | ||
|
|
eda3874ba7 | ||
|
|
609fea09f6 | ||
|
|
d3956d688b | ||
|
|
e46c1c3abe | ||
|
|
ca668d2434 | ||
|
|
af621921e9 | ||
|
|
9f165e647d | ||
|
|
4cff7a4711 | ||
|
|
a60f083e08 | ||
|
|
74f6ab4866 | ||
|
|
ea68abc3cc | ||
|
|
73813786c0 | ||
|
|
7b5594c196 | ||
|
|
87a13cf729 | ||
|
|
324f042f77 | ||
|
|
83a9e8b8c3 | ||
|
|
2a58fdaf80 | ||
|
|
62c437dcc8 | ||
|
|
a2e8736c14 | ||
|
|
b93468e9f6 | ||
|
|
9947f37a26 | ||
|
|
ce93af7c81 | ||
|
|
f132397ae6 | ||
|
|
c15c600b45 | ||
|
|
f59d7c4759 | ||
|
|
76b678aec4 | ||
|
|
e51f093ce8 | ||
|
|
10f1478474 | ||
|
|
29c92a8dc8 | ||
|
|
9e447d4a2a | ||
|
|
1726479648 | ||
|
|
117c03fb46 | ||
|
|
4d562aa62c | ||
|
|
e398cc2d8e | ||
|
|
e6137925f3 | ||
|
|
f08fb59aa3 | ||
|
|
f9429cd717 | ||
|
|
fc7e1b0bae | ||
|
|
c833f27a92 | ||
|
|
5975a9f5f3 | ||
|
|
0f65dbc19b | ||
|
|
646043cdf0 | ||
|
|
caef3640d1 | ||
|
|
fe130e8b8e | ||
|
|
586a14e409 | ||
|
|
213c5ce763 | ||
|
|
cadf998c32 | ||
|
|
886be957cd | ||
|
|
580f0072e3 | ||
|
|
5079beb68e | ||
|
|
f609ab4a34 | ||
|
|
ee02cec5ac | ||
|
|
e2d8f7b89b | ||
|
|
f12a5a9258 | ||
|
|
709f2a5376 | ||
|
|
329937a7f7 | ||
|
|
61ca4e7bbf | ||
|
|
6edaeaa0b0 | ||
|
|
176928cff2 | ||
|
|
1cdd07b2d5 | ||
|
|
ebd263954a | ||
|
|
b487702986 | ||
|
|
3597ec3465 | ||
|
|
33b6080ccd | ||
|
|
bfb30e58cc | ||
|
|
4a329e8029 | ||
|
|
f435293368 | ||
|
|
3666d58e88 | ||
|
|
38e99a8703 | ||
|
|
2ff6a5dddf | ||
|
|
b1d088bef6 | ||
|
|
c5f15db2b8 | ||
|
|
98baadfe32 | ||
|
|
d4c0af18aa | ||
|
|
6df5aa1e1e | ||
|
|
410ddd106f | ||
|
|
5d83912c3b | ||
|
|
953196facb | ||
|
|
9474b9144c | ||
|
|
b347572f84 | ||
|
|
2a3f089861 | ||
|
|
f8b7d0fba5 | ||
|
|
96bb1ea7e2 | ||
|
|
9ee34d3983 | ||
|
|
dbc51fbedf | ||
|
|
0f914e461f | ||
|
|
66179d4a45 | ||
|
|
75640077b4 | ||
|
|
b7cbd6775b | ||
|
|
f912195a26 | ||
|
|
02923bee53 | ||
|
|
bda5898a35 | ||
|
|
5eecf8b671 | ||
|
|
e2b76451ab | ||
|
|
51c2dae5f9 | ||
|
|
c17ad230ca | ||
|
|
b4d2748f94 | ||
|
|
6922cd49f5 | ||
|
|
469dd57931 | ||
|
|
447c3daca0 | ||
|
|
cdd1d92fcb | ||
|
|
2776307e51 | ||
|
|
c25ea97301 | ||
|
|
eeaf3cccac | ||
|
|
0e0d5395b2 | ||
|
|
4e70b40e26 | ||
|
|
0cc7d22190 | ||
|
|
8473fee636 | ||
|
|
47a228f14a | ||
|
|
304b29b762 | ||
|
|
a6ac1dc4f7 | ||
|
|
b86fb33cbb | ||
|
|
c727a8b9f6 | ||
|
|
9a6ddb3b00 | ||
|
|
57fbe2c3eb | ||
|
|
1ac89047f5 | ||
|
|
18c3a53db5 | ||
|
|
21a9bd35cc | ||
|
|
423daa0e84 | ||
|
|
4dac670207 | ||
|
|
7c28e1b17c | ||
|
|
142af0c2c8 | ||
|
|
c356a9e008 | ||
|
|
9ba9e407b0 | ||
|
|
7464d503e6 | ||
|
|
e076408af9 | ||
|
|
00478faa4e | ||
|
|
0983ca3a8e | ||
|
|
8f49d24569 | ||
|
|
0d17535530 | ||
|
|
a605fa9e1a | ||
|
|
6a010c5c57 | ||
|
|
062a556a70 | ||
|
|
c0c03a16a1 | ||
|
|
d813a08b62 | ||
|
|
8783e099b1 | ||
|
|
f7669ca67f | ||
|
|
3dce0ff86f | ||
|
|
cd4ee39655 | ||
|
|
309d3e185f | ||
|
|
20c749ed61 | ||
|
|
d85e81c936 | ||
|
|
064a0bbb25 | ||
|
|
8b643a9f2d | ||
|
|
a18d68b919 | ||
|
|
d77595ce07 | ||
|
|
95825514b8 | ||
|
|
2811dd732b |
No files matched your search
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="output" path="bin/default"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17/"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1 @@
|
||||
.gitea/CODEOWNERS linguist-detectable=false
|
||||
@@ -0,0 +1,3 @@
|
||||
# Pull requests request review from the eligible staff team(s).
|
||||
# One approval from either an Admin or Developer satisfies branch protection.
|
||||
* @trueog/Admins @trueog/Developers
|
||||
+15
-15
@@ -6,42 +6,42 @@ jobs:
|
||||
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: gradle/wrapper-validation-action@v1
|
||||
- name: Gradle wrapper validation
|
||||
uses: gradle/wrapper-validation-action@v2
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-gradle-
|
||||
cache: 'gradle'
|
||||
- name: Build
|
||||
run: ./gradlew build
|
||||
- name: Upload Bukkit
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Bukkit
|
||||
path: "bukkit/build/libs/Chunky-*.jar"
|
||||
- name: Upload Fabric
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Fabric
|
||||
path: "fabric/build/libs/Chunky-*.jar"
|
||||
- name: Upload Forge
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Forge
|
||||
path: "forge/build/libs/Chunky-*.jar"
|
||||
- name: Upload NeoForge
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NeoForge
|
||||
path: "neoforge/build/libs/Chunky-*.jar"
|
||||
- name: Upload Sponge
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Sponge
|
||||
path: "sponge/build/libs/Chunky-*.jar"
|
||||
@@ -0,0 +1,39 @@
|
||||
name: Deploy Javadoc to Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["javadoc"]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow one concurrent deployment
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# Single deploy job since we're just deploying
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v2
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
path: './docs/'
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v1
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Chunky</name>
|
||||
<comment>Pre-generates chunks, quickly, efficiently, and safely</comment>
|
||||
<projects/>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments/>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<linkedResources/>
|
||||
<filteredResources/>
|
||||
</projectDescription>
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||

|
||||
|
||||
Minecraft chunk pre-generator, supporting a wide variety of server implementations including Spigot, Paper, Fabric, Forge, and Sponge.
|
||||
Minecraft chunk pre-generator, supporting a wide variety of server implementations including Spigot, Paper, Fabric, Forge, NeoForge, and Sponge.
|
||||
|
||||
Pre-generate chunks, quickly, efficiently, and safely!
|
||||
|
||||
|
||||
+48
-34
@@ -1,26 +1,21 @@
|
||||
import java.io.ByteArrayOutputStream
|
||||
|
||||
buildscript {
|
||||
configurations.all {
|
||||
resolutionStrategy {
|
||||
force("org.ow2.asm:asm:9.3")
|
||||
force("org.ow2.asm:asm-commons:9.3")
|
||||
}
|
||||
}
|
||||
}
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.gradle.api.tasks.Sync
|
||||
import org.gradle.api.tasks.bundling.Jar
|
||||
|
||||
plugins {
|
||||
eclipse
|
||||
id("java-library")
|
||||
id("maven-publish")
|
||||
id("com.github.johnrengelman.shadow") version "7.1.2"
|
||||
id("com.gradleup.shadow") version "8.3.9" apply false
|
||||
}
|
||||
|
||||
subprojects {
|
||||
plugins.apply("java-library")
|
||||
plugins.apply("maven-publish")
|
||||
plugins.apply("com.github.johnrengelman.shadow")
|
||||
plugins.apply("com.gradleup.shadow")
|
||||
|
||||
group = "${project.property("group")}"
|
||||
group = project.property("group") as String
|
||||
version = "${project.property("version")}.${commitsSinceLastTag()}"
|
||||
|
||||
repositories {
|
||||
@@ -29,60 +24,79 @@ subprojects {
|
||||
}
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
tasks {
|
||||
withType<JavaCompile> {
|
||||
options.encoding = "UTF-8"
|
||||
options.release = 17
|
||||
options.compilerArgs.add("-Xlint:none")
|
||||
}
|
||||
jar {
|
||||
|
||||
withType<AbstractArchiveTask> {
|
||||
isPreserveFileTimestamps = false
|
||||
isReproducibleFileOrder = true
|
||||
}
|
||||
|
||||
named<Jar>("jar") {
|
||||
archiveClassifier.set("noshade")
|
||||
}
|
||||
shadowJar {
|
||||
|
||||
named<ShadowJar>("shadowJar") {
|
||||
archiveClassifier.set("")
|
||||
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
||||
archiveFileName.set("${project.property("artifactName")}-${project.version}.jar")
|
||||
isEnableRelocation = true
|
||||
relocationPrefix = "${project.group}.${rootProject.name.lowercase()}.shadow"
|
||||
}
|
||||
build {
|
||||
dependsOn(shadowJar)
|
||||
|
||||
named("build") {
|
||||
dependsOn("shadowJar")
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
if (project.hasProperty("mavenUsername") && project.hasProperty("mavenPassword")) {
|
||||
if (hasProperty("mavenUsername") && hasProperty("mavenPassword")) {
|
||||
maven {
|
||||
credentials {
|
||||
username = "${project.property("mavenUsername")}"
|
||||
password = "${project.property("mavenPassword")}"
|
||||
username = project.property("mavenUsername") as String
|
||||
password = project.property("mavenPassword") as String
|
||||
}
|
||||
url = uri("https://repo.codemc.io/repository/maven-releases/")
|
||||
}
|
||||
}
|
||||
}
|
||||
publications {
|
||||
create<MavenPublication>("maven") {
|
||||
groupId = "${project.group}"
|
||||
artifactId = project.name
|
||||
version = "${project.version}"
|
||||
from(components["java"])
|
||||
}
|
||||
publications.create<MavenPublication>("maven") {
|
||||
groupId = project.group.toString()
|
||||
artifactId = project.name
|
||||
version = project.version.toString()
|
||||
from(components["java"])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named<Jar>("jar") {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
val pluginArtifact by tasks.registering(Sync::class) {
|
||||
dependsOn(":Chunky-bukkit:shadowJar")
|
||||
from(project(":Chunky-bukkit").tasks.named("shadowJar"))
|
||||
into(layout.buildDirectory.dir("libs"))
|
||||
}
|
||||
|
||||
tasks.named("build") {
|
||||
dependsOn(pluginArtifact)
|
||||
}
|
||||
|
||||
fun commitsSinceLastTag(): String {
|
||||
val tagDescription = ByteArrayOutputStream()
|
||||
exec {
|
||||
commandLine("git", "describe", "--tags")
|
||||
standardOutput = tagDescription
|
||||
}
|
||||
if (tagDescription.toString().indexOf('-') < 0) {
|
||||
return "0"
|
||||
}
|
||||
return tagDescription.toString().split('-')[1]
|
||||
val desc = tagDescription.toString().trim()
|
||||
return if ('-' !in desc) "0" else desc.split('-')[1]
|
||||
}
|
||||
+19
-10
@@ -1,24 +1,30 @@
|
||||
plugins {
|
||||
id("com.gradleup.shadow")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.purpurmc.org/snapshots")
|
||||
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/")
|
||||
maven("https://papermc.io/repo/repository/maven-public")
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
maven("https://jitpack.io")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(group = "org.spigotmc", name = "spigot-api", version = "1.18.2-R0.1-SNAPSHOT")
|
||||
compileOnly(group = "com.github.Brettflan", name = "WorldBorder", version = "44f388f3ba") {
|
||||
compileOnly(group = "org.purpurmc.purpur", name = "purpur-api", version = "1.19.4-R0.1-SNAPSHOT")
|
||||
compileOnly(group = "com.github.Puremin0rez", name = "WorldBorder", version = "1.19") {
|
||||
isTransitive = false
|
||||
}
|
||||
implementation(group = "io.papermc", name = "paperlib", version = "1.0.8-SNAPSHOT")
|
||||
implementation(group = "org.bstats", name = "bstats-bukkit", version = "3.0.0")
|
||||
implementation(project(":chunky-common"))
|
||||
implementation(group = "org.bstats", name = "bstats-bukkit", version = "3.0.2")
|
||||
implementation(project(":Chunky-common"))
|
||||
implementation(project(":Chunky-paper"))
|
||||
implementation(project(":Chunky-folia"))
|
||||
}
|
||||
|
||||
tasks {
|
||||
processResources {
|
||||
filesMatching("plugin.yml") {
|
||||
expand(
|
||||
"name" to rootProject.name.capitalize(),
|
||||
"name" to project.property("artifactName"),
|
||||
"version" to project.version,
|
||||
"group" to project.group,
|
||||
"author" to project.property("author"),
|
||||
@@ -27,10 +33,13 @@ tasks {
|
||||
}
|
||||
}
|
||||
shadowJar {
|
||||
archiveClassifier.set("")
|
||||
isEnableRelocation = false
|
||||
minimize {
|
||||
exclude(project(":chunky-common"))
|
||||
exclude(project(":Chunky-common"))
|
||||
exclude(project(":Chunky-paper"))
|
||||
exclude(project(":Chunky-folia"))
|
||||
}
|
||||
relocate("io.papermc.lib", "${project.group}.${rootProject.name}.lib.paperlib")
|
||||
relocate("org.bstats", "${project.group}.${rootProject.name}.lib.bstats")
|
||||
relocate("org.bstats", "${project.group}.${rootProject.name.lowercase()}.lib.bstats")
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.popcraft.chunky;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bstats.charts.SimplePie;
|
||||
import org.bukkit.Bukkit;
|
||||
@@ -12,23 +11,26 @@ import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.world.WorldInitEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.popcraft.chunky.api.ChunkyAPI;
|
||||
import org.popcraft.chunky.command.ChunkyCommand;
|
||||
import org.popcraft.chunky.command.CommandArguments;
|
||||
import org.popcraft.chunky.command.CommandLiteral;
|
||||
import org.popcraft.chunky.integration.WorldBorderIntegration;
|
||||
import org.popcraft.chunky.platform.BukkitConfig;
|
||||
import org.popcraft.chunky.platform.BukkitPlayer;
|
||||
import org.popcraft.chunky.platform.BukkitSender;
|
||||
import org.popcraft.chunky.platform.BukkitServer;
|
||||
import org.popcraft.chunky.platform.Folia;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
import org.popcraft.chunky.util.Version;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
@@ -40,18 +42,22 @@ public final class ChunkyBukkit extends JavaPlugin implements Listener {
|
||||
public void onEnable() {
|
||||
this.chunky = new Chunky(new BukkitServer(this), new BukkitConfig(this));
|
||||
final Version currentVersion = new Version(Bukkit.getBukkitVersion(), true);
|
||||
if (Version.MINECRAFT_1_13_2.isEqualTo(currentVersion) && !PaperLib.isPaper()) {
|
||||
getLogger().severe(() -> translate(TranslationKey.ERROR_VERSION_SPIGOT));
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
} else if (currentVersion.isValid() && Version.MINECRAFT_1_13_2.isHigherThan(currentVersion)) {
|
||||
if (currentVersion.isValid() && Version.MINECRAFT_1_13_2.isHigherThan(currentVersion)) {
|
||||
getLogger().severe(() -> translate(TranslationKey.ERROR_VERSION));
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
}
|
||||
if (!isEnabled()) {
|
||||
return;
|
||||
}
|
||||
getServer().getServicesManager().register(Chunky.class, chunky, this, ServicePriority.Normal);
|
||||
getServer().getServicesManager().register(ChunkyAPI.class, chunky.getApi(), this, ServicePriority.Normal);
|
||||
if (chunky.getConfig().getContinueOnRestart()) {
|
||||
getServer().getScheduler().scheduleSyncDelayedTask(this, () -> chunky.getCommands().get(CommandLiteral.CONTINUE).execute(chunky.getServer().getConsole(), new String[]{}));
|
||||
final Runnable continueTask = () -> chunky.getCommands().get(CommandLiteral.CONTINUE).execute(chunky.getServer().getConsole(), CommandArguments.empty());
|
||||
if (Folia.isFolia()) {
|
||||
Folia.onServerInit(this, continueTask);
|
||||
} else {
|
||||
getServer().getScheduler().scheduleSyncDelayedTask(this, continueTask);
|
||||
}
|
||||
}
|
||||
if (getServer().getPluginManager().getPlugin("WorldBorder") != null) {
|
||||
chunky.getServer().getIntegrations().put("border", new WorldBorderIntegration());
|
||||
@@ -72,16 +78,17 @@ public final class ChunkyBukkit extends JavaPlugin implements Listener {
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@Override
|
||||
public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) {
|
||||
final Sender bukkitSender = sender instanceof Player ? new BukkitPlayer((Player) sender) : new BukkitSender(sender);
|
||||
final Sender bukkitSender = sender instanceof final Player player ? new BukkitPlayer(player) : new BukkitSender(sender);
|
||||
final Map<String, ChunkyCommand> commands = chunky.getCommands();
|
||||
final CommandArguments arguments = CommandArguments.of(Arrays.copyOfRange(args, Math.min(1, args.length), args.length));
|
||||
if (args.length > 0 && commands.containsKey(args[0].toLowerCase())) {
|
||||
if (sender.hasPermission(COMMAND_PERMISSION_KEY + args[0].toLowerCase())) {
|
||||
commands.get(args[0].toLowerCase()).execute(bukkitSender, args);
|
||||
commands.get(args[0].toLowerCase()).execute(bukkitSender, arguments);
|
||||
} else {
|
||||
bukkitSender.sendMessage(TranslationKey.COMMAND_NO_PERMISSION);
|
||||
}
|
||||
} else {
|
||||
commands.get(CommandLiteral.HELP).execute(bukkitSender, new String[]{});
|
||||
commands.get(CommandLiteral.HELP).execute(bukkitSender, arguments);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -90,18 +97,19 @@ public final class ChunkyBukkit extends JavaPlugin implements Listener {
|
||||
@Override
|
||||
public List<String> onTabComplete(final CommandSender sender, final Command command, final String alias, final String[] args) {
|
||||
if (args.length < 1) {
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
final Map<String, ChunkyCommand> commands = chunky.getCommands();
|
||||
if (args.length == 1) {
|
||||
commands.keySet().stream().filter(name -> sender.hasPermission(COMMAND_PERMISSION_KEY + name)).forEach(suggestions::add);
|
||||
} else if (commands.containsKey(args[0].toLowerCase()) && sender.hasPermission(COMMAND_PERMISSION_KEY + args[0].toLowerCase())) {
|
||||
suggestions.addAll(commands.get(args[0].toLowerCase()).tabSuggestions(args));
|
||||
final CommandArguments arguments = CommandArguments.of(Arrays.copyOfRange(args, 1, args.length));
|
||||
suggestions.addAll(commands.get(args[0].toLowerCase()).suggestions(arguments));
|
||||
}
|
||||
return suggestions.stream()
|
||||
.filter(s -> s.toLowerCase().contains(args[args.length - 1].toLowerCase()))
|
||||
.collect(Collectors.toList());
|
||||
.toList();
|
||||
}
|
||||
|
||||
public Chunky getChunky() {
|
||||
|
||||
@@ -1,25 +1,16 @@
|
||||
package org.popcraft.chunky.platform;
|
||||
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.FileConfigurationOptions;
|
||||
import org.popcraft.chunky.ChunkyBukkit;
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.iterator.PatternType;
|
||||
import org.popcraft.chunky.shape.ShapeType;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
import org.popcraft.chunky.util.Translator;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class BukkitConfig implements Config {
|
||||
private static final String TASKS_KEY = "tasks.";
|
||||
private static final List<String> HEADER = Arrays.asList("Chunky Configuration", "https://github.com/pop4959/Chunky/wiki/Configuration");
|
||||
private final ChunkyBukkit plugin;
|
||||
|
||||
@@ -41,76 +32,6 @@ public class BukkitConfig implements Config {
|
||||
return plugin.getDataFolder().toPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Optional<GenerationTask> loadTask(final World world) {
|
||||
final FileConfiguration config = plugin.getConfig();
|
||||
if (config.getConfigurationSection(TASKS_KEY + world.getName()) == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final String worldKey = TASKS_KEY + world.getName() + ".";
|
||||
final boolean cancelled = config.getBoolean(worldKey + "cancelled", false);
|
||||
final double radiusX = config.getDouble(worldKey + "radius", Selection.DEFAULT_RADIUS);
|
||||
final double radiusZ = config.getDouble(worldKey + "z-radius", radiusX);
|
||||
final Selection.Builder selection = Selection.builder(plugin.getChunky(), world)
|
||||
.centerX(config.getDouble(worldKey + "x-center", Selection.DEFAULT_CENTER_X))
|
||||
.centerZ(config.getDouble(worldKey + "z-center", Selection.DEFAULT_CENTER_Z))
|
||||
.radiusX(radiusX)
|
||||
.radiusZ(radiusZ)
|
||||
.pattern(Parameter.of(config.getString(worldKey + "iterator", PatternType.CONCENTRIC)))
|
||||
.shape(config.getString(worldKey + "shape", ShapeType.SQUARE));
|
||||
final long count = config.getLong(worldKey + "count", 0);
|
||||
final long time = config.getLong(worldKey + "time", 0);
|
||||
return Optional.of(new GenerationTask(plugin.getChunky(), selection.build(), count, time, cancelled));
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized List<GenerationTask> loadTasks() {
|
||||
final List<GenerationTask> generationTasks = new ArrayList<>();
|
||||
plugin.getChunky().getServer().getWorlds().forEach(world -> loadTask(world).ifPresent(generationTasks::add));
|
||||
return generationTasks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void saveTask(final GenerationTask generationTask) {
|
||||
final FileConfiguration config = plugin.getConfig();
|
||||
final Selection selection = generationTask.getSelection();
|
||||
final String worldKey = TASKS_KEY + selection.world().getName() + ".";
|
||||
final String shape = generationTask.getShape().name();
|
||||
config.set(worldKey + "cancelled", generationTask.isCancelled());
|
||||
config.set(worldKey + "radius", selection.radiusX());
|
||||
if (ShapeType.RECTANGLE.equals(shape) || ShapeType.ELLIPSE.equals(shape)) {
|
||||
config.set(worldKey + "z-radius", selection.radiusZ());
|
||||
}
|
||||
config.set(worldKey + "x-center", selection.centerX());
|
||||
config.set(worldKey + "z-center", selection.centerZ());
|
||||
config.set(worldKey + "iterator", generationTask.getChunkIterator().name());
|
||||
config.set(worldKey + "shape", shape);
|
||||
config.set(worldKey + "count", generationTask.getCount());
|
||||
config.set(worldKey + "time", generationTask.getTotalTime());
|
||||
plugin.saveConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void saveTasks() {
|
||||
plugin.getChunky().getGenerationTasks().values().forEach(this::saveTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelTask(final World world) {
|
||||
loadTask(world).ifPresent(generationTask -> {
|
||||
generationTask.stop(true);
|
||||
saveTask(generationTask);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void cancelTasks() {
|
||||
loadTasks().forEach(generationTask -> {
|
||||
generationTask.stop(true);
|
||||
saveTask(generationTask);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVersion() {
|
||||
return plugin.getConfig().getInt("version", 0);
|
||||
@@ -126,6 +47,11 @@ public class BukkitConfig implements Config {
|
||||
return plugin.getConfig().getBoolean("continue-on-restart", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceLoadExistingChunks() {
|
||||
return plugin.getConfig().getBoolean("force-load-existing-chunks", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSilent() {
|
||||
return plugin.getConfig().getBoolean("silent", false);
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
package org.popcraft.chunky.platform;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.popcraft.chunky.ChunkyBukkit;
|
||||
import org.popcraft.chunky.platform.util.Location;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translateKey;
|
||||
|
||||
public class BukkitPlayer extends BukkitSender implements Player {
|
||||
private static final boolean ACTION_BAR_SUPPORTED;
|
||||
private final JavaPlugin plugin = JavaPlugin.getPlugin(ChunkyBukkit.class);
|
||||
|
||||
static {
|
||||
boolean barSupported;
|
||||
@@ -58,14 +63,36 @@ public class BukkitPlayer extends BukkitSender implements Player {
|
||||
return player.getUniqueId();
|
||||
}
|
||||
|
||||
@SuppressWarnings("UnstableApiUsage")
|
||||
@Override
|
||||
public void teleport(final Location location) {
|
||||
final org.bukkit.World world = Bukkit.getWorld(location.getWorld().getName());
|
||||
final org.bukkit.Location loc = new org.bukkit.Location(world, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||
final Entity vehicle = player.getVehicle();
|
||||
PaperLib.teleportAsync(player, loc);
|
||||
if (vehicle != null) {
|
||||
PaperLib.teleportAsync(vehicle, loc);
|
||||
if (vehicle == null) {
|
||||
teleportAsync(player, loc);
|
||||
} else {
|
||||
final List<Entity> passengers = new ArrayList<>(vehicle.getPassengers());
|
||||
vehicle.eject();
|
||||
teleportAsync(player, loc).thenAcceptAsync(ignored -> {
|
||||
vehicle.teleport(player);
|
||||
for (final Entity passenger : passengers) {
|
||||
passenger.teleport(player);
|
||||
if (passenger instanceof final org.bukkit.entity.Player playerPassenger) {
|
||||
playerPassenger.hideEntity(plugin, vehicle);
|
||||
playerPassenger.showEntity(plugin, vehicle);
|
||||
}
|
||||
vehicle.addPassenger(passenger);
|
||||
}
|
||||
}, command -> plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, command, 1));
|
||||
}
|
||||
}
|
||||
|
||||
private CompletableFuture<Boolean> teleportAsync(final Entity entity, final org.bukkit.Location location) {
|
||||
if (Paper.isPaper()) {
|
||||
return Paper.teleportAsync(entity, location);
|
||||
} else {
|
||||
return CompletableFuture.completedFuture(entity.teleport(location));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class BukkitServer implements Server {
|
||||
private final ChunkyBukkit plugin;
|
||||
@@ -38,6 +37,11 @@ public class BukkitServer implements Server {
|
||||
return worlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxWorldSize() {
|
||||
return plugin.getServer().getMaxWorldSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sender getConsole() {
|
||||
return new BukkitSender(plugin.getServer().getConsoleSender());
|
||||
@@ -45,7 +49,9 @@ public class BukkitServer implements Server {
|
||||
|
||||
@Override
|
||||
public Collection<Player> getPlayers() {
|
||||
return plugin.getServer().getOnlinePlayers().stream().map(BukkitPlayer::new).collect(Collectors.toList());
|
||||
final Collection<Player> players = new ArrayList<>();
|
||||
plugin.getServer().getOnlinePlayers().forEach(player -> players.add(new BukkitPlayer(player)));
|
||||
return players;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,23 +1,43 @@
|
||||
package org.popcraft.chunky.platform;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.popcraft.chunky.ChunkyBukkit;
|
||||
import org.popcraft.chunky.platform.util.Location;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionException;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class BukkitWorld implements World {
|
||||
private static final boolean IS_GENERATED_SUPPORTED;
|
||||
private static final int TICKING_LOAD_DURATION = Input.tryInteger(System.getProperty("chunky.tickingLoadDuration")).orElse(0);
|
||||
private static final boolean AWAIT_TICKET_REMOVAL = Boolean.getBoolean("chunky.awaitTicketRemoval");
|
||||
private final JavaPlugin plugin = JavaPlugin.getPlugin(ChunkyBukkit.class);
|
||||
private final org.bukkit.World world;
|
||||
private final Border worldBorder;
|
||||
|
||||
static {
|
||||
boolean isGeneratedSupported;
|
||||
try {
|
||||
Chunk.class.getMethod("isGenerated");
|
||||
isGeneratedSupported = true;
|
||||
} catch (NoSuchMethodException e) {
|
||||
isGeneratedSupported = false;
|
||||
}
|
||||
IS_GENERATED_SUPPORTED = isGeneratedSupported;
|
||||
}
|
||||
|
||||
public BukkitWorld(final org.bukkit.World world) {
|
||||
this.world = world;
|
||||
this.worldBorder = new BukkitBorder(world.getWorldBorder());
|
||||
@@ -34,17 +54,54 @@ public class BukkitWorld implements World {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChunkGenerated(final int x, final int z) {
|
||||
try {
|
||||
return PaperLib.isPaper() && PaperLib.isChunkGenerated(world, x, z);
|
||||
} catch (CompletionException e) {
|
||||
return false;
|
||||
public CompletableFuture<Boolean> isChunkGenerated(final int x, final int z) {
|
||||
if (Paper.isPaper()) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
return world.isChunkGenerated(x, z);
|
||||
} catch (CompletionException e) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (IS_GENERATED_SUPPORTED) {
|
||||
return CompletableFuture.completedFuture(world.getChunkAt(x, z, false).isGenerated());
|
||||
} else {
|
||||
return CompletableFuture.completedFuture(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> getChunkAtAsync(final int x, final int z) {
|
||||
return CompletableFuture.allOf(PaperLib.getChunkAtAsync(world, x, z));
|
||||
final CompletableFuture<Void> chunkFuture;
|
||||
if (Paper.isPaper()) {
|
||||
chunkFuture = CompletableFuture.allOf(Paper.getChunkAtAsync(world, x, z));
|
||||
} else {
|
||||
chunkFuture = CompletableFuture.allOf(CompletableFuture.completedFuture(world.getChunkAt(x, z)));
|
||||
}
|
||||
if (TICKING_LOAD_DURATION > 0) {
|
||||
final CompletableFuture<Void> removeTicketFuture = new CompletableFuture<>();
|
||||
chunkFuture.thenAccept(ignored -> {
|
||||
final Runnable addTicketTask = () -> world.addPluginChunkTicket(x, z, plugin);
|
||||
final Runnable removeTicketTask = () -> {
|
||||
world.removePluginChunkTicket(x, z, plugin);
|
||||
removeTicketFuture.complete(null);
|
||||
};
|
||||
if (Folia.isFolia()) {
|
||||
final org.bukkit.Location location = new org.bukkit.Location(world, x << 4, 0, z << 4);
|
||||
Folia.schedule(plugin, location, addTicketTask);
|
||||
CompletableFuture.runAsync(() -> Folia.schedule(plugin, location, removeTicketTask), CompletableFuture.delayedExecutor(TICKING_LOAD_DURATION, TimeUnit.SECONDS));
|
||||
} else {
|
||||
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, addTicketTask);
|
||||
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, removeTicketTask, TICKING_LOAD_DURATION * 20L);
|
||||
}
|
||||
});
|
||||
if (AWAIT_TICKET_REMOVAL) {
|
||||
return removeTicketFuture;
|
||||
}
|
||||
}
|
||||
return chunkFuture;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -70,40 +127,80 @@ public class BukkitWorld implements World {
|
||||
|
||||
@Override
|
||||
public int getElevation(final int x, final int z) {
|
||||
return world.getHighestBlockYAt(x, z);
|
||||
if (Folia.isFolia()) {
|
||||
final org.bukkit.Location location = new org.bukkit.Location(world, x, 0, z);
|
||||
return CompletableFuture
|
||||
.supplyAsync(() -> getElevationForLocation(x, z), command -> Folia.schedule(plugin, location, command))
|
||||
.join();
|
||||
} else {
|
||||
return getElevationForLocation(x, z);
|
||||
}
|
||||
}
|
||||
|
||||
private int getElevationForLocation(final int x, final int z) {
|
||||
final int height = world.getHighestBlockYAt(x, z) + 1;
|
||||
final int logicalHeight = world.getLogicalHeight();
|
||||
if (height >= logicalHeight) {
|
||||
Block block = world.getBlockAt(x, logicalHeight, z);
|
||||
int air = 0;
|
||||
while (block.getY() > world.getMinHeight()) {
|
||||
block = block.getRelative(BlockFace.DOWN);
|
||||
final Material type = block.getType();
|
||||
if (type.isSolid() && air > 1) {
|
||||
return block.getY() + 1;
|
||||
}
|
||||
air = type.isAir() ? air + 1 : 0;
|
||||
}
|
||||
}
|
||||
return height;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxElevation() {
|
||||
return world.getLogicalHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playEffect(final Player player, final String effect) {
|
||||
final Effect effectType;
|
||||
try {
|
||||
final Location location = player.getLocation();
|
||||
final org.bukkit.Location bukkitLocation = new org.bukkit.Location(world, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||
world.playEffect(bukkitLocation, Effect.valueOf(effect.toUpperCase()), 0);
|
||||
} catch (IllegalArgumentException ignored) {
|
||||
effectType = Effect.valueOf(effect.toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return;
|
||||
}
|
||||
final Location location = player.getLocation();
|
||||
final org.bukkit.Location bukkitLocation = new org.bukkit.Location(world, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||
world.playEffect(bukkitLocation, effectType, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playSound(final Player player, final String sound) {
|
||||
final Sound soundType;
|
||||
try {
|
||||
final Location location = player.getLocation();
|
||||
final org.bukkit.Location bukkitLocation = new org.bukkit.Location(world, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||
world.playSound(bukkitLocation, Sound.valueOf(sound.toUpperCase()), 2f, 1f);
|
||||
} catch (IllegalArgumentException ignored) {
|
||||
soundType = Sound.valueOf(sound.toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return;
|
||||
}
|
||||
final Location location = player.getLocation();
|
||||
final org.bukkit.Location bukkitLocation = new org.bukkit.Location(world, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||
world.playSound(bukkitLocation, soundType, 2f, 1f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Path> getDirectory(final String name) {
|
||||
if (name != null) {
|
||||
try (Stream<Path> paths = Files.walk(world.getWorldFolder().toPath())) {
|
||||
return paths.filter(Files::isDirectory)
|
||||
.filter(path -> name.equals(path.getFileName().toString()))
|
||||
.findFirst();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (name == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.empty();
|
||||
final org.bukkit.World.Environment environment = world.getEnvironment();
|
||||
final String parent;
|
||||
if (org.bukkit.World.Environment.NETHER.equals(environment)) {
|
||||
parent = "DIM-1";
|
||||
} else if (org.bukkit.World.Environment.THE_END.equals(environment)) {
|
||||
parent = "DIM1";
|
||||
} else {
|
||||
parent = "";
|
||||
}
|
||||
final Path directory = world.getWorldFolder().toPath().resolve(parent).normalize().resolve(name);
|
||||
return Files.isDirectory(directory) ? Optional.of(directory) : Optional.empty();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,9 @@
|
||||
version: 1
|
||||
# Chunky Configuration
|
||||
# https://github.com/pop4959/Chunky/wiki/Configuration
|
||||
|
||||
version: 2
|
||||
language: en
|
||||
continue-on-restart: false
|
||||
continue-on-restart: true
|
||||
force-load-existing-chunks: false
|
||||
silent: false
|
||||
update-interval: 1
|
||||
@@ -2,6 +2,7 @@ name: ${name}
|
||||
version: ${version}
|
||||
main: ${group}.chunky.ChunkyBukkit
|
||||
api-version: 1.13
|
||||
folia-supported: true
|
||||
softdepend: [dynmap, BlueMap, squaremap, WorldBorder]
|
||||
load: POSTWORLD
|
||||
authors: [${author}]
|
||||
@@ -16,6 +17,9 @@ commands:
|
||||
permissions:
|
||||
chunky.command:
|
||||
default: op
|
||||
chunky.command.border:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.cancel:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
@@ -31,9 +35,6 @@ permissions:
|
||||
chunky.command.corners:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.trim:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.help:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
@@ -55,6 +56,9 @@ permissions:
|
||||
chunky.command.reload:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.selection:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.shape:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
@@ -67,6 +71,9 @@ permissions:
|
||||
chunky.command.start:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.trim:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
chunky.command.worldborder:
|
||||
default: op
|
||||
children: [chunky.command]
|
||||
@@ -89,6 +96,7 @@ permissions:
|
||||
- chunky.command.quiet
|
||||
- chunky.command.radius
|
||||
- chunky.command.reload
|
||||
- chunky.command.selection
|
||||
- chunky.command.shape
|
||||
- chunky.command.silent
|
||||
- chunky.command.spawn
|
||||
|
||||
@@ -2,6 +2,7 @@ dependencies {
|
||||
compileOnly(group = "com.google.code.gson", name = "gson", version = "2.8.9")
|
||||
testImplementation(group = "junit", name = "junit", version = "4.13.2")
|
||||
testImplementation(group = "com.google.code.gson", name = "gson", version = "2.8.9")
|
||||
implementation(project(":Chunky-nbt"))
|
||||
}
|
||||
|
||||
tasks {
|
||||
@@ -12,4 +13,14 @@ tasks {
|
||||
)
|
||||
}
|
||||
}
|
||||
javadoc {
|
||||
sourceSets {
|
||||
main {
|
||||
allJava
|
||||
}
|
||||
}
|
||||
setDestinationDir(rootProject.projectDir.resolve("docs/chunky/javadoc"))
|
||||
include("org/popcraft/chunky/api/**")
|
||||
exclude("org/popcraft/chunky/api/ChunkyAPIImpl.java")
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.popcraft.chunky;
|
||||
|
||||
import org.popcraft.chunky.api.ChunkyAPI;
|
||||
import org.popcraft.chunky.api.ChunkyAPIImpl;
|
||||
import org.popcraft.chunky.command.CancelCommand;
|
||||
import org.popcraft.chunky.command.CenterCommand;
|
||||
import org.popcraft.chunky.command.ChunkyCommand;
|
||||
@@ -14,6 +16,7 @@ import org.popcraft.chunky.command.ProgressCommand;
|
||||
import org.popcraft.chunky.command.QuietCommand;
|
||||
import org.popcraft.chunky.command.RadiusCommand;
|
||||
import org.popcraft.chunky.command.ReloadCommand;
|
||||
import org.popcraft.chunky.command.SelectionCommand;
|
||||
import org.popcraft.chunky.command.ShapeCommand;
|
||||
import org.popcraft.chunky.command.SilentCommand;
|
||||
import org.popcraft.chunky.command.SpawnCommand;
|
||||
@@ -28,6 +31,7 @@ import org.popcraft.chunky.platform.Server;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.PendingAction;
|
||||
import org.popcraft.chunky.util.RegionCache;
|
||||
import org.popcraft.chunky.util.TaskLoader;
|
||||
import org.popcraft.chunky.util.TaskScheduler;
|
||||
import org.popcraft.chunky.util.Translator;
|
||||
import org.popcraft.chunky.util.Version;
|
||||
@@ -45,29 +49,34 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
public class Chunky {
|
||||
private final Server server;
|
||||
private final Config config;
|
||||
private final TaskLoader taskLoader;
|
||||
private final EventBus eventBus;
|
||||
private final Selection.Builder selection;
|
||||
private final TaskScheduler scheduler = new TaskScheduler();
|
||||
private final Map<String, GenerationTask> generationTasks = new ConcurrentHashMap<>();
|
||||
private final Map<String, TrimCommand.Task> trimTasks = new ConcurrentHashMap<>();
|
||||
private final Map<String, PendingAction> pendingActions = new HashMap<>();
|
||||
private final RegionCache regionCache = new RegionCache();
|
||||
private final double limit;
|
||||
private final Version version;
|
||||
private final Map<String, ChunkyCommand> commands;
|
||||
private final ChunkyAPI api;
|
||||
|
||||
public Chunky(final Server server, final Config config) {
|
||||
this.server = server;
|
||||
this.config = config;
|
||||
this.taskLoader = new TaskLoader(this);
|
||||
this.eventBus = new EventBus();
|
||||
this.selection = Selection.builder(this, server.getWorlds().get(0));
|
||||
this.limit = loadLimit().orElse(Double.MAX_VALUE);
|
||||
this.version = loadVersion();
|
||||
this.commands = loadCommands();
|
||||
this.api = new ChunkyAPIImpl(this);
|
||||
ChunkyProvider.register(this);
|
||||
}
|
||||
|
||||
public void disable() {
|
||||
getConfig().saveTasks();
|
||||
taskLoader.saveTasks();
|
||||
getGenerationTasks().values().forEach(generationTask -> generationTask.stop(false));
|
||||
getScheduler().cancelTasks();
|
||||
ChunkyProvider.unregister();
|
||||
@@ -108,6 +117,7 @@ public class Chunky {
|
||||
commandMap.put(CommandLiteral.QUIET, new QuietCommand(this));
|
||||
commandMap.put(CommandLiteral.RADIUS, new RadiusCommand(this));
|
||||
commandMap.put(CommandLiteral.RELOAD, new ReloadCommand(this));
|
||||
commandMap.put(CommandLiteral.SELECTION, new SelectionCommand(this));
|
||||
commandMap.put(CommandLiteral.SHAPE, new ShapeCommand(this));
|
||||
commandMap.put(CommandLiteral.SILENT, new SilentCommand(this));
|
||||
commandMap.put(CommandLiteral.SPAWN, new SpawnCommand(this));
|
||||
@@ -130,6 +140,10 @@ public class Chunky {
|
||||
return config;
|
||||
}
|
||||
|
||||
public TaskLoader getTaskLoader() {
|
||||
return taskLoader;
|
||||
}
|
||||
|
||||
public EventBus getEventBus() {
|
||||
return eventBus;
|
||||
}
|
||||
@@ -138,6 +152,10 @@ public class Chunky {
|
||||
return generationTasks;
|
||||
}
|
||||
|
||||
public Map<String, TrimCommand.Task> getTrimTasks() {
|
||||
return trimTasks;
|
||||
}
|
||||
|
||||
public Map<String, ChunkyCommand> getCommands() {
|
||||
return commands;
|
||||
}
|
||||
@@ -171,4 +189,8 @@ public class Chunky {
|
||||
public Version getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public ChunkyAPI getApi() {
|
||||
return api;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.popcraft.chunky;
|
||||
|
||||
import org.popcraft.chunky.api.event.task.GenerationCompleteEvent;
|
||||
import org.popcraft.chunky.api.event.task.GenerationProgressEvent;
|
||||
import org.popcraft.chunky.event.task.GenerationTaskFinishEvent;
|
||||
import org.popcraft.chunky.event.task.GenerationTaskUpdateEvent;
|
||||
import org.popcraft.chunky.iterator.ChunkIterator;
|
||||
@@ -14,12 +16,15 @@ import org.popcraft.chunky.util.RegionCache;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class GenerationTask implements Runnable {
|
||||
private static final int MAX_WORKING_COUNT = Input.tryInteger(System.getProperty("chunky.maxWorkingCount")).orElse(50);
|
||||
private static final double SAMPLE_INTERVAL = 1000d * Math.max(Input.tryInteger(System.getProperty("chunky.sampleInterval")).orElse(30), 30);
|
||||
private static final double SAMPLE_SUB_INTERVAL = SAMPLE_INTERVAL / 30;
|
||||
private final Chunky chunky;
|
||||
private final Selection selection;
|
||||
private final Shape shape;
|
||||
@@ -50,7 +55,7 @@ public class GenerationTask implements Runnable {
|
||||
this.worldState = chunky.getRegionCache().getWorld(selection.world().getName());
|
||||
}
|
||||
|
||||
private void update(final int chunkX, final int chunkZ, final boolean loaded) {
|
||||
private synchronized void update(final int chunkX, final int chunkZ, final boolean loaded) {
|
||||
if (stopped) {
|
||||
return;
|
||||
}
|
||||
@@ -60,10 +65,10 @@ public class GenerationTask implements Runnable {
|
||||
final Pair<Long, AtomicLong> bin = updateSamples.peekLast();
|
||||
if (loaded) {
|
||||
worldState.setGenerated(chunkX, chunkZ);
|
||||
if (bin != null && currentTime - bin.left() < 2e3) {
|
||||
if (bin != null && currentTime - bin.left() < SAMPLE_SUB_INTERVAL) {
|
||||
bin.right().addAndGet(1);
|
||||
} else if (updateSamples.add(Pair.of(currentTime, new AtomicLong(1)))) {
|
||||
while (!updateSamples.isEmpty() && currentTime - updateSamples.peek().left() > 1e4) {
|
||||
while (!updateSamples.isEmpty() && currentTime - updateSamples.peek().left() > SAMPLE_INTERVAL) {
|
||||
updateSamples.poll();
|
||||
}
|
||||
}
|
||||
@@ -92,6 +97,7 @@ public class GenerationTask implements Runnable {
|
||||
progress.seconds = time - progress.hours * 3600 - progress.minutes * 60;
|
||||
progress.chunkX = chunkX;
|
||||
progress.chunkZ = chunkZ;
|
||||
chunky.getEventBus().call(new GenerationProgressEvent(progress.world, progress.chunkCount, progress.complete, progress.percentComplete, progress.hours, progress.minutes, progress.seconds, progress.rate, progress.chunkX, progress.chunkZ));
|
||||
if (progress.complete) {
|
||||
progress.sendUpdate(chunky.getServer().getConsole());
|
||||
chunky.getEventBus().call(new GenerationTaskUpdateEvent(this));
|
||||
@@ -112,18 +118,22 @@ public class GenerationTask implements Runnable {
|
||||
public void run() {
|
||||
final String poolThreadName = Thread.currentThread().getName();
|
||||
Thread.currentThread().setName(String.format("Chunky-%s Thread", selection.world().getName()));
|
||||
if (!chunkIterator.process()) {
|
||||
stop(true);
|
||||
}
|
||||
final Semaphore working = new Semaphore(MAX_WORKING_COUNT);
|
||||
final boolean forceLoadExistingChunks = chunky.getConfig().isForceLoadExistingChunks();
|
||||
startTime.set(System.currentTimeMillis());
|
||||
while (!stopped && chunkIterator.hasNext()) {
|
||||
final ChunkCoordinate chunk = chunkIterator.next();
|
||||
final int chunkCenterX = (chunk.x << 4) + 8;
|
||||
final int chunkCenterZ = (chunk.z << 4) + 8;
|
||||
if (!shape.isBounding(chunkCenterX, chunkCenterZ) || worldState.isGenerated(chunk.x, chunk.z)) {
|
||||
update(chunk.x, chunk.z, false);
|
||||
final int chunkCenterX = (chunk.x() << 4) + 8;
|
||||
final int chunkCenterZ = (chunk.z() << 4) + 8;
|
||||
if (!shape.isBounding(chunkCenterX, chunkCenterZ)) {
|
||||
update(chunk.x(), chunk.z(), false);
|
||||
continue;
|
||||
}
|
||||
if (selection.world().isChunkGenerated(chunk.x, chunk.z)) {
|
||||
update(chunk.x, chunk.z, true);
|
||||
if (!forceLoadExistingChunks && worldState.isGenerated(chunk.x(), chunk.z())) {
|
||||
update(chunk.x(), chunk.z(), false);
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
@@ -133,20 +143,31 @@ public class GenerationTask implements Runnable {
|
||||
stop(cancelled);
|
||||
break;
|
||||
}
|
||||
selection.world().getChunkAtAsync(chunk.x, chunk.z).whenComplete((ignored, throwable) -> {
|
||||
working.release();
|
||||
update(chunk.x, chunk.z, true);
|
||||
});
|
||||
final CompletableFuture<Boolean> isChunkGenerated = forceLoadExistingChunks ?
|
||||
CompletableFuture.completedFuture(false) :
|
||||
selection.world().isChunkGenerated(chunk.x(), chunk.z());
|
||||
isChunkGenerated
|
||||
.thenCompose(generated -> {
|
||||
if (Boolean.TRUE.equals(generated)) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
} else {
|
||||
return selection.world().getChunkAtAsync(chunk.x(), chunk.z());
|
||||
}
|
||||
}).whenComplete((ignored, throwable) -> {
|
||||
working.release();
|
||||
update(chunk.x(), chunk.z(), true);
|
||||
});
|
||||
}
|
||||
if (stopped) {
|
||||
chunky.getServer().getConsole().sendMessagePrefixed(TranslationKey.TASK_STOPPED, selection.world().getName());
|
||||
} else {
|
||||
cancelled = true;
|
||||
}
|
||||
chunky.getConfig().saveTask(this);
|
||||
chunky.getTaskLoader().saveTask(this);
|
||||
chunky.getGenerationTasks().remove(selection.world().getName());
|
||||
Thread.currentThread().setName(poolThreadName);
|
||||
chunky.getEventBus().call(new GenerationTaskFinishEvent(this));
|
||||
chunky.getEventBus().call(new GenerationCompleteEvent(selection.world().getName()));
|
||||
}
|
||||
|
||||
public void stop(final boolean cancelled) {
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.popcraft.chunky.platform.util.Vector2;
|
||||
import org.popcraft.chunky.shape.ShapeType;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class Selection {
|
||||
public static final double DEFAULT_CENTER_X = 0d;
|
||||
public static final double DEFAULT_CENTER_Z = 0d;
|
||||
@@ -26,6 +27,12 @@ public final class Selection {
|
||||
private final int radiusChunksZ;
|
||||
private final int diameterChunksX;
|
||||
private final int diameterChunksZ;
|
||||
private final int centerRegionX;
|
||||
private final int centerRegionZ;
|
||||
private final int radiusRegionsX;
|
||||
private final int radiusRegionsZ;
|
||||
private final int diameterRegionsX;
|
||||
private final int diameterRegionsZ;
|
||||
|
||||
private Selection(final Chunky chunky, final World world, final double centerX, final double centerZ, final double radiusX, final double radiusZ, final Parameter pattern, final String shape) {
|
||||
this.chunky = chunky;
|
||||
@@ -42,6 +49,12 @@ public final class Selection {
|
||||
this.radiusChunksZ = (int) Math.ceil(radiusZ / 16f);
|
||||
this.diameterChunksX = 2 * radiusChunksX + 1;
|
||||
this.diameterChunksZ = 2 * radiusChunksZ + 1;
|
||||
this.centerRegionX = centerChunkX >> 5;
|
||||
this.centerRegionZ = centerChunkZ >> 5;
|
||||
this.radiusRegionsX = (int) Math.ceil(radiusChunksX / 32f);
|
||||
this.radiusRegionsZ = (int) Math.ceil(radiusChunksZ / 32f);
|
||||
this.diameterRegionsX = 2 * radiusRegionsX + 1;
|
||||
this.diameterRegionsZ = 2 * radiusRegionsZ + 1;
|
||||
}
|
||||
|
||||
public static Builder builder(final Chunky chunky, final World world) {
|
||||
@@ -104,7 +117,30 @@ public final class Selection {
|
||||
return this.diameterChunksZ;
|
||||
}
|
||||
|
||||
@SuppressWarnings("UnusedReturnValue")
|
||||
public int centerRegionX() {
|
||||
return this.centerRegionX;
|
||||
}
|
||||
|
||||
public int centerRegionZ() {
|
||||
return this.centerRegionZ;
|
||||
}
|
||||
|
||||
public int radiusRegionsX() {
|
||||
return this.radiusRegionsX;
|
||||
}
|
||||
|
||||
public int radiusRegionsZ() {
|
||||
return this.radiusRegionsZ;
|
||||
}
|
||||
|
||||
public int diameterRegionsX() {
|
||||
return this.diameterRegionsX;
|
||||
}
|
||||
|
||||
public int diameterRegionsZ() {
|
||||
return this.diameterRegionsZ;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
private final Chunky chunky;
|
||||
private World world;
|
||||
@@ -112,7 +148,7 @@ public final class Selection {
|
||||
private double centerZ = DEFAULT_CENTER_Z;
|
||||
private double radiusX = DEFAULT_RADIUS;
|
||||
private double radiusZ = DEFAULT_RADIUS;
|
||||
private Parameter pattern = Parameter.of(PatternType.CONCENTRIC);
|
||||
private Parameter pattern = Parameter.of(PatternType.REGION);
|
||||
private String shape = ShapeType.SQUARE;
|
||||
|
||||
private Builder(final Chunky chunky, final World world) {
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
package org.popcraft.chunky.api;
|
||||
|
||||
import org.popcraft.chunky.api.event.task.GenerationCompleteEvent;
|
||||
import org.popcraft.chunky.api.event.task.GenerationProgressEvent;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* The Chunky API
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public interface ChunkyAPI {
|
||||
/**
|
||||
* Gets the current API version.
|
||||
*
|
||||
* @return The api version
|
||||
*/
|
||||
int version();
|
||||
|
||||
/**
|
||||
* Gets whether a generation task is currently running for a world.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @return If a task is running in that world
|
||||
*/
|
||||
boolean isRunning(final String world);
|
||||
|
||||
/**
|
||||
* Starts a generation task with a given selection in a world.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @param shape The selection shape
|
||||
* @param centerX The center x coordinate
|
||||
* @param centerZ The center z coordinate
|
||||
* @param radiusX The primary radius (x-axis)
|
||||
* @param radiusZ The secondary radius (z-axis) (only used for certain shapes)
|
||||
* @param pattern The generation pattern
|
||||
* @return If the task was created and started successfully
|
||||
*/
|
||||
boolean startTask(final String world, final String shape, final double centerX, final double centerZ, final double radiusX, final double radiusZ, final String pattern);
|
||||
|
||||
/**
|
||||
* Pauses a generation task in a world.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @return If the task was paused
|
||||
*/
|
||||
boolean pauseTask(final String world);
|
||||
|
||||
/**
|
||||
* Continues a generation task in a world.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @return If the task was continued
|
||||
*/
|
||||
boolean continueTask(final String world);
|
||||
|
||||
/**
|
||||
* Cancels a generation task in a world.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @return If the task was cancelled
|
||||
*/
|
||||
boolean cancelTask(final String world);
|
||||
|
||||
/**
|
||||
* Register a listener for generation progress events.
|
||||
*
|
||||
* @param listener The listener
|
||||
*/
|
||||
void onGenerationProgress(final Consumer<GenerationProgressEvent> listener);
|
||||
|
||||
/**
|
||||
* Register a listener for generation complete events.
|
||||
*
|
||||
* @param listener The listener
|
||||
*/
|
||||
void onGenerationComplete(final Consumer<GenerationCompleteEvent> listener);
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
package org.popcraft.chunky.api;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.api.event.task.GenerationCompleteEvent;
|
||||
import org.popcraft.chunky.api.event.task.GenerationProgressEvent;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@SuppressWarnings("ClassCanBeRecord")
|
||||
public class ChunkyAPIImpl implements ChunkyAPI {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ChunkyAPIImpl(final Chunky chunky) {
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int version() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRunning(final String world) {
|
||||
return chunky.getGenerationTasks().containsKey(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean startTask(final String world, final String shape, final double centerX, final double centerZ, final double radiusX, final double radiusZ, final String pattern) {
|
||||
final World implWorld = Input.tryWorld(chunky, world).orElse(null);
|
||||
if (implWorld == null) {
|
||||
return false;
|
||||
}
|
||||
if (chunky.getGenerationTasks().containsKey(world)) {
|
||||
return false;
|
||||
}
|
||||
final Selection selection = Selection.builder(chunky, implWorld)
|
||||
.shape(shape).center(centerX, centerZ)
|
||||
.radiusX(radiusX).radiusZ(radiusZ)
|
||||
.pattern(Parameter.of(pattern)).build();
|
||||
final GenerationTask task = new GenerationTask(chunky, selection);
|
||||
chunky.getGenerationTasks().put(world, task);
|
||||
chunky.getScheduler().runTask(task);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean pauseTask(final String world) {
|
||||
final GenerationTask task = chunky.getGenerationTasks().get(world);
|
||||
if (task == null) {
|
||||
return false;
|
||||
}
|
||||
task.stop(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean continueTask(final String world) {
|
||||
final World implWorld = Input.tryWorld(chunky, world).orElse(null);
|
||||
if (implWorld == null) {
|
||||
return false;
|
||||
}
|
||||
final GenerationTask task = chunky.getTaskLoader().loadTask(implWorld).orElse(null);
|
||||
if (task == null || task.isCancelled()) {
|
||||
return false;
|
||||
}
|
||||
if (chunky.getGenerationTasks().containsKey(world)) {
|
||||
return false;
|
||||
}
|
||||
chunky.getGenerationTasks().put(world, task);
|
||||
chunky.getScheduler().runTask(task);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean cancelTask(final String world) {
|
||||
final World implWorld = Input.tryWorld(chunky, world).orElse(null);
|
||||
if (implWorld == null) {
|
||||
return false;
|
||||
}
|
||||
if (!chunky.getGenerationTasks().containsKey(world)) {
|
||||
return false;
|
||||
}
|
||||
chunky.getGenerationTasks().remove(world).stop(true);
|
||||
chunky.getTaskLoader().cancelTask(implWorld);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGenerationProgress(final Consumer<GenerationProgressEvent> event) {
|
||||
chunky.getEventBus().subscribe(GenerationProgressEvent.class, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGenerationComplete(final Consumer<GenerationCompleteEvent> event) {
|
||||
chunky.getEventBus().subscribe(GenerationCompleteEvent.class, event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.popcraft.chunky.api.event.task;
|
||||
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
/**
|
||||
* Event which is fired when a generation task completes.
|
||||
*
|
||||
* @param world The world identifier associated with the completed task
|
||||
*/
|
||||
public record GenerationCompleteEvent(String world) implements Event {
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package org.popcraft.chunky.api.event.task;
|
||||
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
/**
|
||||
* Event which is fired when a generation task calculates progress.
|
||||
*
|
||||
* @param world The world identifier
|
||||
* @param chunks The number of chunks generated
|
||||
* @param complete If the generation task completed
|
||||
* @param progress The percent progress
|
||||
* @param hours The number of hours elapsed for this task
|
||||
* @param minutes The number of minutes elapsed for this task
|
||||
* @param seconds The number of seconds elapsed for this task
|
||||
* @param rate The current average generation rate
|
||||
* @param x The current chunk's x coordinate
|
||||
* @param z The current chunk's z coordinate
|
||||
*/
|
||||
public record GenerationProgressEvent(String world, long chunks, boolean complete, float progress, long hours,
|
||||
long minutes, long seconds, double rate, long x, long z) implements Event {
|
||||
}
|
||||
@@ -8,44 +8,53 @@ import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class CancelCommand extends ChunkyCommand {
|
||||
public class CancelCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public CancelCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Map<String, GenerationTask> generationTasks = chunky.getGenerationTasks();
|
||||
if (generationTasks.isEmpty() && chunky.getConfig().loadTasks().stream().allMatch(GenerationTask::isCancelled)) {
|
||||
final Map<String, TrimCommand.Task> trimTasks = chunky.getTrimTasks();
|
||||
if (generationTasks.isEmpty()
|
||||
&& chunky.getTaskLoader().loadTasks().stream().allMatch(GenerationTask::isCancelled)
|
||||
&& trimTasks.isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CANCEL_NO_TASKS);
|
||||
return;
|
||||
}
|
||||
final Runnable cancelAction;
|
||||
if (args.length > 1) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
|
||||
if (!world.isPresent()) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, arguments.joined());
|
||||
if (world.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_CANCEL);
|
||||
return;
|
||||
}
|
||||
cancelAction = () -> {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CANCEL, world.get().getName());
|
||||
chunky.getConfig().cancelTask(world.get());
|
||||
chunky.getTaskLoader().cancelTask(world.get());
|
||||
if (chunky.getGenerationTasks().containsKey(world.get().getName())) {
|
||||
chunky.getGenerationTasks().remove(world.get().getName()).stop(true);
|
||||
}
|
||||
if (chunky.getTrimTasks().containsKey(world.get().getName())) {
|
||||
chunky.getTrimTasks().remove(world.get().getName()).setCancelled(true);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
cancelAction = () -> {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CANCEL_ALL);
|
||||
chunky.getConfig().cancelTasks();
|
||||
chunky.getTaskLoader().cancelTasks();
|
||||
chunky.getGenerationTasks().values().forEach(generationTask -> generationTask.stop(true));
|
||||
chunky.getGenerationTasks().clear();
|
||||
chunky.getScheduler().cancelTasks();
|
||||
chunky.getTrimTasks().values().forEach(trimTask -> trimTask.setCancelled(true));
|
||||
chunky.getTrimTasks().clear();
|
||||
};
|
||||
}
|
||||
chunky.setPendingAction(sender, cancelAction);
|
||||
@@ -53,12 +62,12 @@ public class CancelCommand extends ChunkyCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -7,25 +7,23 @@ import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class CenterCommand extends ChunkyCommand {
|
||||
public class CenterCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public CenterCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
Optional<Double> newX = Optional.empty();
|
||||
if (args.length > 1) {
|
||||
newX = Input.tryDoubleSuffixed(args[1]);
|
||||
}
|
||||
Optional<Double> newZ = Optional.empty();
|
||||
if (args.length > 2) {
|
||||
newZ = Input.tryDoubleSuffixed(args[2]);
|
||||
}
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<Double> newX = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
final Optional<Double> newZ = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
final double centerX;
|
||||
final double centerZ;
|
||||
if (!newX.isPresent() && !newZ.isPresent()) {
|
||||
if (newX.isEmpty() && newZ.isEmpty()) {
|
||||
final Location coordinate = sender.getLocation();
|
||||
centerX = coordinate.getX();
|
||||
centerZ = coordinate.getZ();
|
||||
@@ -43,4 +41,9 @@ public class CenterCommand extends ChunkyCommand {
|
||||
chunky.getSelection().center(centerX, centerZ);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CENTER, Formatting.number(centerX), Formatting.number(centerZ));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,11 @@
|
||||
package org.popcraft.chunky.command;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ChunkyCommand {
|
||||
protected final Chunky chunky;
|
||||
public interface ChunkyCommand {
|
||||
void execute(Sender sender, CommandArguments arguments);
|
||||
|
||||
protected ChunkyCommand(final Chunky chunky) {
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public abstract void execute(Sender sender, String[] args);
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<String> suggestions(final CommandArguments arguments);
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package org.popcraft.chunky.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Queue;
|
||||
|
||||
public final class CommandArguments {
|
||||
private final int size;
|
||||
private final Queue<String> args = new LinkedList<>();
|
||||
|
||||
private CommandArguments(final List<String> arguments) {
|
||||
this.size = arguments.size();
|
||||
this.args.addAll(arguments);
|
||||
}
|
||||
|
||||
public static CommandArguments of(final List<String> arguments) {
|
||||
return new CommandArguments(arguments);
|
||||
}
|
||||
|
||||
public static CommandArguments of(final String... arguments) {
|
||||
return new CommandArguments(List.of(arguments));
|
||||
}
|
||||
|
||||
public static CommandArguments empty() {
|
||||
return new CommandArguments(List.of());
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public Optional<String> next() {
|
||||
return Optional.ofNullable(args.poll());
|
||||
}
|
||||
|
||||
public List<String> remaining() {
|
||||
final List<String> arguments = new ArrayList<>(args);
|
||||
args.clear();
|
||||
return arguments;
|
||||
}
|
||||
|
||||
public String joined() {
|
||||
return String.join(" ", remaining());
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ public final class CommandLiteral {
|
||||
public static final String CONTINUE = "continue";
|
||||
public static final String CORNERS = "corners";
|
||||
public static final String HELP = "help";
|
||||
public static final String INHABITED = "inhabited";
|
||||
public static final String INTERVAL = "interval";
|
||||
public static final String PAGE = "page";
|
||||
public static final String PATTERN = "pattern";
|
||||
@@ -21,11 +22,13 @@ public final class CommandLiteral {
|
||||
public static final String RADIUS_X = "radiusX";
|
||||
public static final String RADIUS_Z = "radiusZ";
|
||||
public static final String RELOAD = "reload";
|
||||
public static final String SELECTION = "selection";
|
||||
public static final String SHAPE = "shape";
|
||||
public static final String SILENT = "silent";
|
||||
public static final String SPAWN = "spawn";
|
||||
public static final String START = "start";
|
||||
public static final String TRIM = "trim";
|
||||
public static final String TRIM_MODE = "trimMode";
|
||||
public static final String WORLDBORDER = "worldborder";
|
||||
public static final String WORLD = "world";
|
||||
public static final String X = "x";
|
||||
@@ -42,6 +45,7 @@ public final class CommandLiteral {
|
||||
public static final String WRAP = "wrap";
|
||||
public static final String PLAYER = "player";
|
||||
public static final String VALUE = "value";
|
||||
public static final String TYPE = "type";
|
||||
|
||||
private CommandLiteral() {
|
||||
}
|
||||
|
||||
@@ -4,20 +4,28 @@ import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ConfirmCommand extends ChunkyCommand {
|
||||
public class ConfirmCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ConfirmCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<Runnable> pendingAction = chunky.getPendingAction(sender);
|
||||
if (!pendingAction.isPresent()) {
|
||||
if (pendingAction.isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CONFIRM);
|
||||
return;
|
||||
}
|
||||
pendingAction.get().run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -8,28 +8,29 @@ import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ContinueCommand extends ChunkyCommand {
|
||||
public class ContinueCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ContinueCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final List<GenerationTask> loadTasks;
|
||||
if (args.length > 1) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
|
||||
if (!world.isPresent()) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, arguments.joined());
|
||||
if (world.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_CONTINUE);
|
||||
return;
|
||||
}
|
||||
loadTasks = chunky.getConfig().loadTask(world.get()).map(Collections::singletonList).orElse(Collections.emptyList());
|
||||
loadTasks = chunky.getTaskLoader().loadTask(world.get()).map(List::of).orElse(List.of());
|
||||
} else {
|
||||
loadTasks = chunky.getConfig().loadTasks();
|
||||
loadTasks = chunky.getTaskLoader().loadTasks();
|
||||
}
|
||||
if (loadTasks.stream().allMatch(GenerationTask::isCancelled)) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CONTINUE_NO_TASKS);
|
||||
@@ -49,12 +50,12 @@ public class ContinueCommand extends ChunkyCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -7,24 +7,23 @@ import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class CornersCommand extends ChunkyCommand {
|
||||
public class CornersCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public CornersCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length < 5) {
|
||||
sender.sendMessage(TranslationKey.HELP_CORNERS);
|
||||
return;
|
||||
}
|
||||
final Optional<Double> x1 = Input.tryDoubleSuffixed(args[1]);
|
||||
final Optional<Double> z1 = Input.tryDoubleSuffixed(args[2]);
|
||||
final Optional<Double> x2 = Input.tryDoubleSuffixed(args[3]);
|
||||
final Optional<Double> z2 = Input.tryDoubleSuffixed(args[4]);
|
||||
if (!x1.isPresent() || !z1.isPresent() || !x2.isPresent() || !z2.isPresent()) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<Double> x1 = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
final Optional<Double> z1 = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
final Optional<Double> x2 = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
final Optional<Double> z2 = arguments.next().flatMap(Input::tryDoubleSuffixed);
|
||||
if (x1.isEmpty() || z1.isEmpty() || x2.isEmpty() || z2.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_CORNERS);
|
||||
return;
|
||||
}
|
||||
@@ -49,4 +48,9 @@ public class CornersCommand extends ChunkyCommand {
|
||||
chunky.getSelection().shape(shape);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_SHAPE, shape);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -10,48 +10,66 @@ import java.util.List;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class HelpCommand extends ChunkyCommand {
|
||||
private final List<String> helpMessages;
|
||||
public class HelpCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
private final List<String> helpCommands = List.of(
|
||||
CommandLiteral.START,
|
||||
CommandLiteral.PAUSE,
|
||||
CommandLiteral.CONTINUE,
|
||||
CommandLiteral.CANCEL,
|
||||
CommandLiteral.WORLD,
|
||||
CommandLiteral.WORLDBORDER,
|
||||
CommandLiteral.CENTER,
|
||||
CommandLiteral.SPAWN,
|
||||
CommandLiteral.RADIUS,
|
||||
CommandLiteral.CORNERS,
|
||||
CommandLiteral.SHAPE,
|
||||
CommandLiteral.PATTERN,
|
||||
CommandLiteral.SILENT,
|
||||
CommandLiteral.QUIET,
|
||||
CommandLiteral.TRIM,
|
||||
CommandLiteral.SELECTION,
|
||||
CommandLiteral.PROGRESS,
|
||||
CommandLiteral.BORDER,
|
||||
CommandLiteral.RELOAD
|
||||
);
|
||||
|
||||
public HelpCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.helpMessages = new ArrayList<>();
|
||||
helpMessages.add(TranslationKey.HELP_START);
|
||||
helpMessages.add(TranslationKey.HELP_PAUSE);
|
||||
helpMessages.add(TranslationKey.HELP_CONTINUE);
|
||||
helpMessages.add(TranslationKey.HELP_CANCEL);
|
||||
helpMessages.add(TranslationKey.HELP_WORLD);
|
||||
helpMessages.add(TranslationKey.HELP_WORLDBORDER);
|
||||
helpMessages.add(TranslationKey.HELP_CENTER);
|
||||
helpMessages.add(TranslationKey.HELP_SPAWN);
|
||||
helpMessages.add(TranslationKey.HELP_RADIUS);
|
||||
helpMessages.add(TranslationKey.HELP_CORNERS);
|
||||
helpMessages.add(TranslationKey.HELP_SHAPE);
|
||||
helpMessages.add(TranslationKey.HELP_PATTERN);
|
||||
helpMessages.add(TranslationKey.HELP_SILENT);
|
||||
helpMessages.add(TranslationKey.HELP_QUIET);
|
||||
helpMessages.add(TranslationKey.HELP_TRIM);
|
||||
helpMessages.add(TranslationKey.HELP_PROGRESS);
|
||||
helpMessages.add(TranslationKey.HELP_RELOAD);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final List<String> visibleCommands = new ArrayList<>();
|
||||
for (final String command : helpCommands) {
|
||||
if (chunky.getCommands().containsKey(command)) {
|
||||
visibleCommands.add(command);
|
||||
}
|
||||
}
|
||||
final int visibleCommandCount = visibleCommands.size();
|
||||
final StringBuilder help = new StringBuilder();
|
||||
final int pageIndexLast = visibleCommandCount / 8;
|
||||
final int pageIndex = (arguments.size() < 1 ? 0 : Math.max(0, arguments.next().flatMap(Input::tryInteger).orElse(1) - 1)) % (pageIndexLast + 1);
|
||||
final int helpIndexFirst;
|
||||
final int helpIndexLast;
|
||||
if (sender.isPlayer()) {
|
||||
final int pageIndexLast = helpMessages.size() / 8;
|
||||
final int pageIndex = (args.length < 2 ? 0 : Math.max(0, Input.tryInteger(args[1]).orElse(1) - 1)) % (pageIndexLast + 1);
|
||||
final int helpIndexFirst = 8 * pageIndex;
|
||||
final int helpIndexLast = Math.min(helpIndexFirst + 8, helpMessages.size());
|
||||
for (int i = helpIndexFirst; i < helpIndexLast; ++i) {
|
||||
help.append('\n').append(translate(helpMessages.get(i)));
|
||||
}
|
||||
if (pageIndex != pageIndexLast) {
|
||||
help.append('\n').append(translate(TranslationKey.HELP_MORE, "/chunky help " + (pageIndex + 2)));
|
||||
}
|
||||
helpIndexFirst = 8 * pageIndex;
|
||||
helpIndexLast = Math.min(helpIndexFirst + 8, visibleCommandCount);
|
||||
} else {
|
||||
helpMessages.forEach(message -> help.append('\n').append(translate(message)));
|
||||
helpIndexFirst = 0;
|
||||
helpIndexLast = visibleCommandCount;
|
||||
}
|
||||
for (int i = helpIndexFirst; i < helpIndexLast; ++i) {
|
||||
help.append('\n').append(translate("help_" + visibleCommands.get(i)));
|
||||
}
|
||||
if (sender.isPlayer() && pageIndex != pageIndexLast) {
|
||||
help.append('\n').append(translate(TranslationKey.HELP_MORE, "/chunky help " + (pageIndex + 2)));
|
||||
}
|
||||
sender.sendMessage(TranslationKey.HELP_MENU, help.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -7,43 +7,41 @@ import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class PatternCommand extends ChunkyCommand {
|
||||
public class PatternCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public PatternCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(TranslationKey.HELP_PATTERN);
|
||||
return;
|
||||
}
|
||||
final Optional<String> optionalType = Input.tryPattern(args[1]);
|
||||
if (!optionalType.isPresent()) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<String> optionalType = arguments.next().flatMap(Input::tryPattern);
|
||||
if (optionalType.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_PATTERN);
|
||||
return;
|
||||
}
|
||||
final String type = optionalType.get();
|
||||
final String value = args.length > 2 ? args[2] : null;
|
||||
if (PatternType.CSV.equals(type) && value == null) {
|
||||
final Optional<String> value = arguments.next();
|
||||
if (PatternType.CSV.equals(type) && value.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_PATTERN);
|
||||
return;
|
||||
}
|
||||
final Parameter pattern = Parameter.of(type, value);
|
||||
final Parameter pattern = Parameter.of(type, value.orElse(null));
|
||||
chunky.getSelection().pattern(pattern);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_PATTERN, translate("pattern_" + pattern.getType()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
return PatternType.ALL;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -8,26 +8,27 @@ import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class PauseCommand extends ChunkyCommand {
|
||||
public class PauseCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public PauseCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Map<String, GenerationTask> generationTasks = chunky.getGenerationTasks();
|
||||
if (generationTasks.isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_PAUSE_NO_TASKS);
|
||||
return;
|
||||
}
|
||||
if (args.length > 1) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
|
||||
if (!world.isPresent() || !generationTasks.containsKey(world.get().getName())) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, arguments.joined());
|
||||
if (world.isEmpty() || !generationTasks.containsKey(world.get().getName())) {
|
||||
sender.sendMessage(TranslationKey.HELP_PAUSE);
|
||||
} else {
|
||||
generationTasks.get(world.get().getName()).stop(false);
|
||||
@@ -42,12 +43,12 @@ public class PauseCommand extends ChunkyCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,18 @@ import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ProgressCommand extends ChunkyCommand {
|
||||
public class ProgressCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ProgressCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Map<String, GenerationTask> generationTasks = chunky.getGenerationTasks();
|
||||
if (generationTasks.isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_PROGRESS_NO_TASKS);
|
||||
@@ -26,4 +29,9 @@ public class ProgressCommand extends ChunkyCommand {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -5,19 +5,20 @@ import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class QuietCommand extends ChunkyCommand {
|
||||
public class QuietCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public QuietCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
Optional<Integer> newQuiet = Optional.empty();
|
||||
if (args.length > 1) {
|
||||
newQuiet = Input.tryInteger(args[1]);
|
||||
}
|
||||
if (!newQuiet.isPresent()) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<Integer> newQuiet = arguments.next().flatMap(Input::tryInteger);
|
||||
if (newQuiet.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_QUIET);
|
||||
return;
|
||||
}
|
||||
@@ -25,4 +26,9 @@ public class QuietCommand extends ChunkyCommand {
|
||||
chunky.getConfig().setUpdateInterval(quietInterval);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_QUIET, quietInterval);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,22 @@ import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class RadiusCommand extends ChunkyCommand {
|
||||
public class RadiusCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public RadiusCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(TranslationKey.HELP_RADIUS);
|
||||
return;
|
||||
}
|
||||
final Optional<Integer> signX = Input.trySign(args[1]);
|
||||
final Optional<Double> newRadiusX = Input.tryDoubleSuffixed(signX.isPresent() ? args[1].substring(1) : args[1]);
|
||||
if (!newRadiusX.isPresent() || newRadiusX.get() < 0 || Input.isPastWorldLimit(newRadiusX.get())) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<String> newX = arguments.next();
|
||||
final Optional<Integer> signX = newX.flatMap(Input::trySign);
|
||||
final Optional<Double> newRadiusX = newX.map(x -> signX.isPresent() ? x.substring(1) : x).flatMap(Input::tryDoubleSuffixed);
|
||||
if (newRadiusX.isEmpty() || newRadiusX.get() < 0 || Input.isPastWorldLimit(newRadiusX.get())) {
|
||||
sender.sendMessage(TranslationKey.HELP_RADIUS);
|
||||
return;
|
||||
}
|
||||
@@ -31,10 +32,11 @@ public class RadiusCommand extends ChunkyCommand {
|
||||
sender.sendMessage(TranslationKey.HELP_RADIUS);
|
||||
return;
|
||||
}
|
||||
if (args.length > 2) {
|
||||
final Optional<Integer> signZ = Input.trySign(args[2]);
|
||||
final Optional<Double> newRadiusZ = Input.tryDoubleSuffixed(signZ.isPresent() ? args[2].substring(1) : args[2]);
|
||||
if (!newRadiusZ.isPresent() || newRadiusZ.get() < 0 || Input.isPastWorldLimit(newRadiusZ.get())) {
|
||||
final Optional<String> newZ = arguments.next();
|
||||
if (newZ.isPresent()) {
|
||||
final Optional<Integer> signZ = newZ.flatMap(Input::trySign);
|
||||
final Optional<Double> newRadiusZ = newZ.map(z -> signZ.isPresent() ? z.substring(1) : z).flatMap(Input::tryDoubleSuffixed);
|
||||
if (newRadiusZ.isEmpty() || newRadiusZ.get() < 0 || Input.isPastWorldLimit(newRadiusZ.get())) {
|
||||
sender.sendMessage(TranslationKey.HELP_RADIUS);
|
||||
return;
|
||||
}
|
||||
@@ -50,4 +52,9 @@ public class RadiusCommand extends ChunkyCommand {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_RADIUS, Formatting.number(radiusX));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,43 @@
|
||||
package org.popcraft.chunky.command;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.event.command.ReloadCommandEvent;
|
||||
import org.popcraft.chunky.platform.Config;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
public class ReloadCommand extends ChunkyCommand {
|
||||
import java.util.List;
|
||||
|
||||
public class ReloadCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ReloadCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (!chunky.getGenerationTasks().isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_RELOAD_TASKS_RUNNING);
|
||||
return;
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final String type = arguments.next().orElse(null);
|
||||
if ("tasks".equals(type)) {
|
||||
if (!chunky.getGenerationTasks().isEmpty()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_RELOAD_TASKS_RUNNING);
|
||||
return;
|
||||
}
|
||||
chunky.getTaskLoader().reload();
|
||||
} else {
|
||||
final Config config = chunky.getServer().getConfig();
|
||||
config.reload();
|
||||
chunky.setLanguage(config.getLanguage());
|
||||
chunky.getEventBus().call(new ReloadCommandEvent());
|
||||
}
|
||||
final Config config = chunky.getServer().getConfig();
|
||||
config.reload();
|
||||
chunky.setLanguage(config.getLanguage());
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_RELOAD);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
return List.of("config", "tasks");
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package org.popcraft.chunky.command;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class SelectionCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public SelectionCommand(final Chunky chunky) {
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Selection current = chunky.getSelection().build();
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_SELECTION);
|
||||
sender.sendMessage(TranslationKey.FORMAT_SELECTION_WORLD, current.world().getName());
|
||||
sender.sendMessage(TranslationKey.FORMAT_SELECTION_SHAPE, translate("shape_" + current.shape()));
|
||||
sender.sendMessage(TranslationKey.FORMAT_SELECTION_CENTER, Formatting.number(current.centerX()), Formatting.number(current.centerZ()));
|
||||
final double radiusX = current.radiusX();
|
||||
final double radiusZ = current.radiusZ();
|
||||
if (radiusX == radiusZ) {
|
||||
sender.sendMessage(TranslationKey.FORMAT_SELECTION_RADIUS, Formatting.number(radiusX));
|
||||
} else {
|
||||
sender.sendMessage(TranslationKey.FORMAT_SELECTION_RADII, Formatting.number(radiusX), Formatting.number(radiusZ));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -6,24 +6,22 @@ import org.popcraft.chunky.shape.ShapeType;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class ShapeCommand extends ChunkyCommand {
|
||||
public class ShapeCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public ShapeCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(TranslationKey.HELP_SHAPE);
|
||||
return;
|
||||
}
|
||||
final Optional<String> inputShape = Input.tryShape(args[1]);
|
||||
if (!inputShape.isPresent()) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final Optional<String> inputShape = arguments.next().flatMap(Input::tryShape);
|
||||
if (inputShape.isEmpty()) {
|
||||
sender.sendMessage(TranslationKey.HELP_SHAPE);
|
||||
return;
|
||||
}
|
||||
@@ -33,10 +31,10 @@ public class ShapeCommand extends ChunkyCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
return ShapeType.ALL;
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
return ShapeType.all();
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -4,16 +4,26 @@ import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class SilentCommand extends ChunkyCommand {
|
||||
public class SilentCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public SilentCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
chunky.getConfig().setSilent(!chunky.getConfig().isSilent());
|
||||
final String status = translate(chunky.getConfig().isSilent() ? TranslationKey.ENABLED : TranslationKey.DISABLED);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_SILENT, status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,24 @@ import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
public class SpawnCommand extends ChunkyCommand {
|
||||
import java.util.List;
|
||||
|
||||
public class SpawnCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public SpawnCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
chunky.getSelection().spawn();
|
||||
final Selection current = chunky.getSelection().build();
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_CENTER, Formatting.number(current.centerX()), Formatting.number(current.centerZ()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -11,20 +11,22 @@ import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class StartCommand extends ChunkyCommand {
|
||||
public class StartCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public StartCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length > 1) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, args[1]);
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = arguments.next().flatMap(arg -> Input.tryWorld(chunky, arg));
|
||||
if (world.isPresent()) {
|
||||
chunky.getSelection().world(world.get());
|
||||
} else {
|
||||
@@ -32,8 +34,8 @@ public class StartCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 2) {
|
||||
final Optional<String> shape = Input.tryShape(args[2]);
|
||||
if (arguments.size() > 1) {
|
||||
final Optional<String> shape = arguments.next().flatMap(Input::tryShape);
|
||||
if (shape.isPresent()) {
|
||||
chunky.getSelection().shape(shape.get());
|
||||
} else {
|
||||
@@ -41,9 +43,9 @@ public class StartCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 3) {
|
||||
final Optional<Double> centerX = Input.tryDoubleSuffixed(args[3]).filter(cx -> !Input.isPastWorldLimit(cx));
|
||||
final Optional<Double> centerZ = Input.tryDoubleSuffixed(args.length > 4 ? args[4] : null).filter(cz -> !Input.isPastWorldLimit(cz));
|
||||
if (arguments.size() > 2) {
|
||||
final Optional<Double> centerX = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(c -> !Input.isPastWorldLimit(c));
|
||||
final Optional<Double> centerZ = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(c -> !Input.isPastWorldLimit(c));
|
||||
if (centerX.isPresent() && centerZ.isPresent()) {
|
||||
chunky.getSelection().center(centerX.get(), centerZ.get());
|
||||
} else {
|
||||
@@ -51,8 +53,8 @@ public class StartCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 5) {
|
||||
final Optional<Double> radiusX = Input.tryDoubleSuffixed(args[5]).filter(rx -> rx >= 0 && !Input.isPastWorldLimit(rx));
|
||||
if (arguments.size() > 4) {
|
||||
final Optional<Double> radiusX = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(r -> r >= 0 && !Input.isPastWorldLimit(r));
|
||||
if (radiusX.isPresent()) {
|
||||
chunky.getSelection().radius(radiusX.get());
|
||||
} else {
|
||||
@@ -60,8 +62,8 @@ public class StartCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 6) {
|
||||
final Optional<Double> radiusZ = Input.tryDoubleSuffixed(args[6]).filter(rz -> rz >= 0 && !Input.isPastWorldLimit(rz));
|
||||
if (arguments.size() > 5) {
|
||||
final Optional<Double> radiusZ = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(r -> r >= 0 && !Input.isPastWorldLimit(r));
|
||||
if (radiusZ.isPresent()) {
|
||||
chunky.getSelection().radiusZ(radiusZ.get());
|
||||
} else {
|
||||
@@ -84,7 +86,7 @@ public class StartCommand extends ChunkyCommand {
|
||||
chunky.getScheduler().runTask(generationTask);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_START, current.world().getName(), translate("shape_" + current.shape()), Formatting.number(current.centerX()), Formatting.number(current.centerZ()), Formatting.radius(current));
|
||||
};
|
||||
if (chunky.getConfig().loadTask(current.world()).filter(task -> !task.isCancelled()).isPresent()) {
|
||||
if (chunky.getTaskLoader().loadTask(current.world()).filter(task -> !task.isCancelled()).isPresent()) {
|
||||
chunky.setPendingAction(sender, startAction);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_START_CONFIRM, "/chunky continue", "/chunky confirm");
|
||||
} else {
|
||||
@@ -93,14 +95,14 @@ public class StartCommand extends ChunkyCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
} else if (args.length == 3) {
|
||||
return ShapeType.ALL;
|
||||
} else if (arguments.size() == 2) {
|
||||
return ShapeType.all();
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,11 @@ package org.popcraft.chunky.command;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.nbt.LongTag;
|
||||
import org.popcraft.chunky.nbt.Tag;
|
||||
import org.popcraft.chunky.nbt.TagType;
|
||||
import org.popcraft.chunky.nbt.util.ChunkFilter;
|
||||
import org.popcraft.chunky.nbt.util.RegionFile;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.shape.Shape;
|
||||
@@ -17,22 +22,24 @@ import java.io.RandomAccessFile;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.popcraft.chunky.util.Translator.translate;
|
||||
|
||||
public class TrimCommand extends ChunkyCommand {
|
||||
public class TrimCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public TrimCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length > 1) {
|
||||
final Optional<World> world = Input.tryWorld(chunky, args[1]);
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = arguments.next().flatMap(arg -> Input.tryWorld(chunky, arg));
|
||||
if (world.isPresent()) {
|
||||
chunky.getSelection().world(world.get());
|
||||
} else {
|
||||
@@ -40,8 +47,8 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 2) {
|
||||
final Optional<String> shape = Input.tryShape(args[2]);
|
||||
if (arguments.size() > 1) {
|
||||
final Optional<String> shape = arguments.next().flatMap(Input::tryShape);
|
||||
if (shape.isPresent()) {
|
||||
chunky.getSelection().shape(shape.get());
|
||||
} else {
|
||||
@@ -49,9 +56,9 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 3) {
|
||||
final Optional<Double> centerX = Input.tryDoubleSuffixed(args[3]).filter(cx -> !Input.isPastWorldLimit(cx));
|
||||
final Optional<Double> centerZ = Input.tryDoubleSuffixed(args.length > 4 ? args[4] : null).filter(cz -> !Input.isPastWorldLimit(cz));
|
||||
if (arguments.size() > 2) {
|
||||
final Optional<Double> centerX = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(c -> !Input.isPastWorldLimit(c));
|
||||
final Optional<Double> centerZ = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(c -> !Input.isPastWorldLimit(c));
|
||||
if (centerX.isPresent() && centerZ.isPresent()) {
|
||||
chunky.getSelection().center(centerX.get(), centerZ.get());
|
||||
} else {
|
||||
@@ -59,8 +66,8 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 5) {
|
||||
final Optional<Double> radiusX = Input.tryDoubleSuffixed(args[5]).filter(rx -> rx >= 0 && !Input.isPastWorldLimit(rx));
|
||||
if (arguments.size() > 4) {
|
||||
final Optional<Double> radiusX = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(r -> r >= 0 && !Input.isPastWorldLimit(r));
|
||||
if (radiusX.isPresent()) {
|
||||
chunky.getSelection().radius(radiusX.get());
|
||||
} else {
|
||||
@@ -68,8 +75,8 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (args.length > 6) {
|
||||
final Optional<Double> radiusZ = Input.tryDoubleSuffixed(args[6]).filter(rz -> rz >= 0 && !Input.isPastWorldLimit(rz));
|
||||
if (arguments.size() > 5) {
|
||||
final Optional<Double> radiusZ = arguments.next().flatMap(Input::tryDoubleSuffixed).filter(r -> r >= 0 && !Input.isPastWorldLimit(r));
|
||||
if (radiusZ.isPresent()) {
|
||||
chunky.getSelection().radiusZ(radiusZ.get());
|
||||
} else {
|
||||
@@ -77,74 +84,89 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return;
|
||||
}
|
||||
}
|
||||
final boolean inside;
|
||||
if (arguments.size() > 6) {
|
||||
final Optional<String> side = arguments.next().map(String::toLowerCase).filter(s -> "outside".equals(s) || "inside".equals(s));
|
||||
if (side.isPresent()) {
|
||||
inside = side.map("inside"::equals).orElse(false);
|
||||
} else {
|
||||
sender.sendMessage(TranslationKey.HELP_TRIM);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
inside = false;
|
||||
}
|
||||
final int inhabitedTime = arguments.next().flatMap(Input::tryIntegerSuffixed).orElse(Integer.MAX_VALUE);
|
||||
final boolean inhabitedTimeCheck = inhabitedTime < Integer.MAX_VALUE;
|
||||
final Selection selection = chunky.getSelection().build();
|
||||
final Shape shape = ShapeFactory.getShape(selection);
|
||||
final Runnable deletionAction = () -> chunky.getScheduler().runTask(() -> {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_START, selection.world().getName(), translate("shape_" + selection.shape()), Formatting.number(selection.centerX()), Formatting.number(selection.centerZ()), Formatting.radius(selection));
|
||||
TrimCommand.Task trimTask = new TrimCommand.Task();
|
||||
chunky.getTrimTasks().put(selection.world().getName(), trimTask);
|
||||
final Optional<Path> regionPath = selection.world().getRegionDirectory();
|
||||
final Optional<Path> poiPath = selection.world().getPOIDirectory();
|
||||
final Optional<Path> entitiesPath = selection.world().getEntitiesDirectory();
|
||||
final AtomicLong finishedRegions = new AtomicLong();
|
||||
final AtomicLong deleted = new AtomicLong();
|
||||
final long startTime = System.currentTimeMillis();
|
||||
final AtomicLong updateTime = new AtomicLong(startTime);
|
||||
try {
|
||||
if (regionPath.isPresent()) {
|
||||
Files.walk(regionPath.get()).forEach(region -> deleted.getAndAdd(checkRegion(region, shape)));
|
||||
}
|
||||
if (poiPath.isPresent()) {
|
||||
Files.walk(poiPath.get()).forEach(region -> checkRegion(region, shape));
|
||||
}
|
||||
if (entitiesPath.isPresent()) {
|
||||
Files.walk(entitiesPath.get()).forEach(region -> checkRegion(region, shape));
|
||||
try (final Stream<Path> files = Files.list(regionPath.get())) {
|
||||
final List<Path> regions = files
|
||||
.filter(file -> ChunkCoordinate.fromRegionFile(file.getFileName().toString()).isPresent())
|
||||
.toList();
|
||||
final long totalRegions = regions.size();
|
||||
for (final Path region : regions) {
|
||||
if (trimTask.isCancelled()) {
|
||||
break;
|
||||
}
|
||||
deleted.getAndAdd(checkRegion(selection.world(), region.getFileName().toString(), shape, inside, inhabitedTimeCheck, inhabitedTime));
|
||||
finishedRegions.getAndIncrement();
|
||||
if (!trimTask.isCancelled() && !chunky.getConfig().isSilent()) {
|
||||
final long currentTime = System.currentTimeMillis();
|
||||
final boolean updateIntervalElapsed = ((currentTime - updateTime.get()) / 1e3) > chunky.getConfig().getUpdateInterval();
|
||||
if (updateIntervalElapsed || finishedRegions.get() == totalRegions) {
|
||||
chunky.getServer().getConsole().sendMessagePrefixed(TranslationKey.TASK_TRIM_UPDATE, selection.world().getName(), finishedRegions.get(), String.format("%.2f", 100f * finishedRegions.get() / totalRegions));
|
||||
updateTime.set(currentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
final long totalTime = System.currentTimeMillis() - startTime;
|
||||
chunky.getTrimTasks().remove(selection.world().getName());
|
||||
sender.sendMessagePrefixed(TranslationKey.TASK_TRIM, deleted.get(), selection.world().getName(), String.format("%.3f", totalTime / 1e3f));
|
||||
});
|
||||
chunky.setPendingAction(sender, deletionAction);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_TRIM_CONFIRM, selection.world().getName(), translate("shape_" + selection.shape()), Formatting.number(selection.centerX()), Formatting.number(selection.centerZ()), Formatting.radius(selection), "/chunky confirm");
|
||||
sender.sendMessagePrefixed(inside ? TranslationKey.FORMAT_TRIM_CONFIRM_INSIDE : TranslationKey.FORMAT_TRIM_CONFIRM, selection.world().getName(), translate("shape_" + selection.shape()), Formatting.number(selection.centerX()), Formatting.number(selection.centerZ()), Formatting.radius(selection), "/chunky confirm");
|
||||
if (inhabitedTimeCheck) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_TRIM_CONFIRM_INHABITED, Formatting.number(inhabitedTime));
|
||||
}
|
||||
}
|
||||
|
||||
private int checkRegion(final Path region, final Shape shape) {
|
||||
final Optional<ChunkCoordinate> regionCoordinate = tryRegionCoordinate(region);
|
||||
if (!regionCoordinate.isPresent()) {
|
||||
private int checkRegion(final World world, final String regionFileName, final Shape shape, final boolean inside, final boolean inhabitedTimeCheck, final int inhabitedTime) {
|
||||
final Optional<ChunkCoordinate> regionCoordinate = ChunkCoordinate.fromRegionFile(regionFileName);
|
||||
if (regionCoordinate.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
final int chunkX = regionCoordinate.get().x << 5;
|
||||
final int chunkZ = regionCoordinate.get().z << 5;
|
||||
if (shouldDeleteRegion(shape, chunkX, chunkZ)) {
|
||||
return deleteRegion(region);
|
||||
final int chunkX = regionCoordinate.get().x() << 5;
|
||||
final int chunkZ = regionCoordinate.get().z() << 5;
|
||||
if (!inhabitedTimeCheck && shouldDeleteRegion(shape, inside, chunkX, chunkZ)) {
|
||||
return deleteRegion(world, regionFileName);
|
||||
} else {
|
||||
return trimRegion(region, shape, chunkX, chunkZ);
|
||||
return trimRegion(world, regionFileName, shape, inside, chunkX, chunkZ, inhabitedTimeCheck, inhabitedTime);
|
||||
}
|
||||
}
|
||||
|
||||
private Optional<ChunkCoordinate> tryRegionCoordinate(final Path region) {
|
||||
final String fileName = region.getFileName().toString();
|
||||
if (!fileName.startsWith("r.")) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final int extension = fileName.indexOf(".mca");
|
||||
if (extension < 2) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final String regionCoordinates = fileName.substring(2, extension);
|
||||
final int separator = regionCoordinates.indexOf('.');
|
||||
final Optional<Integer> regionX = Input.tryInteger(regionCoordinates.substring(0, separator));
|
||||
final Optional<Integer> regionZ = Input.tryInteger(regionCoordinates.substring(separator + 1));
|
||||
if (regionX.isPresent() && regionZ.isPresent()) {
|
||||
return Optional.of(new ChunkCoordinate(regionX.get(), regionZ.get()));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
private boolean shouldDeleteRegion(final Shape shape, final int chunkX, final int chunkZ) {
|
||||
private boolean shouldDeleteRegion(final Shape shape, final boolean inside, final int chunkX, final int chunkZ) {
|
||||
for (int offsetX = 0; offsetX < 32; ++offsetX) {
|
||||
for (int offsetZ = 0; offsetZ < 32; ++offsetZ) {
|
||||
final int chunkCenterX = ((chunkX + offsetX) << 4) + 8;
|
||||
final int chunkCenterZ = ((chunkZ + offsetZ) << 4) + 8;
|
||||
if (shape.isBounding(chunkCenterX, chunkCenterZ)) {
|
||||
if (inside != shape.isBounding(chunkCenterX, chunkCenterZ)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -152,9 +174,18 @@ public class TrimCommand extends ChunkyCommand {
|
||||
return true;
|
||||
}
|
||||
|
||||
private int deleteRegion(final Path region) {
|
||||
private int deleteRegion(final World world, final String regionFileName) {
|
||||
try {
|
||||
Files.deleteIfExists(region);
|
||||
final Path regionPath = world.getRegionDirectory().map(region -> region.resolve(regionFileName)).orElseThrow(IllegalStateException::new);
|
||||
Files.deleteIfExists(regionPath);
|
||||
final Path poiPath = world.getPOIDirectory().map(region -> region.resolve(regionFileName)).orElse(null);
|
||||
if (poiPath != null) {
|
||||
Files.deleteIfExists(poiPath);
|
||||
}
|
||||
final Path entitiesPath = world.getEntitiesDirectory().map(region -> region.resolve(regionFileName)).orElse(null);
|
||||
if (entitiesPath != null) {
|
||||
Files.deleteIfExists(entitiesPath);
|
||||
}
|
||||
return 1024;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -162,17 +193,44 @@ public class TrimCommand extends ChunkyCommand {
|
||||
}
|
||||
}
|
||||
|
||||
private int trimRegion(final Path region, final Shape shape, final int chunkX, final int chunkZ) {
|
||||
private int trimRegion(final World world, final String regionFileName, final Shape shape, final boolean inside, final int chunkX, final int chunkZ, final boolean inhabitedTimeCheck, final int inhabitedTime) {
|
||||
final Path regionPath = world.getRegionDirectory().map(region -> region.resolve(regionFileName)).orElseThrow(IllegalStateException::new);
|
||||
final Path poiPath = world.getPOIDirectory().map(region -> region.resolve(regionFileName)).orElse(null);
|
||||
final Path entitiesPath = world.getEntitiesDirectory().map(region -> region.resolve(regionFileName)).orElse(null);
|
||||
int marked = 0;
|
||||
int deleted = 0;
|
||||
try (RandomAccessFile regionFile = new RandomAccessFile(region.toFile(), "rw")) {
|
||||
final RegionFile regionData = inhabitedTimeCheck ? new RegionFile(regionPath.toFile(), ChunkFilter.of(TagType.LONG, "InhabitedTime")) : null;
|
||||
try (final RandomAccessFile regionFile = new RandomAccessFile(regionPath.toFile(), "rw");
|
||||
final RandomAccessFile poiFile = poiPath == null || Files.notExists(poiPath) ? null : new RandomAccessFile(poiPath.toFile(), "rw");
|
||||
final RandomAccessFile entitiesFile = entitiesPath == null || Files.notExists(entitiesPath) ? null : new RandomAccessFile(entitiesPath.toFile(), "rw")) {
|
||||
if (regionFile.length() < 4096) {
|
||||
return 0;
|
||||
}
|
||||
final boolean poiValid = poiFile != null && poiFile.length() >= 4096;
|
||||
final boolean entitiesValid = entitiesFile != null && entitiesFile.length() >= 4096;
|
||||
for (int offsetX = 0; offsetX < 32; ++offsetX) {
|
||||
for (int offsetZ = 0; offsetZ < 32; ++offsetZ) {
|
||||
final int chunkCenterX = ((chunkX + offsetX) << 4) + 8;
|
||||
final int chunkCenterZ = ((chunkZ + offsetZ) << 4) + 8;
|
||||
if (!shape.isBounding(chunkCenterX, chunkCenterZ)) {
|
||||
final int offsetChunkX = chunkX + offsetX;
|
||||
final int offsetChunkZ = chunkZ + offsetZ;
|
||||
final int chunkCenterX = (offsetChunkX << 4) + 8;
|
||||
final int chunkCenterZ = (offsetChunkZ << 4) + 8;
|
||||
final boolean trimChunk;
|
||||
if (inside) {
|
||||
trimChunk = shape.isBounding(chunkCenterX, chunkCenterZ);
|
||||
} else {
|
||||
trimChunk = !shape.isBounding(chunkCenterX, chunkCenterZ);
|
||||
}
|
||||
final boolean trimInhabited = regionData == null || regionData.getChunk(offsetChunkX, offsetChunkZ)
|
||||
.map(chunk -> {
|
||||
final Tag tag = chunk.getData();
|
||||
if (!(tag instanceof final LongTag inhabited)) {
|
||||
return true;
|
||||
}
|
||||
return inhabited.value() <= inhabitedTime;
|
||||
})
|
||||
.orElse(true);
|
||||
if (trimChunk && trimInhabited) {
|
||||
++marked;
|
||||
final int chunkLocation = ((offsetX % 32) + (offsetZ % 32) * 32) * 4;
|
||||
regionFile.seek(chunkLocation);
|
||||
if (regionFile.readInt() != 0) {
|
||||
@@ -180,24 +238,53 @@ public class TrimCommand extends ChunkyCommand {
|
||||
regionFile.writeInt(0);
|
||||
++deleted;
|
||||
}
|
||||
if (poiValid) {
|
||||
poiFile.seek(chunkLocation);
|
||||
if (poiFile.readInt() != 0) {
|
||||
poiFile.seek(chunkLocation);
|
||||
poiFile.writeInt(0);
|
||||
}
|
||||
}
|
||||
if (entitiesValid) {
|
||||
entitiesFile.seek(chunkLocation);
|
||||
if (entitiesFile.readInt() != 0) {
|
||||
entitiesFile.seek(chunkLocation);
|
||||
entitiesFile.writeInt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (inhabitedTimeCheck && marked == 1024) {
|
||||
deleteRegion(world, regionFileName);
|
||||
}
|
||||
return deleted;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
} else if (args.length == 3) {
|
||||
return ShapeType.ALL;
|
||||
} else if (arguments.size() == 2) {
|
||||
return ShapeType.all();
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
|
||||
public static final class Task {
|
||||
private boolean cancelled;
|
||||
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
public void setCancelled(final boolean cancelled) {
|
||||
this.cancelled = cancelled;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@@ -9,16 +9,32 @@ import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.platform.util.Vector2;
|
||||
import org.popcraft.chunky.util.Formatting;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class WorldBorderCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public class WorldBorderCommand extends ChunkyCommand {
|
||||
public WorldBorderCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
@Override
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
if (arguments.size() > 0) {
|
||||
final Optional<World> world = arguments.next().flatMap(arg -> Input.tryWorld(chunky, arg));
|
||||
if (world.isPresent()) {
|
||||
chunky.getSelection().world(world.get());
|
||||
} else {
|
||||
sender.sendMessage(TranslationKey.HELP_WORLDBORDER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
final Selection previous = chunky.getSelection().build();
|
||||
if (!setBorderViaIntegration(previous.world())) {
|
||||
chunky.getSelection().worldborder();
|
||||
@@ -33,6 +49,19 @@ public class WorldBorderCommand extends ChunkyCommand {
|
||||
if (!previous.shape().equals(current.shape())) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_SHAPE, current.shape());
|
||||
}
|
||||
if (current.radiusX() > chunky.getServer().getMaxWorldSize()) {
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_WORLDBORDER_TOO_LARGE, chunky.getServer().getMaxWorldSize());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
|
||||
boolean setBorderViaIntegration(final World world) {
|
||||
|
||||
@@ -1,43 +1,45 @@
|
||||
package org.popcraft.chunky.command;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.platform.Player;
|
||||
import org.popcraft.chunky.platform.Sender;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class WorldCommand extends ChunkyCommand {
|
||||
public class WorldCommand implements ChunkyCommand {
|
||||
private final Chunky chunky;
|
||||
|
||||
public WorldCommand(final Chunky chunky) {
|
||||
super(chunky);
|
||||
}
|
||||
|
||||
public void execute(final Sender sender, final String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(TranslationKey.HELP_WORLD);
|
||||
return;
|
||||
}
|
||||
final Optional<World> newWorld = Input.tryWorld(chunky, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
|
||||
if (!newWorld.isPresent()) {
|
||||
sender.sendMessage(TranslationKey.HELP_WORLD);
|
||||
return;
|
||||
}
|
||||
chunky.getSelection().world(newWorld.get());
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_WORLD, newWorld.get().getName());
|
||||
this.chunky = chunky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> tabSuggestions(final String[] args) {
|
||||
if (args.length == 2) {
|
||||
public void execute(final Sender sender, final CommandArguments arguments) {
|
||||
final World world;
|
||||
if (arguments.size() == 0 && sender instanceof final Player player) {
|
||||
world = player.getWorld();
|
||||
} else {
|
||||
world = Input.tryWorld(chunky, arguments.joined()).orElse(null);
|
||||
}
|
||||
if (world == null) {
|
||||
sender.sendMessage(TranslationKey.HELP_WORLD);
|
||||
return;
|
||||
}
|
||||
chunky.getSelection().world(world);
|
||||
sender.sendMessagePrefixed(TranslationKey.FORMAT_WORLD, world.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> suggestions(final CommandArguments arguments) {
|
||||
if (arguments.size() == 1) {
|
||||
final List<String> suggestions = new ArrayList<>();
|
||||
chunky.getServer().getWorlds().forEach(world -> suggestions.add(world.getName()));
|
||||
return suggestions;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package org.popcraft.chunky.event.command;
|
||||
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
public record ReloadCommandEvent() implements Event {
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package org.popcraft.chunky.event.task;
|
||||
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
public class GenerationTaskEvent implements Event {
|
||||
private final GenerationTask generationTask;
|
||||
|
||||
public GenerationTaskEvent(final GenerationTask generationTask) {
|
||||
this.generationTask = generationTask;
|
||||
}
|
||||
|
||||
public GenerationTask getGenerationTask() {
|
||||
return generationTask;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
package org.popcraft.chunky.event.task;
|
||||
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
public class GenerationTaskFinishEvent extends GenerationTaskEvent {
|
||||
public GenerationTaskFinishEvent(final GenerationTask generationTask) {
|
||||
super(generationTask);
|
||||
}
|
||||
public record GenerationTaskFinishEvent(GenerationTask generationTask) implements Event {
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
package org.popcraft.chunky.event.task;
|
||||
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.event.Event;
|
||||
|
||||
public class GenerationTaskUpdateEvent extends GenerationTaskEvent {
|
||||
public GenerationTaskUpdateEvent(final GenerationTask generationTask) {
|
||||
super(generationTask);
|
||||
}
|
||||
public record GenerationTaskUpdateEvent(GenerationTask generationTask) implements Event {
|
||||
}
|
||||
@@ -8,4 +8,8 @@ public interface ChunkIterator extends Iterator<ChunkCoordinate> {
|
||||
long total();
|
||||
|
||||
String name();
|
||||
|
||||
default boolean process() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -8,25 +8,20 @@ public final class ChunkIteratorFactory {
|
||||
}
|
||||
|
||||
public static ChunkIterator getChunkIterator(final Selection selection, final long count) {
|
||||
switch (selection.shape()) {
|
||||
case ShapeType.RECTANGLE:
|
||||
case ShapeType.ELLIPSE:
|
||||
case ShapeType.OVAL:
|
||||
return new Loop2ChunkIterator(selection, count);
|
||||
default:
|
||||
break;
|
||||
if (selection.pattern().getType().equals(PatternType.WORLD)) {
|
||||
return new WorldChunkIterator(selection);
|
||||
}
|
||||
switch (selection.pattern().getType()) {
|
||||
case PatternType.LOOP:
|
||||
return new Loop2ChunkIterator(selection, count);
|
||||
case PatternType.SPIRAL:
|
||||
return new SpiralChunkIterator(selection, count);
|
||||
case PatternType.CSV:
|
||||
return new CsvChunkIterator(selection, count);
|
||||
case PatternType.CONCENTRIC:
|
||||
default:
|
||||
return new ConcentricChunkIterator(selection, count);
|
||||
final String shape = selection.shape();
|
||||
if (ShapeType.RECTANGLE.equals(shape) || ShapeType.ELLIPSE.equals(shape) || ShapeType.OVAL.equals(shape)) {
|
||||
return new Loop2ChunkIterator(selection, count);
|
||||
}
|
||||
return switch (selection.pattern().getType()) {
|
||||
case PatternType.LOOP -> new Loop2ChunkIterator(selection, count);
|
||||
case PatternType.SPIRAL -> new SpiralChunkIterator(selection, count);
|
||||
case PatternType.CSV -> new CsvChunkIterator(selection, count);
|
||||
case PatternType.CONCENTRIC -> new ConcentricChunkIterator(selection, count);
|
||||
default -> new RegionChunkIterator(selection, count);
|
||||
};
|
||||
}
|
||||
|
||||
public static ChunkIterator getChunkIterator(final Selection selection) {
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.popcraft.chunky.iterator;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.util.ChunkCoordinate;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class ConcentricChunkIterator implements ChunkIterator {
|
||||
private final int xCenter, zCenter;
|
||||
private final int radiusChunks;
|
||||
@@ -57,6 +59,9 @@ public class ConcentricChunkIterator implements ChunkIterator {
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (!hasNext) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
final ChunkCoordinate chunkCoord = new ChunkCoordinate(x, z);
|
||||
if (x == xCenter + annulus && z == zCenter + annulus) {
|
||||
++annulus;
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.LinkedList;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Optional;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
@@ -59,6 +60,9 @@ public class CsvChunkIterator implements ChunkIterator {
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (chunks.isEmpty()) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
return chunks.poll();
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.popcraft.chunky.iterator;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.util.ChunkCoordinate;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class Loop2ChunkIterator implements ChunkIterator {
|
||||
private final int x1, x2, z1, z2;
|
||||
private final long diameterChunksZ;
|
||||
@@ -45,6 +47,9 @@ public class Loop2ChunkIterator implements ChunkIterator {
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (!hasNext) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
final ChunkCoordinate chunkCoord = new ChunkCoordinate(x, z);
|
||||
if (++z > z2) {
|
||||
z = z1;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.popcraft.chunky.iterator;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public final class PatternType {
|
||||
@@ -9,8 +7,10 @@ public final class PatternType {
|
||||
public static final String LOOP = "loop";
|
||||
public static final String SPIRAL = "spiral";
|
||||
public static final String CSV = "csv";
|
||||
public static final String REGION = "region";
|
||||
public static final String WORLD = "world";
|
||||
|
||||
public static final List<String> ALL = Collections.unmodifiableList(Arrays.asList(CONCENTRIC, LOOP, SPIRAL, CSV));
|
||||
public static final List<String> ALL = List.of(CONCENTRIC, LOOP, SPIRAL, CSV, REGION, WORLD);
|
||||
|
||||
private PatternType() {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
package org.popcraft.chunky.iterator;
|
||||
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.util.ChunkCoordinate;
|
||||
import org.popcraft.chunky.util.Hilbert;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class RegionChunkIterator implements ChunkIterator {
|
||||
private final int centerRegionX;
|
||||
private final int centerRegionZ;
|
||||
private final int radiusRegions;
|
||||
private final int minChunkX;
|
||||
private final int minChunkZ;
|
||||
private final int maxChunkX;
|
||||
private final int maxChunkZ;
|
||||
private final long totalChunks;
|
||||
private RegionChunkProgress currentRegionProgress;
|
||||
private int regionX;
|
||||
private int regionZ;
|
||||
private int annulusRegions;
|
||||
private int spanRegions;
|
||||
private int downRegions;
|
||||
private int leftRegions;
|
||||
private int upRegions;
|
||||
private int rightRegions;
|
||||
private boolean hasNextRegion = true;
|
||||
private boolean hasNext = true;
|
||||
|
||||
public RegionChunkIterator(final Selection selection, final long count) {
|
||||
this(selection);
|
||||
if (count <= 0) {
|
||||
return;
|
||||
}
|
||||
this.currentRegionProgress = null;
|
||||
this.regionX = centerRegionX;
|
||||
this.regionZ = centerRegionZ;
|
||||
this.annulusRegions = 0;
|
||||
this.spanRegions = 0;
|
||||
this.downRegions = this.leftRegions = this.upRegions = this.rightRegions = 0;
|
||||
this.hasNextRegion = true;
|
||||
this.hasNext = true;
|
||||
long countRemainingChunks = count;
|
||||
final long estimatedRegionCount = count / 1024;
|
||||
int estimatedDiameterRegions = (int) Math.floor(Math.sqrt(estimatedRegionCount));
|
||||
if (estimatedDiameterRegions % 2 == 0) {
|
||||
--estimatedDiameterRegions;
|
||||
}
|
||||
if (estimatedDiameterRegions > 2) {
|
||||
final int skipDiameterRegions = estimatedDiameterRegions - 2;
|
||||
this.annulusRegions = skipDiameterRegions / 2 + 1;
|
||||
this.regionX += annulusRegions;
|
||||
this.regionZ += annulusRegions - 1;
|
||||
this.spanRegions = 2 * annulusRegions;
|
||||
++this.downRegions;
|
||||
final long skipChunks = ((long) skipDiameterRegions * skipDiameterRegions) * 1024;
|
||||
countRemainingChunks -= skipChunks;
|
||||
}
|
||||
currentRegionProgress = nextRegionChunkProgress(countRemainingChunks);
|
||||
countRemainingChunks -= Math.min(countRemainingChunks, currentRegionProgress == null ? 0 : currentRegionProgress.total());
|
||||
while (currentRegionProgress != null && !currentRegionProgress.hasNext()) {
|
||||
currentRegionProgress = nextRegionChunkProgress(countRemainingChunks);
|
||||
countRemainingChunks -= Math.min(countRemainingChunks, currentRegionProgress == null ? 0 : currentRegionProgress.total());
|
||||
}
|
||||
if (currentRegionProgress == null) {
|
||||
hasNext = false;
|
||||
}
|
||||
}
|
||||
|
||||
public RegionChunkIterator(final Selection selection) {
|
||||
this.centerRegionX = selection.centerRegionX();
|
||||
this.centerRegionZ = selection.centerRegionZ();
|
||||
this.radiusRegions = selection.radiusRegionsX();
|
||||
final int centerChunkX = selection.centerChunkX();
|
||||
final int centerChunkZ = selection.centerChunkZ();
|
||||
final int radiusChunks = selection.radiusChunksX();
|
||||
this.minChunkX = centerChunkX - radiusChunks;
|
||||
this.minChunkZ = centerChunkZ - radiusChunks;
|
||||
this.maxChunkX = centerChunkX + radiusChunks;
|
||||
this.maxChunkZ = centerChunkZ + radiusChunks;
|
||||
this.regionX = centerRegionX;
|
||||
this.regionZ = centerRegionZ;
|
||||
final long diameterChunks = selection.diameterChunksX();
|
||||
this.totalChunks = diameterChunks * diameterChunks;
|
||||
this.currentRegionProgress = nextRegionChunkProgress();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return hasNext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (!hasNext) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
final ChunkCoordinate chunkCoord = currentRegionProgress.next();
|
||||
while (currentRegionProgress != null && !currentRegionProgress.hasNext()) {
|
||||
currentRegionProgress = nextRegionChunkProgress();
|
||||
}
|
||||
if (currentRegionProgress == null) {
|
||||
hasNext = false;
|
||||
}
|
||||
return chunkCoord;
|
||||
}
|
||||
|
||||
private RegionChunkProgress nextRegionChunkProgress() {
|
||||
return nextRegionChunkProgress(0);
|
||||
}
|
||||
|
||||
private RegionChunkProgress nextRegionChunkProgress(final long count) {
|
||||
if (!hasNextRegion) {
|
||||
return null;
|
||||
}
|
||||
final RegionChunkProgress regionChunkProgress = new RegionChunkProgress(regionX, regionZ, count);
|
||||
if (regionX == centerRegionX + annulusRegions && regionZ == centerRegionZ + annulusRegions) {
|
||||
++annulusRegions;
|
||||
++regionX;
|
||||
++regionZ;
|
||||
if (annulusRegions > radiusRegions) {
|
||||
hasNextRegion = false;
|
||||
}
|
||||
spanRegions = 2 * annulusRegions;
|
||||
downRegions = leftRegions = upRegions = rightRegions = 0;
|
||||
}
|
||||
if (downRegions < spanRegions) {
|
||||
--regionZ;
|
||||
++downRegions;
|
||||
} else if (leftRegions < spanRegions) {
|
||||
--regionX;
|
||||
++leftRegions;
|
||||
} else if (upRegions < spanRegions) {
|
||||
++regionZ;
|
||||
++upRegions;
|
||||
} else if (rightRegions < spanRegions) {
|
||||
++regionX;
|
||||
++rightRegions;
|
||||
}
|
||||
return regionChunkProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long total() {
|
||||
return totalChunks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return PatternType.REGION;
|
||||
}
|
||||
|
||||
public final class RegionChunkProgress implements ChunkIterator {
|
||||
private final int minX;
|
||||
private final int minZ;
|
||||
private final int sizeZ;
|
||||
private final int total;
|
||||
private final boolean full;
|
||||
private final String name;
|
||||
private int current;
|
||||
private int offsetX;
|
||||
private int offsetZ;
|
||||
private boolean hasNext = true;
|
||||
|
||||
public RegionChunkProgress(final int x, final int z, final long count) {
|
||||
this(x, z);
|
||||
if (count <= 0) {
|
||||
return;
|
||||
}
|
||||
this.current = (int) Math.min(count, 1024);
|
||||
if (!full && sizeZ > 0) {
|
||||
offsetX = current / sizeZ;
|
||||
offsetZ = current % sizeZ;
|
||||
}
|
||||
if (current >= total) {
|
||||
this.hasNext = false;
|
||||
}
|
||||
}
|
||||
|
||||
public RegionChunkProgress(final int x, final int z) {
|
||||
final int lowEdgeX = x << 5;
|
||||
final int lowEdgeZ = z << 5;
|
||||
final int highEdgeX = lowEdgeX + 31;
|
||||
final int highEdgeZ = lowEdgeZ + 31;
|
||||
this.minX = Math.max(lowEdgeX, minChunkX);
|
||||
this.minZ = Math.max(lowEdgeZ, minChunkZ);
|
||||
final int maxX = Math.min(highEdgeX, maxChunkX);
|
||||
final int maxZ = Math.min(highEdgeZ, maxChunkZ);
|
||||
final int sizeX = maxX - minX + 1;
|
||||
if (minX > highEdgeX || minZ > highEdgeZ || maxX < lowEdgeX || maxZ < lowEdgeZ) {
|
||||
this.sizeZ = 0;
|
||||
this.total = 0;
|
||||
this.full = false;
|
||||
this.hasNext = false;
|
||||
} else {
|
||||
this.sizeZ = maxZ - minZ + 1;
|
||||
this.total = sizeX * sizeZ;
|
||||
this.full = total == 1024;
|
||||
}
|
||||
this.name = "region_chunk_progress_%d_%d".formatted(x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return hasNext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (!hasNext) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
final ChunkCoordinate chunkCoord;
|
||||
if (full) {
|
||||
final ChunkCoordinate offset = Hilbert.regionDistanceToChunkCoordinateOffset(current);
|
||||
chunkCoord = new ChunkCoordinate(minX + offset.x(), minZ + offset.z());
|
||||
} else {
|
||||
chunkCoord = new ChunkCoordinate(minX + offsetX, minZ + offsetZ);
|
||||
if (++offsetZ >= sizeZ) {
|
||||
offsetZ = 0;
|
||||
++offsetX;
|
||||
}
|
||||
}
|
||||
++current;
|
||||
if (current >= total) {
|
||||
hasNext = false;
|
||||
}
|
||||
return chunkCoord;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long total() {
|
||||
return total;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package org.popcraft.chunky.iterator;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.util.ChunkCoordinate;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class SpiralChunkIterator implements ChunkIterator {
|
||||
private static final int RIGHT = 0, DOWN = 1, LEFT = 2, UP = 3;
|
||||
private final int stopX, stopZ;
|
||||
@@ -88,6 +90,9 @@ public class SpiralChunkIterator implements ChunkIterator {
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (!hasNext) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
final ChunkCoordinate chunkCoord = new ChunkCoordinate(x, z);
|
||||
if (x == stopX && z == stopZ) {
|
||||
hasNext = false;
|
||||
@@ -96,21 +101,16 @@ public class SpiralChunkIterator implements ChunkIterator {
|
||||
spanCount = 0;
|
||||
++span;
|
||||
}
|
||||
switch (direction) {
|
||||
case RIGHT:
|
||||
x += 1;
|
||||
break;
|
||||
case DOWN:
|
||||
z -= 1;
|
||||
break;
|
||||
case LEFT:
|
||||
x -= 1;
|
||||
break;
|
||||
case UP:
|
||||
z += 1;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Invalid direction");
|
||||
if (direction == RIGHT) {
|
||||
x += 1;
|
||||
} else if (direction == DOWN) {
|
||||
z -= 1;
|
||||
} else if (direction == LEFT) {
|
||||
x -= 1;
|
||||
} else if (direction == UP) {
|
||||
z += 1;
|
||||
} else {
|
||||
throw new IllegalStateException("Invalid direction");
|
||||
}
|
||||
++spanProgress;
|
||||
if (spanProgress == span) {
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
package org.popcraft.chunky.iterator;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.nbt.StringTag;
|
||||
import org.popcraft.chunky.nbt.TagType;
|
||||
import org.popcraft.chunky.nbt.util.ChunkFilter;
|
||||
import org.popcraft.chunky.nbt.util.RegionFile;
|
||||
import org.popcraft.chunky.util.ChunkCoordinate;
|
||||
import org.popcraft.chunky.util.Hilbert;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
import org.popcraft.chunky.util.TranslationKey;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Optional;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class WorldChunkIterator implements ChunkIterator {
|
||||
private final Chunky chunky;
|
||||
private final int minRegionX;
|
||||
private final int minRegionZ;
|
||||
private final int maxRegionX;
|
||||
private final int maxRegionZ;
|
||||
private final int minChunkX;
|
||||
private final int minChunkZ;
|
||||
private final int maxChunkX;
|
||||
private final int maxChunkZ;
|
||||
private final String worldName;
|
||||
private final Queue<ChunkCoordinate> chunks;
|
||||
private final AtomicLong total = new AtomicLong();
|
||||
private final Path savePath;
|
||||
private final Path regionPath;
|
||||
private final String name;
|
||||
|
||||
public WorldChunkIterator(final Selection selection) {
|
||||
this.chunky = selection.chunky();
|
||||
final int centerRegionX = selection.centerRegionX();
|
||||
final int centerRegionZ = selection.centerRegionZ();
|
||||
final int radiusRegionsX = selection.radiusRegionsX();
|
||||
final int radiusRegionsZ = selection.radiusRegionsZ();
|
||||
this.minRegionX = centerRegionX - radiusRegionsX;
|
||||
this.minRegionZ = centerRegionZ - radiusRegionsZ;
|
||||
this.maxRegionX = centerRegionX + radiusRegionsX;
|
||||
this.maxRegionZ = centerRegionZ + radiusRegionsZ;
|
||||
final int centerChunkX = selection.centerChunkX();
|
||||
final int centerChunkZ = selection.centerChunkZ();
|
||||
final int radiusChunksX = selection.radiusChunksX();
|
||||
final int radiusChunksZ = selection.radiusChunksZ();
|
||||
this.minChunkX = centerChunkX - radiusChunksX;
|
||||
this.minChunkZ = centerChunkZ - radiusChunksZ;
|
||||
this.maxChunkX = centerChunkX + radiusChunksX;
|
||||
this.maxChunkZ = centerChunkZ + radiusChunksZ;
|
||||
this.chunks = new LinkedList<>();
|
||||
this.worldName = selection.world().getName();
|
||||
final String saveFile = worldName.substring(worldName.indexOf(':') + 1);
|
||||
this.savePath = selection.chunky().getConfig().getDirectory().resolve(String.format("%s.csv", saveFile));
|
||||
this.regionPath = selection.world().getRegionDirectory().orElse(null);
|
||||
this.name = Parameter.of(PatternType.CSV, saveFile).toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !chunks.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordinate next() {
|
||||
if (chunks.isEmpty()) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
return chunks.poll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long total() {
|
||||
return total.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process() {
|
||||
if (regionPath == null) {
|
||||
return false;
|
||||
}
|
||||
final long startTime = System.currentTimeMillis();
|
||||
final AtomicLong updateTime = new AtomicLong(startTime);
|
||||
final StringBuilder saveData = new StringBuilder();
|
||||
try (final Stream<Path> files = Files.list(regionPath)) {
|
||||
final List<Path> regions = files
|
||||
.filter(file -> {
|
||||
final ChunkCoordinate regionCoordinate = ChunkCoordinate.fromRegionFile(file.getFileName().toString())
|
||||
.orElse(null);
|
||||
return regionCoordinate != null && regionCoordinate.x() >= minRegionX && regionCoordinate.x() <= maxRegionX && regionCoordinate.z() >= minRegionZ && regionCoordinate.z() <= maxRegionZ;
|
||||
})
|
||||
.toList();
|
||||
final long totalRegions = regions.size();
|
||||
final AtomicLong finishedRegions = new AtomicLong();
|
||||
for (final Path region : regions) {
|
||||
final ChunkCoordinate regionCoordinate = ChunkCoordinate.fromRegionFile(region.getFileName().toString())
|
||||
.orElseThrow(IllegalStateException::new);
|
||||
final int regionX = regionCoordinate.x();
|
||||
final int regionZ = regionCoordinate.z();
|
||||
final RegionFile regionFile = new RegionFile(region.toFile(), ChunkFilter.of(TagType.STRING, "Status"));
|
||||
for (final ChunkCoordinate offset : Hilbert.chunkCoordinateOffsets()) {
|
||||
final ChunkCoordinate chunkCoordinate = new ChunkCoordinate((regionX << 5) + offset.x(), (regionZ << 5) + offset.z());
|
||||
if (chunkCoordinate.x() < minChunkX || chunkCoordinate.x() > maxChunkX || chunkCoordinate.z() < minChunkZ || chunkCoordinate.z() > maxChunkZ) {
|
||||
continue;
|
||||
}
|
||||
regionFile.getChunk(chunkCoordinate.x(), chunkCoordinate.z()).ifPresent(chunk -> {
|
||||
final boolean generated = Optional.ofNullable(chunk.getData())
|
||||
.filter(StringTag.class::isInstance)
|
||||
.map(StringTag.class::cast)
|
||||
.map(StringTag::value)
|
||||
.map(status -> "minecraft:full".equals(status) || "full".equals(status))
|
||||
.orElse(false);
|
||||
if (generated) {
|
||||
chunks.add(chunkCoordinate);
|
||||
saveData.append(chunkCoordinate.x()).append(',').append(chunkCoordinate.z()).append('\n');
|
||||
total.incrementAndGet();
|
||||
}
|
||||
});
|
||||
}
|
||||
finishedRegions.getAndIncrement();
|
||||
if (!chunky.getConfig().isSilent()) {
|
||||
final long currentTime = System.currentTimeMillis();
|
||||
final boolean updateIntervalElapsed = ((currentTime - updateTime.get()) / 1e3) > chunky.getConfig().getUpdateInterval();
|
||||
if (updateIntervalElapsed || finishedRegions.get() == totalRegions) {
|
||||
chunky.getServer().getConsole().sendMessagePrefixed(TranslationKey.TASK_TRIM_UPDATE, worldName, finishedRegions.get(), String.format("%.2f", 100f * finishedRegions.get() / totalRegions));
|
||||
updateTime.set(currentTime);
|
||||
}
|
||||
}
|
||||
if (Thread.interrupted()) {
|
||||
Thread.currentThread().interrupt();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Files.writeString(savePath, saveData, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +1,18 @@
|
||||
package org.popcraft.chunky.platform;
|
||||
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public interface Config {
|
||||
Path getDirectory();
|
||||
|
||||
Optional<GenerationTask> loadTask(World world);
|
||||
|
||||
List<GenerationTask> loadTasks();
|
||||
|
||||
void saveTask(GenerationTask generationTask);
|
||||
|
||||
void saveTasks();
|
||||
|
||||
void cancelTask(World world);
|
||||
|
||||
void cancelTasks();
|
||||
|
||||
int getVersion();
|
||||
|
||||
String getLanguage();
|
||||
|
||||
boolean getContinueOnRestart();
|
||||
|
||||
boolean isForceLoadExistingChunks();
|
||||
|
||||
boolean isSilent();
|
||||
|
||||
void setSilent(boolean silent);
|
||||
|
||||
@@ -14,6 +14,8 @@ public interface Server {
|
||||
|
||||
List<World> getWorlds();
|
||||
|
||||
int getMaxWorldSize();
|
||||
|
||||
Sender getConsole();
|
||||
|
||||
Collection<Player> getPlayers();
|
||||
|
||||
@@ -12,7 +12,7 @@ public interface World {
|
||||
|
||||
String getKey();
|
||||
|
||||
boolean isChunkGenerated(int x, int z);
|
||||
CompletableFuture<Boolean> isChunkGenerated(int x, int z);
|
||||
|
||||
CompletableFuture<Void> getChunkAtAsync(int x, int z);
|
||||
|
||||
@@ -26,6 +26,8 @@ public interface World {
|
||||
|
||||
int getElevation(int x, int z);
|
||||
|
||||
int getMaxElevation();
|
||||
|
||||
void playEffect(Player player, String effect);
|
||||
|
||||
void playSound(Player player, String sound);
|
||||
|
||||
@@ -2,15 +2,8 @@ package org.popcraft.chunky.platform.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.iterator.PatternType;
|
||||
import org.popcraft.chunky.platform.Config;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.shape.ShapeType;
|
||||
import org.popcraft.chunky.util.Input;
|
||||
import org.popcraft.chunky.util.Parameter;
|
||||
import org.popcraft.chunky.util.Translator;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -18,21 +11,15 @@ import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class GsonConfig implements Config {
|
||||
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
||||
private final Supplier<Chunky> chunky;
|
||||
private final Path savePath;
|
||||
private ConfigModel configModel = new ConfigModel();
|
||||
|
||||
public GsonConfig(final Supplier<Chunky> chunky, final Path savePath) {
|
||||
this.chunky = chunky;
|
||||
public GsonConfig(final Path savePath) {
|
||||
this.savePath = savePath;
|
||||
if (Files.exists(this.savePath)) {
|
||||
reload();
|
||||
@@ -47,80 +34,6 @@ public class GsonConfig implements Config {
|
||||
return savePath.getParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<GenerationTask> loadTask(final World world) {
|
||||
final Map<String, TaskModel> tasks = Optional.ofNullable(configModel.tasks).orElse(new HashMap<>());
|
||||
final TaskModel taskModel = tasks.get(world.getName());
|
||||
if (taskModel == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final boolean cancelled = Optional.ofNullable(taskModel.cancelled).orElse(false);
|
||||
final double radiusX = Optional.ofNullable(taskModel.radius).orElse(Selection.DEFAULT_RADIUS);
|
||||
final double radiusZ = Optional.ofNullable(taskModel.radiusZ).orElse(radiusX);
|
||||
final Selection.Builder selection = Selection.builder(chunky.get(), world)
|
||||
.centerX(Optional.ofNullable(taskModel.centerX).orElse(Selection.DEFAULT_CENTER_X))
|
||||
.centerZ(Optional.ofNullable(taskModel.centerZ).orElse(Selection.DEFAULT_CENTER_Z))
|
||||
.radiusX(radiusX)
|
||||
.radiusZ(radiusZ)
|
||||
.pattern(Parameter.of(Optional.ofNullable(taskModel.iterator).orElse(PatternType.CONCENTRIC)))
|
||||
.shape(Optional.ofNullable(taskModel.shape).orElse(ShapeType.SQUARE));
|
||||
final long count = taskModel.count;
|
||||
final long time = taskModel.time;
|
||||
return Optional.of(new GenerationTask(chunky.get(), selection.build(), count, time, cancelled));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GenerationTask> loadTasks() {
|
||||
final List<GenerationTask> generationTasks = new ArrayList<>();
|
||||
chunky.get().getServer().getWorlds().forEach(world -> loadTask(world).ifPresent(generationTasks::add));
|
||||
return generationTasks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTask(final GenerationTask generationTask) {
|
||||
if (configModel.tasks == null) {
|
||||
configModel.tasks = new HashMap<>();
|
||||
}
|
||||
final Map<String, TaskModel> tasks = configModel.tasks;
|
||||
final Selection selection = generationTask.getSelection();
|
||||
final TaskModel taskModel = tasks.getOrDefault(selection.world().getName(), new TaskModel());
|
||||
final String shape = generationTask.getShape().name();
|
||||
taskModel.cancelled = generationTask.isCancelled();
|
||||
taskModel.radius = selection.radiusX();
|
||||
if (ShapeType.RECTANGLE.equals(shape) || ShapeType.ELLIPSE.equals(shape)) {
|
||||
taskModel.radiusZ = selection.radiusZ();
|
||||
}
|
||||
taskModel.centerX = selection.centerX();
|
||||
taskModel.centerZ = selection.centerZ();
|
||||
taskModel.iterator = generationTask.getChunkIterator().name();
|
||||
taskModel.shape = shape;
|
||||
taskModel.count = generationTask.getCount();
|
||||
taskModel.time = generationTask.getTotalTime();
|
||||
tasks.put(selection.world().getName(), taskModel);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTasks() {
|
||||
chunky.get().getGenerationTasks().values().forEach(this::saveTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelTask(final World world) {
|
||||
loadTask(world).ifPresent(generationTask -> {
|
||||
generationTask.stop(true);
|
||||
saveTask(generationTask);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelTasks() {
|
||||
loadTasks().forEach(generationTask -> {
|
||||
generationTask.stop(true);
|
||||
saveTask(generationTask);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVersion() {
|
||||
return Optional.ofNullable(configModel.version).orElse(0);
|
||||
@@ -136,6 +49,11 @@ public class GsonConfig implements Config {
|
||||
return Optional.ofNullable(configModel.continueOnRestart).orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceLoadExistingChunks() {
|
||||
return Optional.ofNullable(configModel.forceLoadExistingChunks).orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSilent() {
|
||||
return Optional.ofNullable(configModel.silent).orElse(false);
|
||||
@@ -180,9 +98,10 @@ public class GsonConfig implements Config {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static class ConfigModel {
|
||||
private Integer version = 1;
|
||||
private Integer version = 2;
|
||||
private String language = "en";
|
||||
private Boolean continueOnRestart = false;
|
||||
private Boolean forceLoadExistingChunks = false;
|
||||
private Boolean silent = false;
|
||||
private Integer updateInterval = 1;
|
||||
private Map<String, TaskModel> tasks;
|
||||
@@ -211,6 +130,14 @@ public class GsonConfig implements Config {
|
||||
this.continueOnRestart = continueOnRestart;
|
||||
}
|
||||
|
||||
public Boolean getForceLoadExistingChunks() {
|
||||
return forceLoadExistingChunks;
|
||||
}
|
||||
|
||||
public void setForceLoadExistingChunks(final Boolean forceLoadExistingChunks) {
|
||||
this.forceLoadExistingChunks = forceLoadExistingChunks;
|
||||
}
|
||||
|
||||
public Map<String, TaskModel> getTasks() {
|
||||
return tasks;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,5 @@ public abstract class AbstractEllipse extends AbstractShape {
|
||||
super(selection, chunkAligned);
|
||||
}
|
||||
|
||||
public Vector2 radii() {
|
||||
return Vector2.of(radiusX, radiusZ);
|
||||
}
|
||||
public abstract Vector2 radii();
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.popcraft.chunky.shape;
|
||||
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.platform.util.Vector2;
|
||||
|
||||
public class Circle extends AbstractEllipse {
|
||||
public Circle(final Selection selection, final boolean chunkAligned) {
|
||||
@@ -16,4 +17,9 @@ public class Circle extends AbstractEllipse {
|
||||
public String name() {
|
||||
return ShapeType.CIRCLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2 radii() {
|
||||
return Vector2.of(radiusX, radiusX);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.popcraft.chunky.shape;
|
||||
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.platform.util.Vector2;
|
||||
|
||||
public class Ellipse extends AbstractEllipse {
|
||||
public Ellipse(final Selection selection, final boolean chunkAligned) {
|
||||
@@ -16,4 +17,9 @@ public class Ellipse extends AbstractEllipse {
|
||||
public String name() {
|
||||
return ShapeType.ELLIPSE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2 radii() {
|
||||
return Vector2.of(radiusX, radiusZ);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package org.popcraft.chunky.shape;
|
||||
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.platform.util.Vector2;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static org.popcraft.chunky.shape.ShapeUtil.insideLine;
|
||||
|
||||
public class Hexagon extends AbstractPolygon {
|
||||
private final double p1x, p1z, p2x, p2z, p3x, p3z, p4x, p4z, p5x, p5z, p6x, p6z;
|
||||
|
||||
public Hexagon(final Selection selection, final boolean chunkAligned) {
|
||||
super(selection, chunkAligned);
|
||||
this.p1x = centerX + radiusX * Math.cos(Math.toRadians(60));
|
||||
this.p1z = centerZ + radiusX * Math.sin(Math.toRadians(60));
|
||||
this.p2x = centerX + radiusX * Math.cos(Math.toRadians(120));
|
||||
this.p2z = centerZ + radiusX * Math.sin(Math.toRadians(120));
|
||||
this.p3x = centerX + radiusX * Math.cos(Math.toRadians(180));
|
||||
this.p3z = centerZ + radiusX * Math.sin(Math.toRadians(180));
|
||||
this.p4x = centerX + radiusX * Math.cos(Math.toRadians(240));
|
||||
this.p4z = centerZ + radiusX * Math.sin(Math.toRadians(240));
|
||||
this.p5x = centerX + radiusX * Math.cos(Math.toRadians(300));
|
||||
this.p5z = centerZ + radiusX * Math.sin(Math.toRadians(300));
|
||||
this.p6x = centerX + radiusX * Math.cos(Math.toRadians(360));
|
||||
this.p6z = centerZ + radiusX * Math.sin(Math.toRadians(360));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Vector2> points() {
|
||||
return Arrays.asList(
|
||||
Vector2.of(p1x, p1z),
|
||||
Vector2.of(p2x, p2z),
|
||||
Vector2.of(p3x, p3z),
|
||||
Vector2.of(p4x, p4z),
|
||||
Vector2.of(p5x, p5z),
|
||||
Vector2.of(p6x, p6z)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBounding(final double x, final double z) {
|
||||
final boolean inside12 = insideLine(p1x, p1z, p2x, p2z, x, z);
|
||||
final boolean inside23 = insideLine(p2x, p2z, p3x, p3z, x, z);
|
||||
final boolean inside34 = insideLine(p3x, p3z, p4x, p4z, x, z);
|
||||
final boolean inside45 = insideLine(p4x, p4z, p5x, p5z, x, z);
|
||||
final boolean inside56 = insideLine(p5x, p5z, p6x, p6z, x, z);
|
||||
final boolean inside61 = insideLine(p6x, p6z, p1x, p1z, x, z);
|
||||
return inside12 && inside23 && inside34 && inside45 && inside56 && inside61;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return ShapeType.HEXAGON;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,16 @@
|
||||
package org.popcraft.chunky.shape;
|
||||
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.util.Translator;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public final class ShapeFactory {
|
||||
private static final Map<String, BiFunction<Selection, Boolean, Shape>> custom = new HashMap<>();
|
||||
|
||||
private ShapeFactory() {
|
||||
}
|
||||
|
||||
@@ -11,25 +19,25 @@ public final class ShapeFactory {
|
||||
}
|
||||
|
||||
public static Shape getShape(final Selection selection, final boolean chunkAligned) {
|
||||
switch (selection.shape()) {
|
||||
case ShapeType.CIRCLE:
|
||||
return new Circle(selection, chunkAligned);
|
||||
case ShapeType.DIAMOND:
|
||||
return new Diamond(selection, chunkAligned);
|
||||
case ShapeType.ELLIPSE:
|
||||
case ShapeType.OVAL:
|
||||
return new Ellipse(selection, chunkAligned);
|
||||
case ShapeType.PENTAGON:
|
||||
return new Pentagon(selection, chunkAligned);
|
||||
case ShapeType.RECTANGLE:
|
||||
return new Rectangle(selection, chunkAligned);
|
||||
case ShapeType.STAR:
|
||||
return new Star(selection, chunkAligned);
|
||||
case ShapeType.TRIANGLE:
|
||||
return new Triangle(selection, chunkAligned);
|
||||
case ShapeType.SQUARE:
|
||||
default:
|
||||
return new Square(selection, chunkAligned);
|
||||
}
|
||||
return switch (selection.shape()) {
|
||||
case ShapeType.CIRCLE -> new Circle(selection, chunkAligned);
|
||||
case ShapeType.DIAMOND -> new Diamond(selection, chunkAligned);
|
||||
case ShapeType.ELLIPSE, ShapeType.OVAL -> new Ellipse(selection, chunkAligned);
|
||||
case ShapeType.HEXAGON -> new Hexagon(selection, chunkAligned);
|
||||
case ShapeType.PENTAGON -> new Pentagon(selection, chunkAligned);
|
||||
case ShapeType.RECTANGLE -> new Rectangle(selection, chunkAligned);
|
||||
case ShapeType.STAR -> new Star(selection, chunkAligned);
|
||||
case ShapeType.TRIANGLE -> new Triangle(selection, chunkAligned);
|
||||
default -> custom.getOrDefault(selection.shape(), Square::new).apply(selection, chunkAligned);
|
||||
};
|
||||
}
|
||||
|
||||
public static void registerCustom(final String name, final BiFunction<Selection, Boolean, Shape> shapeFunction) {
|
||||
custom.put(name, shapeFunction);
|
||||
Translator.addCustomTranslation("shape_%s".formatted(name), name);
|
||||
}
|
||||
|
||||
public static Set<String> getCustomTypes() {
|
||||
return custom.keySet();
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
package org.popcraft.chunky.shape;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public final class ShapeType {
|
||||
public static final String CIRCLE = "circle";
|
||||
public static final String DIAMOND = "diamond";
|
||||
public static final String ELLIPSE = "ellipse";
|
||||
public static final String HEXAGON = "hexagon";
|
||||
public static final String OVAL = "oval";
|
||||
public static final String PENTAGON = "pentagon";
|
||||
public static final String RECTANGLE = "rectangle";
|
||||
@@ -15,8 +16,18 @@ public final class ShapeType {
|
||||
public static final String STAR = "star";
|
||||
public static final String TRIANGLE = "triangle";
|
||||
|
||||
public static final List<String> ALL = Collections.unmodifiableList(Arrays.asList(CIRCLE, DIAMOND, ELLIPSE, PENTAGON, RECTANGLE, SQUARE, STAR, TRIANGLE));
|
||||
private static final List<String> DEFAULTS = List.of(CIRCLE, DIAMOND, ELLIPSE, HEXAGON, PENTAGON, RECTANGLE, SQUARE, STAR, TRIANGLE);
|
||||
|
||||
private ShapeType() {
|
||||
}
|
||||
|
||||
public static List<String> all() {
|
||||
final Set<String> customTypes = ShapeFactory.getCustomTypes();
|
||||
if (customTypes.isEmpty()) {
|
||||
return DEFAULTS;
|
||||
}
|
||||
final List<String> allTypes = new ArrayList<>(DEFAULTS);
|
||||
allTypes.addAll(customTypes);
|
||||
return allTypes;
|
||||
}
|
||||
}
|
||||
@@ -70,4 +70,43 @@ public final class ShapeUtil {
|
||||
final double z = centerZ + radiusZ * Math.sin(angle);
|
||||
return Vector2.of(x, z);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the closest point on a line from a given position.
|
||||
*
|
||||
* @param posX Position x
|
||||
* @param posZ Position z
|
||||
* @param p1x Line point 1 x
|
||||
* @param p1z Line point 1 z
|
||||
* @param p2x Line point 2 x
|
||||
* @param p2z Line point 2 z
|
||||
* @return The closest point to the position on the line.
|
||||
*/
|
||||
public static Vector2 closestPointOnLine(final double posX, final double posZ, final double p1x, final double p1z, final double p2x, final double p2z) {
|
||||
final double dx = p2x - p1x;
|
||||
final double dz = p2z - p1z;
|
||||
final double perpendicularSlope = -dx / dz;
|
||||
final double p3x, p3z;
|
||||
if (Double.isInfinite(perpendicularSlope)) {
|
||||
p3x = posX;
|
||||
p3z = posZ + 1;
|
||||
} else {
|
||||
p3x = posX + 1;
|
||||
p3z = posZ + perpendicularSlope;
|
||||
}
|
||||
return ShapeUtil.intersection(p1x, p1z, p2x, p2z, posX, posZ, p3x, p3z).orElseThrow(IllegalStateException::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the distance between 2 points.
|
||||
*
|
||||
* @param p1x Point 1 x
|
||||
* @param p1z Point 1 z
|
||||
* @param p2x Point 2 x
|
||||
* @param p2z Point 2 z
|
||||
* @return The distance between the 2 points.
|
||||
*/
|
||||
public static double distanceBetweenPoints(final double p1x, final double p1z, final double p2x, final double p2z) {
|
||||
return Math.sqrt(Math.pow(p1x - p2x, 2) + Math.pow(p1z - p2z, 2));
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,25 @@
|
||||
package org.popcraft.chunky.util;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ChunkCoordinate implements Comparable<ChunkCoordinate> {
|
||||
public final int x, z;
|
||||
|
||||
public ChunkCoordinate(final int x, final int z) {
|
||||
this.x = x;
|
||||
this.z = z;
|
||||
public record ChunkCoordinate(int x, int z) implements Comparable<ChunkCoordinate> {
|
||||
public static Optional<ChunkCoordinate> fromRegionFile(final String regionFileName) {
|
||||
if (!regionFileName.startsWith("r.")) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final int extension = regionFileName.indexOf(".mca");
|
||||
if (extension < 2) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final String regionCoordinates = regionFileName.substring(2, extension);
|
||||
final int separator = regionCoordinates.indexOf('.');
|
||||
final Optional<Integer> regionX = Input.tryInteger(regionCoordinates.substring(0, separator));
|
||||
final Optional<Integer> regionZ = Input.tryInteger(regionCoordinates.substring(separator + 1));
|
||||
if (regionX.isPresent() && regionZ.isPresent()) {
|
||||
return Optional.of(new ChunkCoordinate(regionX.get(), regionZ.get()));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,6 +33,7 @@ public final class Disk {
|
||||
return currentWorkingDirectory.toFile().getUsableSpace();
|
||||
}
|
||||
} catch (UnsupportedOperationException | InvalidPathException | SecurityException ignored) {
|
||||
return Long.MAX_VALUE;
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
package org.popcraft.chunky.util;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
|
||||
public final class Hilbert {
|
||||
private static final ChunkCoordinate[] regionChunkCoordinateOffsets = {
|
||||
new ChunkCoordinate(0, 0), new ChunkCoordinate(0, 1), new ChunkCoordinate(1, 1),
|
||||
new ChunkCoordinate(1, 0), new ChunkCoordinate(2, 0), new ChunkCoordinate(3, 0),
|
||||
new ChunkCoordinate(3, 1), new ChunkCoordinate(2, 1), new ChunkCoordinate(2, 2),
|
||||
new ChunkCoordinate(3, 2), new ChunkCoordinate(3, 3), new ChunkCoordinate(2, 3),
|
||||
new ChunkCoordinate(1, 3), new ChunkCoordinate(1, 2), new ChunkCoordinate(0, 2),
|
||||
new ChunkCoordinate(0, 3), new ChunkCoordinate(0, 4), new ChunkCoordinate(1, 4),
|
||||
new ChunkCoordinate(1, 5), new ChunkCoordinate(0, 5), new ChunkCoordinate(0, 6),
|
||||
new ChunkCoordinate(0, 7), new ChunkCoordinate(1, 7), new ChunkCoordinate(1, 6),
|
||||
new ChunkCoordinate(2, 6), new ChunkCoordinate(2, 7), new ChunkCoordinate(3, 7),
|
||||
new ChunkCoordinate(3, 6), new ChunkCoordinate(3, 5), new ChunkCoordinate(2, 5),
|
||||
new ChunkCoordinate(2, 4), new ChunkCoordinate(3, 4), new ChunkCoordinate(4, 4),
|
||||
new ChunkCoordinate(5, 4), new ChunkCoordinate(5, 5), new ChunkCoordinate(4, 5),
|
||||
new ChunkCoordinate(4, 6), new ChunkCoordinate(4, 7), new ChunkCoordinate(5, 7),
|
||||
new ChunkCoordinate(5, 6), new ChunkCoordinate(6, 6), new ChunkCoordinate(6, 7),
|
||||
new ChunkCoordinate(7, 7), new ChunkCoordinate(7, 6), new ChunkCoordinate(7, 5),
|
||||
new ChunkCoordinate(6, 5), new ChunkCoordinate(6, 4), new ChunkCoordinate(7, 4),
|
||||
new ChunkCoordinate(7, 3), new ChunkCoordinate(7, 2), new ChunkCoordinate(6, 2),
|
||||
new ChunkCoordinate(6, 3), new ChunkCoordinate(5, 3), new ChunkCoordinate(4, 3),
|
||||
new ChunkCoordinate(4, 2), new ChunkCoordinate(5, 2), new ChunkCoordinate(5, 1),
|
||||
new ChunkCoordinate(4, 1), new ChunkCoordinate(4, 0), new ChunkCoordinate(5, 0),
|
||||
new ChunkCoordinate(6, 0), new ChunkCoordinate(6, 1), new ChunkCoordinate(7, 1),
|
||||
new ChunkCoordinate(7, 0), new ChunkCoordinate(8, 0), new ChunkCoordinate(9, 0),
|
||||
new ChunkCoordinate(9, 1), new ChunkCoordinate(8, 1), new ChunkCoordinate(8, 2),
|
||||
new ChunkCoordinate(8, 3), new ChunkCoordinate(9, 3), new ChunkCoordinate(9, 2),
|
||||
new ChunkCoordinate(10, 2), new ChunkCoordinate(10, 3), new ChunkCoordinate(11, 3),
|
||||
new ChunkCoordinate(11, 2), new ChunkCoordinate(11, 1), new ChunkCoordinate(10, 1),
|
||||
new ChunkCoordinate(10, 0), new ChunkCoordinate(11, 0), new ChunkCoordinate(12, 0),
|
||||
new ChunkCoordinate(12, 1), new ChunkCoordinate(13, 1), new ChunkCoordinate(13, 0),
|
||||
new ChunkCoordinate(14, 0), new ChunkCoordinate(15, 0), new ChunkCoordinate(15, 1),
|
||||
new ChunkCoordinate(14, 1), new ChunkCoordinate(14, 2), new ChunkCoordinate(15, 2),
|
||||
new ChunkCoordinate(15, 3), new ChunkCoordinate(14, 3), new ChunkCoordinate(13, 3),
|
||||
new ChunkCoordinate(13, 2), new ChunkCoordinate(12, 2), new ChunkCoordinate(12, 3),
|
||||
new ChunkCoordinate(12, 4), new ChunkCoordinate(12, 5), new ChunkCoordinate(13, 5),
|
||||
new ChunkCoordinate(13, 4), new ChunkCoordinate(14, 4), new ChunkCoordinate(15, 4),
|
||||
new ChunkCoordinate(15, 5), new ChunkCoordinate(14, 5), new ChunkCoordinate(14, 6),
|
||||
new ChunkCoordinate(15, 6), new ChunkCoordinate(15, 7), new ChunkCoordinate(14, 7),
|
||||
new ChunkCoordinate(13, 7), new ChunkCoordinate(13, 6), new ChunkCoordinate(12, 6),
|
||||
new ChunkCoordinate(12, 7), new ChunkCoordinate(11, 7), new ChunkCoordinate(10, 7),
|
||||
new ChunkCoordinate(10, 6), new ChunkCoordinate(11, 6), new ChunkCoordinate(11, 5),
|
||||
new ChunkCoordinate(11, 4), new ChunkCoordinate(10, 4), new ChunkCoordinate(10, 5),
|
||||
new ChunkCoordinate(9, 5), new ChunkCoordinate(9, 4), new ChunkCoordinate(8, 4),
|
||||
new ChunkCoordinate(8, 5), new ChunkCoordinate(8, 6), new ChunkCoordinate(9, 6),
|
||||
new ChunkCoordinate(9, 7), new ChunkCoordinate(8, 7), new ChunkCoordinate(8, 8),
|
||||
new ChunkCoordinate(9, 8), new ChunkCoordinate(9, 9), new ChunkCoordinate(8, 9),
|
||||
new ChunkCoordinate(8, 10), new ChunkCoordinate(8, 11), new ChunkCoordinate(9, 11),
|
||||
new ChunkCoordinate(9, 10), new ChunkCoordinate(10, 10), new ChunkCoordinate(10, 11),
|
||||
new ChunkCoordinate(11, 11), new ChunkCoordinate(11, 10), new ChunkCoordinate(11, 9),
|
||||
new ChunkCoordinate(10, 9), new ChunkCoordinate(10, 8), new ChunkCoordinate(11, 8),
|
||||
new ChunkCoordinate(12, 8), new ChunkCoordinate(12, 9), new ChunkCoordinate(13, 9),
|
||||
new ChunkCoordinate(13, 8), new ChunkCoordinate(14, 8), new ChunkCoordinate(15, 8),
|
||||
new ChunkCoordinate(15, 9), new ChunkCoordinate(14, 9), new ChunkCoordinate(14, 10),
|
||||
new ChunkCoordinate(15, 10), new ChunkCoordinate(15, 11), new ChunkCoordinate(14, 11),
|
||||
new ChunkCoordinate(13, 11), new ChunkCoordinate(13, 10), new ChunkCoordinate(12, 10),
|
||||
new ChunkCoordinate(12, 11), new ChunkCoordinate(12, 12), new ChunkCoordinate(12, 13),
|
||||
new ChunkCoordinate(13, 13), new ChunkCoordinate(13, 12), new ChunkCoordinate(14, 12),
|
||||
new ChunkCoordinate(15, 12), new ChunkCoordinate(15, 13), new ChunkCoordinate(14, 13),
|
||||
new ChunkCoordinate(14, 14), new ChunkCoordinate(15, 14), new ChunkCoordinate(15, 15),
|
||||
new ChunkCoordinate(14, 15), new ChunkCoordinate(13, 15), new ChunkCoordinate(13, 14),
|
||||
new ChunkCoordinate(12, 14), new ChunkCoordinate(12, 15), new ChunkCoordinate(11, 15),
|
||||
new ChunkCoordinate(10, 15), new ChunkCoordinate(10, 14), new ChunkCoordinate(11, 14),
|
||||
new ChunkCoordinate(11, 13), new ChunkCoordinate(11, 12), new ChunkCoordinate(10, 12),
|
||||
new ChunkCoordinate(10, 13), new ChunkCoordinate(9, 13), new ChunkCoordinate(9, 12),
|
||||
new ChunkCoordinate(8, 12), new ChunkCoordinate(8, 13), new ChunkCoordinate(8, 14),
|
||||
new ChunkCoordinate(9, 14), new ChunkCoordinate(9, 15), new ChunkCoordinate(8, 15),
|
||||
new ChunkCoordinate(7, 15), new ChunkCoordinate(7, 14), new ChunkCoordinate(6, 14),
|
||||
new ChunkCoordinate(6, 15), new ChunkCoordinate(5, 15), new ChunkCoordinate(4, 15),
|
||||
new ChunkCoordinate(4, 14), new ChunkCoordinate(5, 14), new ChunkCoordinate(5, 13),
|
||||
new ChunkCoordinate(4, 13), new ChunkCoordinate(4, 12), new ChunkCoordinate(5, 12),
|
||||
new ChunkCoordinate(6, 12), new ChunkCoordinate(6, 13), new ChunkCoordinate(7, 13),
|
||||
new ChunkCoordinate(7, 12), new ChunkCoordinate(7, 11), new ChunkCoordinate(6, 11),
|
||||
new ChunkCoordinate(6, 10), new ChunkCoordinate(7, 10), new ChunkCoordinate(7, 9),
|
||||
new ChunkCoordinate(7, 8), new ChunkCoordinate(6, 8), new ChunkCoordinate(6, 9),
|
||||
new ChunkCoordinate(5, 9), new ChunkCoordinate(5, 8), new ChunkCoordinate(4, 8),
|
||||
new ChunkCoordinate(4, 9), new ChunkCoordinate(4, 10), new ChunkCoordinate(5, 10),
|
||||
new ChunkCoordinate(5, 11), new ChunkCoordinate(4, 11), new ChunkCoordinate(3, 11),
|
||||
new ChunkCoordinate(2, 11), new ChunkCoordinate(2, 10), new ChunkCoordinate(3, 10),
|
||||
new ChunkCoordinate(3, 9), new ChunkCoordinate(3, 8), new ChunkCoordinate(2, 8),
|
||||
new ChunkCoordinate(2, 9), new ChunkCoordinate(1, 9), new ChunkCoordinate(1, 8),
|
||||
new ChunkCoordinate(0, 8), new ChunkCoordinate(0, 9), new ChunkCoordinate(0, 10),
|
||||
new ChunkCoordinate(1, 10), new ChunkCoordinate(1, 11), new ChunkCoordinate(0, 11),
|
||||
new ChunkCoordinate(0, 12), new ChunkCoordinate(0, 13), new ChunkCoordinate(1, 13),
|
||||
new ChunkCoordinate(1, 12), new ChunkCoordinate(2, 12), new ChunkCoordinate(3, 12),
|
||||
new ChunkCoordinate(3, 13), new ChunkCoordinate(2, 13), new ChunkCoordinate(2, 14),
|
||||
new ChunkCoordinate(3, 14), new ChunkCoordinate(3, 15), new ChunkCoordinate(2, 15),
|
||||
new ChunkCoordinate(1, 15), new ChunkCoordinate(1, 14), new ChunkCoordinate(0, 14),
|
||||
new ChunkCoordinate(0, 15), new ChunkCoordinate(0, 16), new ChunkCoordinate(1, 16),
|
||||
new ChunkCoordinate(1, 17), new ChunkCoordinate(0, 17), new ChunkCoordinate(0, 18),
|
||||
new ChunkCoordinate(0, 19), new ChunkCoordinate(1, 19), new ChunkCoordinate(1, 18),
|
||||
new ChunkCoordinate(2, 18), new ChunkCoordinate(2, 19), new ChunkCoordinate(3, 19),
|
||||
new ChunkCoordinate(3, 18), new ChunkCoordinate(3, 17), new ChunkCoordinate(2, 17),
|
||||
new ChunkCoordinate(2, 16), new ChunkCoordinate(3, 16), new ChunkCoordinate(4, 16),
|
||||
new ChunkCoordinate(4, 17), new ChunkCoordinate(5, 17), new ChunkCoordinate(5, 16),
|
||||
new ChunkCoordinate(6, 16), new ChunkCoordinate(7, 16), new ChunkCoordinate(7, 17),
|
||||
new ChunkCoordinate(6, 17), new ChunkCoordinate(6, 18), new ChunkCoordinate(7, 18),
|
||||
new ChunkCoordinate(7, 19), new ChunkCoordinate(6, 19), new ChunkCoordinate(5, 19),
|
||||
new ChunkCoordinate(5, 18), new ChunkCoordinate(4, 18), new ChunkCoordinate(4, 19),
|
||||
new ChunkCoordinate(4, 20), new ChunkCoordinate(4, 21), new ChunkCoordinate(5, 21),
|
||||
new ChunkCoordinate(5, 20), new ChunkCoordinate(6, 20), new ChunkCoordinate(7, 20),
|
||||
new ChunkCoordinate(7, 21), new ChunkCoordinate(6, 21), new ChunkCoordinate(6, 22),
|
||||
new ChunkCoordinate(7, 22), new ChunkCoordinate(7, 23), new ChunkCoordinate(6, 23),
|
||||
new ChunkCoordinate(5, 23), new ChunkCoordinate(5, 22), new ChunkCoordinate(4, 22),
|
||||
new ChunkCoordinate(4, 23), new ChunkCoordinate(3, 23), new ChunkCoordinate(2, 23),
|
||||
new ChunkCoordinate(2, 22), new ChunkCoordinate(3, 22), new ChunkCoordinate(3, 21),
|
||||
new ChunkCoordinate(3, 20), new ChunkCoordinate(2, 20), new ChunkCoordinate(2, 21),
|
||||
new ChunkCoordinate(1, 21), new ChunkCoordinate(1, 20), new ChunkCoordinate(0, 20),
|
||||
new ChunkCoordinate(0, 21), new ChunkCoordinate(0, 22), new ChunkCoordinate(1, 22),
|
||||
new ChunkCoordinate(1, 23), new ChunkCoordinate(0, 23), new ChunkCoordinate(0, 24),
|
||||
new ChunkCoordinate(0, 25), new ChunkCoordinate(1, 25), new ChunkCoordinate(1, 24),
|
||||
new ChunkCoordinate(2, 24), new ChunkCoordinate(3, 24), new ChunkCoordinate(3, 25),
|
||||
new ChunkCoordinate(2, 25), new ChunkCoordinate(2, 26), new ChunkCoordinate(3, 26),
|
||||
new ChunkCoordinate(3, 27), new ChunkCoordinate(2, 27), new ChunkCoordinate(1, 27),
|
||||
new ChunkCoordinate(1, 26), new ChunkCoordinate(0, 26), new ChunkCoordinate(0, 27),
|
||||
new ChunkCoordinate(0, 28), new ChunkCoordinate(1, 28), new ChunkCoordinate(1, 29),
|
||||
new ChunkCoordinate(0, 29), new ChunkCoordinate(0, 30), new ChunkCoordinate(0, 31),
|
||||
new ChunkCoordinate(1, 31), new ChunkCoordinate(1, 30), new ChunkCoordinate(2, 30),
|
||||
new ChunkCoordinate(2, 31), new ChunkCoordinate(3, 31), new ChunkCoordinate(3, 30),
|
||||
new ChunkCoordinate(3, 29), new ChunkCoordinate(2, 29), new ChunkCoordinate(2, 28),
|
||||
new ChunkCoordinate(3, 28), new ChunkCoordinate(4, 28), new ChunkCoordinate(5, 28),
|
||||
new ChunkCoordinate(5, 29), new ChunkCoordinate(4, 29), new ChunkCoordinate(4, 30),
|
||||
new ChunkCoordinate(4, 31), new ChunkCoordinate(5, 31), new ChunkCoordinate(5, 30),
|
||||
new ChunkCoordinate(6, 30), new ChunkCoordinate(6, 31), new ChunkCoordinate(7, 31),
|
||||
new ChunkCoordinate(7, 30), new ChunkCoordinate(7, 29), new ChunkCoordinate(6, 29),
|
||||
new ChunkCoordinate(6, 28), new ChunkCoordinate(7, 28), new ChunkCoordinate(7, 27),
|
||||
new ChunkCoordinate(7, 26), new ChunkCoordinate(6, 26), new ChunkCoordinate(6, 27),
|
||||
new ChunkCoordinate(5, 27), new ChunkCoordinate(4, 27), new ChunkCoordinate(4, 26),
|
||||
new ChunkCoordinate(5, 26), new ChunkCoordinate(5, 25), new ChunkCoordinate(4, 25),
|
||||
new ChunkCoordinate(4, 24), new ChunkCoordinate(5, 24), new ChunkCoordinate(6, 24),
|
||||
new ChunkCoordinate(6, 25), new ChunkCoordinate(7, 25), new ChunkCoordinate(7, 24),
|
||||
new ChunkCoordinate(8, 24), new ChunkCoordinate(8, 25), new ChunkCoordinate(9, 25),
|
||||
new ChunkCoordinate(9, 24), new ChunkCoordinate(10, 24), new ChunkCoordinate(11, 24),
|
||||
new ChunkCoordinate(11, 25), new ChunkCoordinate(10, 25), new ChunkCoordinate(10, 26),
|
||||
new ChunkCoordinate(11, 26), new ChunkCoordinate(11, 27), new ChunkCoordinate(10, 27),
|
||||
new ChunkCoordinate(9, 27), new ChunkCoordinate(9, 26), new ChunkCoordinate(8, 26),
|
||||
new ChunkCoordinate(8, 27), new ChunkCoordinate(8, 28), new ChunkCoordinate(9, 28),
|
||||
new ChunkCoordinate(9, 29), new ChunkCoordinate(8, 29), new ChunkCoordinate(8, 30),
|
||||
new ChunkCoordinate(8, 31), new ChunkCoordinate(9, 31), new ChunkCoordinate(9, 30),
|
||||
new ChunkCoordinate(10, 30), new ChunkCoordinate(10, 31), new ChunkCoordinate(11, 31),
|
||||
new ChunkCoordinate(11, 30), new ChunkCoordinate(11, 29), new ChunkCoordinate(10, 29),
|
||||
new ChunkCoordinate(10, 28), new ChunkCoordinate(11, 28), new ChunkCoordinate(12, 28),
|
||||
new ChunkCoordinate(13, 28), new ChunkCoordinate(13, 29), new ChunkCoordinate(12, 29),
|
||||
new ChunkCoordinate(12, 30), new ChunkCoordinate(12, 31), new ChunkCoordinate(13, 31),
|
||||
new ChunkCoordinate(13, 30), new ChunkCoordinate(14, 30), new ChunkCoordinate(14, 31),
|
||||
new ChunkCoordinate(15, 31), new ChunkCoordinate(15, 30), new ChunkCoordinate(15, 29),
|
||||
new ChunkCoordinate(14, 29), new ChunkCoordinate(14, 28), new ChunkCoordinate(15, 28),
|
||||
new ChunkCoordinate(15, 27), new ChunkCoordinate(15, 26), new ChunkCoordinate(14, 26),
|
||||
new ChunkCoordinate(14, 27), new ChunkCoordinate(13, 27), new ChunkCoordinate(12, 27),
|
||||
new ChunkCoordinate(12, 26), new ChunkCoordinate(13, 26), new ChunkCoordinate(13, 25),
|
||||
new ChunkCoordinate(12, 25), new ChunkCoordinate(12, 24), new ChunkCoordinate(13, 24),
|
||||
new ChunkCoordinate(14, 24), new ChunkCoordinate(14, 25), new ChunkCoordinate(15, 25),
|
||||
new ChunkCoordinate(15, 24), new ChunkCoordinate(15, 23), new ChunkCoordinate(14, 23),
|
||||
new ChunkCoordinate(14, 22), new ChunkCoordinate(15, 22), new ChunkCoordinate(15, 21),
|
||||
new ChunkCoordinate(15, 20), new ChunkCoordinate(14, 20), new ChunkCoordinate(14, 21),
|
||||
new ChunkCoordinate(13, 21), new ChunkCoordinate(13, 20), new ChunkCoordinate(12, 20),
|
||||
new ChunkCoordinate(12, 21), new ChunkCoordinate(12, 22), new ChunkCoordinate(13, 22),
|
||||
new ChunkCoordinate(13, 23), new ChunkCoordinate(12, 23), new ChunkCoordinate(11, 23),
|
||||
new ChunkCoordinate(11, 22), new ChunkCoordinate(10, 22), new ChunkCoordinate(10, 23),
|
||||
new ChunkCoordinate(9, 23), new ChunkCoordinate(8, 23), new ChunkCoordinate(8, 22),
|
||||
new ChunkCoordinate(9, 22), new ChunkCoordinate(9, 21), new ChunkCoordinate(8, 21),
|
||||
new ChunkCoordinate(8, 20), new ChunkCoordinate(9, 20), new ChunkCoordinate(10, 20),
|
||||
new ChunkCoordinate(10, 21), new ChunkCoordinate(11, 21), new ChunkCoordinate(11, 20),
|
||||
new ChunkCoordinate(11, 19), new ChunkCoordinate(11, 18), new ChunkCoordinate(10, 18),
|
||||
new ChunkCoordinate(10, 19), new ChunkCoordinate(9, 19), new ChunkCoordinate(8, 19),
|
||||
new ChunkCoordinate(8, 18), new ChunkCoordinate(9, 18), new ChunkCoordinate(9, 17),
|
||||
new ChunkCoordinate(8, 17), new ChunkCoordinate(8, 16), new ChunkCoordinate(9, 16),
|
||||
new ChunkCoordinate(10, 16), new ChunkCoordinate(10, 17), new ChunkCoordinate(11, 17),
|
||||
new ChunkCoordinate(11, 16), new ChunkCoordinate(12, 16), new ChunkCoordinate(13, 16),
|
||||
new ChunkCoordinate(13, 17), new ChunkCoordinate(12, 17), new ChunkCoordinate(12, 18),
|
||||
new ChunkCoordinate(12, 19), new ChunkCoordinate(13, 19), new ChunkCoordinate(13, 18),
|
||||
new ChunkCoordinate(14, 18), new ChunkCoordinate(14, 19), new ChunkCoordinate(15, 19),
|
||||
new ChunkCoordinate(15, 18), new ChunkCoordinate(15, 17), new ChunkCoordinate(14, 17),
|
||||
new ChunkCoordinate(14, 16), new ChunkCoordinate(15, 16), new ChunkCoordinate(16, 16),
|
||||
new ChunkCoordinate(17, 16), new ChunkCoordinate(17, 17), new ChunkCoordinate(16, 17),
|
||||
new ChunkCoordinate(16, 18), new ChunkCoordinate(16, 19), new ChunkCoordinate(17, 19),
|
||||
new ChunkCoordinate(17, 18), new ChunkCoordinate(18, 18), new ChunkCoordinate(18, 19),
|
||||
new ChunkCoordinate(19, 19), new ChunkCoordinate(19, 18), new ChunkCoordinate(19, 17),
|
||||
new ChunkCoordinate(18, 17), new ChunkCoordinate(18, 16), new ChunkCoordinate(19, 16),
|
||||
new ChunkCoordinate(20, 16), new ChunkCoordinate(20, 17), new ChunkCoordinate(21, 17),
|
||||
new ChunkCoordinate(21, 16), new ChunkCoordinate(22, 16), new ChunkCoordinate(23, 16),
|
||||
new ChunkCoordinate(23, 17), new ChunkCoordinate(22, 17), new ChunkCoordinate(22, 18),
|
||||
new ChunkCoordinate(23, 18), new ChunkCoordinate(23, 19), new ChunkCoordinate(22, 19),
|
||||
new ChunkCoordinate(21, 19), new ChunkCoordinate(21, 18), new ChunkCoordinate(20, 18),
|
||||
new ChunkCoordinate(20, 19), new ChunkCoordinate(20, 20), new ChunkCoordinate(20, 21),
|
||||
new ChunkCoordinate(21, 21), new ChunkCoordinate(21, 20), new ChunkCoordinate(22, 20),
|
||||
new ChunkCoordinate(23, 20), new ChunkCoordinate(23, 21), new ChunkCoordinate(22, 21),
|
||||
new ChunkCoordinate(22, 22), new ChunkCoordinate(23, 22), new ChunkCoordinate(23, 23),
|
||||
new ChunkCoordinate(22, 23), new ChunkCoordinate(21, 23), new ChunkCoordinate(21, 22),
|
||||
new ChunkCoordinate(20, 22), new ChunkCoordinate(20, 23), new ChunkCoordinate(19, 23),
|
||||
new ChunkCoordinate(18, 23), new ChunkCoordinate(18, 22), new ChunkCoordinate(19, 22),
|
||||
new ChunkCoordinate(19, 21), new ChunkCoordinate(19, 20), new ChunkCoordinate(18, 20),
|
||||
new ChunkCoordinate(18, 21), new ChunkCoordinate(17, 21), new ChunkCoordinate(17, 20),
|
||||
new ChunkCoordinate(16, 20), new ChunkCoordinate(16, 21), new ChunkCoordinate(16, 22),
|
||||
new ChunkCoordinate(17, 22), new ChunkCoordinate(17, 23), new ChunkCoordinate(16, 23),
|
||||
new ChunkCoordinate(16, 24), new ChunkCoordinate(16, 25), new ChunkCoordinate(17, 25),
|
||||
new ChunkCoordinate(17, 24), new ChunkCoordinate(18, 24), new ChunkCoordinate(19, 24),
|
||||
new ChunkCoordinate(19, 25), new ChunkCoordinate(18, 25), new ChunkCoordinate(18, 26),
|
||||
new ChunkCoordinate(19, 26), new ChunkCoordinate(19, 27), new ChunkCoordinate(18, 27),
|
||||
new ChunkCoordinate(17, 27), new ChunkCoordinate(17, 26), new ChunkCoordinate(16, 26),
|
||||
new ChunkCoordinate(16, 27), new ChunkCoordinate(16, 28), new ChunkCoordinate(17, 28),
|
||||
new ChunkCoordinate(17, 29), new ChunkCoordinate(16, 29), new ChunkCoordinate(16, 30),
|
||||
new ChunkCoordinate(16, 31), new ChunkCoordinate(17, 31), new ChunkCoordinate(17, 30),
|
||||
new ChunkCoordinate(18, 30), new ChunkCoordinate(18, 31), new ChunkCoordinate(19, 31),
|
||||
new ChunkCoordinate(19, 30), new ChunkCoordinate(19, 29), new ChunkCoordinate(18, 29),
|
||||
new ChunkCoordinate(18, 28), new ChunkCoordinate(19, 28), new ChunkCoordinate(20, 28),
|
||||
new ChunkCoordinate(21, 28), new ChunkCoordinate(21, 29), new ChunkCoordinate(20, 29),
|
||||
new ChunkCoordinate(20, 30), new ChunkCoordinate(20, 31), new ChunkCoordinate(21, 31),
|
||||
new ChunkCoordinate(21, 30), new ChunkCoordinate(22, 30), new ChunkCoordinate(22, 31),
|
||||
new ChunkCoordinate(23, 31), new ChunkCoordinate(23, 30), new ChunkCoordinate(23, 29),
|
||||
new ChunkCoordinate(22, 29), new ChunkCoordinate(22, 28), new ChunkCoordinate(23, 28),
|
||||
new ChunkCoordinate(23, 27), new ChunkCoordinate(23, 26), new ChunkCoordinate(22, 26),
|
||||
new ChunkCoordinate(22, 27), new ChunkCoordinate(21, 27), new ChunkCoordinate(20, 27),
|
||||
new ChunkCoordinate(20, 26), new ChunkCoordinate(21, 26), new ChunkCoordinate(21, 25),
|
||||
new ChunkCoordinate(20, 25), new ChunkCoordinate(20, 24), new ChunkCoordinate(21, 24),
|
||||
new ChunkCoordinate(22, 24), new ChunkCoordinate(22, 25), new ChunkCoordinate(23, 25),
|
||||
new ChunkCoordinate(23, 24), new ChunkCoordinate(24, 24), new ChunkCoordinate(24, 25),
|
||||
new ChunkCoordinate(25, 25), new ChunkCoordinate(25, 24), new ChunkCoordinate(26, 24),
|
||||
new ChunkCoordinate(27, 24), new ChunkCoordinate(27, 25), new ChunkCoordinate(26, 25),
|
||||
new ChunkCoordinate(26, 26), new ChunkCoordinate(27, 26), new ChunkCoordinate(27, 27),
|
||||
new ChunkCoordinate(26, 27), new ChunkCoordinate(25, 27), new ChunkCoordinate(25, 26),
|
||||
new ChunkCoordinate(24, 26), new ChunkCoordinate(24, 27), new ChunkCoordinate(24, 28),
|
||||
new ChunkCoordinate(25, 28), new ChunkCoordinate(25, 29), new ChunkCoordinate(24, 29),
|
||||
new ChunkCoordinate(24, 30), new ChunkCoordinate(24, 31), new ChunkCoordinate(25, 31),
|
||||
new ChunkCoordinate(25, 30), new ChunkCoordinate(26, 30), new ChunkCoordinate(26, 31),
|
||||
new ChunkCoordinate(27, 31), new ChunkCoordinate(27, 30), new ChunkCoordinate(27, 29),
|
||||
new ChunkCoordinate(26, 29), new ChunkCoordinate(26, 28), new ChunkCoordinate(27, 28),
|
||||
new ChunkCoordinate(28, 28), new ChunkCoordinate(29, 28), new ChunkCoordinate(29, 29),
|
||||
new ChunkCoordinate(28, 29), new ChunkCoordinate(28, 30), new ChunkCoordinate(28, 31),
|
||||
new ChunkCoordinate(29, 31), new ChunkCoordinate(29, 30), new ChunkCoordinate(30, 30),
|
||||
new ChunkCoordinate(30, 31), new ChunkCoordinate(31, 31), new ChunkCoordinate(31, 30),
|
||||
new ChunkCoordinate(31, 29), new ChunkCoordinate(30, 29), new ChunkCoordinate(30, 28),
|
||||
new ChunkCoordinate(31, 28), new ChunkCoordinate(31, 27), new ChunkCoordinate(31, 26),
|
||||
new ChunkCoordinate(30, 26), new ChunkCoordinate(30, 27), new ChunkCoordinate(29, 27),
|
||||
new ChunkCoordinate(28, 27), new ChunkCoordinate(28, 26), new ChunkCoordinate(29, 26),
|
||||
new ChunkCoordinate(29, 25), new ChunkCoordinate(28, 25), new ChunkCoordinate(28, 24),
|
||||
new ChunkCoordinate(29, 24), new ChunkCoordinate(30, 24), new ChunkCoordinate(30, 25),
|
||||
new ChunkCoordinate(31, 25), new ChunkCoordinate(31, 24), new ChunkCoordinate(31, 23),
|
||||
new ChunkCoordinate(30, 23), new ChunkCoordinate(30, 22), new ChunkCoordinate(31, 22),
|
||||
new ChunkCoordinate(31, 21), new ChunkCoordinate(31, 20), new ChunkCoordinate(30, 20),
|
||||
new ChunkCoordinate(30, 21), new ChunkCoordinate(29, 21), new ChunkCoordinate(29, 20),
|
||||
new ChunkCoordinate(28, 20), new ChunkCoordinate(28, 21), new ChunkCoordinate(28, 22),
|
||||
new ChunkCoordinate(29, 22), new ChunkCoordinate(29, 23), new ChunkCoordinate(28, 23),
|
||||
new ChunkCoordinate(27, 23), new ChunkCoordinate(27, 22), new ChunkCoordinate(26, 22),
|
||||
new ChunkCoordinate(26, 23), new ChunkCoordinate(25, 23), new ChunkCoordinate(24, 23),
|
||||
new ChunkCoordinate(24, 22), new ChunkCoordinate(25, 22), new ChunkCoordinate(25, 21),
|
||||
new ChunkCoordinate(24, 21), new ChunkCoordinate(24, 20), new ChunkCoordinate(25, 20),
|
||||
new ChunkCoordinate(26, 20), new ChunkCoordinate(26, 21), new ChunkCoordinate(27, 21),
|
||||
new ChunkCoordinate(27, 20), new ChunkCoordinate(27, 19), new ChunkCoordinate(27, 18),
|
||||
new ChunkCoordinate(26, 18), new ChunkCoordinate(26, 19), new ChunkCoordinate(25, 19),
|
||||
new ChunkCoordinate(24, 19), new ChunkCoordinate(24, 18), new ChunkCoordinate(25, 18),
|
||||
new ChunkCoordinate(25, 17), new ChunkCoordinate(24, 17), new ChunkCoordinate(24, 16),
|
||||
new ChunkCoordinate(25, 16), new ChunkCoordinate(26, 16), new ChunkCoordinate(26, 17),
|
||||
new ChunkCoordinate(27, 17), new ChunkCoordinate(27, 16), new ChunkCoordinate(28, 16),
|
||||
new ChunkCoordinate(29, 16), new ChunkCoordinate(29, 17), new ChunkCoordinate(28, 17),
|
||||
new ChunkCoordinate(28, 18), new ChunkCoordinate(28, 19), new ChunkCoordinate(29, 19),
|
||||
new ChunkCoordinate(29, 18), new ChunkCoordinate(30, 18), new ChunkCoordinate(30, 19),
|
||||
new ChunkCoordinate(31, 19), new ChunkCoordinate(31, 18), new ChunkCoordinate(31, 17),
|
||||
new ChunkCoordinate(30, 17), new ChunkCoordinate(30, 16), new ChunkCoordinate(31, 16),
|
||||
new ChunkCoordinate(31, 15), new ChunkCoordinate(31, 14), new ChunkCoordinate(30, 14),
|
||||
new ChunkCoordinate(30, 15), new ChunkCoordinate(29, 15), new ChunkCoordinate(28, 15),
|
||||
new ChunkCoordinate(28, 14), new ChunkCoordinate(29, 14), new ChunkCoordinate(29, 13),
|
||||
new ChunkCoordinate(28, 13), new ChunkCoordinate(28, 12), new ChunkCoordinate(29, 12),
|
||||
new ChunkCoordinate(30, 12), new ChunkCoordinate(30, 13), new ChunkCoordinate(31, 13),
|
||||
new ChunkCoordinate(31, 12), new ChunkCoordinate(31, 11), new ChunkCoordinate(30, 11),
|
||||
new ChunkCoordinate(30, 10), new ChunkCoordinate(31, 10), new ChunkCoordinate(31, 9),
|
||||
new ChunkCoordinate(31, 8), new ChunkCoordinate(30, 8), new ChunkCoordinate(30, 9),
|
||||
new ChunkCoordinate(29, 9), new ChunkCoordinate(29, 8), new ChunkCoordinate(28, 8),
|
||||
new ChunkCoordinate(28, 9), new ChunkCoordinate(28, 10), new ChunkCoordinate(29, 10),
|
||||
new ChunkCoordinate(29, 11), new ChunkCoordinate(28, 11), new ChunkCoordinate(27, 11),
|
||||
new ChunkCoordinate(26, 11), new ChunkCoordinate(26, 10), new ChunkCoordinate(27, 10),
|
||||
new ChunkCoordinate(27, 9), new ChunkCoordinate(27, 8), new ChunkCoordinate(26, 8),
|
||||
new ChunkCoordinate(26, 9), new ChunkCoordinate(25, 9), new ChunkCoordinate(25, 8),
|
||||
new ChunkCoordinate(24, 8), new ChunkCoordinate(24, 9), new ChunkCoordinate(24, 10),
|
||||
new ChunkCoordinate(25, 10), new ChunkCoordinate(25, 11), new ChunkCoordinate(24, 11),
|
||||
new ChunkCoordinate(24, 12), new ChunkCoordinate(24, 13), new ChunkCoordinate(25, 13),
|
||||
new ChunkCoordinate(25, 12), new ChunkCoordinate(26, 12), new ChunkCoordinate(27, 12),
|
||||
new ChunkCoordinate(27, 13), new ChunkCoordinate(26, 13), new ChunkCoordinate(26, 14),
|
||||
new ChunkCoordinate(27, 14), new ChunkCoordinate(27, 15), new ChunkCoordinate(26, 15),
|
||||
new ChunkCoordinate(25, 15), new ChunkCoordinate(25, 14), new ChunkCoordinate(24, 14),
|
||||
new ChunkCoordinate(24, 15), new ChunkCoordinate(23, 15), new ChunkCoordinate(22, 15),
|
||||
new ChunkCoordinate(22, 14), new ChunkCoordinate(23, 14), new ChunkCoordinate(23, 13),
|
||||
new ChunkCoordinate(23, 12), new ChunkCoordinate(22, 12), new ChunkCoordinate(22, 13),
|
||||
new ChunkCoordinate(21, 13), new ChunkCoordinate(21, 12), new ChunkCoordinate(20, 12),
|
||||
new ChunkCoordinate(20, 13), new ChunkCoordinate(20, 14), new ChunkCoordinate(21, 14),
|
||||
new ChunkCoordinate(21, 15), new ChunkCoordinate(20, 15), new ChunkCoordinate(19, 15),
|
||||
new ChunkCoordinate(19, 14), new ChunkCoordinate(18, 14), new ChunkCoordinate(18, 15),
|
||||
new ChunkCoordinate(17, 15), new ChunkCoordinate(16, 15), new ChunkCoordinate(16, 14),
|
||||
new ChunkCoordinate(17, 14), new ChunkCoordinate(17, 13), new ChunkCoordinate(16, 13),
|
||||
new ChunkCoordinate(16, 12), new ChunkCoordinate(17, 12), new ChunkCoordinate(18, 12),
|
||||
new ChunkCoordinate(18, 13), new ChunkCoordinate(19, 13), new ChunkCoordinate(19, 12),
|
||||
new ChunkCoordinate(19, 11), new ChunkCoordinate(19, 10), new ChunkCoordinate(18, 10),
|
||||
new ChunkCoordinate(18, 11), new ChunkCoordinate(17, 11), new ChunkCoordinate(16, 11),
|
||||
new ChunkCoordinate(16, 10), new ChunkCoordinate(17, 10), new ChunkCoordinate(17, 9),
|
||||
new ChunkCoordinate(16, 9), new ChunkCoordinate(16, 8), new ChunkCoordinate(17, 8),
|
||||
new ChunkCoordinate(18, 8), new ChunkCoordinate(18, 9), new ChunkCoordinate(19, 9),
|
||||
new ChunkCoordinate(19, 8), new ChunkCoordinate(20, 8), new ChunkCoordinate(21, 8),
|
||||
new ChunkCoordinate(21, 9), new ChunkCoordinate(20, 9), new ChunkCoordinate(20, 10),
|
||||
new ChunkCoordinate(20, 11), new ChunkCoordinate(21, 11), new ChunkCoordinate(21, 10),
|
||||
new ChunkCoordinate(22, 10), new ChunkCoordinate(22, 11), new ChunkCoordinate(23, 11),
|
||||
new ChunkCoordinate(23, 10), new ChunkCoordinate(23, 9), new ChunkCoordinate(22, 9),
|
||||
new ChunkCoordinate(22, 8), new ChunkCoordinate(23, 8), new ChunkCoordinate(23, 7),
|
||||
new ChunkCoordinate(22, 7), new ChunkCoordinate(22, 6), new ChunkCoordinate(23, 6),
|
||||
new ChunkCoordinate(23, 5), new ChunkCoordinate(23, 4), new ChunkCoordinate(22, 4),
|
||||
new ChunkCoordinate(22, 5), new ChunkCoordinate(21, 5), new ChunkCoordinate(21, 4),
|
||||
new ChunkCoordinate(20, 4), new ChunkCoordinate(20, 5), new ChunkCoordinate(20, 6),
|
||||
new ChunkCoordinate(21, 6), new ChunkCoordinate(21, 7), new ChunkCoordinate(20, 7),
|
||||
new ChunkCoordinate(19, 7), new ChunkCoordinate(19, 6), new ChunkCoordinate(18, 6),
|
||||
new ChunkCoordinate(18, 7), new ChunkCoordinate(17, 7), new ChunkCoordinate(16, 7),
|
||||
new ChunkCoordinate(16, 6), new ChunkCoordinate(17, 6), new ChunkCoordinate(17, 5),
|
||||
new ChunkCoordinate(16, 5), new ChunkCoordinate(16, 4), new ChunkCoordinate(17, 4),
|
||||
new ChunkCoordinate(18, 4), new ChunkCoordinate(18, 5), new ChunkCoordinate(19, 5),
|
||||
new ChunkCoordinate(19, 4), new ChunkCoordinate(19, 3), new ChunkCoordinate(19, 2),
|
||||
new ChunkCoordinate(18, 2), new ChunkCoordinate(18, 3), new ChunkCoordinate(17, 3),
|
||||
new ChunkCoordinate(16, 3), new ChunkCoordinate(16, 2), new ChunkCoordinate(17, 2),
|
||||
new ChunkCoordinate(17, 1), new ChunkCoordinate(16, 1), new ChunkCoordinate(16, 0),
|
||||
new ChunkCoordinate(17, 0), new ChunkCoordinate(18, 0), new ChunkCoordinate(18, 1),
|
||||
new ChunkCoordinate(19, 1), new ChunkCoordinate(19, 0), new ChunkCoordinate(20, 0),
|
||||
new ChunkCoordinate(21, 0), new ChunkCoordinate(21, 1), new ChunkCoordinate(20, 1),
|
||||
new ChunkCoordinate(20, 2), new ChunkCoordinate(20, 3), new ChunkCoordinate(21, 3),
|
||||
new ChunkCoordinate(21, 2), new ChunkCoordinate(22, 2), new ChunkCoordinate(22, 3),
|
||||
new ChunkCoordinate(23, 3), new ChunkCoordinate(23, 2), new ChunkCoordinate(23, 1),
|
||||
new ChunkCoordinate(22, 1), new ChunkCoordinate(22, 0), new ChunkCoordinate(23, 0),
|
||||
new ChunkCoordinate(24, 0), new ChunkCoordinate(24, 1), new ChunkCoordinate(25, 1),
|
||||
new ChunkCoordinate(25, 0), new ChunkCoordinate(26, 0), new ChunkCoordinate(27, 0),
|
||||
new ChunkCoordinate(27, 1), new ChunkCoordinate(26, 1), new ChunkCoordinate(26, 2),
|
||||
new ChunkCoordinate(27, 2), new ChunkCoordinate(27, 3), new ChunkCoordinate(26, 3),
|
||||
new ChunkCoordinate(25, 3), new ChunkCoordinate(25, 2), new ChunkCoordinate(24, 2),
|
||||
new ChunkCoordinate(24, 3), new ChunkCoordinate(24, 4), new ChunkCoordinate(25, 4),
|
||||
new ChunkCoordinate(25, 5), new ChunkCoordinate(24, 5), new ChunkCoordinate(24, 6),
|
||||
new ChunkCoordinate(24, 7), new ChunkCoordinate(25, 7), new ChunkCoordinate(25, 6),
|
||||
new ChunkCoordinate(26, 6), new ChunkCoordinate(26, 7), new ChunkCoordinate(27, 7),
|
||||
new ChunkCoordinate(27, 6), new ChunkCoordinate(27, 5), new ChunkCoordinate(26, 5),
|
||||
new ChunkCoordinate(26, 4), new ChunkCoordinate(27, 4), new ChunkCoordinate(28, 4),
|
||||
new ChunkCoordinate(29, 4), new ChunkCoordinate(29, 5), new ChunkCoordinate(28, 5),
|
||||
new ChunkCoordinate(28, 6), new ChunkCoordinate(28, 7), new ChunkCoordinate(29, 7),
|
||||
new ChunkCoordinate(29, 6), new ChunkCoordinate(30, 6), new ChunkCoordinate(30, 7),
|
||||
new ChunkCoordinate(31, 7), new ChunkCoordinate(31, 6), new ChunkCoordinate(31, 5),
|
||||
new ChunkCoordinate(30, 5), new ChunkCoordinate(30, 4), new ChunkCoordinate(31, 4),
|
||||
new ChunkCoordinate(31, 3), new ChunkCoordinate(31, 2), new ChunkCoordinate(30, 2),
|
||||
new ChunkCoordinate(30, 3), new ChunkCoordinate(29, 3), new ChunkCoordinate(28, 3),
|
||||
new ChunkCoordinate(28, 2), new ChunkCoordinate(29, 2), new ChunkCoordinate(29, 1),
|
||||
new ChunkCoordinate(28, 1), new ChunkCoordinate(28, 0), new ChunkCoordinate(29, 0),
|
||||
new ChunkCoordinate(30, 0), new ChunkCoordinate(30, 1), new ChunkCoordinate(31, 1),
|
||||
new ChunkCoordinate(31, 0)
|
||||
};
|
||||
|
||||
private Hilbert() {
|
||||
}
|
||||
|
||||
public static ChunkCoordinate regionDistanceToChunkCoordinateOffset(final int distance) {
|
||||
return regionChunkCoordinateOffsets[distance];
|
||||
}
|
||||
|
||||
public static ChunkCoordinate[] chunkCoordinateOffsets() {
|
||||
return regionChunkCoordinateOffsets;
|
||||
}
|
||||
}
|
||||
@@ -34,12 +34,19 @@ public final class Input {
|
||||
return Optional.empty();
|
||||
}
|
||||
final String inputLower = input.toLowerCase();
|
||||
if (ShapeType.ALL.contains(inputLower)) {
|
||||
if (ShapeType.all().contains(inputLower)) {
|
||||
return Optional.of(inputLower);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<Boolean> tryBoolean(final String input) {
|
||||
if (input == null || input.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(Boolean.parseBoolean(input));
|
||||
}
|
||||
|
||||
public static Optional<Integer> tryInteger(final String input) {
|
||||
if (input == null || input.isEmpty()) {
|
||||
return Optional.empty();
|
||||
@@ -82,19 +89,27 @@ public final class Input {
|
||||
.orElse(tryDouble(input));
|
||||
}
|
||||
|
||||
public static Optional<Long> tryLong(final String input) {
|
||||
if (input == null || input.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
try {
|
||||
return Optional.of(Long.parseLong(input));
|
||||
} catch (NumberFormatException e) {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<Integer> trySign(final String input) {
|
||||
if (input == null || input.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final char sign = input.charAt(0);
|
||||
switch (sign) {
|
||||
case '-':
|
||||
return Optional.of(-1);
|
||||
case '+':
|
||||
return Optional.of(1);
|
||||
default:
|
||||
return Optional.empty();
|
||||
}
|
||||
return switch (sign) {
|
||||
case '-' -> Optional.of(-1);
|
||||
case '+' -> Optional.of(1);
|
||||
default -> Optional.empty();
|
||||
};
|
||||
}
|
||||
|
||||
public static boolean isPastWorldLimit(final double value) {
|
||||
@@ -106,15 +121,11 @@ public final class Input {
|
||||
}
|
||||
|
||||
private static Optional<Integer> suffixValue(final char suffix) {
|
||||
switch (Character.toLowerCase(suffix)) {
|
||||
case 'c':
|
||||
return Optional.of(16);
|
||||
case 'r':
|
||||
return Optional.of(512);
|
||||
case 'k':
|
||||
return Optional.of(1000);
|
||||
default:
|
||||
return Optional.empty();
|
||||
}
|
||||
return switch (Character.toLowerCase(suffix)) {
|
||||
case 'c' -> Optional.of(16);
|
||||
case 'r' -> Optional.of(512);
|
||||
case 'k' -> Optional.of(1000);
|
||||
default -> Optional.empty();
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,7 @@
|
||||
package org.popcraft.chunky.util;
|
||||
|
||||
public final class Pair<L, R> {
|
||||
private final L left;
|
||||
private final R right;
|
||||
|
||||
private Pair(final L left, final R right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
public record Pair<L, R>(L left, R right) {
|
||||
public static <L, R> Pair<L, R> of(final L left, final R right) {
|
||||
return new Pair<>(left, right);
|
||||
}
|
||||
|
||||
public L left() {
|
||||
return this.left;
|
||||
}
|
||||
|
||||
public R right() {
|
||||
return this.right;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
package org.popcraft.chunky.util;
|
||||
|
||||
import org.popcraft.chunky.Chunky;
|
||||
import org.popcraft.chunky.GenerationTask;
|
||||
import org.popcraft.chunky.Selection;
|
||||
import org.popcraft.chunky.iterator.PatternType;
|
||||
import org.popcraft.chunky.platform.World;
|
||||
import org.popcraft.chunky.shape.ShapeType;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class TaskLoader {
|
||||
private final Chunky chunky;
|
||||
private final Path savePath;
|
||||
private final Map<String, Properties> tasks = new ConcurrentHashMap<>();
|
||||
|
||||
public TaskLoader(final Chunky chunky) {
|
||||
this.chunky = chunky;
|
||||
this.savePath = chunky.getConfig().getDirectory().resolve("tasks");
|
||||
reload();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
try {
|
||||
Files.createDirectories(savePath);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try (final Stream<Path> taskWalker = Files.walk(savePath)) {
|
||||
taskWalker.forEach(task -> {
|
||||
if (task.getFileName().toString().endsWith(".properties")) {
|
||||
try (final InputStream input = Files.newInputStream(task)) {
|
||||
final Properties properties = new Properties();
|
||||
properties.load(input);
|
||||
final String world = properties.getProperty("world");
|
||||
if (world != null) {
|
||||
tasks.put(world, properties);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<GenerationTask> loadTask(final World world) {
|
||||
final Properties task = tasks.get(world.getName());
|
||||
if (task == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final boolean cancelled = Input.tryBoolean(task.getProperty(TaskProperty.CANCELLED.key())).orElse(false);
|
||||
final double centerX = Input.tryDouble(task.getProperty(TaskProperty.CENTER_X.key())).orElse(Selection.DEFAULT_CENTER_X);
|
||||
final double centerZ = Input.tryDouble(task.getProperty(TaskProperty.CENTER_Z.key())).orElse(Selection.DEFAULT_CENTER_Z);
|
||||
final double radiusX = Input.tryDouble(task.getProperty(TaskProperty.RADIUS_X.key())).orElse(Selection.DEFAULT_RADIUS);
|
||||
final double radiusZ = Input.tryDouble(task.getProperty(TaskProperty.RADIUS_Z.key())).orElse(radiusX);
|
||||
final String pattern = task.getProperty(TaskProperty.PATTERN.key(), PatternType.REGION);
|
||||
final String file = task.getProperty(TaskProperty.CSV.key());
|
||||
final String shape = task.getProperty(TaskProperty.SHAPE.key(), ShapeType.SQUARE);
|
||||
final Selection.Builder selection = Selection.builder(chunky, world)
|
||||
.centerX(centerX)
|
||||
.centerZ(centerZ)
|
||||
.radiusX(radiusX)
|
||||
.radiusZ(radiusZ)
|
||||
.pattern(Parameter.of(pattern, file))
|
||||
.shape(shape);
|
||||
final long chunks = Input.tryLong(task.getProperty(TaskProperty.CHUNKS.key())).orElse(0L);
|
||||
final long time = Input.tryLong(task.getProperty(TaskProperty.TIME.key())).orElse(0L);
|
||||
return Optional.of(new GenerationTask(chunky, selection.build(), chunks, time, cancelled));
|
||||
}
|
||||
|
||||
public List<GenerationTask> loadTasks() {
|
||||
final List<GenerationTask> generationTasks = new ArrayList<>();
|
||||
for (final World world : chunky.getServer().getWorlds()) {
|
||||
loadTask(world).ifPresent(generationTasks::add);
|
||||
}
|
||||
return generationTasks;
|
||||
}
|
||||
|
||||
public void saveTask(final GenerationTask task) {
|
||||
final Selection selection = task.getSelection();
|
||||
final String world = selection.world().getName();
|
||||
final Properties properties = tasks.getOrDefault(world, new Properties());
|
||||
properties.setProperty(TaskProperty.WORLD.key(), world);
|
||||
properties.setProperty(TaskProperty.CANCELLED.key(), String.valueOf(task.isCancelled()));
|
||||
properties.setProperty(TaskProperty.CENTER_X.key(), String.valueOf(selection.centerX()));
|
||||
properties.setProperty(TaskProperty.CENTER_Z.key(), String.valueOf(selection.centerZ()));
|
||||
properties.setProperty(TaskProperty.RADIUS_X.key(), String.valueOf(selection.radiusX()));
|
||||
final String shape = task.getShape().name();
|
||||
if (ShapeType.RECTANGLE.equals(shape) || ShapeType.ELLIPSE.equals(shape)) {
|
||||
properties.setProperty(TaskProperty.RADIUS_Z.key(), String.valueOf(selection.radiusZ()));
|
||||
}
|
||||
final Parameter pattern = Parameter.of(task.getChunkIterator().name());
|
||||
properties.setProperty(TaskProperty.PATTERN.key(), pattern.getType());
|
||||
if (PatternType.CSV.equals(pattern.getType())) {
|
||||
pattern.getValue().ifPresent(file -> properties.setProperty(TaskProperty.CSV.key(), file));
|
||||
}
|
||||
properties.setProperty(TaskProperty.SHAPE.key(), shape);
|
||||
properties.setProperty(TaskProperty.CHUNKS.key(), String.valueOf(task.getCount()));
|
||||
properties.setProperty(TaskProperty.TIME.key(), String.valueOf(task.getTotalTime()));
|
||||
tasks.put(world, properties);
|
||||
writeTask(world, properties);
|
||||
}
|
||||
|
||||
public void saveTasks() {
|
||||
for (final GenerationTask task : chunky.getGenerationTasks().values()) {
|
||||
saveTask(task);
|
||||
}
|
||||
}
|
||||
|
||||
public void cancelTask(final World world) {
|
||||
loadTask(world).ifPresent(generationTask -> {
|
||||
generationTask.stop(true);
|
||||
saveTask(generationTask);
|
||||
});
|
||||
}
|
||||
|
||||
public void cancelTasks() {
|
||||
loadTasks().forEach(generationTask -> cancelTask(generationTask.getSelection().world()));
|
||||
}
|
||||
|
||||
private void writeTask(final String world, final Properties properties) {
|
||||
final StringBuilder propertiesBuilder = new StringBuilder();
|
||||
for (final TaskProperty taskProperty : TaskProperty.values()) {
|
||||
final String propertyValue = properties.getProperty(taskProperty.key());
|
||||
if (propertyValue != null) {
|
||||
propertiesBuilder.append(taskProperty.key()).append('=').append(propertyValue).append('\n');
|
||||
}
|
||||
}
|
||||
final String taskFileName = world.replace(':', '/') + ".properties";
|
||||
final Path taskPath = savePath.resolve(taskFileName);
|
||||
try {
|
||||
Files.createDirectories(taskPath.getParent());
|
||||
Files.write(taskPath, propertiesBuilder.toString().getBytes());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private enum TaskProperty {
|
||||
WORLD("world"),
|
||||
CANCELLED("cancelled"),
|
||||
CENTER_X("center-x"),
|
||||
CENTER_Z("center-z"),
|
||||
RADIUS_X("radius"),
|
||||
RADIUS_Z("radius-z"),
|
||||
SHAPE("shape"),
|
||||
PATTERN("pattern"),
|
||||
CSV("csv"),
|
||||
CHUNKS("chunks"),
|
||||
TIME("time");
|
||||
|
||||
private final String key;
|
||||
|
||||
TaskProperty(final String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public String key() {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,8 @@ public final class TranslationKey {
|
||||
public static final String FORMAT_CONTINUE = "format_continue";
|
||||
public static final String FORMAT_CONTINUE_NO_TASKS = "format_continue_no_tasks";
|
||||
public static final String FORMAT_TRIM_CONFIRM = "format_trim_confirm";
|
||||
public static final String FORMAT_TRIM_CONFIRM_INSIDE = "format_trim_confirm_inside";
|
||||
public static final String FORMAT_TRIM_CONFIRM_INHABITED = "format_trim_confirm_inhabited";
|
||||
public static final String FORMAT_PATTERN = "format_pattern";
|
||||
public static final String FORMAT_PAUSE = "format_pause";
|
||||
public static final String FORMAT_PAUSE_NO_TASKS = "format_pause_no_tasks";
|
||||
@@ -37,6 +39,12 @@ public final class TranslationKey {
|
||||
public static final String FORMAT_RADIUS = "format_radius";
|
||||
public static final String FORMAT_RELOAD = "format_reload";
|
||||
public static final String FORMAT_RELOAD_TASKS_RUNNING = "format_reload_tasks_running";
|
||||
public static final String FORMAT_SELECTION = "format_selection";
|
||||
public static final String FORMAT_SELECTION_CENTER = "format_selection_center";
|
||||
public static final String FORMAT_SELECTION_RADII = "format_selection_radii";
|
||||
public static final String FORMAT_SELECTION_RADIUS = "format_selection_radius";
|
||||
public static final String FORMAT_SELECTION_SHAPE = "format_selection_shape";
|
||||
public static final String FORMAT_SELECTION_WORLD = "format_selection_world";
|
||||
public static final String FORMAT_SHAPE = "format_shape";
|
||||
public static final String FORMAT_SILENT = "format_silent";
|
||||
public static final String FORMAT_START = "format_start";
|
||||
@@ -45,6 +53,7 @@ public final class TranslationKey {
|
||||
public static final String FORMAT_START_LIMIT = "format_start_limit";
|
||||
public static final String FORMAT_STARTED_ALREADY = "format_started_already";
|
||||
public static final String FORMAT_WORLD = "format_world";
|
||||
public static final String FORMAT_WORLDBORDER_TOO_LARGE = "format_worldborder_too_large";
|
||||
public static final String HELP_BORDER = "help_border";
|
||||
public static final String HELP_CANCEL = "help_cancel";
|
||||
public static final String HELP_CENTER = "help_center";
|
||||
@@ -59,24 +68,39 @@ public final class TranslationKey {
|
||||
public static final String HELP_QUIET = "help_quiet";
|
||||
public static final String HELP_RADIUS = "help_radius";
|
||||
public static final String HELP_RELOAD = "help_reload";
|
||||
public static final String HELP_SELECTION = "help_selection";
|
||||
public static final String HELP_SHAPE = "help_shape";
|
||||
public static final String HELP_SILENT = "help_silent";
|
||||
public static final String HELP_SPAWN = "help_spawn";
|
||||
public static final String HELP_START = "help_start";
|
||||
public static final String HELP_WORLD = "help_world";
|
||||
public static final String HELP_WORLDBORDER = "help_worldborder";
|
||||
public static final String PATTERN_CONCENTRIC = "pattern_concentric";
|
||||
public static final String PATTERN_LOOP = "pattern_loop";
|
||||
public static final String PATTERN_SPIRAL = "pattern_spiral";
|
||||
public static final String PATTERN_CSV = "pattern_csv";
|
||||
public static final String PATTERN_REGION = "pattern_region";
|
||||
public static final String SHAPE_CIRCLE = "shape_circle";
|
||||
public static final String SHAPE_DIAMOND = "shape_diamond";
|
||||
public static final String SHAPE_ELLIPSE = "shape_ellipse";
|
||||
public static final String SHAPE_HEXAGON = "shape_hexagon";
|
||||
public static final String SHAPE_PENTAGON = "shape_pentagon";
|
||||
public static final String SHAPE_RECTANGLE = "shape_rectangle";
|
||||
public static final String SHAPE_SQUARE = "shape_square";
|
||||
public static final String SHAPE_STAR = "shape_star";
|
||||
public static final String SHAPE_TRIANGLE = "shape_triangle";
|
||||
public static final String TASK_TRIM = "task_trim";
|
||||
public static final String TASK_TRIM_UPDATE = "task_trim_update";
|
||||
public static final String TASK_DONE = "task_done";
|
||||
public static final String TASK_STOPPED = "task_stopped";
|
||||
public static final String TASK_UPDATE = "task_update";
|
||||
public static final String WRAP_BOTH = "wrap_both";
|
||||
public static final String WRAP_DEFAULT = "wrap_default";
|
||||
public static final String WRAP_EARTH = "wrap_earth";
|
||||
public static final String WRAP_NONE = "wrap_none";
|
||||
public static final String WRAP_RADIAL = "wrap_radial";
|
||||
public static final String WRAP_X = "wrap_x";
|
||||
public static final String WRAP_Z = "wrap_z";
|
||||
|
||||
private TranslationKey() {
|
||||
}
|
||||
|
||||
@@ -7,13 +7,12 @@ import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class Translator {
|
||||
private static final Map<String, String> fallbackTranslations;
|
||||
private static Map<String, String> translations = Collections.emptyMap();
|
||||
private static Map<String, String> translations = Map.of();
|
||||
|
||||
static {
|
||||
fallbackTranslations = load("en");
|
||||
@@ -32,7 +31,7 @@ public final class Translator {
|
||||
|
||||
public static String translateKey(final String key, final boolean prefixed, final Object... args) {
|
||||
final StringBuilder translation = new StringBuilder();
|
||||
final String message = translations.getOrDefault(key, fallbackTranslations.getOrDefault(key, "Missing translation"));
|
||||
final String message = translations.getOrDefault(key, fallbackTranslations.getOrDefault(key, key));
|
||||
if (prefixed) {
|
||||
translation.append("[Chunky] ");
|
||||
}
|
||||
@@ -59,9 +58,10 @@ public final class Translator {
|
||||
}
|
||||
return new Gson().fromJson(lang.toString(), new TypeToken<HashMap<String, String>>() {
|
||||
}.getType());
|
||||
} catch (Exception ignored) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return Collections.emptyMap();
|
||||
return Map.of();
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Селекцията заредена от световна граница за %s.",
|
||||
"format_border_no_border": "Няма съществуваща световна граница за %s.",
|
||||
"format_border_remove": "Премахната световна граница от %s.",
|
||||
"format_border_wrap": "Обвиването на световната граница вече е %s за %s.",
|
||||
"format_border_wrap": "Обвивката на световната граница променена на %s за %s.",
|
||||
"format_cancel": "Задачата отменена за %s.",
|
||||
"format_cancel_all": "Отменяне на всички задачи.",
|
||||
"format_cancel_confirm": "Отменените задачи не могат да бъдат продължени. Ако сте сигурни, че искате да отмените напишете '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Задача възобновена за %s.",
|
||||
"format_continue_no_tasks": "Няма задачи за възобновяване.",
|
||||
"format_trim_confirm": "&cПредупреждение: Чънкове в %s, извън %s региона центриран на %s, %s с радиус от %s ще бъдат перманентно изтрити. Моля, уверете се, че сте направили бакъп на Вашият сървър преди да продължите, за да избегнете потенциални щети. Ще бъдете задължени напълно да рестартирате Вашият сървър, след като задачата приключи. Ако разбирате и желаете да продължите напишете '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Шарка променена на %s.",
|
||||
"format_pause": "Задача поставена на пауза за %s.",
|
||||
"format_pause_no_tasks": "Няма задачи за поставяне на пауза.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Радиус променен на %s.",
|
||||
"format_reload": "Успешно презареждане на конфигурацията.",
|
||||
"format_reload_tasks_running": "Конфигурацията не може да бъде презаредена докато се изпълняват задачи.",
|
||||
"format_selection": "Текуща селекция",
|
||||
"format_selection_center": "Център: %s, %s",
|
||||
"format_selection_radius": "Радиус: %s",
|
||||
"format_selection_radii": "Радии: %s, %s",
|
||||
"format_selection_shape": "Форма: %s",
|
||||
"format_selection_world": "Свят: %s",
|
||||
"format_shape": "Форма променена на %s.",
|
||||
"format_silent": "Тих режим %s.",
|
||||
"format_start": "Задача стартирана за %1$s на %3$s, %4$s с радиус %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Вашият хост е ограничил максималният радиус на прегенерация на %s, за да избегне прекомерно използване на дисковото пространство. Намалете радиус или се свържете с Вашият хост, ако желаете този лимит да бъде премахнат.",
|
||||
"format_started_already": "Задачата е вече стартирана за %s!",
|
||||
"format_world": "Свят променен на %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Управлявайте персонализираните световни граници",
|
||||
"help_cancel": "&2chunky cancel&r - Спиране и изтриване на текущи или запазени задачи",
|
||||
"help_center": "&2chunky center <x> <z>&r - Задаване на позицията на централния блок",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Задаване на тих интервал",
|
||||
"help_radius": "&2chunky radius <radius>&r - Задаване на радиуса",
|
||||
"help_reload": "&2chunky reload&r - Презарежда конфигурацията",
|
||||
"help_selection": "&2chunky selection&r - Показва текущата селекция",
|
||||
"help_shape": "&2chunky shape <shape>&r - Задаване на формата на генериране",
|
||||
"help_silent": "&2chunky silent&r - Превключване на съобщенията за актуализации",
|
||||
"help_spawn": "&2chunky spawn&r - Задача центъра на стартовата точката",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "цикличен",
|
||||
"pattern_spiral": "спирален",
|
||||
"pattern_csv": "цсв",
|
||||
"pattern_region": "регион",
|
||||
"pattern_world": "свят",
|
||||
"shape_circle": "кръгъл",
|
||||
"shape_diamond": "диамантен",
|
||||
"shape_ellipse": "елипса",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "петоъгълен",
|
||||
"shape_rectangle": "правоъгълен",
|
||||
"shape_square": "квадратен",
|
||||
"shape_star": "звезден",
|
||||
"shape_triangle": "триъгълен",
|
||||
"task_trim": "Изтрити %s чънка от %s за %s секунди.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Завършена задача за %s. Обработени: %s чънкове (%s%%), Общо време: %s:%s:%s",
|
||||
"task_stopped": "Задача спряна за %s.",
|
||||
"task_update": "Протичаща задача за %s. Обработени: %s чънкове (%s%%), ETA: %s:%s:%s, Скорост: %s cps, Текущ: %s, %s"
|
||||
"task_update": "Протичаща задача за %s. Обработени: %s чънкове (%s%%), ETA: %s:%s:%s, Скорост: %s cps, Текущ: %s, %s",
|
||||
"wrap_both": "и двете",
|
||||
"wrap_default": "по подразбиране",
|
||||
"wrap_earth": "земя",
|
||||
"wrap_none": "нищо",
|
||||
"wrap_radial": "радиална",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selekcija učitana iz bordera svijeta %s.",
|
||||
"format_border_no_border": "Nema bordera svijeta za %s.",
|
||||
"format_border_remove": "Obrisan border svijeta iz %s.",
|
||||
"format_border_wrap": "Wrapped border je sada %s za %s.",
|
||||
"format_border_wrap": "Wrapped border promijenjen u %s za %s.",
|
||||
"format_cancel": "Proces otkazan za %s.",
|
||||
"format_cancel_all": "Otkazivanje svih procesa.",
|
||||
"format_cancel_confirm": "Otkazani procesi ne mogu biti nastavljeni. Ako sigurno želite da otkažete, kucajte '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Proces nastavljen za %s.",
|
||||
"format_continue_no_tasks": "Nema procesa za nastavak.",
|
||||
"format_trim_confirm": "&cUpozorenje: Čankovi u %s izvan %s regije centrirani u %s, %s sa razdaljinom %s će biti trajno obrisani. Napravite rezervnu kopiju servera prije nego što nastavite da biste izbjegli potencijalnu štetu. Morate restartovati server kada se proces završi. Ako ste razumjeli i želite nastaviti, napišite '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Oblik promijenjen u %s.",
|
||||
"format_pause": "Proces za %s pauziran.",
|
||||
"format_pause_no_tasks": "Nema procesa za pauziranje.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Razdaljina promijenjena u %s.",
|
||||
"format_reload": "Konfiguracija uspješno osvježena.",
|
||||
"format_reload_tasks_running": "Konfiguracija ne može biti osvježena dok je proces u toku.",
|
||||
"format_selection": "Trenutna selekcija",
|
||||
"format_selection_center": "Centar: %s, %s",
|
||||
"format_selection_radius": "Razdaljina: %s",
|
||||
"format_selection_radii": "Poluprečnik: %s, %s",
|
||||
"format_selection_shape": "Oblik: %s",
|
||||
"format_selection_world": "Svijet: %s",
|
||||
"format_shape": "Oblik promijenjen u %s.",
|
||||
"format_silent": "Tihi mod postavljen na %s.",
|
||||
"format_start": "Proces pokrenut u %s za %s regiju centriranu u %s, %s sa razdaljinom %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Vaš host je ograničio maksimalnu razdaljinu pregenerisanja na %s da bi izbjegao veće korištenje memorije. Smanjite razdaljinu ili ih kontaktirajte da biste uklonili ovo ograničenje.",
|
||||
"format_started_already": "Proces je već pokrenut za %s!",
|
||||
"format_world": "Svijet promijenjen u %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Upravljajte borderima svijetova",
|
||||
"help_cancel": "&2chunky cancel&r - Prekinite i obrišite trenutne ili sačuvane procese",
|
||||
"help_center": "&2chunky center <x> <z>&r - Postavite centralne koordinate",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Postavite tihi interval",
|
||||
"help_radius": "&2chunky radius <razdaljina>&r - Postavite razdaljinu",
|
||||
"help_reload": "&2chunky reload&r - Osvježite konfiguraciju",
|
||||
"help_selection": "&2chunky selection&r - Prikažite trenutnu selekciju",
|
||||
"help_shape": "&2chunky shape <oblik>&r - Postavite oblik za generisanje",
|
||||
"help_silent": "&2chunky silent&r - Uključite/isključite poruke napretka",
|
||||
"help_spawn": "&2chunky spawn&r - Postavite centar za spawn lokaciju",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "petlja",
|
||||
"pattern_spiral": "spirala",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "krug",
|
||||
"shape_diamond": "romb",
|
||||
"shape_ellipse": "elipsa",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "pravougaonik",
|
||||
"shape_square": "kvadrat",
|
||||
"shape_star": "zvijezda",
|
||||
"shape_triangle": "trougao",
|
||||
"task_trim": "Obrisano %s čankova iz %s u %s sekundi.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Proces završen za %s. Obrađeno: %s čankova (%s%%), Proteklo vremena: %s:%s:%s",
|
||||
"task_stopped": "Proces zaustavljen za %s.",
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutno: %s, %s"
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutno: %s, %s",
|
||||
"wrap_both": "oba",
|
||||
"wrap_default": "podrazumijevano",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "ništa",
|
||||
"wrap_radial": "radijalno",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -13,10 +13,10 @@
|
||||
"format_border_list": "Hranice světa",
|
||||
"format_border_list_border": "%s: %s se středem %s, %s a poloměrem %s.",
|
||||
"format_border_list_none": "Neexistují žádné světové hranice.",
|
||||
"format_border_load": "Výběr pro svět %s byl načten z světové hranice.",
|
||||
"format_border_load": "Výběr byl načten z okraje světa pro %s.",
|
||||
"format_border_no_border": "Pro %s neexistuje žádná hranice světa.",
|
||||
"format_border_remove": "Ohraničení světa bylo odebráno z %s.",
|
||||
"format_border_wrap": "Zabalování hranic světa je nyní %s pro %s.",
|
||||
"format_border_wrap": "Zabalování hranic světa změněno na %s pro %s.",
|
||||
"format_cancel": "Úkol zrušen pro %s.",
|
||||
"format_cancel_all": "Rušení všech úkolů.",
|
||||
"format_cancel_confirm": "Ve zrušeném úkolu nelze pokračovat. Pokud jsi si jistý, že chceš zrušit úkol, napiš '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Úkol pokračuje pro %s.",
|
||||
"format_continue_no_tasks": "Žádné úkoly k pokračování.",
|
||||
"format_trim_confirm": "&cVarování: chunky v %s mimo oblast %s se středem na %s, %s s poloměrem %s budou natrvalo odstraněny. Před pokračováním se ujistěte, že jste si vytvořili zálohu svého serveru a zabránili tak potenciálnímu poškození. Po dokončení úkolu budete muset plně restartovat server. Pokud souhlasíte a přejete si pokračovat, zadejte '%s'.",
|
||||
"format_trim_confirm_inside": "&cVarování: chunky v %s uvnitř oblasti %s se středem v %s, %s s poloměrem %s budou natrvalo odstraněny. Před pokračováním se ujistěte, že jste si vytvořili zálohu svého serveru a zabránili tak potenciálnímu poškození. Po dokončení úkolu budete muset plně restartovat server. Pokud souhlasíte a přejete si pokračovat, zadejte '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eUpozornění: Filtrování chunků podle maximální doby osídlení z %s tiků. Dokončení může trvat déle než obvykle.",
|
||||
"format_pattern": "Vzor změněn na %s.",
|
||||
"format_pause": "Úkol pozastaven pro %s.",
|
||||
"format_pause_no_tasks": "Žádné úkoly k pozastavení.",
|
||||
@@ -33,8 +35,14 @@
|
||||
"format_quiet": "Interval ticha nastaven na %s vteřin.",
|
||||
"format_radii": "Poloměr změněn x na %s a z na %s.",
|
||||
"format_radius": "Poloměr změněn na %s.",
|
||||
"format_reload": "Úspěšné znovu nsctenata configurace.",
|
||||
"format_reload_tasks_running": "Configurace nemůže být znovunačtena, když úkoly probíhají.",
|
||||
"format_reload": "Konfigurace úspěšně znovu načtena.",
|
||||
"format_reload_tasks_running": "Konfigurace nemůže být znovu načtena pokud úkoly probíhají.",
|
||||
"format_selection": "Aktuální výběr",
|
||||
"format_selection_center": "Střed: %s, %s",
|
||||
"format_selection_radius": "Poloměr: %s",
|
||||
"format_selection_radii": "Poloměr: %s, %s",
|
||||
"format_selection_shape": "Tvar: %s",
|
||||
"format_selection_world": "Svět: %s",
|
||||
"format_shape": "Tvar změněn na %s.",
|
||||
"format_silent": "Tichý režim %s.",
|
||||
"format_start": "Úkol byl zahájen v %s pro oblast %s se středem v %s, %s s poloměrem %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Váš hostitel omezil maximální poloměr před generováním na %s, aby se zabránilo nadměrnému využívání místa na disku. Omezte poloměr nebo kontaktujte svého hostitele, pokud chcete odebrat tento limit.",
|
||||
"format_started_already": "Úkol byl již zahájen pro %s!",
|
||||
"format_world": "Svět změněn na %s.",
|
||||
"format_worldborder_too_large": "&eUpozornění: Váše hranice světa je aktuálně nastavena větší než maximálních %s nakonfigurovaných v server.properties. To je obvykle chyba a může způsobit problémy.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Spravujte vlastní hranice světa",
|
||||
"help_cancel": "&2chunky cancel&r - Zastaví a smaže aktuální nebo uložené úkoly",
|
||||
"help_center": "&2chunky center <x> <z>&r - Nastaví středový blok",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Nastavit interval klidu",
|
||||
"help_radius": "&2chunky radius <radius>&r - Nastavit poloměr",
|
||||
"help_reload": "&2chunky reload&r - Obnovit konfigurační soubory",
|
||||
"help_selection": "&2chunky selection&r - Zobrazit aktuální výběr",
|
||||
"help_shape": "&2chunky shape <shape>&r - Nastavit tvar pro generování",
|
||||
"help_silent": "&2chunky silent&r - Přepnout zobrazování aktualizačních zpráv",
|
||||
"help_spawn": "&2chunky spawn&r - Nastavit střed na bod spawnu",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "opakování",
|
||||
"pattern_spiral": "spirála",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "oblast",
|
||||
"pattern_world": "svět",
|
||||
"shape_circle": "kruh",
|
||||
"shape_diamond": "diamant",
|
||||
"shape_ellipse": "elipsa",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pětiúhelník",
|
||||
"shape_rectangle": "obdélník",
|
||||
"shape_square": "čtverec",
|
||||
"shape_star": "hvězda",
|
||||
"shape_triangle": "trojúhelník",
|
||||
"task_trim": "Smazáno %s chunků z %s za %s vteřin.",
|
||||
"task_trim_update": "Úkol běží pro %s. Zpracováno: %s regionů (%s%%)",
|
||||
"task_done": "Úkol pro %s byl dokončen. Zpracováno: %s chunků (%s%%), Celkový čas: %s:%s:%s",
|
||||
"task_stopped": "Úkol pro %s byl zastaven.",
|
||||
"task_update": "Úkol běží po dobu %s. Zpracováno: %s chunků (%s%%), ETA: %s:%s:%s, Hodnota: %s cps, Aktuální: %s, %s"
|
||||
"task_update": "Úkol běží po dobu %s. Zpracováno: %s chunků (%s%%), ETA: %s:%s:%s, Hodnota: %s cps, Aktuální: %s, %s",
|
||||
"wrap_both": "oboje",
|
||||
"wrap_default": "výchozí",
|
||||
"wrap_earth": "země",
|
||||
"wrap_none": "žádné",
|
||||
"wrap_radial": "kruhové",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Auswahl von der Weltgrenze für %s geladen.",
|
||||
"format_border_no_border": "Für %s existiert keine Weltgrenze.",
|
||||
"format_border_remove": "Weltgrenze von %s entfernt.",
|
||||
"format_border_wrap": "Der Weltrandumbruch ist jetzt %s für %s.",
|
||||
"format_border_wrap": "Weltrandumbruch geändert zu %s für %s.",
|
||||
"format_cancel": "Aufgabe abgebrochen für %s.",
|
||||
"format_cancel_all": "Abbrechen aller Aufgaben.",
|
||||
"format_cancel_confirm": "Abgebrochene Aufgaben können nicht fortgesetzt werden. Wenn du dir sicher bist, dass du es abbrechen willst, schreibe '%s'",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Mache weiter mit Aufgabe für %s.",
|
||||
"format_continue_no_tasks": "Keine Aufgaben zum Weitermachen.",
|
||||
"format_trim_confirm": "&cWarnung: Chunks in %s ausserhalb von der %s Region zentriert bei %s, %s mit Radius %s wird vollständig gelöscht. Bitte stelle sicher, dass du ein Backup von deinem Server gemacht hast, bevor du weiter machst, um eventuelle Schäden zu verhindern. Du musst deinen Server komplett neustarten nachdem die Aufgabe erledigt ist. Wenn du dies verstehst und weitermachen willst, schreibe '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarnung: Chunks in %s der %s Region zentriert bei %s, %s mit Radius %s wird vollständig gelöscht. Bitte stelle sicher, dass du ein Backup von deinem Server gemacht hast, bevor du weiter machst, um eventuelle Schäden zu verhindern. Du musst deinen Server komplett neustarten nachdem die Aufgabe erledigt ist. Wenn du dies verstehst und weitermachen willst, schreibe '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eHinweis: Filtere Chunks nach einer maximalen bewohnten Zeit von %s ticks. Trimmen kann länger dauern als üblich zum abschliessen.",
|
||||
"format_pattern": "Muster geändert zu %s.",
|
||||
"format_pause": "Aufgabe pausiert für %s.",
|
||||
"format_pause_no_tasks": "Keine aufgaben zum pausieren.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Radius geändert zu %s.",
|
||||
"format_reload": "Konfiguration erfolgreich neu geladen.",
|
||||
"format_reload_tasks_running": "Die Konfiguration kann nicht neu geladen werden während Aufgaben laufen.",
|
||||
"format_selection": "Aktuelle Auswahl",
|
||||
"format_selection_center": "Zentrum: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radien: %s. %s",
|
||||
"format_selection_shape": "Form: %s",
|
||||
"format_selection_world": "Welt: %s",
|
||||
"format_shape": "Form geändert zu %s.",
|
||||
"format_silent": "Stummer Modus %s.",
|
||||
"format_start": "Aufgabe gestartet für %2$s Region in %1$s bei %3$s, %4$s mit Radius %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Dein Host hat den maximalen Radius fürs generieren auf %s beschränkt, um übermässigen Speicherplatzverbrauch zu vermeiden. Verringere den Radius oder kontaktiere deinen Host wenn du dieses Limit entfernt haben willst.",
|
||||
"format_started_already": "Aufgabe für %s bereits gestartet!",
|
||||
"format_world": "Welt geändert zu %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Verwalten von benutzerdefinierten Weltgrenzen",
|
||||
"help_cancel": "&2chunky cancel&r - Stoppe und lösche alle momentan gespeicherten Aufgaben",
|
||||
"help_center": "&2chunky center <x> <z>&r - Setze die mittlere Block-Position",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Setze den stummen Intervall",
|
||||
"help_radius": "&2chunky radius <radius>&r - Setze den Radius",
|
||||
"help_reload": "&2chunky reload&r - Ladet die Konfiguration neu",
|
||||
"help_selection": "&2chunky selection&r - Zeige die aktuelle Auswahl",
|
||||
"help_shape": "&2chunky shape <shape>&r - Setze die Form zum Generieren.",
|
||||
"help_silent": "&2chunky silent&r - Ändere das Anzeigen von Update-Nachrichten",
|
||||
"help_spawn": "&2chunky spawn&r - Setze den Spawnpunkt als Mitte",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "Schleife",
|
||||
"pattern_spiral": "Spirale",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "Kreis",
|
||||
"shape_diamond": "Diamant",
|
||||
"shape_ellipse": "Ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "Pentagon",
|
||||
"shape_rectangle": "Rechteck",
|
||||
"shape_square": "Quadrat",
|
||||
"shape_star": "Stern",
|
||||
"shape_triangle": "Dreieck",
|
||||
"task_trim": "Löschte %s Chunks von %s in %s Sekunden.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Aufgabe für %s beendet. Verarbeitet: %s Chunks (%s%%), Gesamte Zeit: %s:%s:%s",
|
||||
"task_stopped": "Aufgabe für %s gestoppt.",
|
||||
"task_update": "Aufgabe für %s läuft. Verarbeitet: %s Chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Aktuell: %s, %s"
|
||||
"task_update": "Aufgabe für %s läuft. Verarbeitet: %s Chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Aktuell: %s, %s",
|
||||
"wrap_both": "beide",
|
||||
"wrap_default": "standard",
|
||||
"wrap_earth": "Erde",
|
||||
"wrap_none": "keine",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selection loaded from world border for %s.",
|
||||
"format_border_no_border": "No world border exists for %s.",
|
||||
"format_border_remove": "Removed world border from %s.",
|
||||
"format_border_wrap": "World border wrapping is now %s for %s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Task cancelled for %s.",
|
||||
"format_cancel_all": "Cancelling all tasks.",
|
||||
"format_cancel_confirm": "Cancelled tasks cannot be continued. If you are sure you want to cancel, type '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Task continuing for %s.",
|
||||
"format_continue_no_tasks": "No tasks to continue.",
|
||||
"format_trim_confirm": "&cWarning: Chunks in %s outside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Pattern changed to %s.",
|
||||
"format_pause": "Task paused for %s.",
|
||||
"format_pause_no_tasks": "No tasks to pause.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Radius changed to %s.",
|
||||
"format_reload": "Successfully reloaded configuration.",
|
||||
"format_reload_tasks_running": "The configuration cannot be reloaded while tasks are running.",
|
||||
"format_selection": "Current selection",
|
||||
"format_selection_center": "Center: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Shape: %s",
|
||||
"format_selection_world": "World: %s",
|
||||
"format_shape": "Shape changed to %s.",
|
||||
"format_silent": "Silent mode %s.",
|
||||
"format_start": "Task started in %s for the %s region centered at %s, %s with radius %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Your host has limited the maximum pre-generation radius to %s to avoid excessive disk space usage. Reduce the radius or contact your host if you wish to have this limit removed.",
|
||||
"format_started_already": "Task already started for %s!",
|
||||
"format_world": "World changed to %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Manage custom world borders",
|
||||
"help_cancel": "&2chunky cancel&r - Stop and delete current or saved tasks",
|
||||
"help_center": "&2chunky center <x> <z>&r - Set the center block location",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Set the quiet interval",
|
||||
"help_radius": "&2chunky radius <radius>&r - Set the radius",
|
||||
"help_reload": "&2chunky reload&r - Reload configuration",
|
||||
"help_selection": "&2chunky selection&r - Display the current selection",
|
||||
"help_shape": "&2chunky shape <shape>&r - Set the shape to generate",
|
||||
"help_silent": "&2chunky silent&r - Toggle displaying update messages",
|
||||
"help_spawn": "&2chunky spawn&r - Set the center to the spawn point",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "circle",
|
||||
"shape_diamond": "diamond",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "square",
|
||||
"shape_star": "star",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "Deleted %s chunks from %s in %s seconds.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Task finished for %s. Processed: %s chunks (%s%%), Total time: %s:%s:%s",
|
||||
"task_stopped": "Task stopped for %s.",
|
||||
"task_update": "Task running for %s. Processed: %s chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Current: %s, %s"
|
||||
"task_update": "Task running for %s. Processed: %s chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Current: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selección de borde de mundo cargada para %s.",
|
||||
"format_border_no_border": "No hay un borde de mundo para %s.",
|
||||
"format_border_remove": "Removido borde de mundo de %s.",
|
||||
"format_border_wrap": "El envoltorio del borde del mundo ahora es %s por %s.",
|
||||
"format_border_wrap": "El envoltorio del borde del mundo ha cambiado a %s por %s.",
|
||||
"format_cancel": "Tarea cancelada para %s.",
|
||||
"format_cancel_all": "Cancelando todas las tareas.",
|
||||
"format_cancel_confirm": "Las tareas canceladas no pueden ser resumidas. Si estás seguro que quieres cancelarla, escribe '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Tarea continuando para %s.",
|
||||
"format_continue_no_tasks": "No hay tareas que continuar.",
|
||||
"format_trim_confirm": "&cAdvertencia: Los chunks en %s fuera de la región de forma %s, centrada en %s, %s con radio %s serán permanentemente borrados. Por favor asegúrate que has hecho un respaldo de tu servidor antes de continuar para evitar cualquier daño posible. Necesitarás reiniciar tu servidor por completo una vez la tarea termine. Si entiendes esto y deseas continuar, usa '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Patrón cambiado a %s.",
|
||||
"format_pause": "Tarea pausada para %s.",
|
||||
"format_pause_no_tasks": "No hay tareas que pausar.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Radio cambiado a %s.",
|
||||
"format_reload": "Configuración recargada correctamente.",
|
||||
"format_reload_tasks_running": "La configuración no puede ser recargada mientras haya tareas en ejecución.",
|
||||
"format_selection": "Selección actual",
|
||||
"format_selection_center": "Centro: %s, %s",
|
||||
"format_selection_radius": "Radio: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Forma: %s",
|
||||
"format_selection_world": "Mundo: %s",
|
||||
"format_shape": "La forma cambió a %s.",
|
||||
"format_silent": "El modo silencioso está %s.",
|
||||
"format_start": "Tarea iniciada para %1$s en %3$s, %4$s con un radio de %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Tu proveedor de servicio ha limitado el radio máximo de pre-generación a %s para evitar un uso excesivo de espacio en disco. Reduce el radio o ponte en contacto con tu proveedor necesitas eliminar este límite.",
|
||||
"format_started_already": "¡Tarea ya iniciada para %s!",
|
||||
"format_world": "Mundo cambiado a %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Administrar bordes personalizados del mundo",
|
||||
"help_cancel": "&2chunky cancel&r - Detiene y elimina las tareas actuales o guardadas",
|
||||
"help_center": "&2chunky center <x> <z>&r - Establece el centro",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Establece el tiempo de reportado silencioso",
|
||||
"help_radius": "&2chunky radius <radius>&r - Establece el radio",
|
||||
"help_reload": "&2chunky reload&r - Recarga la configuración",
|
||||
"help_selection": "&2selección de chunky&r - Muestra la actual selección",
|
||||
"help_shape": "&2chunky shape <shape>&r - Selecciona la forma de generación",
|
||||
"help_silent": "&2chunky silent&r - Enciende/apaga las notificaciones de progreso",
|
||||
"help_spawn": "&2chunky spawn&r - Establece el centro en el punto de reaparición",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "bucle",
|
||||
"pattern_spiral": "espiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "círculo",
|
||||
"shape_diamond": "diamante",
|
||||
"shape_ellipse": "elipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentágono",
|
||||
"shape_rectangle": "rectángulo",
|
||||
"shape_square": "cuadrado",
|
||||
"shape_star": "estrella",
|
||||
"shape_triangle": "triángulo",
|
||||
"task_trim": "Borrados %s chunks de %s en %s segundos.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Tarea finalizada en %s. Chunks procesados: %s (%s%%), Tiempo total: %s:%s:%s",
|
||||
"task_stopped": "Tarea pausada por %s.",
|
||||
"task_update": "Tarea en %s. Chunks procesados: %s (%s%%), tiempo estimado restante: %s:%s:%s, Promedio de: %s cps, Chunk actual: %s, %s"
|
||||
"task_update": "Tarea en %s. Chunks procesados: %s (%s%%), tiempo estimado restante: %s:%s:%s, Promedio de: %s cps, Chunk actual: %s, %s",
|
||||
"wrap_both": "ambos",
|
||||
"wrap_default": "por defecto",
|
||||
"wrap_earth": "tierra",
|
||||
"wrap_none": "ninguno",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selection loaded from world border for %s.",
|
||||
"format_border_no_border": "No world border exists for %s.",
|
||||
"format_border_remove": "Removed world border from %s.",
|
||||
"format_border_wrap": "World border wrapping is now %s for %s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Task cancelled for %s.",
|
||||
"format_cancel_all": "Cancelling all tasks.",
|
||||
"format_cancel_confirm": "Cancelled tasks cannot be continued. If you are sure you want to cancel, type '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Task continuing for %s.",
|
||||
"format_continue_no_tasks": "No tasks to continue.",
|
||||
"format_trim_confirm": "&cWarning: Chunks in %s outside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Pattern changed to %s.",
|
||||
"format_pause": "Task paused for %s.",
|
||||
"format_pause_no_tasks": "No tasks to pause.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Radius changed to %s.",
|
||||
"format_reload": "Successfully reloaded configuration.",
|
||||
"format_reload_tasks_running": "The configuration cannot be reloaded while tasks are running.",
|
||||
"format_selection": "Current selection",
|
||||
"format_selection_center": "Center: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Shape: %s",
|
||||
"format_selection_world": "World: %s",
|
||||
"format_shape": "Shape changed to %s.",
|
||||
"format_silent": "Silent mode %s.",
|
||||
"format_start": "Task started in %s for the %s region centered at %s, %s with radius %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Your host has limited the maximum pre-generation radius to %s to avoid excessive disk space usage. Reduce the radius or contact your host if you wish to have this limit removed.",
|
||||
"format_started_already": "Task already started for %s!",
|
||||
"format_world": "World changed to %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Manage custom world borders",
|
||||
"help_cancel": "&2chunky cancel&r - Stop and delete current or saved tasks",
|
||||
"help_center": "&2chunky center <x> <z>&r - Set the center block location",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Set the quiet interval",
|
||||
"help_radius": "&2chunky radius <radius>&r - Set the radius",
|
||||
"help_reload": "&2chunky reload&r - Reload configuration",
|
||||
"help_selection": "&2chunky selection&r - Display the current selection",
|
||||
"help_shape": "&2chunky shape <shape>&r - Set the shape to generate",
|
||||
"help_silent": "&2chunky silent&r - Toggle displaying update messages",
|
||||
"help_spawn": "&2chunky spawn&r - Set the center to the spawn point",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "circle",
|
||||
"shape_diamond": "diamond",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "square",
|
||||
"shape_star": "star",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "Deleted %s chunks from %s in %s seconds.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Task finished for %s. Processed: %s chunks (%s%%), Total time: %s:%s:%s",
|
||||
"task_stopped": "Task stopped for %s.",
|
||||
"task_update": "Task running for %s. Processed: %s chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Current: %s, %s"
|
||||
"task_update": "Task running for %s. Processed: %s chunks (%s%%), ETA: %s:%s:%s, Rate: %s cps, Current: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
"command_no_permission": "&cVous n'avez pas la permission pour cette commande.",
|
||||
"disabled": "désactivé",
|
||||
"enabled": "activé",
|
||||
"error_version": "Ce plugin n'est pas compatible avec les versions de Minecraft ultérieures à la 1.13.",
|
||||
"error_version": "Ce plugin n'est pas compatible avec les versions de Minecraft antérieures à la 1.13.",
|
||||
"error_version_spigot": "Ce plugin n'est pas compatible avec Spigot 1.13 !",
|
||||
"format_border_add": "Ajout de la bordure du monde %s pour %s avec pour centre %s, %s, et de rayon %s.",
|
||||
"format_border_bypass": "Contournement de bordure temporaire %s pour %s.",
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Sélection chargée de la bordure du monde pour le monde %s.",
|
||||
"format_border_no_border": "Aucune bordure de monde n'existe pour %s.",
|
||||
"format_border_remove": "La bordure du monde %s a été supprimée.",
|
||||
"format_border_wrap": "Le dégagement de la bordure du monde est maintenant %s dans la dimension %s.",
|
||||
"format_border_wrap": "L'enveloppe de bordure du monde a été changée de %s à %s.",
|
||||
"format_cancel": "Tâche annulée pour le monde: %s.",
|
||||
"format_cancel_all": "Annulation de toutes les tâches.",
|
||||
"format_cancel_confirm": "Les tâches annulées ne peuvent pas être continuées. Si vous êtes sûr(e) de vouloir annuler, tapez '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "La tâche se poursuit pour %s.",
|
||||
"format_continue_no_tasks": "Aucune tâche à continuer.",
|
||||
"format_trim_confirm": "&cAvertissement: Les tronçons dans %s en dehors de la région %s centrée à %s, %s avec le rayon %s seront définitivement supprimés. Veuillez vous assurer que vous avez fait une sauvegarde de votre serveur avant de continuer pour éviter des dommages potentiels. Vous devrez redémarrer votre serveur une fois la tâche terminée. Si vous comprenez et souhaitez continuer, tapez '%s'.",
|
||||
"format_trim_confirm_inside": "&cAvertissement : Les Chunks dans %s à l'intérieur de la région %s, coordonnées %s, %s avec un rayon de %s, seront définitivement supprimés. Veuillez vous assurer que vous avez fait une sauvegarde de votre serveur avant de continuer afin d'éviter tout dommage potentiel. Vous devrez redémarrer votre serveur une fois la tâche terminée. Si vous souhaitez continuer, tapez '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eRemarque: Filtrage des chunks non occupés depuis %s ticks. Le traitement peut être plus long que d'habitude.",
|
||||
"format_pattern": "Le modèle a été changé en %s.",
|
||||
"format_pause": "Tâche interrompue pour %s.",
|
||||
"format_pause_no_tasks": "Aucune tâche à mettre en pause.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Rayon modifié à %s.",
|
||||
"format_reload": "Configuration rechargée avec succès.",
|
||||
"format_reload_tasks_running": "La configuration ne peut pas être rechargée pendant que les tâches sont en cours d'exécution.",
|
||||
"format_selection": "Sélection active",
|
||||
"format_selection_center": "Centre: %s, %s",
|
||||
"format_selection_radius": "Rayon: %s",
|
||||
"format_selection_radii": "Rayons: %s,%s",
|
||||
"format_selection_shape": "Forme: %s",
|
||||
"format_selection_world": "Monde: %s",
|
||||
"format_shape": "La forme a été changée en %s.",
|
||||
"format_silent": "Mode silencieux %s.",
|
||||
"format_start": "La tâche a commencé en %s pour la région %s centrée en %s, %s avec un rayon de %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Votre hôte a limité le rayon de pré-génération maximum à %s pour éviter une utilisation excessive de l'espace disque. Réduisez le rayon ou contactez votre hôte si vous souhaitez que cette limite soit supprimée.",
|
||||
"format_started_already": "La tâche a déjà commencé pour %s !",
|
||||
"format_world": "Le monde est passé à %s.",
|
||||
"format_worldborder_too_large": "&eRemarque : La bordure de votre monde est actuellement plus grande que le maximum de %s configuré dans server.properties. Il s'agit normalement d'une erreur qui peut entraîner des problèmes.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Gérer les bordures personnalisées du monde",
|
||||
"help_cancel": "&2chunky cancel&r - Arrêter et supprimer les tâches en cours ou enregistrées",
|
||||
"help_center": "&2chunky center <x> <z>&r - Définir l'emplacement du bloc central",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Définir l'intervalle de silence",
|
||||
"help_radius": "&2chunky radius <radius>&r - Définir le rayon",
|
||||
"help_reload": "&2chunky reload&r - Recharger la configuration",
|
||||
"help_selection": "&2chunky selection&r - Afficher la sélection actuelle",
|
||||
"help_shape": "&2chunky shape <shape>&r - Définir la forme à générer",
|
||||
"help_silent": "&2chunky silent&r - Activer/désactiver les messages de mise à jour",
|
||||
"help_spawn": "&2chunky spawn&r - Définir le centre au point d'apparition",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "boucle",
|
||||
"pattern_spiral": "spirale",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "région",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "cercle",
|
||||
"shape_diamond": "diamant",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagone",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "carré",
|
||||
"shape_star": "étoile",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "%s tronçons supprimés de %s en %s secondes.",
|
||||
"task_trim_update": "Tâche en cours d'exécution pour %s. Traitée : %s régions (%s%%)",
|
||||
"task_done": "Tâche terminée pour %s. Traité: %s tronçons (%s%%), Durée totale: %s:%s:%s",
|
||||
"task_stopped": "Tâche arrêtée pour %s.",
|
||||
"task_update": "Tâche en cours pour %s. Traité: %s tronçons (%s%%), Prévision: %s:%s:%s, Moyenne: %s cps, Actuellement: %s, %s"
|
||||
"task_update": "Tâche en cours pour %s. Traité: %s tronçons (%s%%), Prévision: %s:%s:%s, Moyenne: %s cps, Actuellement: %s, %s",
|
||||
"wrap_both": "les deux",
|
||||
"wrap_default": "par défaut",
|
||||
"wrap_earth": "terrestre",
|
||||
"wrap_none": "aucun",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"border_dependency_update": "צאנקי צריך להתעדכן כדי להשתמש בChunkyBorder!",
|
||||
"border_load_failed": "אין גבולות שמורים שנמצאו.",
|
||||
"border_save_failed": "לא ניתן לשמור גבולות.",
|
||||
"command_no_permission": "&cאין לך גישה להשתמש בפקודה זאת.",
|
||||
"disabled": "מבוטלת",
|
||||
"enabled": "מופעלת",
|
||||
"error_version": "פלאגין זה אינו מתאים למיינקראפט בגרסה שמתחת ל1.13.",
|
||||
"error_version_spigot": "פלאגין זה אינו מתאים לSpigot בגרסה 1.13!",
|
||||
"format_border_add": "נוסף %s גבול ל%s עם המרכז %s,%s, ורדיוס של %s.",
|
||||
"format_border_bypass": "עקיפת הגבול היא %s עבור %s.",
|
||||
"format_border_bypass_no_target": "לא נמצא שחקן עם השם %s.",
|
||||
"format_border_list": "גבולות עולם",
|
||||
"format_border_list_border": "%s: %s עם מרכז %s, %s ורדיוס של %s.",
|
||||
"format_border_list_none": "אין גבולות עולם.",
|
||||
"format_border_load": "בחירה נטענה מגבול העולם עבור %s.",
|
||||
"format_border_no_border": "אין גבול עולם קיים עבור %s.",
|
||||
"format_border_remove": "הוסר גבול העולם מ%s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "משימה בוטלה עבור %s.",
|
||||
"format_cancel_all": "מבטל את כל המשימות.",
|
||||
"format_cancel_confirm": "משימות מבוטלות לא יכולות להימשך. אם אתה רוצה לבטל, הקלד '%s'.",
|
||||
"format_cancel_no_tasks": "אין משימות לביטול.",
|
||||
"format_center": "מרכז שונה ל %s, %s.",
|
||||
"format_confirm": "אין מה לאשר!",
|
||||
"format_continue": "ממשיך משימה עבור %s.",
|
||||
"format_continue_no_tasks": "אין משימות להמשיך.",
|
||||
"format_trim_confirm": "&cאזהרה: צאנקים בעולם %s מחוץ לאזור ה %s הממורכז ב %s, %s עם רדיוס %s ימחקו לאלתר. אנא וודא כי שמרת גיבוי של השרת לפני שתמשיך כדי למנוע נזק אפשרי. אתה תצטרך להפעיל מחדש את השרת לגמרי לאחר שהמשימה הושלמה. אם אתה מבין ורוצה להמשיך, הקלד '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "דפוס השתנה ל%s.",
|
||||
"format_pause": "משימה הושהתה עבור %s.",
|
||||
"format_pause_no_tasks": "אין משימות להשהות.",
|
||||
"format_progress_no_tasks": "אין משימות פועלות.",
|
||||
"format_quiet": "מרווח זמן שקט הוגדר ל%s שניות.",
|
||||
"format_radii": "ערכי הרדיוס השתנו עבור x ל%s, ועבור z ל%s.",
|
||||
"format_radius": "רדיוס השתנה ל%s.",
|
||||
"format_reload": "הגדרות נטענו מחדש בהצלחה.",
|
||||
"format_reload_tasks_running": "ההגדרות לא יכלו להיטען מחדש מאחר ומשימות עדיין פועלות.",
|
||||
"format_selection": "בחירה נוכחית",
|
||||
"format_selection_center": "מרכז: %s, %s",
|
||||
"format_selection_radius": "רדיוס: %s",
|
||||
"format_selection_radii": "רדיוסים: %s, %s",
|
||||
"format_selection_shape": "צורה: %s",
|
||||
"format_selection_world": "עולם: %s",
|
||||
"format_shape": "צורה השתנתה ל%s.",
|
||||
"format_silent": "מצב השתקה %s.",
|
||||
"format_start": "משימה התחילה ב%s עבור אזור %s ממורכז ב %s, %s עם רדיוס %s.",
|
||||
"format_start_confirm": "משימה כבר התחילה עבור עולם זה. על מנת להמשיך אותה, הקלד '%s'. על מנת להתחיל משימה חדשה, הקלד '%s'.",
|
||||
"format_start_disk": "לשרת יש רק %s נותר בשטח דיסק, אבל שטח הדיסק הנדרש למשימה הוא %s. אם ברצונך להתחיל בכל זאת, הקלד '%s'.",
|
||||
"format_start_limit": "מאחסן השרת שלך הגביל את הרדיוס המקסימלי עבור יצירה מראש ל%s כדי להימנע משימוש מופרז בשטח הדיסק. הקטן את הרדיוס או צור קשר עם מאחסן השרת אם ברצונך שתוסר ההגבלה.",
|
||||
"format_started_already": "משימה כבר החלה עבור %s!",
|
||||
"format_world": "עולם השתנה ל%s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - מנהל גבולות עולם מותאמות אישית",
|
||||
"help_cancel": "&2chunky cancel&r - עוצר ומוחק משימות שמורות או נוכחיות",
|
||||
"help_center": "&2chunky center <x> <z>&r - מגדיר את מיקום הבלוק המרכזי",
|
||||
"help_continue": "&2chunky continue&r - להמשיך משימה שמורה או נוכחית",
|
||||
"help_corners": "&2chunky corners <x1> <z1> <x2> <z2>&r - הגדרה לפי פינות",
|
||||
"help_trim": "&2chunky trim&r - מחיקת צאנקים מחוץ לבחירה",
|
||||
"help_menu": "&aפקודות צאנקי&r%s",
|
||||
"help_more": "הקלד &a%s&r כדי לראות עוד.",
|
||||
"help_pattern": "&2chunky pattern <pattern>&r - הגדר את דפוס היצירה",
|
||||
"help_pause": "&2chunky pause&r - השהה התקדמות משימות שמורות ונוכחיות",
|
||||
"help_progress": "&2chunky progress&r - מציג את התקדמות המשימה הנוכחית",
|
||||
"help_quiet": "&2chunky quiet <interval>&r - הגדר את מרווח הזמן השקט",
|
||||
"help_radius": "&2chunky radius <radius>&r - מגדיר את הרדיוס",
|
||||
"help_reload": "&2chunky reload&r - מרענן הגדרות",
|
||||
"help_selection": "&2chunky selection&r - מציג את הבחירה הנוכחית",
|
||||
"help_shape": "&2chunky shape <shape>&r - מגדיר את הצורה ליצירה",
|
||||
"help_silent": "&2chunky silent&r - הצג או בטל הצגה של הודעות העידכון",
|
||||
"help_spawn": "&2chunky spawn&r - הגדר את המרכז לנקודת השיגור",
|
||||
"help_start": "&2chunky start&r - התחל משימת יצירת צאנקים חדשה",
|
||||
"help_world": "&2chunky world <world>&r - הגדר את עולם היעד",
|
||||
"help_worldborder": "&2chunky worldborder&r - השתמש במרכז וברדיוס של גבול העולם",
|
||||
"pattern_concentric": "מעגלים ממורכזים",
|
||||
"pattern_loop": "הלוך ושוב",
|
||||
"pattern_spiral": "ספירלית",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "מעגל",
|
||||
"shape_diamond": "יהלום",
|
||||
"shape_ellipse": "אליפסה",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "מחומש",
|
||||
"shape_rectangle": "מלבן",
|
||||
"shape_square": "ריבוע",
|
||||
"shape_star": "כוכב",
|
||||
"shape_triangle": "משולש",
|
||||
"task_trim": "נמחק %s צאנקים מ%s ב%s שניות.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "משימה הושלמה עבור %s. עובד: %s צאנקים (%s%%), זמן סך הכל: %s:%s:%s",
|
||||
"task_stopped": "משימה הופסקה עבור %s.",
|
||||
"task_update": "משימה פועלת עבור %s. עובד: %s צאנקים (%s%%), זמן משוער: %s:%s:%s, קצב: %s צאנקים לשנייה, כעת: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -10,13 +10,13 @@
|
||||
"format_border_add": "%2$s में %1$s वर्ल्ड सीमा केंद्र %s,%s और त्रिज्या %s के साथ जोड़ी गयी।",
|
||||
"format_border_bypass": "%2$s के लिए अस्थायी सीमा बाईपास %1$s किया गया।",
|
||||
"format_border_bypass_no_target": "%s नाम का कोई प्लेयर नहीं मिला।",
|
||||
"format_border_list": "वर्ल्ड सीमायें",
|
||||
"format_border_list": "दुनिया सीमा",
|
||||
"format_border_list_border": "%s: %s आकार में केंद्र %s,%s और त्रिज्या %s.",
|
||||
"format_border_list_none": "कोई वर्ल्ड सीमायें नहीं।",
|
||||
"format_border_load": "%s के लिए वर्ल्ड सीमा से चयन लोड किया गया।",
|
||||
"format_border_no_border": "%s के लिए कोई वर्ल्ड सीमा मौजूद नहीं है।",
|
||||
"format_border_remove": "%s से वर्ल्ड सीमा हटाई गयी।",
|
||||
"format_border_wrap": "%s के लिए वर्ल्ड सीमा रैपिंग %s कर दी गयी है।",
|
||||
"format_border_wrap": "वर्ल्ड सीमा रैप %s से %s बदल दी गयी।",
|
||||
"format_cancel": "%s के लिए कार्य रद्द किया गया।",
|
||||
"format_cancel_all": "सभी कार्यों को रद्द कर रहा है।",
|
||||
"format_cancel_confirm": "रद्द किये गए कार्य जारी नहीं किये जा सकते। अगर आप वाकई रद्द करना चाहते हैं तो, लिखिए '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "%s के लिए कार्य जारी है।",
|
||||
"format_continue_no_tasks": "जारी करने के लिए कोई कार्य नहीं।",
|
||||
"format_trim_confirm": "&cचेतावनी: %s में केंद्र %3$s, %4$s और त्रिज्या %5$s में %2$s आकार से बाहर के सारे चंक स्थायी रूप से हट जाएंगे। संभावित हानि को टालने के लिए सुनिश्चित करें कि आपने अपने सर्वर का बैकअप ले लिया है। कार्य पूरा होने के बाद आपको अपने सर्वर को रीस्टार्ट करना होगा। अगर आप इसे समझते है और आगे बढ़ना चाहते हैं तो, लिखे '%s'.",
|
||||
"format_trim_confirm_inside": "&cचेतावनी: %s में केंद्र %s, %s और त्रिज्या %s में %s आकार से बाहर के सारे चंक स्थायी रूप से हट जाएंगे। संभावित हानि को टालने के लिए सुनिश्चित करें कि आपने अपने सर्वर का बैकअप ले लिया है। कार्य पूरा होने के बाद आपको अपने सर्वर को रीस्टार्ट करना होगा। अगर आप इसे समझते है और आगे बढ़ना चाहते हैं तो, लिखे '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "पैटर्न %s से बदला गया।",
|
||||
"format_pause": "%s के लिए कार्य रोका गया।",
|
||||
"format_pause_no_tasks": "रोकने के लिए कोई कार्य नहीं।",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "त्रिज्या %s से बदली गयी।",
|
||||
"format_reload": "कॉन्फ़िगरेशन सफलतापूर्वक पुनः लोड किये गए।",
|
||||
"format_reload_tasks_running": "कोई कार्य जारी होने के दौरान कॉन्फ़िगरेशन पुनः लोड नहीं किये जा सकते।",
|
||||
"format_selection": "वर्तमान चयन",
|
||||
"format_selection_center": "केंद्र: %s,%s",
|
||||
"format_selection_radius": "त्रिज्या: %s",
|
||||
"format_selection_radii": "त्रिज्या: %s,%s",
|
||||
"format_selection_shape": "आकार: %s",
|
||||
"format_selection_world": "वर्ल्ड: %s",
|
||||
"format_shape": "आकार %s से बदला गया।",
|
||||
"format_silent": "मौन मोड %s.",
|
||||
"format_start": "%s से %s आकार केंद्र %s,%s और त्रिज्या %s के साथ कार्य शुरू किया गया।",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "आपके होस्ट ने अत्यधिक डिस्क स्थान उपयोग से बचने के लिए अधिकतम प्री-जेनरेशन त्रिज्या %s कर दी है। यदि आप इस सीमा को हटाना चाहते हैं तो अपने होस्ट से संपर्क करें या सीमा कम रखें।",
|
||||
"format_started_already": "%s के लिए कार्य पहले से ही जारी है!",
|
||||
"format_world": "वर्ल्ड को %s से बदला गया।",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - कस्टम वर्ल्ड सीमायें प्रबंधित करना",
|
||||
"help_cancel": "&2chunky cancel&r - वर्तमान या सहजें गए कार्य रोकना या हटाना",
|
||||
"help_center": "&2chunky center <x> <z>&r - केंद्र ब्लॉक का स्थान सेट करना",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - मौन अंतराल सेट करना",
|
||||
"help_radius": "&2chunky radius <radius>&r - त्रिज्या सेट करना",
|
||||
"help_reload": "&2chunky reload&r - कॉन्फ़िगरेशन पुनः लोड करना",
|
||||
"help_selection": "&2chunky selection&r - वर्तमान चयन दिखाना",
|
||||
"help_shape": "&2chunky shape <shape>&r - जेनरेट करने के लिए आकार सेट करना",
|
||||
"help_silent": "&2chunky silent&r - अपडेट मैसेज को प्रदर्शित करने के लिए टॉगल करना",
|
||||
"help_spawn": "&2chunky spawn&r - केंद्र को स्पॉन बिंदु पर सेट करना",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "लूप",
|
||||
"pattern_spiral": "कुंडली",
|
||||
"pattern_csv": "csv",
|
||||
"shape_circle": "गोल",
|
||||
"pattern_region": "क्षेत्र",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "वृत्त",
|
||||
"shape_diamond": "डायमंड",
|
||||
"shape_ellipse": "अंडाकार",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "पंचभुज",
|
||||
"shape_rectangle": "आयात",
|
||||
"shape_square": "वर्ग",
|
||||
"shape_star": "तारा",
|
||||
"shape_triangle": "त्रिभुज",
|
||||
"task_trim": "%2$s वर्ल्ड में %1$s चंक %3$s सेकंड में हटाए गए।",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "%s के लिए कार्य पूरा किया गया। प्रसंस्कृत: %s चंक (%s%%), कुल समय: %s:%s:%s",
|
||||
"task_stopped": "%s के लिए कार्य रोका गया।",
|
||||
"task_update": "%s के लिए कार्य जारी है। प्रसंस्कृत: %s चंक (%s%%), ETA: %s:%s:%s, दर: %s cps, वर्तमान: %s,%s"
|
||||
"task_update": "%s के लिए कार्य जारी है। प्रसंस्कृत: %s चंक (%s%%), ETA: %s:%s:%s, दर: %s cps, वर्तमान: %s,%s",
|
||||
"wrap_both": "दोनों",
|
||||
"wrap_default": "डिफ़ॉल्ट",
|
||||
"wrap_earth": "पृथ्वी",
|
||||
"wrap_none": "कुछ नही",
|
||||
"wrap_radial": "त्रैज्यिक",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selekcija učitana iz bordera svijeta %s.",
|
||||
"format_border_no_border": "Nema bordera svijeta za %s.",
|
||||
"format_border_remove": "Obrisan border svijeta iz %s.",
|
||||
"format_border_wrap": "Wrapped border je sada %s za %s.",
|
||||
"format_border_wrap": "Wrapped border promijenjen u %s za %s.",
|
||||
"format_cancel": "Proces otkazan za %s.",
|
||||
"format_cancel_all": "Otkazivanje svih procesa.",
|
||||
"format_cancel_confirm": "Otkazani procesi ne mogu biti nastavljeni. Ako sigurno želite da otkažete, kucajte '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Proces nastavljen za %s.",
|
||||
"format_continue_no_tasks": "Nema procesa za nastavak.",
|
||||
"format_trim_confirm": "&cUpozorenje: Čankovi u %s izvan %s regije centrirani u %s, %s sa razdaljinom %s će biti trajno obrisani. Napravite rezervnu kopiju servera prije nego što nastavite da biste izbjegli potencijalnu štetu. Morate restartovati server kada se proces završi. Ako ste razumijeli i želite nastaviti, napišite '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Oblik promijenjen u %s.",
|
||||
"format_pause": "Proces za %s pauziran.",
|
||||
"format_pause_no_tasks": "Nema procesa za pauziranje.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Razdaljina promijenjena u %s.",
|
||||
"format_reload": "Konfiguracija uspješno osvježena.",
|
||||
"format_reload_tasks_running": "Konfiguracija ne može biti osvježena dok je proces u toku.",
|
||||
"format_selection": "Trenutačna selekcija",
|
||||
"format_selection_center": "Centar: %s, %s",
|
||||
"format_selection_radius": "Razdaljina: %s",
|
||||
"format_selection_radii": "Poluprečnik: %s, %s",
|
||||
"format_selection_shape": "Oblik: %s",
|
||||
"format_selection_world": "Svijet: %s",
|
||||
"format_shape": "Oblik promijenjen u %s.",
|
||||
"format_silent": "Tihi mod postavljen na %s.",
|
||||
"format_start": "Proces pokrenut u %s za %s regiju centriranu u %s, %s sa razdaljinom %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Vaš host je ograničio maksimalnu razdaljinu pregenerisanja na %s da bi izbjegao veće korištenje memorije. Smanjite razdaljinu ili ih kontaktirajte da biste uklonili ovo ograničenje.",
|
||||
"format_started_already": "Proces je već pokrenut za %s!",
|
||||
"format_world": "Svijet promijenjen u %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Upravljajte borderima svijetova",
|
||||
"help_cancel": "&2chunky cancel&r - Prekinite i obrišite trenutačne ili sačuvane procese",
|
||||
"help_center": "&2chunky center <x> <z>&r - Postavite centralne koordinate",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Postavite tihi interval",
|
||||
"help_radius": "&2chunky radius <razdaljina>&r - Postavite razdaljinu",
|
||||
"help_reload": "&2chunky reload&r - Osvježite konfiguraciju",
|
||||
"help_selection": "&2chunky selection&r - Prikažite trenutačnu selekciju",
|
||||
"help_shape": "&2chunky shape <oblik>&r - Postavite oblik za generisanje",
|
||||
"help_silent": "&2chunky silent&r - Uključite/isključite poruke napretka",
|
||||
"help_spawn": "&2chunky spawn&r - Postavite centar za spawn lokaciju",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "petlja",
|
||||
"pattern_spiral": "spirala",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "krug",
|
||||
"shape_diamond": "romb",
|
||||
"shape_ellipse": "elipsa",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "pravokutnik",
|
||||
"shape_square": "kvadrat",
|
||||
"shape_star": "zvijezda",
|
||||
"shape_triangle": "trokut",
|
||||
"task_trim": "Obrisano %s čankova iz %s u %s sekundi.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Proces završen za %s. Obrađeno: %s čankova (%s%%), Protjeklo vremena: %s:%s:%s",
|
||||
"task_stopped": "Proces zaustavljen za %s.",
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutačno: %s, %s"
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutačno: %s, %s",
|
||||
"wrap_both": "oboje",
|
||||
"wrap_default": "podrazumijevano",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "ništa",
|
||||
"wrap_radial": "radijalno",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selezione caricata dal bordo del mondo %s.",
|
||||
"format_border_no_border": "Non esiste nessun bordo in %s.",
|
||||
"format_border_remove": "Rimosso il bordo del mondo da %s.",
|
||||
"format_border_wrap": "L'effetto Pac-Man è ora %s per %s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Attività annullata per %s.",
|
||||
"format_cancel_all": "Annullamento di tutte le attività.",
|
||||
"format_cancel_confirm": "Le attività annullate non possono essere continuate. Se sei sicuro di voler annullare, digita '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Continuazione dell'attività per %s.",
|
||||
"format_continue_no_tasks": "Nessuna attività da continuare.",
|
||||
"format_trim_confirm": "&cAttenzione: I chunk in %s fuori dalla regione %s centrata in %s, %s con raggio %s verranno eliminati definitivamente. Assicurati di aver effettuato un backup del tuo server prima di continuare per evitare potenziali danni. Ti sarà richiesto di riavviare il server completamente dopo che l'attività sarà terminata. Se hai compreso e desideri procedere, digita '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Modello cambiato in %s.",
|
||||
"format_pause": "Attività in pausa per %s.",
|
||||
"format_pause_no_tasks": "Nessuna attività da fermare.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Raggio cambiato in %s.",
|
||||
"format_reload": "Configurazione ricaricata con successo.",
|
||||
"format_reload_tasks_running": "La configurazione non può essere ricaricata mentre sono in esecuzione delle attività.",
|
||||
"format_selection": "Current selection",
|
||||
"format_selection_center": "Center: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Shape: %s",
|
||||
"format_selection_world": "World: %s",
|
||||
"format_shape": "Regione cambiata in %s.",
|
||||
"format_silent": "Modalità silenziosa %s.",
|
||||
"format_start": "Attività iniziata in %s per la regione %s centrata in %s, %s con raggio %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Il tuo host ha limitato il raggio massimo di pre-generazione a %s per evitare un uso eccessivo dello spazio su disco. Riduci il raggio o contatta il tuo host se desideri che questo limite venga rimosso.",
|
||||
"format_started_already": "Attività già iniziata per %s!",
|
||||
"format_world": "Mondo cambiato in %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Gestisci i confini personalizzati del mondo",
|
||||
"help_cancel": "&2chunky cancel&r - Ferma ed elimina le attività correnti o salvate",
|
||||
"help_center": "&2chunky center <x> <z>&r - Imposta la posizione del blocco centrale",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Imposta l'intervallo di pausa",
|
||||
"help_radius": "&2chunky radius <radius>&r - Imposta il raggio",
|
||||
"help_reload": "&2chunky reload&r - Ricarica la configurazione",
|
||||
"help_selection": "&2chunky selection&r - Display the current selection",
|
||||
"help_shape": "&2chunky shape <shape>&r - Imposta la regione da generare",
|
||||
"help_silent": "&2chunky silent&r - Attiva/disattiva la visualizzazione dei messaggi di aggiornamento",
|
||||
"help_spawn": "&2chunky spawn&r - Imposta il centro al punto di spawn del mondo",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spirale",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "cerchio",
|
||||
"shape_diamond": "diamante",
|
||||
"shape_ellipse": "ellisse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagono",
|
||||
"shape_rectangle": "rettangolo",
|
||||
"shape_square": "quadrato",
|
||||
"shape_star": "stella",
|
||||
"shape_triangle": "triangolo",
|
||||
"task_trim": "Eliminati %s chunk da %s in %s secondi.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Attività terminata per %s. Elaborati: %s chunk (%s%%), Tempo totale: %s:%s:%s",
|
||||
"task_stopped": "Attività interrotta per %s.",
|
||||
"task_update": "Attività in esecuzione per %s. Elaborati: %s chunk (%s%%), ETA: %s:%s:%s, Velocità: %s cps, Attuale: %s, %s"
|
||||
"task_update": "Attività in esecuzione per %s. Elaborati: %s chunk (%s%%), ETA: %s:%s:%s, Velocità: %s cps, Attuale: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"border_dependency_update": "ChunkyBorder를 사용하려면 Chunky를 업데이트해야 합니다!",
|
||||
"border_load_failed": "저장된 테두리를 찾을 수 없습니다.",
|
||||
"border_save_failed": "테두리를 저장할 수 없습니다.",
|
||||
"command_no_permission": "&c이 명령에 대한 권한이 없습니다.",
|
||||
"disabled": "비활성화",
|
||||
"enabled": "활성화",
|
||||
"error_version": "이 플러그인은 1.13 이하의 Minecraft 버전과 호환되지 않습니다.",
|
||||
"error_version_spigot": "이 플러그인은 Spigot 1.13과 호환되지 않습니다!",
|
||||
"format_border_add": "중심이 %s, %s 및 반지름이 %s인 %s 월드 보더를 %s에 추가했습니다.",
|
||||
"format_border_bypass": "%s에 대한 임시 경계 우회 %s입니다.",
|
||||
"format_border_bypass_no_target": "닉네임이 %s인 플레이어를 찾을 수 없습니다.",
|
||||
"format_border_list": "월드 경계선",
|
||||
"format_border_list_border": "%s: 중심이 %s, %s, 반지름이 %s인 %s.",
|
||||
"format_border_list_none": "월드 경계가 없습니다.",
|
||||
"format_border_load": "%s의 월드 경계에서 선택 항목이 로드되었습니다.",
|
||||
"format_border_no_border": "%s에 대한 월드 경계가 없습니다.",
|
||||
"format_border_remove": "%s에서 월드 경계를 제거했습니다.",
|
||||
"format_border_wrap": "%s에 대한 월드 경계 포장이 %s로 변경되었습니다.",
|
||||
"format_cancel": "%s에 대한 작업이 취소되었습니다.",
|
||||
"format_cancel_all": "모든 작업을 취소합니다.",
|
||||
"format_cancel_confirm": "작업을 취소할 수 없습니다. 취소하려면 '%s'를 입력하십시오.",
|
||||
"format_cancel_no_tasks": "취소할 작업이 없습니다.",
|
||||
"format_center": "중심이 %s, %s로 변경되었습니다.",
|
||||
"format_confirm": "확인할 사항이 없습니다!",
|
||||
"format_continue": "%s에 대한 작업이 계속됩니다.",
|
||||
"format_continue_no_tasks": "계속할 작업이 없습니다.",
|
||||
"format_trim_confirm": "&c경고: %s을(를) 중심으로 하는 %s 영역 외부의 %s에 있는 청크, 반경이 %s인 %s는 영구적으로 삭제됩니다. 잠재적 손상을 방지하기 위해 계속하기 전에 서버를 백업했는지 확인하십시오. 작업이 완료된 후 서버를 완전히 다시 시작해야 합니다. 이해하고 계속하려면 '%s'를 입력하십시오.",
|
||||
"format_trim_confirm_inside": "&c경고: 반경이 %s인 %s, %s을(를) 중심으로 하는 %s 영역 내 %s의 청크는 영구적으로 삭제됩니다. 잠재적 손상을 방지하기 위해 계속하기 전에 서버를 백업했는지 확인하십시오. 작업이 완료된 후 서버를 완전히 다시 시작해야 합니다. 이해하고 계속하려면 '%s'를 입력하십시오.",
|
||||
"format_trim_confirm_inhabited": "&e알림: %s 틱의 최대 거주 시간으로 청크를 필터링합니다. 트림을 완료하는 데 평소보다 오래 걸릴 수 있습니다.",
|
||||
"format_pattern": "패턴이 %s(으)로 변경되었습니다.",
|
||||
"format_pause": "작업이 %s 동안 일시 중지되었습니다.",
|
||||
"format_pause_no_tasks": "일시 중지할 작업이 없습니다.",
|
||||
"format_progress_no_tasks": "실행 중인 작업이 없습니다.",
|
||||
"format_quiet": "조용한 간격이 %s초로 설정되었습니다.",
|
||||
"format_radii": "반경이 x에서 %s로, z에서 %s로 변경되었습니다.",
|
||||
"format_radius": "반경이 %s(으)로 변경되었습니다.",
|
||||
"format_reload": "설정을 성공적으로 다시 로드했습니다.",
|
||||
"format_reload_tasks_running": "작업이 실행되는 동안에는 설정을 다시 로드할 수 없습니다.",
|
||||
"format_selection": "현재 선택",
|
||||
"format_selection_center": "중심: %s, %s",
|
||||
"format_selection_radius": "반경: %s",
|
||||
"format_selection_radii": "반지름: %s, %s",
|
||||
"format_selection_shape": "패턴: %s",
|
||||
"format_selection_world": "월드: %s",
|
||||
"format_shape": "패턴이 %s(으)로 변경되었습니다.",
|
||||
"format_silent": " 조용한 모드 %s.",
|
||||
"format_start": "반경이 %s인 %s, %s을(를) 중심으로 하는 %s 영역에 대해 %s에서 작업이 시작되었습니다.",
|
||||
"format_start_confirm": "이 월드에 대한 작업이 이미 시작되었습니다. 계속 실행하려면 '%s'를 입력하십시오. 새 작업을 시작하려면 '%s'를 입력하십시오.",
|
||||
"format_start_disk": "서버에는 %s 디스크 공간이 남아 있지만 작업에 필요한 예상 디스크 공간은 %s입니다. 그래도 시작하려면 '%s'를 입력하십시오.",
|
||||
"format_start_limit": "호스트는 과도한 디스크 공간 사용을 방지하기 위해 최대 사전 생성 반경을 %s로 제한했습니다. 이 제한을 제거하려면 반경을 줄이거나 호스트에게 문의하십시오.",
|
||||
"format_started_already": "%s에 대한 작업이 이미 시작되었습니다!",
|
||||
"format_world": "월드가 %s로 변경되었습니다.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - 사용자 지정 월드 경계선 관리",
|
||||
"help_cancel": "&2chunky cancel&r - 현재 또는 저장된 작업 중지 및 삭제",
|
||||
"help_center": "&2chunky center <x> <z>&r - 중앙 블록 위치 설정",
|
||||
"help_continue": "&2chunky continue&r - 현재 또는 저장된 작업 계속하기",
|
||||
"help_corners": "&2chunky corners <x1> <z1> <x2> <z2>&r - 코너로 설정",
|
||||
"help_trim": "&2chunky trim&r - 선택 영역 밖의 청크 삭제",
|
||||
"help_menu": "&aChunky 명령어&r%s",
|
||||
"help_more": "더 보려면 &a%s&r을 입력하세요.",
|
||||
"help_pattern": "&2chunky pattern <pattern>&r - 생성 패턴 설정",
|
||||
"help_pause": "&2chunky pause&r - 현재 작업을 일시 중지하고 진행 상황을 저장합니다.",
|
||||
"help_progress": "&2chunky progress&r - 현재 작업 진행률 표시",
|
||||
"help_quiet": "&2chunky quiet <interval>&r - 조용한 간격 설정",
|
||||
"help_radius": "&2chunky radius <radius>&r - 반지름 설정",
|
||||
"help_reload": "&2chunky reload&r - 설정 리로드",
|
||||
"help_selection": "&2chunky selection&r - 현재 선택 항목 표시",
|
||||
"help_shape": "&2chunky shape <shape>&r - 생성할 모양 설정",
|
||||
"help_silent": "&2chunky silent&r - 업데이트 메시지 표시 토글",
|
||||
"help_spawn": "&2chunky spawn&r - 중심을 스폰 지점으로 설정",
|
||||
"help_start": "&2chunky start&r - 새 청크 생성 작업 시작",
|
||||
"help_world": "&2chunky world <world>&r - 월드 대상 설정",
|
||||
"help_worldborder": "&2chunky worldborder&r - 월드 경계 중심 및 반경 사용",
|
||||
"pattern_concentric": "concentric",
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "circle",
|
||||
"shape_diamond": "diamond",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "square",
|
||||
"shape_star": "star",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "%s초 안에 %s에서 %s 청크를 삭제했습니다.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "%s에 대한 작업이 완료되었습니다. 처리됨: %s 청크(%s%%), 총 시간: %s:%s:%s",
|
||||
"task_stopped": "작업이 %s 동안 중지되었습니다.",
|
||||
"task_update": "%s에 대해 작업이 실행 중입니다. 처리됨: %s 청크(%s%%), ETA: %s:%s:%s, 속도: %s cps, 현재: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "방사형",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selectie geladen van wereldgrens voor %s.",
|
||||
"format_border_no_border": "Er bestaat geen wereldgrens voor %s.",
|
||||
"format_border_remove": "Verwijderde wereldgrens van %s.",
|
||||
"format_border_wrap": "De worldborder is nu %s voor %s.",
|
||||
"format_border_wrap": "De worldborder is nu veranderd naar %s voor %s.",
|
||||
"format_cancel": "Taak geannuleerd voor %s.",
|
||||
"format_cancel_all": "Alle taken annuleren.",
|
||||
"format_cancel_confirm": "Geannuleerde taken kunnen niet worden voortgezet. Als u zeker weet dat u wilt annuleren, typ '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Taak wordt voortgezet voor %s.",
|
||||
"format_continue_no_tasks": "Geen taken om mee door te gaan.",
|
||||
"format_trim_confirm": "&cWaarschuwing: Chunks in %s buiten de %s regio gecentreerd op %s, %s met radius %s zullen permanent verwijderd worden. Zorg ervoor dat je een back-up van je server hebt genomen voordat je verder gaat om mogelijke schade te voorkomen. Je zult de server volledig moeten herstarten nadat de taak is voltooid. Als je het begrijpt en verder wilt gaan, typ dan '%s'.",
|
||||
"format_trim_confirm_inside": "&cWaarschuwing: Chunks in %s buiten de %s regio gecentreerd op %s, %s met radius %s zullen permanent verwijderd worden. Zorg ervoor dat je een back-up van je server hebt genomen voordat je verder gaat om mogelijke schade te voorkomen. Je zult de server volledig moeten herstarten nadat de taak is voltooid. Als je het begrijpt en verder wilt gaan, typ dan '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotitie: Chunks filteren met een maximale tijd van %s ticks. Bijsnijden kan langer duren dan gewoonlijk om te voltooien.",
|
||||
"format_pattern": "Patroon gewijzigd naar %s.",
|
||||
"format_pause": "taak gepauzeerd voor %s.",
|
||||
"format_pause_no_tasks": "Geen taken om te pauzeren.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Straal veranderd naar %s.",
|
||||
"format_reload": "Configuratie succesvol herladen.",
|
||||
"format_reload_tasks_running": "De configuratie kan niet opnieuw worden geladen terwijl er taken worden uitgevoerd.",
|
||||
"format_selection": "Huidige selectie",
|
||||
"format_selection_center": "Midden: %s, %s",
|
||||
"format_selection_radius": "Straal: %s",
|
||||
"format_selection_radii": "Straal: %s, %s",
|
||||
"format_selection_shape": "Vorm: %s",
|
||||
"format_selection_world": "Wereld: %s",
|
||||
"format_shape": "Vorm veranderd naar %s.",
|
||||
"format_silent": "Stille modus %s.",
|
||||
"format_start": "Taak begonnen voor %1$s om %3$s, %4$s met de radius %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Je host heeft de maximale pre-generatie radius beperkt tot %s om overmatig gebruik van schijfruimte te voorkomen. Verminder de radius of neem contact op met je host als je wilt dat deze limiet wordt verwijderd.",
|
||||
"format_started_already": "Taak is al gestart voor %s!",
|
||||
"format_world": "Wereld veranderd naar %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Je wereldgrens is momenteel groter dan het maximum van %s geconfigureerd in server.properties. Dit is normaal gesproken een fout en kan problemen veroorzaken.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Beheer custom world borders",
|
||||
"help_cancel": "&2chunky cancel&r - Stop en verwijder huidige of opgeslagen taken",
|
||||
"help_center": "&2chunky center <x> <z>&r - Stel de locatie van het midden blok in",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Stel de stille interval in",
|
||||
"help_radius": "&2chunky radius <radius>&r - Stel de straal in",
|
||||
"help_reload": "&2chunky reload&r - Herlaad configuratie",
|
||||
"help_selection": "&2chunky selectie&r - Geef de huidige selectie weer",
|
||||
"help_shape": "&2chunky shape <shape>&r - Stel de vorm in om te genereren",
|
||||
"help_silent": "&2chunky silent&r - Schakel tussen het tonen van update berichten",
|
||||
"help_spawn": "&2chunky spawn&r - Zet het midden naar het spawnpunt",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiraal",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "gebied",
|
||||
"pattern_world": "wereld",
|
||||
"shape_circle": "cirkel",
|
||||
"shape_diamond": "diamant",
|
||||
"shape_ellipse": "elllips",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "regelmatige vijfhoek",
|
||||
"shape_rectangle": "rechthoek",
|
||||
"shape_square": "vierkant",
|
||||
"shape_star": "ster",
|
||||
"shape_triangle": "driehoek",
|
||||
"task_trim": "%s chunks verwijderd van %s in %s seconden.",
|
||||
"task_trim_update": "Taak uitgevoerd voor %s. Verwerkt: %s regio's (%s%%)",
|
||||
"task_done": "Taak voltooid voor %s. Verwerkt: %s chunks (%s%%), Totale tijd: %s:%s:%s",
|
||||
"task_stopped": "Taak geannuleerd voor %s.",
|
||||
"task_update": "Taak wordt uitgevoerd voor %s. Verwerkt: %s chunks (%s%%), ETA: %s:%s:%s, Snelheid: %s cps, Huidig: %s, %s"
|
||||
"task_update": "Taak wordt uitgevoerd voor %s. Verwerkt: %s chunks (%s%%), ETA: %s:%s:%s, Snelheid: %s cps, Huidig: %s, %s",
|
||||
"wrap_both": "beide",
|
||||
"wrap_default": "standaard",
|
||||
"wrap_earth": "aarde",
|
||||
"wrap_none": "geen",
|
||||
"wrap_radial": "radiaal",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"border_dependency_update": "Chunky needs to be updated in order to use ChunkyBorder!",
|
||||
"border_load_failed": "No saved borders found.",
|
||||
"border_dependency_update": "Chunky må oppdateres for å kunne bruke ChunkyBorder!",
|
||||
"border_load_failed": "Ingen lagrede grenser funnet.",
|
||||
"border_save_failed": "Kan ikke lagre grenser.",
|
||||
"command_no_permission": "&cDu har ikke tillatelse til å bruke denne kommandoen.",
|
||||
"disabled": "deaktivert",
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selection loaded from world border for %s.",
|
||||
"format_border_no_border": "No world border exists for %s.",
|
||||
"format_border_remove": "Removed world border from %s.",
|
||||
"format_border_wrap": "World border wrapping is now %s for %s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Oppgaven ble avbrutt for %s.",
|
||||
"format_cancel_all": "Avbryte alle oppgaver.",
|
||||
"format_cancel_confirm": "Avbrutte oppgaver kan ikke fortsettes. Hvis du er sikker på at du ønsker å avbryte, skriv '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Oppgaven fortsetter for %s.",
|
||||
"format_continue_no_tasks": "Ingen oppgaver å fortsette.",
|
||||
"format_trim_confirm": "&cAdvarsel: Chunker i %s utenfor %s regionene satt på %s, %s med radius %s vil bli permanent slettet. Kontroller at du har tatt en sikkerhetskopi av serveren før du fortsetter for å unngå skade. Du må restarte serveren helt etter oppgaven er fullført. Hvis du forstår og ønsker å fortsette, skriv '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Mønsteret er endret til %s.",
|
||||
"format_pause": "Oppgaven ble pauset for %s.",
|
||||
"format_pause_no_tasks": "Ingen oppgaver å pause.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Radiusen er endret til %s.",
|
||||
"format_reload": "Vellykket relastning av konfigurasjonen.",
|
||||
"format_reload_tasks_running": "Konfigurasjonen kan ikke lastes inn på nytt når oppgaver kjører.",
|
||||
"format_selection": "Current selection",
|
||||
"format_selection_center": "Center: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Shape: %s",
|
||||
"format_selection_world": "World: %s",
|
||||
"format_shape": "Formen er endret til %s.",
|
||||
"format_silent": "Stillemodus %s.",
|
||||
"format_start": "Oppgave startet i %s for %s regionen sentrert ved %s, %s med radius %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Verten har begrenset maksimal forhåndsgenerasjons radius til %s for å unngå for mye bruk av diskplassen. Reduser radiusen eller kontakt verten din hvis du ønsker å fjerne denne grensen.",
|
||||
"format_started_already": "Oppgaven har allerede startet for %s!",
|
||||
"format_world": "Verden endret til %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Manage custom world borders",
|
||||
"help_cancel": "&2chunky cancel&r - Stopp og slett gjeldende eller lagrede oppgaver",
|
||||
"help_center": "&2chunky center <x> <z>&r - Sett blokklokasjon i midten",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Sett stilleintervall",
|
||||
"help_radius": "&2chunky radius <radius>&r - sett radius",
|
||||
"help_reload": "&2chunky reload&r - Last inn konfigurasjonen på nytt",
|
||||
"help_selection": "&2chunky selection&r - Display the current selection",
|
||||
"help_shape": "&2chunky shape <shape>&r - Sett formen for å generere",
|
||||
"help_silent": "&2chunky silent&r - Vis/Skjul oppdateringsmeldinger",
|
||||
"help_spawn": "&2chunky spawn&r - Sett midten til startpunktet",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "sirkel",
|
||||
"shape_diamond": "diamant",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "femkant",
|
||||
"shape_rectangle": "rektangel",
|
||||
"shape_square": "kvadrat",
|
||||
"shape_star": "stjerne",
|
||||
"shape_triangle": "triangel",
|
||||
"task_trim": "Slettet %s chunker fra %s på %s sekunder.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Oppgave fullført for %s. Behandlet: %s chunker (%s%%), tid brukt: %s:%s:%s",
|
||||
"task_stopped": "Oppgaven ble stoppet for %s.",
|
||||
"task_update": "Oppgave kjører for %s. Behandlet: %s chunker (%s%%), ETA: %s:%s:%s, Rate: %s cps, nåværende: %s, %s"
|
||||
"task_update": "Oppgave kjører for %s. Behandlet: %s chunker (%s%%), ETA: %s:%s:%s, Rate: %s cps, nåværende: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"border_dependency_update": "Chunky wymaga aktualizacji aby korzystać z ChunkyBorder!",
|
||||
"border_dependency_update": "Chunky wymaga aktualizacji, aby korzystać z ChunkyBorder!",
|
||||
"border_load_failed": "Nie znaleziono zapisanych granic.",
|
||||
"border_save_failed": "Nie można zapisać granic.",
|
||||
"command_no_permission": "&cNie masz uprawnień, żeby użyć tej komendy.",
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selekcja załadowana z granicy świata dla %s.",
|
||||
"format_border_no_border": "Nie ma żadnych granic świata w %s.",
|
||||
"format_border_remove": "Usunięto granicę świata z %s.",
|
||||
"format_border_wrap": "Zawijanie granicy świata jest teraz %s dla %s.",
|
||||
"format_border_wrap": "Zawijanie granicy świata zmieniono na %s dla %s.",
|
||||
"format_cancel": "Zadanie wstrzymane dla %s.",
|
||||
"format_cancel_all": "Anulowanie wszystkich zadań.",
|
||||
"format_cancel_confirm": "Anulowane zadania nie mogą być kontynuowane. Jeśli jesteś pewien, że chcesz anulować wpisz '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Kontynuowanie zadania dla %s.",
|
||||
"format_continue_no_tasks": "Brak zadań do kontynuowania.",
|
||||
"format_trim_confirm": "&cOstrzeżenie: Chunki w %s poza obszarem %s wyśrodkowanym na %s, %s o promieniu %s zostaną trwale usunięte. Upewnij się, że zrobiłeś kopię zapasową serwera zanim będziesz mógł uniknąć potencjalnej utraty danych. Będziesz musiał zrestartować serwer po zakończeniu zadania. Jeśli rozumiesz i chcesz kontynuować, wpisz '%s'.",
|
||||
"format_trim_confirm_inside": "&cUwaga: Chunki w %s w obszarze %s wycentrowanego na %s, %s z promieniem %s zostaną trwale usunięte. Przed kontynuacją upewnij się, że wykonałeś kopię zapasową serwera aby uniknąć potencjalnej utraty danych. Po ukończeniu zadania konieczne będzie pełne ponowne uruchomienie serwera. Jeżeli rozumiesz i chcesz kontynuować, wpisz %s.",
|
||||
"format_trim_confirm_inhabited": "&eUwaga: Filtrowanie chunków według maksymalnego czasu przebywania wynoszącego %s ticków. Przycinanie może potrwać dłużej niż zazwyczaj.",
|
||||
"format_pattern": "Wzór zmieniony na %s.",
|
||||
"format_pause": "Zadanie wstrzymane dla %s.",
|
||||
"format_pause_no_tasks": "Brak zadań do wstrzymania.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Promień zmieniony na %s.",
|
||||
"format_reload": "pomyślnie odżwieżono konfigurację.",
|
||||
"format_reload_tasks_running": "konfiguracja nie może być odświeżona podczas trwania zadań.",
|
||||
"format_selection": "Bieżące zaznaczenie",
|
||||
"format_selection_center": "Środek: %s, %s",
|
||||
"format_selection_radius": "Promień: %s",
|
||||
"format_selection_radii": "Promienie X i Z: %s, %s",
|
||||
"format_selection_shape": "Kształt: %s",
|
||||
"format_selection_world": "Świat: %s",
|
||||
"format_shape": "Kształt zmieniony na %s.",
|
||||
"format_silent": "Tryb cichy %s.",
|
||||
"format_start": "Zadanie rozpoczęte dla %1$s na %3$s, %4$s z promieniem %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Twój host ograniczył maksymalny promień generowania do %s aby uniknąć dużego zużycia pamięci dyskowej. Zmniejsz promień albo skontaktuj się z twoim hostem jeżeli chcesz aby ten limit został usunięty.",
|
||||
"format_started_already": "Zadanie jest już rozpoczęte dla %s!",
|
||||
"format_world": "Świat zmieniony na %s.",
|
||||
"format_worldborder_too_large": "&eUwaga: Twoja granica świata jest obecnie ustawiona powyżej maksymalnej wartości %s skonfigurowanej w server.properties. Zazwyczaj jest to błąd i może powodować problemy.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Zarządzaj niestandardowymi granicami świata",
|
||||
"help_cancel": "&2chunky cancel&r - Anuluje i usuwa obecne lub zapisane zadania",
|
||||
"help_center": "&2chunky center <x> <z>&r - Ustawia lokalizację środka mapy",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Ustawia cichy interwał",
|
||||
"help_radius": "&2chunky radius <radius>&r - Ustawia promień (rozmiar świata)",
|
||||
"help_reload": "&2chunky reload&r - Odśwież konfigurację",
|
||||
"help_selection": "&2chunky selection&r - Wyświetl bieżące zaznaczenie",
|
||||
"help_shape": "&2chunky shape <shape>&r - Ustawia kształt do wygenerowania",
|
||||
"help_silent": "&2chunky silent&r - Przełącza wyświetlanie wiadomości o generacji",
|
||||
"help_spawn": "&2chunky spawn&r - Ustawia środek mapy na punkt odrodzenia",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "pętla",
|
||||
"pattern_spiral": "spirala",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "koło",
|
||||
"shape_diamond": "diament",
|
||||
"shape_ellipse": "elipsa",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pięciokąt",
|
||||
"shape_rectangle": "prostokąt",
|
||||
"shape_square": "kwadrat",
|
||||
"shape_star": "gwiazda",
|
||||
"shape_triangle": "trójkąt",
|
||||
"task_trim": "Usunięto %s chunków z %s w %s sekund.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Zadanie zakończone dla %s. Przetworzono: %s chunków (%s%%), Łączny czas: %s:%s:%s",
|
||||
"task_stopped": "Zadanie zatrzymane dla %s.",
|
||||
"task_update": "Zadanie w trakcie dla %s. Przetworzono: %s chunków (%s%%), ETA: %s:%s:%s, Tempo: %s cps, Obecnie: %s, %s"
|
||||
"task_update": "Zadanie w trakcie dla %s. Przetworzono: %s chunków (%s%%), ETA: %s:%s:%s, Tempo: %s cps, Obecnie: %s, %s",
|
||||
"wrap_both": "obie",
|
||||
"wrap_default": "domyślne",
|
||||
"wrap_earth": "ziemia",
|
||||
"wrap_none": "brak",
|
||||
"wrap_radial": "kolisty",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selection loaded from world border for %s.",
|
||||
"format_border_no_border": "No world border exists for %s.",
|
||||
"format_border_remove": "Removed world border from %s.",
|
||||
"format_border_wrap": "World border wrapping is now %s for %s.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Task cancelled for %s.",
|
||||
"format_cancel_all": "Cancelando todas as tarefas.",
|
||||
"format_cancel_confirm": "Tarefas canceladas não podem ser retomadas. Se você tem certeza que deseja cancelar, digite '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Tarefa contínua para %s.",
|
||||
"format_continue_no_tasks": "Nenhuma tarefa a ser continuada.",
|
||||
"format_trim_confirm": "&cWarning: Chunks in %s outside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Padrão alterado para %s.",
|
||||
"format_pause": "Tarefa pausada para %s.",
|
||||
"format_pause_no_tasks": "Nenhuma tarefa a ser pausada.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "O raio mudou para %s.",
|
||||
"format_reload": "Configuração recarregada com sucesso.",
|
||||
"format_reload_tasks_running": "A configuração não pode ser recarregada enquanto tarefas estiverem em execução.",
|
||||
"format_selection": "Current selection",
|
||||
"format_selection_center": "Center: %s, %s",
|
||||
"format_selection_radius": "Radius: %s",
|
||||
"format_selection_radii": "Radii: %s, %s",
|
||||
"format_selection_shape": "Shape: %s",
|
||||
"format_selection_world": "World: %s",
|
||||
"format_shape": "Formato alterado para %s.",
|
||||
"format_silent": "Modo silencioso %s.",
|
||||
"format_start": "Tarefa iniciada para %1$s em %3$s, %4$s com raio de %5$s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Your host has limited the maximum pre-generation radius to %s to avoid excessive disk space usage. Reduce the radius or contact your host if you wish to have this limit removed.",
|
||||
"format_started_already": "Tarefa já iniciada para %s !",
|
||||
"format_world": "O mundo mudou para %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Manage custom world borders",
|
||||
"help_cancel": "&2chunky cancel&r - Parar e apagar tarefas actuais ou guardadas",
|
||||
"help_center": "&2chunky center <x> <z>&r - Definir a localização do bloco central",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Definir o intervalo de silêncio",
|
||||
"help_radius": "&2chunky radius <radius>&r - Definir o raio",
|
||||
"help_reload": "&2chunky reload&r - Reload configuration",
|
||||
"help_selection": "&2chunky selection&r - Display the current selection",
|
||||
"help_shape": "&2chunky shape <shape>&r - Set the shape to generate",
|
||||
"help_silent": "&2chunky silent&r - Alternar exibindo mensagens de actualização",
|
||||
"help_spawn": "&2chunky spawn&r - define o centro do ponto de spawn",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "circle",
|
||||
"shape_diamond": "diamond",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "square",
|
||||
"shape_star": "star",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "Deleted %s chunks from %s in %s seconds.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Tarefa terminada para %s. Processado: %s chunks (%s%%), Tempo total: %s:%s:%s",
|
||||
"task_stopped": "Tarefa parada para %s.",
|
||||
"task_update": "Tarefa em execução para %s. Processado: %s chunks (%s%%), ETA: %s:%s:%s, Taxa: %s cps, Actual: %s, %s"
|
||||
"task_update": "Tarefa em execução para %s. Processado: %s chunks (%s%%), ETA: %s:%s:%s, Taxa: %s cps, Actual: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -1,31 +1,33 @@
|
||||
{
|
||||
"border_dependency_update": "Atualize o Chunky para continuar a usar o ChunkyBorder!",
|
||||
"border_dependency_update": "Atualize o Chunky para continuar usando o ChunkyBorder!",
|
||||
"border_load_failed": "Nenhuma barreira salva encontrada.",
|
||||
"border_save_failed": "Não foi possível salvar as barreiras.",
|
||||
"command_no_permission": "&cVocê não pode rodar esse comando.",
|
||||
"command_no_permission": "&cVocê não pode executar esse comando.",
|
||||
"disabled": "não",
|
||||
"enabled": "sim",
|
||||
"error_version": "O plugin é incompatível com as versões abaixo do Minecraft 1.13.",
|
||||
"error_version_spigot": "O plugin é incompatível com o Spigot 1.13!",
|
||||
"format_border_add": "Uma barreira de mundo com a forma %s foi adicionada no %s com o centro %s, %s, e raio %s.",
|
||||
"format_border_bypass": "Ignorar barreiras temporariamente: %s (para %s).",
|
||||
"format_border_bypass_no_target": "Nenhum jogador encontrado com o nome %s.",
|
||||
"format_border_bypass_no_target": "Nenhum jogador encontrado com o nome \"%s\".",
|
||||
"format_border_list": "Barreiras do mundo",
|
||||
"format_border_list_border": "%s: %s com o centro %s, %s e raio %s.",
|
||||
"format_border_list_none": "Nenhuma barreira do mundo encontrada.",
|
||||
"format_border_load": "Seleção carregada da barreira do mundo no %s.",
|
||||
"format_border_no_border": "Nenhuma barreira do mundo encontrada no %s.",
|
||||
"format_border_remove": "Barreira do mundo removida do %s.",
|
||||
"format_border_wrap": "Barreira do mundo envolta: %s no %s.",
|
||||
"format_border_wrap": "Entorno da barreira do mundo alterado para %s no %s.",
|
||||
"format_cancel": "Tarefa cancelada no mundo %s.",
|
||||
"format_cancel_all": "Cancelando todas as tarefas.",
|
||||
"format_cancel_confirm": "Tarefas canceladas não podem ser retomadas. Caso queira cancelar, digite \"%s\".",
|
||||
"format_cancel_no_tasks": "Nenhuma tarefa para cancelar.",
|
||||
"format_center": "Centro alterado para %s, %s.",
|
||||
"format_confirm": "Nada para confirmar!",
|
||||
"format_confirm": "Nada a confirmar!",
|
||||
"format_continue": "Tarefa retomada no mundo %s.",
|
||||
"format_continue_no_tasks": "Nenhuma tarefa para continuar.",
|
||||
"format_trim_confirm": "&Aviso: Chunks no %s fora da região em forma de %s centralizados em %s, %s com raio %s serão excluídos para sempre. Faça um backup do servidor antes de continuar para evitar possíveis problemas. Reinicie o servidor completamente após a conclusão da tarefa. Se você entendeu e deseja continuar, digite \"%s\".",
|
||||
"format_trim_confirm": "&Aviso: Chunks no %s fora da região em forma de %s centralizados em %s, %s com raio %s serão excluídos para sempre. Faça um backup do servidor antes de continuar para evitar problemas. Reinicie o servidor completamente após a conclusão da tarefa. Se você entendeu e deseja continuar, digite \"%s\".",
|
||||
"format_trim_confirm_inside": "&cAtenção: os chunks (%s) dentro da região centralizada em %s, %s com raio %s serão apagados para sempre. Veja se há um backup do servidor antes de continuar para evitar danos. O servidor deverá ser reiniciado para concluir a tarefa. Se você entendeu e deseja continuar, digite \"%s\".",
|
||||
"format_trim_confirm_inhabited": "&eAviso: filtrando chunks com um tempo máximo de %s ciclos. O corte pode demorar mais um pouco para concluir.",
|
||||
"format_pattern": "Padrão alterado para %s.",
|
||||
"format_pause": "Tarefa pausada no mundo %s.",
|
||||
"format_pause_no_tasks": "Nenhuma tarefa para pausar.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Raio alterado para %s.",
|
||||
"format_reload": "As definições foram recarregadas.",
|
||||
"format_reload_tasks_running": "A definição não pode ser recarregada com tarefas em execução.",
|
||||
"format_selection": "Seleção atual",
|
||||
"format_selection_center": "Centro: %s, %s",
|
||||
"format_selection_radius": "Raio: %s",
|
||||
"format_selection_radii": "Raios: %s, %s",
|
||||
"format_selection_shape": "Forma: %s",
|
||||
"format_selection_world": "Mundo: %s",
|
||||
"format_shape": "Forma alterada para %s.",
|
||||
"format_silent": "Modo silencioso: %s.",
|
||||
"format_start": "Tarefa iniciada no mundo %s para a região de forma %s em %s, %s com raio %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Sua hospedagem limitou o raio máximo de pré-geração para %s a fim de evitar o uso excessivo de espaço em disco. Reduza o raio ou entre em contato com o serviço para remover o limite.",
|
||||
"format_started_already": "Tarefa já iniciada no mundo %s!",
|
||||
"format_world": "Mundo alterado para %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Gerenciar barreiras de mundo personalizadas",
|
||||
"help_cancel": "&2chunky cancel&r - Parar e excluir tarefas atuais ou salvas",
|
||||
"help_center": "&2chunky center <x> <z>&r - Definir o local do bloco central",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Definir intervalo de avisos",
|
||||
"help_radius": "&2chunky radius <radius>&r - Definir raio",
|
||||
"help_reload": "&2chunky reload&r - Recarregar definições",
|
||||
"help_selection": "&2chunky selection&r - Exibe a seleção atual",
|
||||
"help_shape": "&2chunky shape <shape>&r - Definir forma para gerar",
|
||||
"help_silent": "&2chunky silent&r - Alternar exibição dos avisos de atualização",
|
||||
"help_spawn": "&2chunky spawn&r - Definir o centro para o ponto de nascimento (spawn)",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "espiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "região",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "círculo",
|
||||
"shape_diamond": "diamante",
|
||||
"shape_ellipse": "elipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentágono",
|
||||
"shape_rectangle": "retângulo",
|
||||
"shape_square": "quadrado",
|
||||
"shape_star": "estrela",
|
||||
"shape_triangle": "triângulo",
|
||||
"task_trim": "%s chunks excluídos no mundo %s em %s segundos.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Tarefa concluída no mundo %s. Chunks processados: %s (%s%%), tempo total: %s:%s:%s",
|
||||
"task_stopped": "Tarefa interrompida no mundo %s.",
|
||||
"task_update": "Tarefa em execução no mundo %s. Chunks processados: %s (%s%%), tempo restante: %s:%s:%s, taxa: %s CPS, atual: %s, %s"
|
||||
"task_update": "Tarefa em execução no mundo %s. Chunks processados: %s (%s%%), tempo restante: %s:%s:%s, taxa: %s CPS, atual: %s, %s",
|
||||
"wrap_both": "ambos",
|
||||
"wrap_default": "padrão",
|
||||
"wrap_earth": "terra",
|
||||
"wrap_none": "não",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -1,31 +1,33 @@
|
||||
{
|
||||
"border_dependency_update": "Для использования ChunkyBorder вы должны обновить Chunky!",
|
||||
"border_load_failed": "Сохранённые границы не найдены.",
|
||||
"border_save_failed": "Невозможно сохранить границы.",
|
||||
"border_dependency_update": "Обновите Chunky, чтобы использовать ChunkyBorder!",
|
||||
"border_load_failed": "Сохранённых границ не найдено.",
|
||||
"border_save_failed": "Не удалось сохранить границы.",
|
||||
"command_no_permission": "&cУ вас недостаточно прав для использования этой команды.",
|
||||
"disabled": "выключен",
|
||||
"enabled": "включен",
|
||||
"disabled": "отключено",
|
||||
"enabled": "включено",
|
||||
"error_version": "Этот плагин несовместим с версиями Minecraft ниже 1.13.",
|
||||
"error_version_spigot": "Этот плагин несовместим со Spigot 1.13!",
|
||||
"format_border_add": "Граница формы %s была добавлена в мире %s с центром на %s, %s, и радиусом %s.",
|
||||
"format_border_bypass": "Значение временного разрешения для обхода: %s для игрока %s.",
|
||||
"format_border_bypass_no_target": "Невозможно найти игрока с именем %s.",
|
||||
"format_border_add": "Граница формы %s была установлена в мире %s с центром на %s, %s, и радиусом %s.",
|
||||
"format_border_bypass": "Временное разрешение на обход границ: %s для игрока %s.",
|
||||
"format_border_bypass_no_target": "Не удалось найти игрока с именем %s.",
|
||||
"format_border_list": "Границы мира",
|
||||
"format_border_list_border": "Мир %s: %s с центром %s, %s и радиусом %s.",
|
||||
"format_border_list_border": "Мир %s: %s с центром в %s, %s и радиусом %s.",
|
||||
"format_border_list_none": "Ни у одного мира не установлены границы.",
|
||||
"format_border_load": "Выделенное пространство было загружено для мира %s.",
|
||||
"format_border_no_border": "Для мира %s не существует границ мира.",
|
||||
"format_border_no_border": "Для мира %s не установлено границ мира.",
|
||||
"format_border_remove": "Граница мира %s была удалена.",
|
||||
"format_border_wrap": "Значение перемещения границ мира: %s для мира %s.",
|
||||
"format_border_wrap": "Тип пограничного перемещения сменен на '%s' для мира %s.",
|
||||
"format_cancel": "Задача для %s отменена.",
|
||||
"format_cancel_all": "Все задачи отменены.",
|
||||
"format_cancel_confirm": "Отмененные задачи не могут быть продолжены. Если вы уверены, что хотите отменить задачу, напишите '%s'.",
|
||||
"format_cancel_confirm": "Отмененные задачи не могут быть продолжены. Если вы уверены, что хотите отменить задачу, введите '%s'.",
|
||||
"format_cancel_no_tasks": "Нет задач для отмены.",
|
||||
"format_center": "Центр перенесён на %s, %s.",
|
||||
"format_confirm": "Подтверждать нечего!",
|
||||
"format_continue": "Задача для %s продолжена.",
|
||||
"format_continue_no_tasks": "Нет задач для продолжения.",
|
||||
"format_trim_confirm": "&cВнимание: Чанки в %s, находящиеся снаружи региона %s с центром в %s, %s и радиусом %s, будут полностью удалены. Во избежание возможной потери данных, пожалуйста, убедитесь в том, что у вас есть резервная копия сервера. После завершения задачи вам будет необходимо полностью перезагрузить сервер. Если вы готовы продолжить, введите '%s'.",
|
||||
"format_trim_confirm_inside": "&cВнимание: Чанки в %s, находящиеся внутри региона %s с центром в %s, %s и радиусом %s, будут полностью удалены. Во избежание возможной потери данных, пожалуйста, убедитесь в том, что у вас есть резервная копия сервера. После завершения задачи вам будет необходимо полностью перезагрузить сервер. Если вы готовы продолжить, введите '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eВнимание: Началась фильтрация чанков, в которых находились менее %s тиков. Обрезка может занять больше времени, чем обычно.",
|
||||
"format_pattern": "Паттерн изменен на %s.",
|
||||
"format_pause": "Задача для %s приостановлена.",
|
||||
"format_pause_no_tasks": "Нет задач для приостановки.",
|
||||
@@ -35,48 +37,67 @@
|
||||
"format_radius": "Радиус изменен на %s.",
|
||||
"format_reload": "Конфигурация успешно перезагружена.",
|
||||
"format_reload_tasks_running": "Конфигурация не может быть перезагружена, пока есть выполняемые задачи.",
|
||||
"format_selection": "Текущее выделение",
|
||||
"format_selection_center": "Центр: %s, %s",
|
||||
"format_selection_radius": "Радиус: %s",
|
||||
"format_selection_radii": "Радиусы: %s, %s",
|
||||
"format_selection_shape": "Форма: %s",
|
||||
"format_selection_world": "Мир: %s",
|
||||
"format_shape": "Форма изменена на %s.",
|
||||
"format_silent": "Тихий режим был %s.",
|
||||
"format_silent": "Тихий режим %s.",
|
||||
"format_start": "Задача в %s запущена для региона %s с центром в %s, %s и радиусом %s.",
|
||||
"format_start_confirm": "Задача для этого мира уже была запущена. Чтобы продолжить ее, напишите '%s'. Чтобы начать новую задачу, напишите '%s'.",
|
||||
"format_start_disk": "На сервере осталось %s дискового пространства, но для выполнения задачи требуется приблизительно %s. Если вы всё ещё хотите продолжить, введите '%s'.",
|
||||
"format_start_limit": "Ваш хост ограничил максимальный радиус предварительной генерации до %s во избежание переполнения дискового пространства. Уменьшите радиус, или свяжитесь с хостом для снятия ограничений.",
|
||||
"format_started_already": "Задача для %s уже запущена!",
|
||||
"format_world": "Мир изменен на %s.",
|
||||
"format_worldborder_too_large": "&eПредупреждение: Граница мира установлена дальше, чем указанное значение %s в server.properties. Как правило, это ошибка, которая может вызвать проблемы.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Управление пользовательскими границами мира",
|
||||
"help_cancel": "&2chunky cancel&r - Остановить и удалить текущие или сохраненные задачи",
|
||||
"help_center": "&2chunky center <x> <z>&r - Установить координаты центра",
|
||||
"help_continue": "&2chunky continue&r - Продолжить текущие или сохраненные задачи",
|
||||
"help_corners": "&2chunky corners <x1> <z1> <x2> <z2>&r - Установить координаты углов",
|
||||
"help_trim": "&2chunky trim&r - Удалить чанки за границами",
|
||||
"help_menu": "&aChunky Commands&r%s",
|
||||
"help_menu": "&aКоманды Chunky&r%s",
|
||||
"help_more": "Используйте &a%s&r, чтобы узнать больше.",
|
||||
"help_pattern": "&2chunky pattern <pattern>&r - Установить паттерн генерации",
|
||||
"help_pattern": "&2chunky pattern <паттерн>&r - Установить паттерн генерации",
|
||||
"help_pause": "&2chunky pause&r - Приостановить текущие задачи и сохранить прогресс",
|
||||
"help_progress": "&2chunky progress&r - Показать текущий прогресс задачи",
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Установить интервал тихой работы",
|
||||
"help_radius": "&2chunky radius <radius>&r - Установить радиус",
|
||||
"help_quiet": "&2chunky quiet <интервал>&r - Установить интервал тихой работы",
|
||||
"help_radius": "&2chunky radius <радиус>&r - Установить радиус",
|
||||
"help_reload": "&2chunky reload&r - Перезагрузить конфигурацию",
|
||||
"help_shape": "&2chunky shape <shape>&r - Установить форму генерации",
|
||||
"help_selection": "&2chunky selection&r - Показать текущее выделение",
|
||||
"help_shape": "&2chunky shape <форма>&r - Установить форму генерации",
|
||||
"help_silent": "&2chunky silent&r - Переключить вывод сообщений о генерации чанков",
|
||||
"help_spawn": "&2chunky spawn&r - Установить центр на точке возрождения игроков",
|
||||
"help_start": "&2chunky start&r - Начать новую задачу генерации чанков",
|
||||
"help_world": "&2chunky world <world>&r - Выбрать мир для генерации чанков",
|
||||
"help_world": "&2chunky world <мир>&r - Выбрать мир для генерации чанков",
|
||||
"help_worldborder": "&2chunky worldborder&r - Установить центр и радиус, исходя из границы мира",
|
||||
"pattern_concentric": "концентрично",
|
||||
"pattern_loop": "цикл",
|
||||
"pattern_spiral": "спираль",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "область",
|
||||
"pattern_world": "мир",
|
||||
"shape_circle": "круг",
|
||||
"shape_diamond": "ромб",
|
||||
"shape_ellipse": "эллипс",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "пятиугольник",
|
||||
"shape_rectangle": "прямоугольник",
|
||||
"shape_square": "квадрат",
|
||||
"shape_star": "звезда",
|
||||
"shape_triangle": "треугольник",
|
||||
"task_trim": "Удалено %s чанков из %s за %s секунд.",
|
||||
"task_trim_update": "Задача для %s выполняется. Обработано %s регионов (%s%%)",
|
||||
"task_done": "Задача для %s выполнена. Обработано: %s чанков (%s%%), Заняло времени: %s:%s:%s",
|
||||
"task_stopped": "Задача для %s остановлена.",
|
||||
"task_update": "Задача для %s выполняется. Обработано: %s чанков (%s%%), ETA: %s:%s:%s, Скорость: %s Чанков в секунду, Текущий чанк: %s, %s"
|
||||
"task_update": "Задача для %s выполняется. Обработано: %s чанков (%s%%), ETA: %s:%s:%s, Скорость: %s Чанков в секунду, Текущий чанк: %s, %s",
|
||||
"wrap_both": "оба",
|
||||
"wrap_default": "обычное",
|
||||
"wrap_earth": "планета",
|
||||
"wrap_none": "нет",
|
||||
"wrap_radial": "круговое",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
"format_border_load": "Selekcija učitana iz bordera sveta %s.",
|
||||
"format_border_no_border": "Nema bordera sveta za %s.",
|
||||
"format_border_remove": "Obrisan border sveta iz %s.",
|
||||
"format_border_wrap": "Wrapped border je sada %s za %s.",
|
||||
"format_border_wrap": "Wrapped border promenjen u %s za %s.",
|
||||
"format_cancel": "Proces otkazan za %s.",
|
||||
"format_cancel_all": "Otkazivanje svih procesa.",
|
||||
"format_cancel_confirm": "Otkazani procesi ne mogu biti nastavljeni. Ako sigurno želite da otkažete, kucajte '%s'.",
|
||||
@@ -26,6 +26,8 @@
|
||||
"format_continue": "Proces nastavljen za %s.",
|
||||
"format_continue_no_tasks": "Nema procesa za nastavak.",
|
||||
"format_trim_confirm": "&cUpozorenje: Čankovi u %s izvan %s regije centrirani u %s, %s sa razdaljinom %s će biti trajno obrisani. Napravite rezervnu kopiju servera pre nego što nastavite da biste izbegli potencijalnu štetu. Morate restartovati server kada se proces završi. Ako ste razumeli i želite nastaviti, napišite '%s'.",
|
||||
"format_trim_confirm_inside": "&cWarning: Chunks in %s inside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Oblik promenjen u %s.",
|
||||
"format_pause": "Proces za %s pauziran.",
|
||||
"format_pause_no_tasks": "Nema procesa za pauziranje.",
|
||||
@@ -35,6 +37,12 @@
|
||||
"format_radius": "Razdaljina promenjena u %s.",
|
||||
"format_reload": "Konfiguracija uspešno osvežena.",
|
||||
"format_reload_tasks_running": "Konfiguracija ne može biti osvežena dok je proces u toku.",
|
||||
"format_selection": "Trenutna selekcija",
|
||||
"format_selection_center": "Centar: %s, %s",
|
||||
"format_selection_radius": "Razdaljina: %s",
|
||||
"format_selection_radii": "Poluprečnik: %s, %s",
|
||||
"format_selection_shape": "Oblik: %s",
|
||||
"format_selection_world": "Svet: %s",
|
||||
"format_shape": "Oblik promenjen u %s.",
|
||||
"format_silent": "Tihi mod postavljen na %s.",
|
||||
"format_start": "Proces pokrenut u %s za %s regiju centriranu u %s, %s sa razdaljinom %s.",
|
||||
@@ -43,6 +51,7 @@
|
||||
"format_start_limit": "Vaš host je ograničio maksimalnu razdaljinu pregenerisanja na %s da bi izbegao veće korišćenje memorije. Smanjite razdaljinu ili ih kontaktirajte da biste uklonili ovo ograničenje.",
|
||||
"format_started_already": "Proces je već pokrenut za %s!",
|
||||
"format_world": "Svet promenjen u %s.",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Upravljajte borderima svetova",
|
||||
"help_cancel": "&2chunky cancel&r - Prekinite i obrišite trenutne ili sačuvane procese",
|
||||
"help_center": "&2chunky center <x> <z>&r - Postavite centralne koordinate",
|
||||
@@ -57,6 +66,7 @@
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Postavite tihi interval",
|
||||
"help_radius": "&2chunky radius <razdaljina>&r - Postavite razdaljinu",
|
||||
"help_reload": "&2chunky reload&r - Osvežite konfiguraciju",
|
||||
"help_selection": "&2chunky selection&r - Prikažite trenutnu selekciju",
|
||||
"help_shape": "&2chunky shape <oblik>&r - Postavite oblik za generisanje",
|
||||
"help_silent": "&2chunky silent&r - Uključite/isključite poruke napretka",
|
||||
"help_spawn": "&2chunky spawn&r - Postavite centar za spawn lokaciju",
|
||||
@@ -67,16 +77,27 @@
|
||||
"pattern_loop": "petlja",
|
||||
"pattern_spiral": "spirala",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "krug",
|
||||
"shape_diamond": "romb",
|
||||
"shape_ellipse": "elipsa",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "pravougaonik",
|
||||
"shape_square": "kvadrat",
|
||||
"shape_star": "zvezda",
|
||||
"shape_triangle": "trougao",
|
||||
"task_trim": "Obrisano %s čankova iz %s u %s sekundi.",
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "Proces završen za %s. Obrađeno: %s čankova (%s%%), Proteklo vremena: %s:%s:%s",
|
||||
"task_stopped": "Proces zaustavljen za %s.",
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutno: %s, %s"
|
||||
"task_update": "U toku je proces za %s. Obrađeno: %s čankova (%s%%), Preostalo: %s:%s:%s, Brzina: %s čps, Trenutno: %s, %s",
|
||||
"wrap_both": "oba",
|
||||
"wrap_default": "podrazumevano",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "ništa",
|
||||
"wrap_radial": "radijalno",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
@@ -1,82 +1,103 @@
|
||||
{
|
||||
"border_dependency_update": "Chunky needs to be updated in order to use ChunkyBorder!",
|
||||
"border_load_failed": "No saved borders found.",
|
||||
"border_save_failed": "Unable to save borders.",
|
||||
"border_dependency_update": "ChunkyBorder'ın kullanılabilmesi için Chunk'nin güncellenmesi gerekiyor!",
|
||||
"border_load_failed": "Kaydedilmiş bir sınır bulunamadı.",
|
||||
"border_save_failed": "Sınırlar kaydedilemiyor.",
|
||||
"command_no_permission": "&cBu komutu kullanmak için yetkiniz yok.",
|
||||
"disabled": "de-aktif",
|
||||
"enabled": "aktif",
|
||||
"error_version": "Bu eklenti, 1.13'ün altındaki Minecraft sürümleriyle uyumlu değildir.",
|
||||
"error_version_spigot": "Bu eklenti Spigot 1.13 ile uyumlu değil!",
|
||||
"format_border_add": "Added %s world border to %s with center %s, %s, and radius %s.",
|
||||
"format_border_bypass": "Temporary border bypass %s for %s.",
|
||||
"format_border_bypass_no_target": "Cannot find a player by the name %s.",
|
||||
"format_border_list": "World Borders",
|
||||
"format_border_list_border": "%s: %s with center %s, %s and radius %s.",
|
||||
"format_border_list_none": "There are no world borders.",
|
||||
"format_border_load": "Selection loaded from world border for %s.",
|
||||
"format_border_no_border": "No world border exists for %s.",
|
||||
"format_border_remove": "Removed world border from %s.",
|
||||
"format_border_wrap": "World border wrapping is now %s for %s.",
|
||||
"format_cancel": "Fonksiyon %s için durduruldu.",
|
||||
"format_border_add": "%s dünya sınırı, %s dünyasına %s, %s merkezi ve %s yarıçap ile eklendi.",
|
||||
"format_border_bypass": "Geçici sınır geçiş izni %s ve %s adlı oyunucya verildi.",
|
||||
"format_border_bypass_no_target": "%s adıyla bir oyuncu bulunamadı.",
|
||||
"format_border_list": "Dünya Sınırları",
|
||||
"format_border_list_border": "%s: Şekil: %s, Merkez: %s, %s, Yarıçap: %s.",
|
||||
"format_border_list_none": "Hiçbir dünya sınırı bulunamadı.",
|
||||
"format_border_load": "Seçim %s dünyasının sınırlarından yüklendi.",
|
||||
"format_border_no_border": "%s üzerinde hiç bir dünya sınırı yok.",
|
||||
"format_border_remove": "%s adlı dünyadan sınır kaldırıldı.",
|
||||
"format_border_wrap": "World border wrap changed to %s for %s.",
|
||||
"format_cancel": "Fonksiyon %s için iptal edildi.",
|
||||
"format_cancel_all": "Tüm fonksiyonlar iptal ediliyor.",
|
||||
"format_cancel_confirm": "İptal edilen fonksiyonlar devam ettirilemez. İptal etmek istediğinden eminsen '%s' yaz.",
|
||||
"format_cancel_no_tasks": "İptal edilecek bir fonksiyon bulunmuyor.",
|
||||
"format_center": "Merkez %s, %s olarak değiştirildi.",
|
||||
"format_confirm": "Onaylanacak bir fonksiyon yok!",
|
||||
"format_continue": "için devam eden fonksiyon.",
|
||||
"format_continue": "%s fonksiyonu devam ettiriliyor.",
|
||||
"format_continue_no_tasks": "Devam edilecek bir fonksiyon bulunmuyor.",
|
||||
"format_trim_confirm": "&cWarning: Chunks in %s outside of the %s region centered at %s, %s with radius %s will be permanently deleted. Please make sure you have taken a backup of your server before continuing to avoid potential damage. You will be required to restart your server fully after the task has finished. If you understand and wish to proceed, type '%s'.",
|
||||
"format_pattern": "Pattern changed to %s.",
|
||||
"format_pause": "fonksiyon %s için durduruldu.",
|
||||
"format_pause_no_tasks": "No tasks to pause.",
|
||||
"format_progress_no_tasks": "No tasks running.",
|
||||
"format_quiet": "Sessiz aralık %s saniye olarak yarlandı.",
|
||||
"format_radii": "Radius changed for x to %s, and for z to %s.",
|
||||
"format_trim_confirm": "&cUyarı: %1$s dünyasındaki %3$s, %4$s merkezli, %5$s yarıçaplı, %2$s alanın dışarısındaki herşey &4&lKALICI &r&colarak silinecektir. Potansiyel hasarı engellemek için lütfen yedek aldığınızdan emin olun. İşlem sona erdiğinde sunucunuzu tamamen yeniden başlatmanız gerekecek. Eğer riskleri anladıysanız ve devam etmek istiyorsanız, '%6$s' yazın.",
|
||||
"format_trim_confirm_inside": "&cUyarı: %1$s dünyasındaki %3$s, %4$s merkezli, %5$s yarıçaplı, %2$s alan &4&lKALICI &r&colarak silinecektir. Potansiyel hasarı engellemek için lütfen yedek aldığınızdan emin olun. İşlem sona erdiğinde sunucunuzu tamamen yeniden başlatmanız gerekecek. Eğer riskleri anladıysanız ve devam etmek istiyorsanız, '%6$s' yazın.",
|
||||
"format_trim_confirm_inhabited": "&eNotice: Filtering chunks by a maximum inhabited time of %s ticks. Trim may take longer than usual to complete.",
|
||||
"format_pattern": "Yol %s olarak değiştirildi.",
|
||||
"format_pause": "Fonksiyon %s için durduruldu.",
|
||||
"format_pause_no_tasks": "Durdurulacak bir fonksiyon bulunmuyor.",
|
||||
"format_progress_no_tasks": "Aktif bir fonksiyon yok.",
|
||||
"format_quiet": "Sessizlik aralığı %s saniye olarak ayarlandı.",
|
||||
"format_radii": "Yarıçap x için %s olarak, z için %s olarak değiştirildi.",
|
||||
"format_radius": "Yarıçap %s olarak ayarlandı.",
|
||||
"format_reload": "Successfully reloaded configuration.",
|
||||
"format_reload_tasks_running": "The configuration cannot be reloaded while tasks are running.",
|
||||
"format_shape": "Shape changed to %s.",
|
||||
"format_reload": "Konfigürasyon başarıyla yeniden yüklendi.",
|
||||
"format_reload_tasks_running": "Fonksiyonlar çalışmaya devam ederken konfigürasyon yeniden yüklenemez.",
|
||||
"format_selection": "Mevcut seçim",
|
||||
"format_selection_center": "Merkez: %s, %s",
|
||||
"format_selection_radius": "Yarıçap: %s",
|
||||
"format_selection_radii": "Yarıçaplar, X: %s, Z: %s",
|
||||
"format_selection_shape": "Şekil: %s",
|
||||
"format_selection_world": "Dünya: %s",
|
||||
"format_shape": "Şekil %s olarak değşitirildi.",
|
||||
"format_silent": "Sessiz mod %s.",
|
||||
"format_start": "Fonksiyon %1$s için %3$s, %4$s ve yarıçap %5$s olarak ayarlandı.",
|
||||
"format_start_confirm": "A task was already started for this world. To continue running it, type '%s'. To start a new task, type '%s'.",
|
||||
"format_start_disk": "The server only has %s disk space remaining, but the estimated disk space required for the task is %s. If you wish to start anyway, type '%s'.",
|
||||
"format_start_limit": "Your host has limited the maximum pre-generation radius to %s to avoid excessive disk space usage. Reduce the radius or contact your host if you wish to have this limit removed.",
|
||||
"format_started_already": "için fonksiyon zaten başladı!",
|
||||
"format_start": "Fonksiyon %s içerisinde %s şekliyle, %s, %s merkezli olarak, %s yarıçapında başlatıldı.",
|
||||
"format_start_confirm": "Bu dünya için zaten hali hazırda bir fonksiyon başlatıldı. Devam ettirmek için '%s' yaz. Yeni bir fonksiyon oluşturmak için '%s' yaz.",
|
||||
"format_start_disk": "Bu sunucu sadece %s kullanılabilir disk alanına sahip fakat bu fonksiyon için tahmin edilen gereken disk alanı %s. Yinede başlatmak istiyorsanız, '%s' yazın.",
|
||||
"format_start_limit": "Sunucu sağlayıcınız aşırı fazla disk kullanımını engellemek için maksimum önden oluşturulmuş dünya yarıçapını %s olarak belirledi. Seçiminizin yarıçapını küçültün veya sunucu sağlayıcınızla iletişime geçin.",
|
||||
"format_started_already": "%s için fonksiyon zaten başlatıldı!",
|
||||
"format_world": "Dünya %s olarak değiştirildi.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Manage custom world borders",
|
||||
"format_worldborder_too_large": "&eNotice: Your world border is currently set larger than the maximum of %s configured in server.properties. This is normally an error and can cause issues.",
|
||||
"help_border": "&2chunky border <add|remove|wrap|list|load|bypass>&r - Özel dünya sınırlarını yönet",
|
||||
"help_cancel": "&2chunky cancel&r - Mevcut veya kayıtlı fonksiyonları durdurun ve silin",
|
||||
"help_center": "&2chunky center <x> <z>&r - Merkez blok konumunu ayarlayın",
|
||||
"help_continue": "&2chunky continue&r - Mevcut veya kayıtlı fonksiyonlara devam edin",
|
||||
"help_corners": "&2chunky corners <x1> <z1> <x2> <z2>&r - Set by corners",
|
||||
"help_trim": "&2chunky trim&r - Delete chunks outside selection",
|
||||
"help_menu": "&aChunky Commands&r%s",
|
||||
"help_more": "Type &a%s&r to see more.",
|
||||
"help_pattern": "&2chunky pattern <pattern>&r - Set the generation pattern",
|
||||
"help_continue": "&2chunky continue&r - Mevcut veya kayıtlı fonksiyonları devam ettirin",
|
||||
"help_corners": "&2chunky corners <x1> <z1> <x2> <z2>&r Köşelerle seçim yap",
|
||||
"help_trim": "&2chunky trim&r - Seçimin dışarısındaki chunkları sil",
|
||||
"help_menu": "&aChunky Komutları&r%s",
|
||||
"help_more": "Daha fazla görmek için &a%s&r yazın.",
|
||||
"help_pattern": "&2chunky pattern <yol>&r - Dünya oluşum yolunu belirler",
|
||||
"help_pause": "&2chunky pause&r - Mevcut fonksiyonları durdurun ve ilerlemeyi kaydedin",
|
||||
"help_progress": "&2chunky progress&r - Displays current task progress",
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Sessiz aralığı ayarlayın",
|
||||
"help_progress": "&2chunky progress&r - Devam etmekte olan fonksiyonun durumunu gösterir",
|
||||
"help_quiet": "&2chunky quiet <interval>&r - Sessizlik aralığını ayarlayın",
|
||||
"help_radius": "&2chunky radius <radius>&r - Yarıçapı ayarlayın",
|
||||
"help_reload": "&2chunky reload&r - Reload configuration",
|
||||
"help_shape": "&2chunky shape <shape>&r - Set the shape to generate",
|
||||
"help_reload": "&2chunky reload&r - Konfigürasyonu yeniden yükle",
|
||||
"help_selection": "&2chunky selection&r - Seçimi görüntüle",
|
||||
"help_shape": "&2chunky shape <şekil>&r - Oluşum şeklini seçer",
|
||||
"help_silent": "&2chunky silent&r - Güncelleme mesajlarını göstermeyi aç / kapat",
|
||||
"help_spawn": "&2chunky spawn&r - Set the center to the spawn point",
|
||||
"help_spawn": "&2chunky spawn&r - Merkezi doğma noktası olarak belirler",
|
||||
"help_start": "&2chunky start&r - Yeni bir chunk oluşturma fonksiyonu başlatın",
|
||||
"help_world": "&2chunky world <world>&r - Dünya hedefini belirleyin",
|
||||
"help_world": "&2chunky world <world>&r - Hedef dünyayı belirleyin",
|
||||
"help_worldborder": "&2chunky worldborder&r - Merkezi ve yarıçapı dünya sınırına ayarlayın",
|
||||
"pattern_concentric": "concentric",
|
||||
"pattern_loop": "loop",
|
||||
"pattern_spiral": "spiral",
|
||||
"pattern_csv": "csv",
|
||||
"pattern_region": "region",
|
||||
"pattern_world": "world",
|
||||
"shape_circle": "circle",
|
||||
"shape_diamond": "diamond",
|
||||
"shape_ellipse": "ellipse",
|
||||
"shape_hexagon": "hexagon",
|
||||
"shape_pentagon": "pentagon",
|
||||
"shape_rectangle": "rectangle",
|
||||
"shape_square": "square",
|
||||
"shape_star": "star",
|
||||
"shape_triangle": "triangle",
|
||||
"task_trim": "Deleted %s chunks from %s in %s seconds.",
|
||||
"task_done": "için fonksiyon tamamlandı: %s chunk (%s%%), Toplam zaman: %s:%s:%s",
|
||||
"task_stopped": "için fonksiyon durduruldu.",
|
||||
"task_update": "için çalışan fonksiyon: %s chunk (%s%%), Tahmini Oluş: %s:%s:%s, Oran: %s CPS, Mevcut: %s, %s"
|
||||
"task_trim_update": "Task running for %s. Processed: %s regions (%s%%)",
|
||||
"task_done": "%s için fonksiyon tamamlandı. %s chunk (%s%%) işlendi. Toplam zaman: %s:%s:%s",
|
||||
"task_stopped": "%s için fonksiyon durduruldu.",
|
||||
"task_update": "%s için fonksiyon devam ediyor: %s chunk (%s%%) işlendi, Kalan süre: %s:%s:%s, Hız: Saniyede %s chunk, Şu anda işlenilen chunk: %s, %s",
|
||||
"wrap_both": "both",
|
||||
"wrap_default": "default",
|
||||
"wrap_earth": "earth",
|
||||
"wrap_none": "none",
|
||||
"wrap_radial": "radial",
|
||||
"wrap_x": "x",
|
||||
"wrap_z": "z"
|
||||
}
|
||||
Loaded 100 of 188 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user