From eb2027e5cb69afa6943af1566a4731a56e7f11f0 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 17 Apr 2022 19:35:21 +0200 Subject: [PATCH 01/16] Add gradle --- .gitignore | 18 +- SchematicSystem_15/build.gradle | 56 +++++ SchematicSystem_15/pom.xml | 54 ----- SchematicSystem_15/settings.gradle | 20 ++ SchematicSystem_8/build.gradle | 56 +++++ SchematicSystem_8/pom.xml | 54 ----- SchematicSystem_8/settings.gradle | 20 ++ SchematicSystem_Core/build.gradle | 54 +++++ SchematicSystem_Core/pom.xml | 50 ----- SchematicSystem_Core/settings.gradle | 20 ++ SchematicSystem_Main/pom.xml | 59 ------ build.gradle | 247 +++++++++++++++++++++++ gradle.properties | 22 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 183 +++++++++++++++++ gradlew.bat | 100 +++++++++ pom.xml | 56 ----- settings.gradle | 24 +++ steamwarci.yml | 6 +- 20 files changed, 826 insertions(+), 279 deletions(-) create mode 100644 SchematicSystem_15/build.gradle delete mode 100644 SchematicSystem_15/pom.xml create mode 100644 SchematicSystem_15/settings.gradle create mode 100644 SchematicSystem_8/build.gradle delete mode 100644 SchematicSystem_8/pom.xml create mode 100644 SchematicSystem_8/settings.gradle create mode 100644 SchematicSystem_Core/build.gradle delete mode 100644 SchematicSystem_Core/pom.xml create mode 100644 SchematicSystem_Core/settings.gradle delete mode 100644 SchematicSystem_Main/pom.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index 377ce8c..36e1257 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,15 @@ +# Package Files +*.jar + +# Gradle +.gradle +**/build/ +!gradle/wrapper/gradle-wrapper.jar +steamwar.properties + +# IntelliJ IDEA .idea -target -lib -dependency-reduced-pom.xml -*.iml \ No newline at end of file +*.iml + +# Other +lib \ No newline at end of file diff --git a/SchematicSystem_15/build.gradle b/SchematicSystem_15/build.gradle new file mode 100644 index 0000000..cb6a6ae --- /dev/null +++ b/SchematicSystem_15/build.gradle @@ -0,0 +1,56 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +plugins { + id 'base' + id 'java' +} + +group 'steamwar' +version '1.0' + +compileJava.options.encoding = 'UTF-8' + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +sourceSets { + main { + java { + srcDirs = ['src/'] + } + resources { + srcDirs = ['src/'] + exclude '**/*.java', '**/*.kt' + } + } +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.22' + testCompileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' + + implementation project(":SchematicSystem_Core") + + compileOnly files("${projectDir}/../lib/Spigot-1.15.jar") + compileOnly files("${projectDir}/../lib/WorldEdit-1.15.jar") + compileOnly files("${projectDir}/../lib/SpigotCore.jar") +} diff --git a/SchematicSystem_15/pom.xml b/SchematicSystem_15/pom.xml deleted file mode 100644 index e23f79a..0000000 --- a/SchematicSystem_15/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - SchematicSystem_15 - 1.0 - - - steamwar - SchematicSystem - 1.0 - - - - ${project.basedir}/.. - - - - src - - - src - - **/*.java - **/*.kt - - - - - - - - steamwar - SchematicSystem_Core - 1.0 - - - steamwar - Spigot - 1.15 - system - ${main.basedir}/lib/Spigot-1.15.jar - - - steamwar - WorldEdit - 1.15 - system - ${main.basedir}/lib/WorldEdit-1.15.jar - - - \ No newline at end of file diff --git a/SchematicSystem_15/settings.gradle b/SchematicSystem_15/settings.gradle new file mode 100644 index 0000000..99722b8 --- /dev/null +++ b/SchematicSystem_15/settings.gradle @@ -0,0 +1,20 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +rootProject.name = 'SchematicSystem_15' \ No newline at end of file diff --git a/SchematicSystem_8/build.gradle b/SchematicSystem_8/build.gradle new file mode 100644 index 0000000..afd30df --- /dev/null +++ b/SchematicSystem_8/build.gradle @@ -0,0 +1,56 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +plugins { + id 'base' + id 'java' +} + +group 'steamwar' +version '1.0' + +compileJava.options.encoding = 'UTF-8' + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +sourceSets { + main { + java { + srcDirs = ['src/'] + } + resources { + srcDirs = ['src/'] + exclude '**/*.java', '**/*.kt' + } + } +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.22' + testCompileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' + + implementation project(":SchematicSystem_Core") + + compileOnly files("${projectDir}/../lib/Spigot-1.8.jar") + compileOnly files("${projectDir}/../lib/WorldEdit-1.12.jar") + compileOnly files("${projectDir}/../lib/SpigotCore.jar") +} diff --git a/SchematicSystem_8/pom.xml b/SchematicSystem_8/pom.xml deleted file mode 100644 index 109833f..0000000 --- a/SchematicSystem_8/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - SchematicSystem_8 - 1.0 - - - steamwar - SchematicSystem - 1.0 - - - - ${project.basedir}/.. - - - - src - - - src - - **/*.java - **/*.kt - - - - - - - - steamwar - Spigot - 1.8 - system - ${main.basedir}/lib/Spigot-1.8.jar - - - steamwar - WorldEdit - 1.12 - system - ${main.basedir}/lib/WorldEdit-1.12.jar - - - steamwar - SchematicSystem_Core - 1.0 - - - \ No newline at end of file diff --git a/SchematicSystem_8/settings.gradle b/SchematicSystem_8/settings.gradle new file mode 100644 index 0000000..f86503d --- /dev/null +++ b/SchematicSystem_8/settings.gradle @@ -0,0 +1,20 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +rootProject.name = 'SchematicSystem_8' \ No newline at end of file diff --git a/SchematicSystem_Core/build.gradle b/SchematicSystem_Core/build.gradle new file mode 100644 index 0000000..282fc61 --- /dev/null +++ b/SchematicSystem_Core/build.gradle @@ -0,0 +1,54 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +plugins { + id 'base' + id 'java' +} + +group 'steamwar' +version '1.0' + +compileJava.options.encoding = 'UTF-8' + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +sourceSets { + main { + java { + srcDirs = ['src/'] + } + resources { + srcDirs = ['src/'] + exclude '**/*.java', '**/*.kt' + } + } +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.22' + testCompileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' + + compileOnly files("${projectDir}/../lib/Spigot-1.15.jar") + compileOnly files("${projectDir}/../lib/WorldEdit-1.15.jar") + compileOnly files("${projectDir}/../lib/SpigotCore.jar") +} diff --git a/SchematicSystem_Core/pom.xml b/SchematicSystem_Core/pom.xml deleted file mode 100644 index 60d1745..0000000 --- a/SchematicSystem_Core/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - steamwar - SchematicSystem - 1.0 - - - - ${project.basedir}/.. - - - SchematicSystem_Core - 1.0 - jar - - - src - - - src - - **/*.java - **/*.kt - - - - - - - - steamwar - Spigot - 1.15 - system - ${main.basedir}/lib/Spigot-1.15.jar - - - steamwar - WorldEdit - 1.15 - system - ${main.basedir}/lib/WorldEdit-1.15.jar - - - \ No newline at end of file diff --git a/SchematicSystem_Core/settings.gradle b/SchematicSystem_Core/settings.gradle new file mode 100644 index 0000000..0463912 --- /dev/null +++ b/SchematicSystem_Core/settings.gradle @@ -0,0 +1,20 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +rootProject.name = 'SchematicSystem_Core' \ No newline at end of file diff --git a/SchematicSystem_Main/pom.xml b/SchematicSystem_Main/pom.xml deleted file mode 100644 index 154470e..0000000 --- a/SchematicSystem_Main/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - - steamwar - SchematicSystem - 1.0 - - - - ${project.basedir}/.. - - - SchematicSystem_Main - 1.0 - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.1 - - - package - - shade - - - - - - schematicsystem - - - - - steamwar - SchematicSystem_15 - 1.0 - compile - - - steamwar - SchematicSystem_8 - 1.0 - compile - - - steamwar - SchematicSystem_Core - 1.0 - compile - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..34ae5ad --- /dev/null +++ b/build.gradle @@ -0,0 +1,247 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +import org.apache.tools.ant.taskdefs.condition.Os + +import java.util.function.BiConsumer + +plugins { + // Adding the base plugin fixes the following gradle warnings in IntelliJ: + // + // Warning: root project 'module-work-multi': Unable to resolve all content root directories + // Details: java.lang.IllegalStateException: No value has been specified for this provider. + // + // Warning: root project 'module-work-multi': Unable to resolve additional project configuration. + // Details: java.lang.IllegalStateException: No value has been specified for this provider. + id 'base' + id 'application' + + id 'com.github.johnrengelman.shadow' version '5.0.0' +} + +group 'de.steamwar' +version '' + +Properties steamwarProperties = new Properties() +if (file("steamwar.properties").exists()) { + steamwarProperties.load(file("steamwar.properties").newDataInputStream()) +} + +ext { + buildName = 'SchematicSystem' + artifactName = 'schematicsystem' + + uberJarName = "${buildName}-all.jar" + jarName = "${artifactName}.jar" + libs = "${buildDir}/libs" + + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + operatingSystem = "windows" + } else { + operatingSystem = "unix" + } +} + +compileJava.options.encoding = 'UTF-8' +compileJava.options.compilerArgs << '-parameter' + +sourceCompatibility = 11 +targetCompatibility = 11 + +mainClassName = '' + +allprojects { + repositories { + mavenCentral() + jcenter() + + maven { + url = uri("https://repo.codemc.io/repository/maven-snapshots/") + } + + maven { + url = uri('https://hub.spigotmc.org/nexus/content/repositories/snapshots/') + } + + maven { + url = uri('https://libraries.minecraft.net') + } + } +} + +dependencies { + implementation project(":SchematicSystem_Core") + implementation project(":SchematicSystem_15") + implementation project(":SchematicSystem_8") +} + +task buildResources(type: Copy) { + from("BauSystem_Main/build/classes/java/main/META-INF/annotations/") + into("build/resources/main/de.steamwar.bausystem") +} +classes.finalizedBy(buildResources) + +task buildProject { + description 'Build this project' + group "Steamwar" + + dependsOn build +} + +task finalizeProject { + description 'Finalize this project' + group "Steamwar" + + doLast { + if ("${buildDir}" == null) { + return + } + delete fileTree("${libs}").matching { + exclude("${uberJarName}") + } + file(libs + "/" + uberJarName).renameTo(file(libs + "/" + jarName)) + } +} +build.finalizedBy(finalizeProject) + +if (steamwarProperties.containsKey("hostname")) { + String hostname = steamwarProperties.get("hostname") + String uploadPath = steamwarProperties.getOrDefault("uploadPath", "~") + + String server = steamwarProperties.getOrDefault("server", "Dev1.15") + String serverStartFlags = steamwarProperties.getOrDefault("serverStartFlags", "") + + task uploadProject { + description 'Upload this project' + group "Steamwar" + + doLast { + await(shell("scp ${libs}/${jarName} ${hostname}:${uploadPath}/${server}/plugins")) + if (steamwarProperties.getOrDefault("directStart", "false") == "false" && !answer("Start ${server} server?")) { + return + } + serverStart(server, serverStartFlags, hostname) + } + } + uploadProject.dependsOn(buildProject) + + task startDevServer { + description 'Start the DevServer' + group "Steamwar" + + doLast { + serverStart(server, serverStartFlags, hostname) + } + } +} + +private def await(Process proc) { + def out = new StringBuilder() + def err = new StringBuilder() + proc.waitForProcessOutput(out, err) + return [out, err, proc.exitValue()] +} + +private def shell(String command) { + if (operatingSystem == "unix") { + return ['bash', '-c', command].execute() + } else { + return ["cmd", "/c", command].execute() + } +} + +private def serverStart(String serverName, String serverFlags, String hostname) { + def proc = shell("ssh -t ${hostname} \"./mc ${serverFlags} ${serverName}\"") + + Set strings = new HashSet<>() + File file = new File("${projectDir}/ignoredlog"); + if (file.exists()) { + new BufferedReader(new InputStreamReader(new FileInputStream(file))).readLines().forEach({ s -> + strings.add(s) + }) + } + + Thread outputThread = new Thread({ + Reader reader = proc.getInputStream().newReader(); + Writer writer = System.out.newWriter(); + try { + while (proc.alive) { + String s = reader.readLine() + if (s == null) { + return + } + if (strings.stream().anyMatch({check -> s.contains(check)})) { + continue + } + writer.write(s + "\n") + writer.flush() + } + } catch (IOException e) { + // Ignored + } + }) + outputThread.setName("${serverName} - OutputThread") + outputThread.start() + + Writer writer + Thread inputThread = new Thread({ + Reader reader = System.in.newReader() + writer = proc.getOutputStream().newWriter() + try { + while (proc.alive) { + String s = reader.readLine() + writer.write(s + "\n") + writer.flush() + } + } catch (IOException e) { + // Ignored + } + }) + inputThread.setName("${serverName} - InputThread") + inputThread.start() + + gradle.buildFinished { buildResult -> + if (!proc.alive) { + return + } + writer = proc.getOutputStream().newWriter() + writer.write("stop\n") + writer.flush() + awaitClose(proc, outputThread, inputThread) + } + awaitClose(proc, outputThread, inputThread) +}; + +private static def awaitClose(Process proc, Thread outputThread, Thread inputThread) { + while (proc.alive) { + Thread.sleep(10) + } + proc.closeStreams() + outputThread.interrupt() + inputThread.interrupt() +} + +private def answer(String question) { + while (System.in.available() > 0) System.in.read() + println(question) + boolean valid = "Yy".contains(((char) System.in.read()).toString()) + while (System.in.available() > 0) System.in.read() + return valid +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..dc56501 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,22 @@ +# +# This file is a part of the SteamWar software. +# +# Copyright (C) 2020 SteamWar.de-Serverteam +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +org.gradle.daemon = true +org.gradle.parallel = true +org.gradle.workers.max = 4 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0f5795e --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Apr 10 23:34:12 CEST 2021 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..2fe81a7 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9618d8d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 411fb62..0000000 --- a/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - steamwar - SchematicSystem - 1.0 - https://maven.apache.org - pom - - - UTF-8 - ${project.basedir} - - - - clean package - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - 1.8 - 1.8 - -Xlint - - - - - - - SchematicSystem_8 - SchematicSystem_15 - SchematicSystem_Main - SchematicSystem_Core - - - - - steamwar - SpigotCore - 1.0 - system - ${main.basedir}/lib/SpigotCore.jar - - - org.projectlombok - lombok - 1.18.22 - provided - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..29bc7e4 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,24 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +rootProject.name = 'SchematicSystem' + +include 'SchematicSystem_8' +include 'SchematicSystem_15' +include 'SchematicSystem_Core' diff --git a/steamwarci.yml b/steamwarci.yml index 7b6472d..7e0300b 100644 --- a/steamwarci.yml +++ b/steamwarci.yml @@ -1,6 +1,8 @@ build: - "ln -s /home/gitea/lib" - - "mvn package -B" + - "cp ~/gradle.properties ." + - "chmod u+x build.gradle" + - "./gradlew buildProject" artifacts: - "/binarys/schematicsystem.jar": "SchematicSystem_Main/target/schematicsystem.jar" + "/binarys/schematicsystem.jar": "build/libs/schematicsystem.jar" From b45055da940ace7cd16444f3b1de46b58f73fddc Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 18 Apr 2022 21:40:46 +0200 Subject: [PATCH 02/16] =?UTF-8?q?=E2=80=9Esteamwarci.yml=E2=80=9C=20=C3=A4?= =?UTF-8?q?ndern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- steamwarci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/steamwarci.yml b/steamwarci.yml index 7e0300b..d958c67 100644 --- a/steamwarci.yml +++ b/steamwarci.yml @@ -1,7 +1,6 @@ build: - "ln -s /home/gitea/lib" - "cp ~/gradle.properties ." - - "chmod u+x build.gradle" - "./gradlew buildProject" artifacts: From eb336fd89e52f97dbeca00754e95205e96efd047 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sun, 24 Apr 2022 20:20:41 +0200 Subject: [PATCH 03/16] Hotfix: Schematic ist Komisch --- .../src/de/steamwar/schematicsystem/commands/GUI.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java index 8fb1f87..3bef589 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java @@ -73,15 +73,8 @@ public class GUI { if(node.getOwner() == user.getId()){ if(!node.isDir() && node.getSchemtype().writeable()){ - List checkedSchematics = CheckedSchematic.getLastDeclined(player.getUniqueId()); - ListIterator i = checkedSchematics.listIterator(checkedSchematics.size()); - while(i.hasPrevious()) { - CheckedSchematic checkedSchematic = i.previous(); - if(checkedSchematic.getNode() == node.getId()) { - inv.setItem(1, SWItem.getDye(10), (byte) 10, "§eStatus " + node.getSchemtype().name(), Collections.singletonList("§7" + checkedSchematic.getDeclineReason()), false, click -> {}); - break; - } - } + CheckedSchematic.getLastDeclinedOfNode(node).stream().findFirst().ifPresent(checkedSchematic -> + inv.setItem(1, SWItem.getDye(10), (byte) 10, "§eStatus " + node.getSchemtype().name(), Collections.singletonList("§7" + checkedSchematic.getDeclineReason()), false, click -> {})); } Material mat = SWItem.getMaterial(node.getItem()); From 170b1da9a7824ef55295092e126d455da0a749be Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 21 May 2022 12:54:41 +0200 Subject: [PATCH 04/16] :art: Initial MessageSystem --- SchematicSystem_Core/src/SchematicSystem.properties | 1 + SchematicSystem_Core/src/SchematicSystem_en.properties | 0 .../src/de/steamwar/schematicsystem/SchematicSystem.java | 4 +++- SchematicSystem_Core/src/plugin.yml | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 SchematicSystem_Core/src/SchematicSystem.properties create mode 100644 SchematicSystem_Core/src/SchematicSystem_en.properties diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties new file mode 100644 index 0000000..ab82e1e --- /dev/null +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -0,0 +1 @@ +PREFIX=§eSchematic§8» §7 \ No newline at end of file diff --git a/SchematicSystem_Core/src/SchematicSystem_en.properties b/SchematicSystem_Core/src/SchematicSystem_en.properties new file mode 100644 index 0000000..e69de29 diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java index de7ec61..8cec6d8 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java @@ -19,11 +19,13 @@ package de.steamwar.schematicsystem; +import de.steamwar.core.Core; +import de.steamwar.message.Message; import de.steamwar.schematicsystem.commands.SchematicCommand; import org.bukkit.plugin.java.JavaPlugin; public class SchematicSystem extends JavaPlugin { - public static final String PREFIX = "§eSchematic§8» §7"; + public static final Message MESSAGE = new Message("SchematicSystem", SchematicSystem.class.getClassLoader()); private static SchematicSystem instance; diff --git a/SchematicSystem_Core/src/plugin.yml b/SchematicSystem_Core/src/plugin.yml index b756bec..bf90555 100644 --- a/SchematicSystem_Core/src/plugin.yml +++ b/SchematicSystem_Core/src/plugin.yml @@ -1,5 +1,5 @@ name: SchematicSystem -version: "2.0" +version: "2.1.0" authors: [Yaruma3341, Lixfel, Chaoscaot] depend: [SpigotCore, WorldEdit] main: de.steamwar.schematicsystem.SchematicSystem From 834bcb5428f7a9493f594f35cbb89d515eae46f5 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 21 May 2022 13:26:38 +0200 Subject: [PATCH 05/16] :art: Add AutoCheckResult and SafeSchematicNode to Multilang --- .../src/SchematicSystem.properties | 22 +++++- .../schematicsystem/AutoCheckResult.java | 70 +++++++++++-------- .../schematicsystem/SafeSchematicNode.java | 14 ++-- 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index ab82e1e..c7d3ebb 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -1 +1,21 @@ -PREFIX=§eSchematic§8» §7 \ No newline at end of file +PREFIX=§eSchematic§8» §7 + +AUTO_CHECK_RESULT_NOT_LOAD=Die Schematic konnte nicht geladen werden +AUTO_CHECK_RESULT_TOO_WIDE=Die Schematic ist zu breit ({0} > {1}) +AUTO_CHECK_RESULT_TOO_LONG=Die Schematic ist zu lang ({0} > {1}) +AUTO_CHECK_RESULT_TOO_HIGH=Die Schematic ist zu hoch ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_BLOCK=Der Block {0} wurde {1} mal zu häufig verbaut +AUTO_CHECK_RESULT_TOO_MANY_BLOCKS=Die Blockkombination {0} wurde {1} mal zu häufig verbaut +AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS=Zu viele Blöcke ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_RECORDS=Keine Schallplatten erlaubt ({0} gefunden) +AUTO_CHECK_RESULT_FORBIDDEN_ITEM=In {0}s wurde das verbotene Item {1} {2} mal gefunden +AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT=In {0}s wurde das verbotene Item {1} {2} mal mit Custom-Tag gefunden +AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS=Ein Werfer enthält mehr als {0} Pfeile und Feuerbälle +AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS={0} Werfer enthält mehr als {1} Pfeile und Feuerbälle +AUTO_CHECK_RESULT_NBTS_WARNING={0} {1}s enthalten keine oder inkorrekte NBT-Daten +AUTO_CHECK_RESULT_NBT_WARNING=Ein(e) {0} enthält keine oder inkorrekte NBT-Daten + +SAFE_NODE_NOT_A_DIR=§cDie ausgewählte Schematic ist kein Ordner +SAFE_NODE_ALREADY_IN_DIRECTORY=§cDie Schematic gibt es bereits in diesem Ordner +SAFE_NODE_INVALID_NAME=§cDieser Name ist unzulässig +SAFE_NODE_NOT_OWNER=§cDu bist nicht der Besitzer dieser Schematic diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java index d3760a9..2f69c9e 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java @@ -47,53 +47,67 @@ public class AutoCheckResult { this.limitedMaterials = type.getLimits(); } - public Collection errors() { - List errors = new LinkedList<>(); + public Map errors() { + Map errors = new HashMap<>(); - if(errorLoadingSchematic) - errors.add("Die Schematic konnte nicht geladen werden"); + if(errorLoadingSchematic) { + errors.put("AUTO_CHECK_RESULT_NOT_LOAD", new Object[0]); + } assert type != null; + // SW Quality Code, Check the Comments! if(width > type.getDepth()) - errors.add("Die Schematic ist zu breit (" + width + " > " + type.getDepth() + ")"); + // Width + errors.put("AUTO_CHECK_RESULT_TOO_WIDE", new Object[]{width, type.getDepth()}); if(length > type.getWidth()) - errors.add("Die Schematic ist zu lang (" + length + " > " + type.getWidth() + ")"); + // Length + errors.put("AUTO_CHECK_RESULT_TOO_LONG", new Object[]{width, type.getWidth()}); if(height > type.getHeight()) - errors.add("Die Schematic ist zu hoch (" + height + " > " + type.getHeight() + ")"); + errors.put("AUTO_CHECK_RESULT_TOO_HIGH", new Object[]{height, type.getHeight()}); for(Map.Entry, Integer> entry : limitedMaterials.entrySet()) { - if(entry.getValue() < 0) - errors.add((entry.getKey().size() == 1 ? "Der Block " : "Die Blockkombination") + String.join(" ", entry.getKey()) + " wurde " + (-entry.getValue()) + " mal zu häufig verbaut"); + if(entry.getValue() < 0) { + errors.put((entry.getKey().size() == 1 ? "AUTO_CHECK_RESULT_TOO_MANY_BLOCK " : "AUTO_CHECK_RESULT_TOO_MANY_BLOCKS"), new Object[]{String.join(" ", entry.getKey()), -entry.getValue()}); + } } if(type.getMaxBlocks() != 0 && blocks > type.getMaxBlocks()) { - errors.add("Zu viele Blöcke (" + blocks + " > " + type.getMaxBlocks() + ")"); + errors.put("AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS", new Object[]{blocks, type.getMaxBlocks()}); } - if(records > 0) - errors.add("Keine Schallplatten erlaubt (" + records + " gefunden)"); - for(Map.Entry> block : forbiddenItems.entrySet()) - for(Map.Entry item : block.getValue().entrySet()) - errors.add("In " + block.getKey() + "s wurde das verbotene Item " + item.getKey() + " " + item.getValue() + " mal gefunden"); - for(Map.Entry> block : itemsWithTag.entrySet()) - for(Map.Entry item : block.getValue().entrySet()) - errors.add("In " + block.getKey() + "s wurde das Item " + item.getKey() + " " + item.getValue() + " mal mit Custom-Tag gefunden"); - if(tooManyDispenserItems == 1) - errors.add("Ein Werfer enthält mehr als " + type.getMaxDispenserItems() + " Pfeile und Feuerbälle"); - else if(tooManyDispenserItems > 1) - errors.add(tooManyDispenserItems + " Werfer enthalten mehr als " + type.getMaxDispenserItems() + " Pfeile und Feuerbälle"); + if(records > 0) { + errors.put("AUTO_CHECK_RESULT_TOO_MANY_RECORDS", new Object[]{records}); + } + + for(Map.Entry> block : forbiddenItems.entrySet()) { + for (Map.Entry item : block.getValue().entrySet()) { + errors.put("AUTO_CHECK_RESULT_FORBIDDEN_ITEM", new Object[]{block.getKey(), item.getKey(), item.getValue()}); + } + } + for(Map.Entry> block : itemsWithTag.entrySet()) { + for (Map.Entry item : block.getValue().entrySet()) { + errors.put("AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT", new Object[]{block.getKey(), item.getKey(), item.getValue()}); + } + } + if(tooManyDispenserItems == 1) { + errors.put("AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS", new Object[]{type.getMaxDispenserItems()}); + } + else if(tooManyDispenserItems > 1) { + errors.put("AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS", new Object[]{tooManyDispenserItems, type.getMaxDispenserItems()}); + } return errors; } - public Collection warnings(){ - List warnings = new LinkedList<>(); + public Map warnings(){ + Map warnings = new HashMap<>(); for(Map.Entry nbtBlock : defunctNbt.entrySet()){ - if(nbtBlock.getValue() > 1) - warnings.add(nbtBlock.getValue() + " " + nbtBlock.getKey() + "s enthalten keine oder inkorrekte NBT-Daten"); - else - warnings.add("Ein(e) " + nbtBlock.getKey() + " enthält keine oder inkorrekte NBT-Daten"); + if(nbtBlock.getValue() > 1) { + warnings.put("AUTO_CHECK_RESULT_NBTS_WARNING", new Object[]{nbtBlock.getValue(), nbtBlock.getKey()}); + } else { + warnings.put("AUTO_CHECK_RESULT_NBT_WARNING", new Object[]{nbtBlock.getKey()}); + } } return warnings; diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SafeSchematicNode.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SafeSchematicNode.java index db3b85b..a91ce52 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SafeSchematicNode.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SafeSchematicNode.java @@ -72,16 +72,14 @@ public class SafeSchematicNode { @AllArgsConstructor public enum Result { - DONE("No"), - NOT_A_DIR(SchematicSystem.PREFIX + "§cDie ausgewählte Schematic ist kein Ordner"), - ALREADY_IN_DIRECTORY(SchematicSystem.PREFIX + "§cDie Schematic gibt es bereits in diesem Ordner"), - INVALID_NAME(SchematicSystem.PREFIX + "§cDieser Name ist unzulässig"), - NOT_OWNER(SchematicSystem.PREFIX + "§cDu bist nicht der Besitzer dieser Schematic"); - - private final String errorMessage; + DONE, + NOT_A_DIR, + ALREADY_IN_DIRECTORY, + INVALID_NAME, + NOT_OWNER; public void sendError(Player player) { - player.sendMessage(errorMessage); + SchematicSystem.MESSAGE.send("SAFE_SCHEMATIC_NODE_" + this.name(), player); } public boolean isSuccessful() { From 917d674f21cbe0927bce3202bfe04fb31e215b87 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 30 May 2022 11:56:19 +0200 Subject: [PATCH 06/16] =?UTF-8?q?Add=20deadline=20to=20autopr=C3=BCfer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schematicsystem/CheckSchemType.java | 26 +++++++++++++++++++ .../commands/SchematicCommandUtils.java | 8 +++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java index 9af5cee..257c466 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java @@ -30,6 +30,10 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.*; import java.util.logging.Level; @@ -45,6 +49,8 @@ public class CheckSchemType { private final Map, Integer> limits; private final int maxBlocks; + private final Date deadline; + private CheckSchemType(ConfigurationSection section) { String name = section.getString("Schematic.Type"); width = section.getInt("Schematic.Size.x"); @@ -65,6 +71,18 @@ public class CheckSchemType { } } + String deadlineString = section.getString("deadline", null); + if (deadlineString != null) { + try { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + deadline = dateFormat.parse(deadlineString); + } catch (ParseException e) { + throw new SecurityException(e.getMessage(), e); + } + } else { + deadline = null; + } + types.put(SchematicType.fromDB(name.toLowerCase()), this); types.put(SchematicType.fromDB("c" + name.toLowerCase()), this); } @@ -126,6 +144,14 @@ public class CheckSchemType { return new HashMap<>(limits); } + public boolean isAfterDeadline() { + return deadline != null && deadline.before(Date.from(Instant.now())); + } + + public String getDeadline() { + return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.GERMAN).format(deadline); + } + public static final ICheckSchemType impl = VersionDependent.getVersionImpl(SchematicSystem.getInstance()); diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index ea92be3..b5fc0e9 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -392,7 +392,13 @@ public class SchematicCommandUtils { return; } - AutoCheckResult result = CheckSchemType.get(type).autoCheck(node); + CheckSchemType checkSchemType = CheckSchemType.get(type); + if (checkSchemType.isAfterDeadline()) { + player.sendMessage("§cVon diesem Typen können keine Schematics mehr eingesendet werden. Einsendeschluss war: " + checkSchemType.getDeadline()); + return; + } + + AutoCheckResult result = checkSchemType.autoCheck(node); Collection errors = result.errors(); for (String warning : result.warnings()) { player.sendMessage(" §e" + warning); From b3d281e189249491426b1f008683e4a42d1fa70b Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 30 May 2022 12:59:30 +0200 Subject: [PATCH 07/16] Rebuild --- SchematicSystem_Core/src/plugin.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/SchematicSystem_Core/src/plugin.yml b/SchematicSystem_Core/src/plugin.yml index b756bec..b125335 100644 --- a/SchematicSystem_Core/src/plugin.yml +++ b/SchematicSystem_Core/src/plugin.yml @@ -6,5 +6,3 @@ main: de.steamwar.schematicsystem.SchematicSystem website: steamwar.de api-version: "1.13" description: Schematic-Frontend - -commands: From 39f25462ff40513eb138234cd85c244f910eb645 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 30 May 2022 13:10:02 +0200 Subject: [PATCH 08/16] Fix SchematicCommand --- .../schematicsystem/commands/SchematicCommand.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java index c3acd21..06c7c4e 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java @@ -19,6 +19,7 @@ package de.steamwar.schematicsystem.commands; +import de.steamwar.command.AbstractTypeMapper; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; import de.steamwar.command.TypeMapper; @@ -49,7 +50,7 @@ import static de.steamwar.schematicsystem.commands.SchematicCommandUtils.*; public class SchematicCommand extends SWCommand { - private static final Map> searchMapper = new HashMap<>(); + private static final Map> searchMapper = new HashMap<>(); static { searchMapper.put("-type", SWCommandUtils.createMapper(SchematicType.values().stream().map(SchematicType::name).toArray(String[]::new))); @@ -657,8 +658,8 @@ public class SchematicCommand extends SWCommand { public TypeMapper publicDirNodeTypeMapper() { return new TypeMapper() { @Override - public List tabCompletes(CommandSender commandSender, String[] strings, String s) { - List list = publicCommandTypeMapper.tabCompletes(commandSender, strings, s); + public Collection tabCompletes(CommandSender commandSender, String[] strings, String s) { + Collection list = publicCommandTypeMapper.tabCompletes(commandSender, strings, s); list.removeIf(s1 -> !s1.endsWith("/")); return list; } @@ -731,7 +732,7 @@ public class SchematicCommand extends SWCommand { } @Override - public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + public Collection tabCompletes(CommandSender commandSender, String[] strings, String s) { if (strings.length == 0) { List list = new ArrayList<>(); list.add(s); @@ -740,7 +741,7 @@ public class SchematicCommand extends SWCommand { } String last = strings[strings.length - 1]; if (searchMapper.containsKey(last)) { - TypeMapper mapper = searchMapper.get(last); + AbstractTypeMapper mapper = searchMapper.get(last); if (mapper == null) { List list = new ArrayList<>(searchMapper.keySet()); list.add(s); From a704ffe7c1f3571f1373b593c0461e5943db2d96 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 31 May 2022 14:23:49 +0200 Subject: [PATCH 09/16] Translating SchematicSystem --- .../src/SchematicSystem.properties | 194 ++++++++++++++++++ .../schematicsystem/commands/GUI.java | 66 +++--- .../commands/SchematicCommand.java | 104 +++++----- .../commands/SchematicCommandHelp.java | 57 ++--- .../commands/SchematicCommandUtils.java | 165 ++++++++------- 5 files changed, 387 insertions(+), 199 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index c7d3ebb..667c125 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -1,4 +1,198 @@ PREFIX=§eSchematic§8» §7 +ON=§aAn +OFF=§cAus +CHANGE=§7Zum Ändern +CLICK=§7anklicken +CURRENT=§7Aktuell: {0} +CONFIRM=§aBestätigen +CANCEL=§cAbbrechen + +UTIL_NAME_REQUIRED=§cDeine Ordner brauchen schon einen Namen +UTIL_NAME_TOO_LONG=§cDer Name der Schematic ist zu lang +UTIL_NAME_INVALID_CHAR=§cDer angegebene Schematicname enthält verbotene Zeichen +UTIL_NAME_FORBIDDEN=§cDer Pfad darf nicht \"§l{0}§c\" enthalten +UTIL_LIST_HEAD=§eSchematics §8(§e{0}§8) +UTIL_LIST_PATH=§7Aktueller Pfad: §e{0} +UTIL_LIST_BACK=§e../ +UTIL_LIST_BACK_HOVER=§eZurück gehen {0} +UTIL_LIST_DIR=§7§lDIR +UTIL_LIST_TYPE=§8§l{0} +UTIL_LIST_BASE= §e +UTIL_LIST_FROM= §8von §7{0} +UTIL_LIST_OPEN_DIR=§eOrdner anzeigen +UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten +UTIL_LIST_REMOVE=[Entfernen] +UTIL_LIST_REMOVE_HOVER=§7Entferne dich von dem Ordner +UTIL_LIST_BACK_ARROW=«« +UTIL_LIST_BACK_ARROW_HOVER=§eVorherige Seite +UTIL_LIST_NEXT= Seite ({0}/{0}) »» +UTIL_LIST_NEXT_HOVER=§eNächste Seite +UTIL_INFO_SCHEM=§7Schematic: §e{0} +UTIL_INFO_NAME=§7Name: §e{0} +UTIL_INFO_OWNER=§7Besitzer: §e{0} +UTIL_INFO_PARENT=§7Ordner: §e{0} +UTIL_INFO_UPDATED=§7Letzes Update: §e{0} +UTIL_INFO_TYPE=§7Typ: §e{0} +UTIL_INFO_TYPE_DIR=§7DIR +UTIL_INFO_RANK=§7Rang: §e{0} +UTIL_INFO_COLOR=§7Farbersetzung: {0} +UTIL_INFO_REPLAY=§7Replaywiedergabe: {0} +UTIL_INFO_FORMAT=§7Format: §e{0} +UTIL_INFO_STATUS=§cStatus: §c{0}: {1} +UTIL_INFO_MEMBER=§7Mitglieder: §e{0} +UTIL_INFO_ACTION_LOAD=[Laden] +UTIL_INFO_ACTION_LOAD_HOVER=§eSchematic laden +UTIL_INFO_ACTION_DOWNLOAD=[Download] +UTIL_INFO_ACTION_DOWNLOAD_HOVER=§eSchematic downloaden +UTIL_INFO_ACTION_TYPE=[Typ ändern] +UTIL_INFO_ACTION_TYPE_HOVER=§eSchematic Typ ändern +UTIL_INFO_ACTION_ADD=[Hinzufügen] +UTIL_INFO_ACTION_ADD_HOVER=§eMember hinzufügen +UTIL_INFO_ACTION_REMOVE=[Entfernen] +UTIL_INFO_ACTION_REMOVE_HOVER=§eMember entfernen +UTIL_INFO_ACTION_MOVE=[Verschieben] +UTIL_INFO_ACTION_MOVE_HOVER=§eSchematic verschieben +UTIL_INFO_ACTION_RENAME=[Umbenennen] +UTIL_INFO_ACTION_RENAME_HOVER=§eSchematic umbenennen +UTIL_INFO_ACTION_DELETE=[Löschen] +UTIL_INFO_ACTION_DELETE_HOVER=§eSchematic löschen +UTIL_LOAD_NOT_HERE=§cDu kannst hier keine Schematics laden +UTIL_LOAD_NOT_HERE_ALL=§cAuf diesem Bau können keine Schematics geladen werden +UTIL_LOAD_DIR=§cDu kannst keine Ordner Laden +UTIL_LOAD_DONE=§7Schematic §e{0}geladen +UTIL_LOAD_NO_DATA=§cEs konnte keine Daten in der Schematic gefunden werden +UTIL_LOAD_ERROR=§cDie Schematic konnte nicht geladen werden +UTIL_DOWNLOAD_PUNISHED=§cDu darf keine Schematics Downloaden: §f§l{0} +UTIL_DOWNLOAD_NOT_OWN=§cDu darfst nur deine eigenen Schematics herunterladen +UTIL_DOWNLOAD_LINK=Dein Download Link: +UTIL_TYPE_PUNISHED=§cDu darf keine Schematics einsenden: §f§l{0} +UTIL_TYPE_NOT_OWN=§cDu kannst nur deine eigenen Schematics einsenden +UTIL_TYPE_DIR=§cDu kannst keine Ordner einsenden +UTIL_TYPE_NOT_ASSIGNABLE=§cZu diesem Typen können keine Schematics geändert werden +UTIL_TYPE_ALREADY=§cDie Schematic hat schon diesen Typen +UTIL_TYPE_DONE=§aSchematictyp geändert +UTIL_TYPE_FIGHT_ALREADY=§cDu hast diese Schematic bereits eingesendet +UTIL_TYPE_AFTER_DEADLINE=§cVon diesem Typen können keine Schematics mehr eingesendet werden. Einsendeschluss war: {0} +UTIL_TYPE_ERROR=§cDie Schematic ist nicht regelkonform +UTIL_TYPE_EXTEND=§aDer Vorbereitungsserver wird gestartet +UTIL_SUBMIT_TITLE=Schematic ausfahren +UTIL_SUBMIT_REPLAY_ON=§aReplay erlaubt +UTIL_SUBMIT_REPLAY_OFF=§cReplay gesperrt +UTIL_SUBMIT_COLOR_ON=§aPink zu Teamfarbe ersetzen +UTIL_SUBMIT_COLOR_OFF=§cPink nicht ersetzen +UTIL_SUBMIT_DIRECT=§eDirekt einsenden +UTIL_SUBMIT_DIRECT_DONE=§aDie Schematic wird zeitnah überprüft +UTIL_SUBMIT_EXTEND=§eSchematic ausfahren +UTIL_SUBMIT_EXTEND_DONE=§aDer Vorbereitungsserver wird gestartet + +COMMAND_NOT_FOLDER=Das ist eine Schematic und kein Ordner +COMMAND_ENTER_NAME=Namen eingeben +COMMAND_PUNISHMENT_NO_SAVE_EXTERNAL=§cDu kannst nicht auf anderen Baus Schematics machen +COMMAND_PUNISHMENT_NO_SAVE=§cAuf diesem Bau können keine Schematics gemacht werden +COMMAND_SAVE_NO_NAME=§cDu must auch einen Namen für die Schematic nach dem Ordner angeben +COMMAND_SAVE_FOLDER=§cDie Schematic ist ein Ordner +COMMAND_SAVE_NO_OVERWRITE=§cDu darfst diese Schematic nicht überschreiben +COMMAND_SAVE_CLIPBOARD_EMPTY=§cDein Clipboard ist leer +COMMAND_SAVE_ERROR=§cFehler beim Speichern der Schematic +COMMAND_SAVE_DONE=Schematic §e{0} §7gespeichert +COMMAND_SAVE_OVERWRITE=Schematic §e{0} §7überschrieben +COMMAND_ADD_PUNISH=§cDu darfst niemanden auf deine Schematics hinzufügen: §f§l{0} +COMMAND_ADD_NOT_OWNER=§cDu kannst nur auf deine eigenen Sachen jemanden hinzufügen +COMMAND_ADD_USER_PUNISHED=§c{0} darf nicht auf Schematics hinzugefügt werden +COMMAND_ADD_OWN=§cAlso bitte: Das ist deine eigene Schematic! +COMMAND_ADD_PUBLIC=§cFür Public-Anträge bitte bei der Moderation melden +COMMAND_ADD_ALREADY=§c{0} ist bereits auf diese Schematic geaddet +COMMAND_ADD_ADDED=Du hast nun Zugriff auf die Schematic §e{0} §7von §e{1} +COMMAND_ADD_NONE=§cEs wurde kein Spieler hinzugefügt +COMMAND_ADD_ONE=§7Der Spieler $e{0} wurde auf die Schematic hinzugefügt +COMMAND_ADD_MANY=§7Die Spieler $e{0} wurden auf die Schematic hinzugefügt +COMMAND_DELMEM_NOT_OWN=§cDu kannst nur auf deine eigenen Sachen jemanden entfernen +COMMAND_DELMEM_DONE=Der Spieler §e{0} §7hat nun keinen Zugriff mehr auf die Schematic §e{1} +COMMAND_DELMEM_DELETED=§cDu hast nun keinen Zugriff mehr auf die Schematic §e{0} §7von §e{1} +COMMAND_SEARCH_NOT_A_PLAYER=§cDer Spieler §e{0} §cexistiert nicht +COMMAND_LOCKREPLAY=Replays von Kämpfen mit {0} können ab sofort nicht mehr betrachtet werden +COMMAND_REPLACE_COLOR_OFF=In Kämpfen {0} werden pinke Blöcke nicht ersetzt +COMMAND_REPLACE_COLOR_ON=In Kämpfen {0} werden pinke Blöcke ersetzt +COMMAND_DIR_DONE=§7Ordner §e{0} §7erstellt +COMMAND_CHANGE_TYPE_NOT_OWNER=§cDu kannst nur deine eigenen Schematics einsenden +COMMAND_CHANGE_TYPE_SELECT=§eTyp auswählen +COMMAND_MOVE_NOT_OWN=§cDu kannst nur deine eigenen Schems verschieben +COMMAND_MOVE_RECURSIVE=§cDas gibt nur Fehler, vertrau mir +COMMAND_MOVE_DONE=§7Die Schematic ist nun unter §e{0} §7zu finden +COMMAND_RENAME_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_RENAME_DONE=§7Die Schematic heist nun §e{0} +COMMAND_ADD_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_ADD_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team +COMMAND_DEL_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_DEL_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team +COMMAND_DEL_TEAM_NONE=§7Es wurde kein Spieler entfernt +COMMAND_DEL_TEAM_DONE=§7Der Spieler §e{0} §7wurden von der Schematic entfernt +COMMAND_CLEAR_MEMBER_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_CLEAR_MEMBER_DONE=§7Alle Spieler wurden von der Schematic entfernt +COMMAND_DEL_ALL_MEMBER=§e{0}} §7wurde von §e{1} §7Schematics entfernt +COMMAND_PUBLIC_ON=§aDu bist nun der Public User +COMMAND_PUBLIC_OFF=§cDu bist nun nicht mehr der Public User +COMMAND_DELETE_NOT_OWN=§cDie Schematic gehört dir nicht +COMMAND_DELETE_MEMBER=§aDu hast dich von der Schematic entfernt +COMMAND_DELETE_DIR=§aDer Ordner §e{0}§a wird gelöscht... +COMMAND_DELETE_DIR_FULL=§cDer Ordner muss leer sein, um ihn zu löchen +COMMAND_DELETE_SCHEM=§aDer Schematic §e{0}§a wird gelöscht... + +HELP_HEADER=§e§lSchematicSystem §8§lHilfe +HELP_VIEW=Finden & Laden +HELP_VIEW_HOVER=Suche oder lade Schematics +HELP_VIEW_1=§8/§7schem §einfo §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic +HELP_VIEW_2=§8/§7schem §elist §8- §7Zeigt dir deine Schematics an +HELP_VIEW_3=§8/§7schem §elist public §8- §7Zeigt alle Public-Schematics +HELP_VIEW_4=§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passenden Schematics +HELP_VIEW_5=§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic +HELP_VIEW_6=§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig) +HELP_EDIT=Speichern & Bearbeiten +HELP_EDIT_HOVER=Modifizierung von Schematics und Ordnern +HELP_EDIT_1=§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic +HELP_EDIT_2=§8/§7schem §eordner §8[§7Ordner§8] - §7Erstelle einen leeren Ordner +HELP_EDIT_3=§8/§7schem §emove §8[§7Schematic§8] [§7Neuer Pfad§8] - §7Verschiebe eine Schematic +HELP_EDIT_4=§8/§7schem §erename §8[§7Schematic§8] [§7Neuer Name§8] - §7Gib der Schematic einen neuen Namen +HELP_EDIT_5=§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic +HELP_EDIT_6=§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic +HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena +HELP_EDIT_8=§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic +HELP_SHARE=Besitzrechte +HELP_SHARE_HOVER=Schematics mit anderen teilen +HELP_SHARE_1=§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu +HELP_SHARE_2=§8/§7schem §edelmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic +HELP_SHARE_3=§8/§7schem §eclearmember §8[§7Schematic§8] - §7Entfernt alle Spieler von der Schematic +HELP_SHARE_4=§8/§7schem §edelallmember §8[§7Spieler§8] - §7Entfernt einen Spieler von allen deinen Schematics +HELP_SHARE_5=§8/§7schem §eaddteam §8[§7Schematic§8] - §7Füge jeden aus deinem Team auf die Schematic hinzu +HELP_SHARE_6=§8/§7schem §edelteam §8[§7Schematic§8] - §7Entferne jeden aus deinem Team von der Schematic + +GUI_TITLE=Schematics \{1\} +GUI_FOLDER_PROPERTIES=§7Ordnereigenschaften +GUI_INFO_LOAD=§eLaden +GUI_INFO_BACK=§eZurück +GUI_INFO_STATUS=§eStatus {0} +GUI_INFO_STATUS_LORE=§7{0} +GUI_INFO_MAT=§e{0} +GUI_INFO_TYPE=§e{0} +GUI_INFO_DOWNLOAD=§eDownload +GUI_INFO_COLOR=Farbersetzung +GUI_INFO_REPLAY=Replay Wiedergabe +GUI_INFO_REPLAY_OFF=§7Zum §lAusschalten +GUI_INFO_REPLAY_TITLE=Wiedergabe dauerhaft sperren +GUI_INFO_MEMBER=§eMitglieder +GUI_INFO_MOVE=§eVerschieben +GUI_INFO_RENAME=§eUmbenennen +GUI_INFO_RENAME_TITLE={0} umbenennen +GUI_INFO_DELETE=§cLöschen +GUI_INFO_MEMBER_FROM=§7von §e{0} +GUI_INFO_MEMBER_REMOVE=§cZugriff entfernen +GUI_CHANGE_TYPE=Typ ändern +GUI_DELETE_OWN_DELETED=Schematic §e{0} §7gelöscht +GUI_DELETE_OWN_TITLE={0} löschen +GUI_DELETE_MEMBER_TITLE={0} entfernen# +GUI_DELETE_MEMBER_DONE=Zugriff zu Schematic §e{0} §7entfernt +GUI_DELETE_MEMBERS_TITLE=Mitglieder entfernen +GUI_CHANGE_ITEM=Item ändern AUTO_CHECK_RESULT_NOT_LOAD=Die Schematic konnte nicht geladen werden AUTO_CHECK_RESULT_TOO_WIDE=Die Schematic ist zu breit ({0} > {1}) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java index 3bef589..a2de41e 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java @@ -19,10 +19,12 @@ package de.steamwar.schematicsystem.commands; +import de.steamwar.core.Core; import de.steamwar.inventory.*; import de.steamwar.schematicsystem.SafeSchematicNode; import de.steamwar.schematicsystem.SchematicSystem; import de.steamwar.sql.*; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -38,7 +40,7 @@ public class GUI { SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectSchematic(), new SchematicSelectorInjectable() { @Override public String createTitle(Player player) { - return "Schematics {1}"; + return SchematicSystem.MESSAGE.parse("GUI_TITLE", player); } @Override @@ -46,7 +48,7 @@ public class GUI { if(parent == null) { inv.setItem(49, Material.AIR, "", clickType -> {}); } else { - inv.setItem(49, Material.ANVIL, "§7Ordnereigenschaften", clickType -> { + inv.setItem(49, Material.ANVIL, SchematicSystem.MESSAGE.parse("GUI_FOLDER_PROPERTIES", player), clickType -> { info(selector.getPlayer(), parent, selector); }); } @@ -61,47 +63,47 @@ public class GUI { SteamwarUser user = getUser(player); SWInventory inv = new SWInventory(player, 9 * 2, node.generateBreadcrumbs(user)); if(!node.isDir()) { - inv.setItem(0, SWItem.getMaterial("WOOD_AXE"), "§eLaden", click -> { + inv.setItem(0, SWItem.getMaterial("WOOD_AXE"), SchematicSystem.MESSAGE.parse("GUI_INFO_LOAD", player), click -> { player.closeInventory(); SchematicCommandUtils.loadSchem(player, node); }); } - inv.setItem(9, SWItem.getMaterial("LEASH"), "§eZurück", clickType -> { + inv.setItem(9, SWItem.getMaterial("LEASH"), SchematicSystem.MESSAGE.parse("GUI_INFO_BACK", player), clickType -> { back.reOpen(); }); if(node.getOwner() == user.getId()){ if(!node.isDir() && node.getSchemtype().writeable()){ CheckedSchematic.getLastDeclinedOfNode(node).stream().findFirst().ifPresent(checkedSchematic -> - inv.setItem(1, SWItem.getDye(10), (byte) 10, "§eStatus " + node.getSchemtype().name(), Collections.singletonList("§7" + checkedSchematic.getDeclineReason()), false, click -> {})); + inv.setItem(1, SWItem.getDye(10), (byte) 10, SchematicSystem.MESSAGE.parse("GUI_INFO_STATUS", player, node.getSchemtype().name()), Collections.singletonList(SchematicSystem.MESSAGE.parse("GUI_INFO_STATUS_LORE", player, checkedSchematic.getDeclineReason().replaceAll("&", "§"))), false, click -> {})); } Material mat = SWItem.getMaterial(node.getItem()); - inv.setItem(node.isDir()?7:5, mat, "§e" + mat.name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), false, click -> { + inv.setItem(node.isDir()?7:5, mat, SchematicSystem.MESSAGE.parse("GUI_INFO_MAT", player, mat.name()), Arrays.asList(SchematicSystem.MESSAGE.parse("CHANGE", player), SchematicSystem.MESSAGE.parse("CLICK", player)), false, click -> { changeItem(player, node, back); }); if(!node.isDir()) { - inv.setItem(6, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + node.getSchemtype().name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), node.getSchemtype().fightType(), click -> { + inv.setItem(6, SWItem.getMaterial("CAULDRON_ITEM"), SchematicSystem.MESSAGE.parse("GUI_INFO_TYPE", player, mat.name()), Arrays.asList(SchematicSystem.MESSAGE.parse("CHANGE", player), SchematicSystem.MESSAGE.parse("CLICK", player)), node.getSchemtype().fightType(), click -> { changeType(player, node); }); - inv.setItem(7, SWItem.getMaterial("MAGENTA_GLAZED_TERRACOTTA"), "§eDownload", click -> { + inv.setItem(7, SWItem.getMaterial("MAGENTA_GLAZED_TERRACOTTA"), SchematicSystem.MESSAGE.parse("GUI_INFO_DOWNLOAD", player), click -> { player.closeInventory(); SchematicCommandUtils.download(player, node); }); if(node.getSchemtype().fightType()) { - inv.setItem(14, SWItem.getMaterial(node.replaceColor() ? "PINK_WOOL" : "LIGHT_GRAY_WOOL"), "Farbersetzung", Arrays.asList("§7Aktuell: " + (node.replaceColor()?"§aAn":"§cAus"), "§7Zum Ändern", "§7anklicken"), false, clickType -> { + inv.setItem(14, SWItem.getMaterial(node.replaceColor() ? "PINK_WOOL" : "LIGHT_GRAY_WOOL"), SchematicSystem.MESSAGE.parse("GUI_INFO_COLOR", player), Arrays.asList(SchematicSystem.MESSAGE.parse("CURRENT", player, SchematicSystem.MESSAGE.parse(node.replaceColor()?"ON":"OFF", player)), SchematicSystem.MESSAGE.parse("CHANGE", player), SchematicSystem.MESSAGE.parse("CLICK", player)), false, clickType -> { node.setReplaceColor(!node.replaceColor()); info(player, node, back); }); - inv.setItem(13, SWItem.getMaterial(node.allowReplay() ? "EYE_OF_ENDER" : "ENDER_PEARL"), "Replay Wiedergabe", Arrays.asList("§7Aktuell: " + (node.allowReplay()?"§aAn":"§4Aus"), "§7Zum §lAusschalten", "§7anklicken"), false, clickType -> { + inv.setItem(13, SWItem.getMaterial(node.allowReplay() ? "EYE_OF_ENDER" : "ENDER_PEARL"), SchematicSystem.MESSAGE.parse("GUI_INFO_REPLAY", player), Arrays.asList(SchematicSystem.MESSAGE.parse("CURRENT", player, SchematicSystem.MESSAGE.parse(node.allowReplay()?"ON":"OFF", player)), SchematicSystem.MESSAGE.parse("GUI_INFO_REPLAY_OFF", player), SchematicSystem.MESSAGE.parse("CLICK", player)), false, clickType -> { if(node.allowReplay()) { - SWInventory confInv = new SWInventory(player, 9, "Wiedergabe dauerhaft sperren"); - confInv.setItem(0, SWItem.getDye(10), (byte) 10, "§aBestätigen", type -> { + SWInventory confInv = new SWInventory(player, 9, SchematicSystem.MESSAGE.parse("GUI_INFO_REPLAY_TITLE", player)); + confInv.setItem(0, SWItem.getDye(10), (byte) 10, SchematicSystem.MESSAGE.parse("CONFIRM", player), type -> { node.setAllowReplay(false); info(player, node, back); }); - confInv.setItem(8, SWItem.getDye(1), (byte) 1, "§cAbbrechen", type -> { + confInv.setItem(8, SWItem.getDye(1), (byte) 1, SchematicSystem.MESSAGE.parse("CANCEL", player), type -> { info(player, node, back); }); confInv.open(); @@ -114,9 +116,9 @@ public class GUI { player.closeInventory(); delmembers(player, node); }); - skull.setName("§eMitglieder"); + skull.setName(SchematicSystem.MESSAGE.parse("GUI_INFO_MEMBER", player)); inv.setItem(8, skull); - inv.setItem(15, Material.ARROW, "§eVerschieben", clickType -> { + inv.setItem(15, Material.ARROW, SchematicSystem.MESSAGE.parse("GUI_INFO_MOVE", player), clickType -> { SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectDirectory(), npar -> { SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, npar); if(result.isSuccessful()) { @@ -127,8 +129,8 @@ public class GUI { }); selector.open(); }); - inv.setItem(16, Material.NAME_TAG, "§eUmbenennen", clickType -> { - SWAnvilInv anvilInv = new SWAnvilInv(player, node.getName() + " umbenennen", node.getName()); + inv.setItem(16, Material.NAME_TAG, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME", player), clickType -> { + SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME_TITLE", player, node.getName()), node.getName()); anvilInv.setItem(mat); anvilInv.setCallback(s -> { SafeSchematicNode.Result result = SafeSchematicNode.setName(user, node, s); @@ -140,21 +142,21 @@ public class GUI { }); anvilInv.open(); }); - inv.setItem(17, SWItem.getDye(1), (byte) 1, "§cLöschen", click -> { + inv.setItem(17, SWItem.getDye(1), (byte) 1, SchematicSystem.MESSAGE.parse("GUI_INFO_DELETE", player), click -> { delete(player, node, back); }); }else{ if(!node.isDir()) { - inv.setItem(4, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + node.getSchemtype().name(), Collections.emptyList(), node.getSchemtype().fightType(), click -> {}); + inv.setItem(4, SWItem.getMaterial("CAULDRON_ITEM"), SchematicSystem.MESSAGE.parse("GUI_INFO_TYPE", player, node.getSchemtype().name()), Collections.emptyList(), node.getSchemtype().fightType(), click -> {}); } SteamwarUser owneruser = SteamwarUser.get(node.getOwner()); SWItem skull = SWItem.getPlayerSkull(owneruser.getUserName()); - skull.setName("§7von §e" + owneruser.getUserName()); + skull.setName(SchematicSystem.MESSAGE.parse("GUI_INFO_MEMBER_FROM", player, owneruser.getUserName())); inv.setItem(8, skull.getItemStack(), clickType -> {}); if(NodeMember.getNodeMember(node.getId(), user.getId()) != null) { - inv.setItem(17, SWItem.getDye(1), (byte) 1, "§cZugriff entfernen", click -> { + inv.setItem(17, SWItem.getDye(1), (byte) 1, SchematicSystem.MESSAGE.parse("GUI_INFO_MEMBER_REMOVE", player), click -> { delete(player, node, back); }); } @@ -177,7 +179,7 @@ public class GUI { types.add(new SWListInv.SWListEntry<>(item, type)); } - SWListInv inv = new SWListInv<>(p, "Typ ändern", types, (clickType, schematicType) -> { + SWListInv inv = new SWListInv<>(p, SchematicSystem.MESSAGE.parse("GUI_CHANGE_TYPE", p), types, (clickType, schematicType) -> { p.closeInventory(); SchematicCommandUtils.changeType(p, schem, schematicType, null); }); @@ -187,11 +189,11 @@ public class GUI { private static void deleteOwn(Player p, SchematicNode schem, SchematicSelector back){ SteamwarUser user = getUser(p); - SWInventory inv = new SWInventory(p, 9, schem.generateBreadcrumbs(user) + " löschen"); - inv.setItem(0, SWItem.getDye(1), (byte) 1, "§eLöschen", click -> { + SWInventory inv = new SWInventory(p, 9, SchematicSystem.MESSAGE.parse("GUI_DELETE_OWN_TITLE", p, schem.generateBreadcrumbs(user))); + inv.setItem(0, SWItem.getDye(1), (byte) 1, SchematicSystem.MESSAGE.parse("CONFIRM", p), click -> { schem.delete(); - p.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + schem.generateBreadcrumbs(user) + " §7gelöscht"); + SchematicSystem.MESSAGE.send("GUI_DELETE_OWN_DELETED", p, schem.generateBreadcrumbs(user)); if(back != null) { if(schem.isDir()) { back.reOpenDirUp(); @@ -200,19 +202,19 @@ public class GUI { } } }); - inv.setItem(8, SWItem.getDye(14), (byte) 14, "§cAbbruch", click -> p.closeInventory()); + inv.setItem(8, SWItem.getDye(14), (byte) 14, SchematicSystem.MESSAGE.parse("CANCEL", p), click -> p.closeInventory()); inv.setCallback(-999, click -> p.closeInventory()); inv.open(); } private static void deleteMembership(Player p, SchematicNode schem, SchematicSelector back){ SteamwarUser user = getUser(p); - SWInventory inv = new SWInventory(p, 9, schem.generateBreadcrumbs(user) + " entfernen"); - inv.setItem(0, SWItem.getDye(1), (byte) 1, "§eZugriff entfernen", click -> { + SWInventory inv = new SWInventory(p, 9, SchematicSystem.MESSAGE.parse("GUI_DELETE_MEMBER_TITLE", p, schem.generateBreadcrumbs(user))); + inv.setItem(0, SWItem.getDye(1), (byte) 1, SchematicSystem.MESSAGE.parse("CONFIRM", p), click -> { NodeMember member = NodeMember.getNodeMember(schem.getId(), user.getId()); if(member != null) member.delete(); - p.sendMessage(SchematicSystem.PREFIX + "Zugriff zu Schematic §e" + schem.generateBreadcrumbs(user) + " §7entfernt"); + SchematicSystem.MESSAGE.send("GUI_DELETE_MEMBER_DONE", p, schem.generateBreadcrumbs(user)); if(back != null) { if(schem.isDir()) { back.reOpenDirUp(); @@ -221,7 +223,7 @@ public class GUI { } } }); - inv.setItem(8, SWItem.getDye(14), (byte) 14, "§cAbbruch", click -> p.closeInventory()); + inv.setItem(8, SWItem.getDye(14), (byte) 14, SchematicSystem.MESSAGE.parse("CANCEL", p), click -> p.closeInventory()); inv.setCallback(-999, click -> p.closeInventory()); inv.open(); } @@ -240,7 +242,7 @@ public class GUI { members.add(new SWListInv.SWListEntry<>(SWItem.getPlayerSkull(user.getUserName()), member)); } - SWListInv inv = new SWListInv<>(p, "Mitglieder entfernen", members, (clickType, member) -> { + SWListInv inv = new SWListInv<>(p, SchematicSystem.MESSAGE.parse("GUI_DELETE_MEMBERS_TITLE", p), members, (clickType, member) -> { member.delete(); p.closeInventory(); delmembers(p, schem); @@ -250,7 +252,7 @@ public class GUI { } private static void changeItem(Player p, SchematicNode schem, SchematicSelector back){ - UtilGui.openMaterialSelector(p, "Item ändern", material -> { + UtilGui.openMaterialSelector(p, SchematicSystem.MESSAGE.parse("GUI_CHANGE_ITEM", p), material -> { schem.setItem(material.name()); p.closeInventory(); info(p, schem, back); diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java index 06c7c4e..608ad43 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java @@ -109,7 +109,7 @@ public class SchematicCommand extends SWCommand { public void schemList(Player player, @Mapper("dirMapper") SchematicNode node, @OptionalValue("0") int page) { SteamwarUser user = getUser(player); if (!node.isDir()) { - player.sendMessage(SchematicSystem.PREFIX + "Das ist eine Schematic und kein Ordner"); + SchematicSystem.MESSAGE.send("COMMAND_NOT_FOLDER", player); } else { renderSchemlist(player, SchematicNode.getSchematicNodeInNode(node), page, node, SchematicListBehavior.builder().setPublics(node.getOwner() == 0).setPageCommandGen(value -> "/schem list " + (node.getOwner()==0?"public ":"") + node.generateBreadcrumbs(user) + " " + value).build()); } @@ -138,7 +138,7 @@ public class SchematicCommand extends SWCommand { SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectSchematicNode(), schematicNode -> { SteamwarUser user = SteamwarUser.get(player.getUniqueId()); if(schematicNode == null || schematicNode.isDir()) { - SWAnvilInv anvilInv = new SWAnvilInv(player, "Namen eingeben"); + SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("COMMAND_ENTER_NAME", player)); anvilInv.setCallback(s -> saveSchem(player, schematicNode==null?s:(schematicNode.generateBreadcrumbs(user) + s))); anvilInv.setItem(Material.CAULDRON); anvilInv.open(); @@ -156,13 +156,13 @@ public class SchematicCommand extends SWCommand { SteamwarUser user = getUser(player); if(BauServerInfo.isBauServer() && BauServerInfo.getOwnerId() != user.getId() && (Punishment.isPunished(user, Punishment.PunishmentType.NoSchemReceiving, punishment -> - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nicht auf anderen Baus Schematics machen")) || + SchematicSystem.MESSAGE.send("COMMAND_PUNISHMENT_NO_SAVE_EXTERNAL", player)) || Punishment.isPunished(SteamwarUser.get(BauServerInfo.getOwnerId()), Punishment.PunishmentType.NoSchemSharing, punishment -> - player.sendMessage(SchematicSystem.PREFIX + "§cAuf diesem Bau können keine Schematics gemacht werden")))) { + SchematicSystem.MESSAGE.send("COMMAND_PUNISHMENT_NO_SAVE", player)))) { return; } if (name.endsWith("/")) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu must auch einen Namen für die Schematic nach dem Ordner angeben"); + SchematicSystem.MESSAGE.send("COMMAND_SAVE_NO_NAME", player); return; } if (name.startsWith("/")) name = name.substring(1); @@ -173,10 +173,10 @@ public class SchematicCommand extends SWCommand { SchematicNode node = SchematicNode.getNodeFromPath(user, String.join("/", layers)); if (node != null) { if(node.isDir()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic ist ein Ordner"); + SchematicSystem.MESSAGE.send("COMMAND_SAVE_FOLDER", player); return; } else if (!node.getSchemtype().writeable() || node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu darfst diese Schematic nicht überschreiben"); + SchematicSystem.MESSAGE.send("COMMAND_SAVE_NO_OVERWRITE", player); return; } } @@ -190,55 +190,51 @@ public class SchematicCommand extends SWCommand { try { node.saveFromPlayer(player); } catch (NoClipboardException e) { - player.sendMessage(SchematicSystem.PREFIX + "§cDein Clipboard ist leer"); + SchematicSystem.MESSAGE.send("COMMAND_SAVE_CLIPBOARD_EMPTY", player); if (newSchem) node.delete(); return; } catch (Exception ex) { Bukkit.getLogger().log(Level.SEVERE, "Could not save schematic", ex); - player.sendMessage(SchematicSystem.PREFIX + "§cFehler beim Speichern der Schematic."); + SchematicSystem.MESSAGE.send("COMMAND_SAVE_ERROR", player); if (newSchem) node.delete(); return; } - if (newSchem) { - player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + node.getName() + " §7gespeichert"); - } else { - player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + node.getName() + " §7überschrieben"); - } + SchematicSystem.MESSAGE.send(newSchem?"COMMAND_SAVE_DONE":"COMMAND_SAVE_OVERWRITE", player, node.generateBreadcrumbs(user)); } @Register("addmember") public void addMember(Player player, SchematicNode node, SteamwarUser... targets) { SteamwarUser user = getUser(player); - if(Punishment.isPunished(user, Punishment.PunishmentType.NoSchemSharing, punishment -> player.sendMessage(SchematicSystem.PREFIX + "§cDu darfst niemanden auf deine Schematics hinzufügen: §f§l" + punishment.getReason()))) { + if(Punishment.isPunished(user, Punishment.PunishmentType.NoSchemSharing, punishment -> SchematicSystem.MESSAGE.send("COMMAND_ADD_PUNISH", player, punishment.getReason()))) { return; } if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur auf deine eigenen Sachen jemanden hinzufügen."); + SchematicSystem.MESSAGE.send("COMMAND_ADD_NOT_OWNER", player); return; } List added = new ArrayList<>(); for (SteamwarUser target: targets) { if(Punishment.isPunished(target, Punishment.PunishmentType.NoSchemReceiving, - punishment -> player.sendMessage(SchematicSystem.PREFIX + "§c" + target.getUserName() + " darf nicht auf Schematics hinzugefügt werden."))) { + punishment -> SchematicSystem.MESSAGE.send("COMMAND_ADD_USER_PUNISHED", player, target.getUserName()))) { continue; } if (user.getId() == target.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cAlso bitte: Das ist deine eigene Schematic!"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_OWN", player); continue; } if (target.getId() == 0) { - player.sendMessage(SchematicSystem.PREFIX + "§cFür Public-Anträge bitte bei der Moderation melden"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_PUBLIC", player); continue; } if (NodeMember.getNodeMember(node.getId(), target.getId()) != null) { - player.sendMessage(SchematicSystem.PREFIX + "§c" + target.getUserName() + " ist bereits auf diese Schematic geaddet"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_ALREADY", player, target.getUserName()); continue; } @@ -247,15 +243,15 @@ public class SchematicCommand extends SWCommand { Player t = Bukkit.getPlayer(target.getUUID()); if (t != null) { - t.sendMessage(SchematicSystem.PREFIX + "Du hast nun Zugriff auf die Schematic §e" + node.getName() + " §7von §e" + player.getName()); + SchematicSystem.MESSAGE.send("COMMAND_ADD_ADDED", t, node.generateBreadcrumbs(target), player.getName()); } } Optional reduced = added.stream().map(SteamwarUser::getUserName).reduce((s, s2) -> s + ", " + s2); if (reduced.isPresent()) { - player.sendMessage(SchematicSystem.PREFIX + "§7" + (added.size()>1?"Die":"Der") + " Spieler §e" + reduced.get() + " §7" + (added.size()>1?"wurden":"wurde") + " auf die Schematic hinzugefügt"); + SchematicSystem.MESSAGE.send(added.size()>1?"COMMAND_ADD_MANY":"COMMAND_ADD_ONE", player, reduced.get()); } else { - player.sendMessage(SchematicSystem.PREFIX + "§cEs wurde kein Spieler hinzugefügt"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_NONE", player); } } @@ -264,7 +260,7 @@ public class SchematicCommand extends SWCommand { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur auf deine eigenen Sachen jemanden entfernen."); + SchematicSystem.MESSAGE.send("COMMAND_DELMEM_NOT_OWN", player); return; } @@ -282,11 +278,11 @@ public class SchematicCommand extends SWCommand { } member.delete(); - player.sendMessage(SchematicSystem.PREFIX + "Der Spieler §e" + target.getUserName() + " §7hat nun keinen Zugriff mehr auf die Schematic §e" + node.generateBreadcrumbs(user)); + SchematicSystem.MESSAGE.send("COMMAND_DELMEM_DONE", player, target.getUserName(), node.generateBreadcrumbs(user)); Player t = Bukkit.getPlayer(target.getUUID()); if (t != null) { - t.sendMessage(SchematicSystem.PREFIX + "Du hast nun keinen Zugriff mehr auf die Schematic §e" + node.getName() + " §7von §e" + player.getName()); + SchematicSystem.MESSAGE.send("COMMAND_DELMEM_DELETED", t, node.getName(), player.getName()); } } @@ -316,7 +312,7 @@ public class SchematicCommand extends SWCommand { case "-owner": SteamwarUser steamwarUser = SteamwarUser.get(query[finalI + 1]); if (steamwarUser == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDer Spieler §e" + query[finalI + 1] + " §cexistiert nicht"); + SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]); return; } predicates.add(node -> node.getOwner() == steamwarUser.getId()); @@ -330,7 +326,7 @@ public class SchematicCommand extends SWCommand { case "-excludeOwner": SteamwarUser steamwarUser1 = SteamwarUser.get(query[finalI + 1]); if (steamwarUser1 == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDer Spieler §e" + query[finalI + 1] + " §cexistiert nicht"); + SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]); return; } predicates.add(node -> node.getOwner() != steamwarUser1.getId()); @@ -369,14 +365,14 @@ public class SchematicCommand extends SWCommand { @Register("lockreplay") public void lockreplay(Player player, SchematicNode node) { node.setAllowReplay(false); - player.sendMessage(SchematicSystem.PREFIX + "Replays von Kämpfen mit " + node.getName() + " können ab sofort nicht mehr betrachtet werden"); + SchematicSystem.MESSAGE.send("COMMAND_LOCKREPLAY", player, node.getName()); } @Register("replacecolor") public void replacecolor(Player player, SchematicNode node) { boolean state = !node.replaceColor(); node.setReplaceColor(state); - player.sendMessage(SchematicSystem.PREFIX + "In Kämpfen " + node.getName() + " werden pinke Blöcke " + (state ? "" : "nicht ") + "ersetzt"); + SchematicSystem.MESSAGE.send(state?"COMMAND_REPLACE_COLOR_ON":"COMMAND_REPLACE_COLOR_OFF", player, node.getName()); } @Register("dir") @@ -389,14 +385,14 @@ public class SchematicCommand extends SWCommand { String[] layers = name.split("/"); if (invalidSchemName(player, layers)) return; SchematicNode node = mkdirs(layers, user, 0); - player.sendMessage(SchematicSystem.PREFIX + "§7Ordner §e" + node.generateBreadcrumbs(user) + " §7erstellt"); + SchematicSystem.MESSAGE.send("COMMAND_DIR_DONE", player, node.generateBreadcrumbs(user)); } @Register("changetype") public void changeType(Player player, SchematicNode node) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schematics einsenden."); + SchematicSystem.MESSAGE.send("COMMAND_CHANGE_TYPE_NOT_OWNER", player); return; } TextComponent base = new TextComponent(); @@ -407,7 +403,7 @@ public class SchematicCommand extends SWCommand { TextComponent component = new TextComponent(type.name() + " "); component.setColor(ChatColor.GRAY); component.setBold(true); - component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eTyp auswählen"))); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(SchematicSystem.MESSAGE.parse("COMMAND_CHANGE_TYPE_SELECT", player)))); component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + node.generateBreadcrumbs(user) + " " + type.name())); base.addExtra(component); }); @@ -434,7 +430,7 @@ public class SchematicCommand extends SWCommand { public void move(Player player, SchematicNode node, @Mapper("dirStringMapper") String name) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schems verschieben."); + SchematicSystem.MESSAGE.send("COMMAND_MOVE_NOT_OWN", player); return; } @@ -447,7 +443,7 @@ public class SchematicCommand extends SWCommand { if (invalidSchemName(player, layers)) return; SchematicNode newNode = mkdirs(layers, user, 0); if(SchematicNode.getAllParentsOfNode(newNode).contains(node)) { - player.sendMessage(SchematicSystem.PREFIX + "§cDas gibt nur Fehler, vertrau mir."); + SchematicSystem.MESSAGE.send("COMMAND_MOVE_RECURSIVE", player); return; } SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, newNode); @@ -456,14 +452,14 @@ public class SchematicCommand extends SWCommand { return; } } - player.sendMessage(SchematicSystem.PREFIX + "§7Die Schematic ist nun unter §e" + node.generateBreadcrumbs(user) + " §7zu finden"); + SchematicSystem.MESSAGE.send("COMMAND_MOVE_DONE", player, node.generateBreadcrumbs(user)); } @Register("rename") public void rename(Player player, SchematicNode node, String name) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + SchematicSystem.MESSAGE.send("COMMAND_RENAME_NOT_OWN", player); return; } if (invalidSchemName(player, new String[]{name})) { @@ -474,19 +470,19 @@ public class SchematicCommand extends SWCommand { result.sendError(player); return; } - player.sendMessage(SchematicSystem.PREFIX + "§7Die Schematic heist nun §e" + node.generateBreadcrumbs(user)); + SchematicSystem.MESSAGE.send("COMMAND_RENAME_DONE", player, node.generateBreadcrumbs(user)); } @Register("addteam") public void addTeam(Player player, SchematicNode node) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_TEAM_NOT_OWN", player); return; } Team team = Team.get(user.getTeam()); if (team == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu bist in keinem Team"); + SchematicSystem.MESSAGE.send("COMMAND_ADD_TEAM_NOT_IN_TEAM", player); return; } @@ -497,12 +493,12 @@ public class SchematicCommand extends SWCommand { public void remTeam(Player player, SchematicNode node) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + SchematicSystem.MESSAGE.send("COMMAND_DEL_TEAM_NOT_OWN", player); return; } Team team = Team.get(user.getTeam()); if (team == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu bist in keinem Team"); + SchematicSystem.MESSAGE.send("COMMAND_DEL_TEAM_NOT_IN_TEAM", player); return; } @@ -518,9 +514,9 @@ public class SchematicCommand extends SWCommand { Optional reduced = removed.stream().reduce((s, s2) -> s + ", " + s2); if (reduced.isPresent()) { - player.sendMessage(SchematicSystem.PREFIX + "§7Die Spieler §e" + reduced.get() + " §7wurden von der Schematic entfernt"); + SchematicSystem.MESSAGE.send("COMMAND_DEL_TEAM_DONE", player, reduced.get()); } else { - player.sendMessage(SchematicSystem.PREFIX + "§7Es wurde kein Spieler entfernt"); + SchematicSystem.MESSAGE.send("COMMAND_DEL_TEAM_NONE", player); } } @@ -528,12 +524,12 @@ public class SchematicCommand extends SWCommand { public void clearMember(Player player, SchematicNode node) { SteamwarUser user = getUser(player); if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + SchematicSystem.MESSAGE.send("COMMAND_CLEAR_MEMBER_NOT_OWN", player); return; } node.getMembers().forEach(NodeMember::delete); - player.sendMessage(SchematicSystem.PREFIX + "§7Alle Spieler wurden von der Schematic entfernt"); + SchematicSystem.MESSAGE.send("COMMAND_CLEAR_MEMBER_DONE", player); } @Register("delallmember") @@ -547,7 +543,7 @@ public class SchematicCommand extends SWCommand { i++; } } - player.sendMessage(SchematicSystem.PREFIX + "§e" + target.getUserName() + " §7wurde von §e" + i + " §7Schematics entfernt"); + SchematicSystem.MESSAGE.send("COMMAND_DEL_ALL_MEMBER", player, target.getUserName(), i); } @Register(value = "togglepublic", noTabComplete = true) @@ -559,9 +555,9 @@ public class SchematicCommand extends SWCommand { } if (togglePublic(player)) { - player.sendMessage(SchematicSystem.PREFIX + "§aDu bist nun der Public User"); + SchematicSystem.MESSAGE.send("COMMAND_PUBLIC_ON", player); } else { - player.sendMessage(SchematicSystem.PREFIX + "§cDu bist nun nicht mehr der Public User"); + SchematicSystem.MESSAGE.send("COMMAND_PUBLIC_OFF", player); } } @@ -571,23 +567,23 @@ public class SchematicCommand extends SWCommand { if (node.getOwner() != user.getId()) { NodeMember member = NodeMember.getNodeMember(node.getId(), user.getId()); if (member == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic gehört dir nicht"); + SchematicSystem.MESSAGE.send("COMMAND_DELETE_NOT_OWN", player); return; } member.delete(); - player.sendMessage(SchematicSystem.PREFIX + "§aDu hast dich von der Schematic entfernt"); + SchematicSystem.MESSAGE.send("COMMAND_DELETE_MEMBER", player); return; } if (node.isDir()) { if (SchematicNode.getSchematicNodeInNode(node).isEmpty()) { - player.sendMessage(SchematicSystem.PREFIX + "§aDer Ordner §e" + node.generateBreadcrumbs(user) + "§a wird gelöcht..."); + SchematicSystem.MESSAGE.send("COMMAND_DELETE_DIR", player, node.generateBreadcrumbs(user)); node.delete(); } else { - player.sendMessage(SchematicSystem.PREFIX + "§cDer Ordner muss leer sein, um ihn zu löchen!"); + SchematicSystem.MESSAGE.send("COMMAND_DELETE_DIR_FULL", player); } } else { - player.sendMessage(SchematicSystem.PREFIX + "§aDie Schematic §e" + node.generateBreadcrumbs(user) + "§a wird gelöscht..."); + SchematicSystem.MESSAGE.send("COMMAND_DELETE_SCHEM", player, node.generateBreadcrumbs(user)); node.delete(); } } diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java index b5d00da..fc2dc0d 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java @@ -19,6 +19,7 @@ package de.steamwar.schematicsystem.commands; +import de.steamwar.schematicsystem.SchematicSystem; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.HoverEvent; @@ -30,49 +31,49 @@ public class SchematicCommandHelp { } public static void printHelpMainPage(Player player) { - player.sendMessage("§e§lSchematicSystem §8§lHilfe"); + SchematicSystem.MESSAGE.sendPrefixless("HELP_HEADER", player); for (HelpPage page : HelpPage.values()) { - TextComponent pageComp = new TextComponent(page.mainText); + TextComponent pageComp = new TextComponent(SchematicSystem.MESSAGE.parse(page.mainText, player)); pageComp.setColor(ChatColor.GRAY); - pageComp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + page.hover))); + pageComp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + SchematicSystem.MESSAGE.parse(page.hover, player)))); pageComp.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem help " + page.name())); player.spigot().sendMessage(pageComp); } } public static void printHelpPage(Player player, HelpPage page) { - player.sendMessage("§e§lSchematicSystem §8§lHilfe"); + SchematicSystem.MESSAGE.sendPrefixless("HELP_HEADER", player); for (String s : page.content) { - player.sendMessage(s); + SchematicSystem.MESSAGE.sendPrefixless(s, player); } } public enum HelpPage { - ANSICHT("Finden & Laden", "Suche oder lade Schematics", new String[]{ - "§8/§7schem §einfo §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic", - "§8/§7schem §elist §8- §7Zeigt dir deine Schematics an", - "§8/§7schem §elist public §8- §7Zeigt alle Public-Schematics", - "§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passenden Schematics", - "§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic", - "§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig)" + ANSICHT("HELP_VIEW", "HELP_VIEW_HOVER", new String[]{ + "HELP_VIEW_1", + "HELP_VIEW_2", + "HELP_VIEW_3", + "HELP_VIEW_4", + "HELP_VIEW_5", + "HELP_VIEW_6" }), - BEARBEITUNG("Speichern & Bearbeiten", "Modifizierung von Schematics und Ordnern", new String[]{ - "§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic", - "§8/§7schem §eordner §8[§7Ordner§8] - §7Erstelle einen leeren Ordner", - "§8/§7schem §emove §8[§7Schematic§8] [§7Neuer Pfad§8] - §7Verschiebe eine Schematic", - "§8/§7schem §erename §8[§7Schematic§8] [§7Neuer Name§8] - §7Gib der Schematic einen neuen Namen", - "§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic", - "§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic", - "§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena", - "§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic" + BEARBEITUNG("HELP_EDIT", "HELP_EDIT_HOVER", new String[]{ + "HELP_EDIT_1", + "HELP_EDIT_2", + "HELP_EDIT_3", + "HELP_EDIT_4", + "HELP_EDIT_5", + "HELP_EDIT_6", + "HELP_EDIT_7", + "HELP_EDIT_8" }), - MEMBER("Besitzrechte", "Schematics mit anderen teilen", new String[]{ - "§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu", - "§8/§7schem §edelmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic", - "§8/§7schem §eclearmember §8[§7Schematic§8] - §7Entfernt alle Spieler von der Schematic", - "§8/§7schem §edelallmember §8[§7Spieler§8] - §7Entfernt einen Spieler von allen deinen Schematics", - "§8/§7schem §eaddteam §8[§7Schematic§8] - §7Füge jeden aus deinem Team auf die Schematic hinzu", - "§8/§7schem §edelteam §8[§7Schematic§8] - §7Entferne jeden aus deinem Team von der Schematic" + MEMBER("HELP_SHARE", "HELP_SHARE_HOVER", new String[]{ + "HELP_SHARE_1", + "HELP_SHARE_2", + "HELP_SHARE_3", + "HELP_SHARE_4", + "HELP_SHARE_5", + "HELP_SHARE_6" }); private final String mainText; diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index b5fc0e9..cecee5f 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -56,11 +56,11 @@ public class SchematicCommandUtils { public static boolean invalidSchemName(Player player, String[] layers) { for (String layer : layers) { if (layer.isEmpty()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDeine Ordner brauchen schon einen Namen!"); + SchematicSystem.MESSAGE.send("UTIL_NAME_REQUIRED", player); return true; } if(layer.length() > 64) { - player.sendMessage(SchematicSystem.PREFIX + "§cDer Name der Schematic ist zu lang"); + SchematicSystem.MESSAGE.send("UTIL_NAME_TOO_LONG", player); return true; } if (layer.contains("/") || @@ -72,11 +72,11 @@ public class SchematicCommandUtils { layer.contains("'") || layer.contains("\"") || layer.contains(" ")) { - player.sendMessage(SchematicSystem.PREFIX + "§cDer angegebene Schematicname enthält verbotene Zeichen"); + SchematicSystem.MESSAGE.send("UTIL_NAME_INVALID_CHAR", player); return true; } if (FORBIDDEN_NAMES.contains(layer.toLowerCase())) { - player.sendMessage(SchematicSystem.PREFIX + "§cDer Pfad darf nicht \"§l" + layer + "§c\" enthalten"); + SchematicSystem.MESSAGE.send("UTIL_NAME_FORBIDDEN", player, layer); return true; } } @@ -91,16 +91,12 @@ public class SchematicCommandUtils { SteamwarUser user = getUser(player); int pageCount = (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE); - player.sendMessage("§eSchematics §8(§e" + nodes.size() + "§8)"); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_HEAD", player, nodes.size()); String breadcrumbs = parent == null ? "" : parent.generateBreadcrumbs(user); - player.sendMessage("§7Aktueller Pfad: §e" + (breadcrumbs.isEmpty() ? "/" : breadcrumbs)); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_PATH", player, (breadcrumbs.isEmpty() ? "/" : breadcrumbs)); if (!breadcrumbs.isEmpty()) { - TextComponent back = new TextComponent("§e../"); String str = breadcrumbs.substring(0, Math.max(0, breadcrumbs.substring(0, breadcrumbs.length() - 1).lastIndexOf("/"))); - back.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eZurück gehen" + str).create())); - back.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public" : "") + " " + str)); - - player.spigot().sendMessage(back); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_BACK", player, SchematicSystem.MESSAGE.parse("UTIL_LIST_BACK_HOVER", player, str), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public" : "") + " " + str)); } for (int i = chunk * CHUNK_SIZE; i < nodes.size() && i < (chunk + 1) * CHUNK_SIZE; i++) { SchematicNode node = nodes.get(i); @@ -108,16 +104,14 @@ public class SchematicCommandUtils { StringBuilder nodeString = new StringBuilder(); if (node.isDir()) { - nodeString.append("§7§lDIR §e"); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)); } else { SchematicType type = node.getSchemtype(); if (type != SchematicType.Normal) { - nodeString.append("§8§l") - .append(type.getKuerzel().toUpperCase()) - .append(" "); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())); } - nodeString.append("§e"); } + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)); nodeString.append(behavior.getRenderHook().apply(node.getName())); @@ -126,16 +120,15 @@ public class SchematicCommandUtils { } if (node.getOwner() != user.getId()) { - nodeString.append(" §8von §7") - .append(SteamwarUser.get(node.getOwner()).getUserName()); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_FROM", player, SteamwarUser.get(node.getOwner()).getUserName())); } TextComponent schematics = new TextComponent(nodeString.toString()); if (node.isDir()) { - schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eOrdner anzeigen").create())); + schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_DIR", player)).create())); schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public" : "") + " " + breadcrumbs + node.getName() + "/")); } else { - schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eSchematic verwalten").create())); + schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_SCHEM", player)).create())); schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + (behavior.isPublics() ? "public" : "") + " " + breadcrumbs + node.getName())); } @@ -143,26 +136,26 @@ public class SchematicCommandUtils { } if (parent != null && parent.getOwner() != user.getId() && NodeMember.getNodeMember(parent.getId(), user.getId()) != null) { - TextComponent deadd = new TextComponent("[Entfernen]"); + TextComponent deadd = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE", false, player); deadd.setColor(ChatColor.RED); - deadd.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§7Entferne dich von dem Ordner"))); + deadd.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE_HOVER", false, player)})); deadd.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + parent.generateBreadcrumbs(user))); player.spigot().sendMessage(deadd); } - TextComponent beforePage = new TextComponent("««"); + TextComponent beforePage = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_BACK_ARROW", false, player); if (chunk > 0) { beforePage.setColor(ChatColor.YELLOW); - beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eVorherige Seite").create())); + beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_BACK_ARROW_HOVER", false, player)})); beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, behavior.getPageCommandGen().apply(chunk - 1))); } else { beforePage.setColor(ChatColor.RED); } - TextComponent nextPage = new TextComponent(" Seite (" + (chunk + 1) + "/" + Math.max(pageCount, 1) + ") »»"); + TextComponent nextPage = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_NEXT", false, player, chunk + 1, Math.max(pageCount, 1)); if (chunk < pageCount - 1) { nextPage.setColor(ChatColor.YELLOW); - nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eNächste Seite").create())); + nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_NEXT_HOVER", false, player)})); nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, behavior.getPageCommandGen().apply(chunk + 1))); } else { nextPage.setColor(ChatColor.RED); @@ -185,84 +178,85 @@ public class SchematicCommandUtils { public static void printSchemInfo(Player player, SchematicNode node) { SteamwarUser user = getUser(player); - player.sendMessage("§7Schematic: §e" + node.getName()); - player.sendMessage("§7Name: §e" + node.generateBreadcrumbs(user)); - player.sendMessage("§7Besitzer: §e" + SteamwarUser.get(node.getOwner()).getUserName()); - player.sendMessage("§7Ordner: §e" + (node.getParent() == null || node.getParent() == 0 ? "/" : node.getParentNode().generateBreadcrumbs(user))); - player.sendMessage("§7Letzes Update: §e" + node.getLastUpdate().toLocalDateTime().format(DateTimeFormatter.ofPattern("HH:mm dd.MM.yyyy", Locale.GERMAN))); - player.sendMessage("§7Typ: §e" + (node.isDir() ? "§7DIR" : node.getSchemtype().name())); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_SCHEM", player, node.getName()); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_NAME", player, node.generateBreadcrumbs(user)); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_OWNER", player, SteamwarUser.get(node.getOwner()).getUserName()); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_PARENT", player, node.getParent() == null || node.getParent() == 0 ? "/" : node.getParentNode().generateBreadcrumbs(user)); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_UPDATED", player, node.getLastUpdate().toLocalDateTime()); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_TYPE", player, node.isDir() ? SchematicSystem.MESSAGE.parse("UTIL_INFO_TYPE_DIR", player) : node.getSchemtype().name()); if (!node.isDir()) { if (node.getRank() > 0) { - player.sendMessage("§7Rang: §e" + node.getRank()); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_RANK", player, node.getRank()); } if (node.getSchemtype().fightType()) { - player.sendMessage("§7Farbersetzung: §e" + (node.replaceColor() ? "ja" : "nein")); - player.sendMessage("§7Replaywiedergabe: §e" + (node.allowReplay() ? "gestattet" : "untersagt")); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_COLOR", player, SchematicSystem.MESSAGE.parse(node.replaceColor() ? "ON" : "OFF", player)); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_REPLAY", player, SchematicSystem.MESSAGE.parse(node.allowReplay() ? "ON" : "OFF", player)); } - player.sendMessage("§7Format: §e" + (node.getSchemFormat() ? ".schem" : ".schematic")); - CheckedSchematic.getLastDeclinedOfNode(node).stream().findFirst().ifPresent(checkedSchematic -> player.sendMessage("§cStatus: §c" + checkedSchematic.getStartTime() + " : " + checkedSchematic.getDeclineReason())); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_FORMAT", player, node.getSchemFormat() ? ".schem" : ".schematic"); + CheckedSchematic.getLastDeclinedOfNode(node).stream().findFirst().ifPresent(checkedSchematic -> + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_STATUS", player, checkedSchematic.getStartTime(), checkedSchematic.getDeclineReason())); } List schematicMembers = new ArrayList<>(); NodeMember.getNodeMembers(node.getId()).forEach(nodeMember -> schematicMembers.add(SteamwarUser.get(nodeMember.getMember()).getUserName())); if (!schematicMembers.isEmpty()) { - player.sendMessage("§7Mitglieder: §e" + schematicMembers); + SchematicSystem.MESSAGE.sendPrefixless("UTIL_INFO_MEMBER", player, schematicMembers); } TextComponent base = new TextComponent(); if (!node.isDir()) { - TextComponent load = new TextComponent("[Laden] "); + TextComponent load = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_LOAD", false, player); load.setColor(ChatColor.GREEN); - load.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic laden"))); + load.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_LOAD_HOVER", false, player)})); load.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem load " + (node.getOwner() == 0 ? "public " : "") + node.generateBreadcrumbs(user))); base.addExtra(load); if (node.getOwner() == user.getId()) { - TextComponent download = new TextComponent("[Download] "); + TextComponent download = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_DOWNLOAD", false, player); download.setColor(ChatColor.GOLD); - download.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic downloaden"))); + download.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_DOWNLOAD_HOVER", false, player)})); download.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem download " + node.generateBreadcrumbs(user))); base.addExtra(download); - TextComponent changeTyp = new TextComponent("[Typ ändern] "); + TextComponent changeTyp = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_TYPE", false, player); changeTyp.setColor(ChatColor.BLUE); - changeTyp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic Typ ändern"))); + changeTyp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_TYPE_HOVER", false, player)})); changeTyp.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + node.generateBreadcrumbs(user))); base.addExtra(changeTyp); } } if (node.getOwner() == user.getId()) { - TextComponent addMember = new TextComponent("[Hinzufügen] "); + TextComponent addMember = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_ADD", false, player); addMember.setColor(ChatColor.AQUA); - addMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eMember hinzufügen"))); + addMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_ADD_HOVER", false, player)})); addMember.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem addmember " + node.generateBreadcrumbs(user) + " ")); base.addExtra(addMember); - TextComponent delMember = new TextComponent("[Entfernen] "); + TextComponent delMember = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_REMOVE", false, player); delMember.setColor(ChatColor.RED); - delMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eMember entfernen"))); + delMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_REMOVE_HOVER", false, player)})); delMember.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem delmember " + node.generateBreadcrumbs(user) + " ")); base.addExtra(delMember); - TextComponent move = new TextComponent("[Verschieben] "); + TextComponent move = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_MOVE", false, player); move.setColor(ChatColor.DARK_PURPLE); - move.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " verschieben"))); + move.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_MOVE_HOVER", false, player)})); move.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem move " + node.generateBreadcrumbs(user) + " " + node.generateBreadcrumbs(user).replace("/" + node.getName(), ""))); base.addExtra(move); - TextComponent rename = new TextComponent("[Umbenennen] "); + TextComponent rename = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_RENAME", false, player); rename.setColor(ChatColor.LIGHT_PURPLE); - rename.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " umbenennen"))); + rename.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_RENAME_HOVER", false, player)})); rename.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem rename " + node.generateBreadcrumbs(user) + " [Neuer Name]")); base.addExtra(rename); } - TextComponent delete = new TextComponent("[" + (node.getOwner() == user.getId() ? "Löschen" : "Entfernen") + "] "); + TextComponent delete = SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_DELETE", false, player); delete.setColor(ChatColor.DARK_RED); - delete.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " Löschen"))); + delete.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{SchematicSystem.MESSAGE.parseToComponent("UTIL_INFO_ACTION_DELETE_HOVER", false, player)})); delete.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + node.generateBreadcrumbs(user))); base.addExtra(delete); @@ -319,24 +313,24 @@ public class SchematicCommandUtils { SteamwarUser user = getUser(player); if(BauServerInfo.isBauServer() && BauServerInfo.getOwnerId() != user.getId() && (Punishment.isPunished(user, Punishment.PunishmentType.NoSchemSharing, punishment -> - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst hier keine Schematics laden")) || + SchematicSystem.MESSAGE.send("UTIL_LOAD_NOT_HERE", player)) || Punishment.isPunished(SteamwarUser.get(BauServerInfo.getOwnerId()), Punishment.PunishmentType.NoSchemReceiving, punishment -> - player.sendMessage(SchematicSystem.PREFIX + "§cAuf diesem Bau können keine Schematics geladen werden")))) { + SchematicSystem.MESSAGE.send("UTIL_LOAD_NOT_HERE_ALL", player)))) { return; } if (node.isDir()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst keine Ordner Laden"); + SchematicSystem.MESSAGE.send("UTIL_LOAD_DIR", player); return; } try { node.loadToPlayer(player); - player.sendMessage(SchematicSystem.PREFIX + "§7Schematic §e" + node.getName() + " §7geladen!"); + SchematicSystem.MESSAGE.send("UTIL_LOAD_DONE", player, node.getName()); Bukkit.getLogger().log(Level.INFO, "{0} has loaded Schematic {1} {2}", new Object[]{player.getName(), node.getId(), node.getName()}); } catch (NoClipboardException e) { - player.sendMessage(SchematicSystem.PREFIX + "§cEs konnte keine Daten in der Schematic gefunden werden."); + SchematicSystem.MESSAGE.send("UTIL_LOAD_NO_DATA", player); } catch (Exception e) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic konnte nicht geladen werden."); + SchematicSystem.MESSAGE.send("UTIL_LOAD_ERROR", player); Bukkit.getLogger().log(Level.INFO, e.getMessage(), e); } } @@ -344,16 +338,16 @@ public class SchematicCommandUtils { public static void download(Player player, SchematicNode node) { SteamwarUser user = getUser(player); if (Punishment.isPunished(user, Punishment.PunishmentType.NoSchemSharing, punishment -> { - player.sendMessage(SchematicSystem.PREFIX + "§cDu darf keine Schematics Downloaden: §f§l" + punishment.getReason()); + SchematicSystem.MESSAGE.send("UTIL_DOWNLOAD_PUNISHED", player, punishment.getReason()); })) { return; } if (node.getOwner() != user.getId()) { - player.sendMessage("§cDu darfst nur deine eigenen Schematics herunterladen!"); + SchematicSystem.MESSAGE.send("UTIL_DOWNLOAD_NOT_OWN", player); return; } - player.sendMessage(SchematicSystem.PREFIX + "Dein Download Link:"); + SchematicSystem.MESSAGE.send("UTIL_DOWNLOAD_LINK", player); player.sendMessage(NodeDownload.getLink(node)); } @@ -361,53 +355,54 @@ public class SchematicCommandUtils { SteamwarUser user = getUser(player); if (Punishment.isPunished(user, Punishment.PunishmentType.NoSchemSubmitting, - punishment -> player.sendMessage(SchematicSystem.PREFIX + "§cDu darf keine Schematics einsenden: §f§l: " + punishment.getReason()))) { + punishment -> SchematicSystem.MESSAGE.send("UTIL_TYPE_PUNISHED", player, punishment.getReason()))) { return; } if (node.getOwner() != user.getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schematics einsenden."); + SchematicSystem.MESSAGE.send("UTIL_TYPE_NOT_OWN", player); return; } if (node.isDir()) { - player.sendMessage(SchematicSystem.PREFIX + "§cOrdner haben keinen Typen."); + SchematicSystem.MESSAGE.send("UTIL_TYPE_DIR", player); return; } if (!type.isAssignable()) { - player.sendMessage(SchematicSystem.PREFIX + "§cZu diesem Typen können keine Schematics geändert werden."); + SchematicSystem.MESSAGE.send("UTIL_TYPE_NOT_ASSIGNABLE", player); + return; } if (node.getSchemtype().equals(type)) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic hat schon diesen Typen"); + SchematicSystem.MESSAGE.send("UTIL_TYPE_ALREADY", player); return; } if (type.writeable()) { node.setSchemtype(type); - player.sendMessage(SchematicSystem.PREFIX + "§aSchematictyp geändert"); + SchematicSystem.MESSAGE.send("UTIL_TYPE_DONE", player); } else if (type.fightType()) { if (node.getSchemtype().check()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu hast diese Schematic bereits eingesendet"); + SchematicSystem.MESSAGE.send("UTIL_TYPE_FIGHT_ALREADY", player); return; } CheckSchemType checkSchemType = CheckSchemType.get(type); if (checkSchemType.isAfterDeadline()) { - player.sendMessage("§cVon diesem Typen können keine Schematics mehr eingesendet werden. Einsendeschluss war: " + checkSchemType.getDeadline()); + SchematicSystem.MESSAGE.send("UTIL_TYPE_AFTER_DEADLINE", player, checkSchemType.getDeadline()); return; } AutoCheckResult result = checkSchemType.autoCheck(node); - Collection errors = result.errors(); - for (String warning : result.warnings()) { - player.sendMessage(" §e" + warning); + Map errors = result.errors(); + for (Map.Entry warning : result.warnings().entrySet()) { + SchematicSystem.MESSAGE.sendPrefixless(warning.getKey(), player, warning.getValue()); } - for (String error : errors) { - player.sendMessage(" §c" + error); + for (Map.Entry error : errors.entrySet()) { + SchematicSystem.MESSAGE.sendPrefixless(error.getKey(), player, error.getValue()); } if (!errors.isEmpty()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic ist nicht regelkonform"); + SchematicSystem.MESSAGE.send("UTIL_TYPE_ERROR", player); return; } @@ -415,29 +410,29 @@ public class SchematicCommandUtils { submitSchemGUI(player, node, type); } else if (extend == SchematicCommand.Extend.AUSFAHREN) { new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); - player.sendMessage(SchematicSystem.PREFIX + "§aDer Vorbereitungsserver wird gestartet"); + SchematicSystem.MESSAGE.send("UTIL_TYPE_EXTEND", player); } } } private static void submitSchemGUI(Player player, SchematicNode node, SchematicType type) { - SWInventory inv = new SWInventory(player, 9, "Schematic ausfahren"); - inv.setItem(0, SWItem.getMaterial("SIGN"), node.allowReplay() ? "§aReplay erlaubt" : "§cReplay gesperrt", click -> { + SWInventory inv = new SWInventory(player, 9, SchematicSystem.MESSAGE.parse("UTIL_SUBMIT_TITLE", player)); + inv.setItem(0, SWItem.getMaterial("SIGN"), SchematicSystem.MESSAGE.parse(node.allowReplay()?"UTIL_SUBMIT_REPLAY_ON":"UTIL_SUBMIT_REPLAY_OFF", player), click -> { node.setAllowReplay(!node.allowReplay()); submitSchemGUI(player, node, type); }); - inv.setItem(1, SWItem.getMaterial(node.replaceColor() ? "PINK_WOOL" : "LIGHT_GRAY_WOOL"), node.replaceColor() ? "§aPink zu Teamfarbe ersetzen" : "§cPink nicht ersetzen", click -> { + inv.setItem(1, SWItem.getMaterial(node.replaceColor() ? "PINK_WOOL" : "LIGHT_GRAY_WOOL"), SchematicSystem.MESSAGE.parse(node.allowReplay()?"UTIL_SUBMIT_COLOR_ON":"UTIL_SUBMIT_COLOR_OFF", player), click -> { node.setReplaceColor(!node.replaceColor()); submitSchemGUI(player, node, type); }); - inv.setItem(7, SWItem.getDye(7), (byte) 7, "§eDirekt einsenden", click -> { + inv.setItem(7, SWItem.getDye(7), (byte) 7, SchematicSystem.MESSAGE.parse("UTIL_SUBMIT_DIRECT", player), click -> { node.setSchemtype(type.checkType()); - player.sendMessage(SchematicSystem.PREFIX + "§aDie Schematic wird zeitnah überprüft"); + SchematicSystem.MESSAGE.send("UTIL_SUBMIT_DIRECT_DONE", player); player.closeInventory(); }); - inv.setItem(8, SWItem.getDye(10), (byte) 10, "§eSchematic ausfahren", click -> { + inv.setItem(8, SWItem.getDye(10), (byte) 10, SchematicSystem.MESSAGE.parse("UTIL_SUBMIT_EXTEND", player), click -> { new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); - player.sendMessage(SchematicSystem.PREFIX + "§aDer Vorbereitungsserver wird gestartet"); + SchematicSystem.MESSAGE.send("UTIL_SUBMIT_EXTEND_DONE", player); player.closeInventory(); }); inv.setCallback(-999, click -> player.closeInventory()); From 7a2588cd603f9f3e622eaa4511b9c7d4fd86365a Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 1 Jun 2022 21:58:37 +0200 Subject: [PATCH 10/16] Update translations --- .../src/SchematicSystem.properties | 384 +++++++++--------- .../src/SchematicSystem_de.properties | 199 +++++++++ .../src/SchematicSystem_en.properties | 0 3 files changed, 391 insertions(+), 192 deletions(-) create mode 100644 SchematicSystem_Core/src/SchematicSystem_de.properties delete mode 100644 SchematicSystem_Core/src/SchematicSystem_en.properties diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index 667c125..f7772fd 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -1,215 +1,215 @@ PREFIX=§eSchematic§8» §7 -ON=§aAn -OFF=§cAus -CHANGE=§7Zum Ändern -CLICK=§7anklicken -CURRENT=§7Aktuell: {0} -CONFIRM=§aBestätigen -CANCEL=§cAbbrechen +ON=§aon +OFF=§coff +CHANGE=§7change +CLICK=§7click +CURRENT=§7Current: {0} +CONFIRM=§aConfirm +CANCEL=§cCancel -UTIL_NAME_REQUIRED=§cDeine Ordner brauchen schon einen Namen -UTIL_NAME_TOO_LONG=§cDer Name der Schematic ist zu lang -UTIL_NAME_INVALID_CHAR=§cDer angegebene Schematicname enthält verbotene Zeichen -UTIL_NAME_FORBIDDEN=§cDer Pfad darf nicht \"§l{0}§c\" enthalten +UTIL_NAME_REQUIRED=§cFolder name required +UTIL_NAME_TOO_LONG=§cSchematic name too long +UTIL_NAME_INVALID_CHAR=§cThe specified schema name contains forbidden characters +UTIL_NAME_FORBIDDEN=§cThe path must not contain \"§l{0}§c\" UTIL_LIST_HEAD=§eSchematics §8(§e{0}§8) -UTIL_LIST_PATH=§7Aktueller Pfad: §e{0} +UTIL_LIST_PATH=§7Current path: §e{0} UTIL_LIST_BACK=§e../ -UTIL_LIST_BACK_HOVER=§eZurück gehen {0} +UTIL_LIST_BACK_HOVER=§eBack {0} UTIL_LIST_DIR=§7§lDIR UTIL_LIST_TYPE=§8§l{0} UTIL_LIST_BASE= §e -UTIL_LIST_FROM= §8von §7{0} -UTIL_LIST_OPEN_DIR=§eOrdner anzeigen -UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten -UTIL_LIST_REMOVE=[Entfernen] -UTIL_LIST_REMOVE_HOVER=§7Entferne dich von dem Ordner +UTIL_LIST_FROM= §8Owner §7{0} +UTIL_LIST_OPEN_DIR=§eShow directory +UTIL_LIST_OPEN_SCHEM=§eManage schematics +UTIL_LIST_REMOVE=[Remove] +UTIL_LIST_REMOVE_HOVER=§7Remove yourself from the directory UTIL_LIST_BACK_ARROW=«« -UTIL_LIST_BACK_ARROW_HOVER=§eVorherige Seite -UTIL_LIST_NEXT= Seite ({0}/{0}) »» -UTIL_LIST_NEXT_HOVER=§eNächste Seite +UTIL_LIST_BACK_ARROW_HOVER=§ePrevious page +UTIL_LIST_NEXT= Page ({0}/{0}) »» +UTIL_LIST_NEXT_HOVER=§eNext page UTIL_INFO_SCHEM=§7Schematic: §e{0} UTIL_INFO_NAME=§7Name: §e{0} -UTIL_INFO_OWNER=§7Besitzer: §e{0} -UTIL_INFO_PARENT=§7Ordner: §e{0} -UTIL_INFO_UPDATED=§7Letzes Update: §e{0} -UTIL_INFO_TYPE=§7Typ: §e{0} +UTIL_INFO_OWNER=§7Owner: §e{0} +UTIL_INFO_PARENT=§7Directory: §e{0} +UTIL_INFO_UPDATED=§7Last update: §e{0} +UTIL_INFO_TYPE=§7Type: §e{0} UTIL_INFO_TYPE_DIR=§7DIR -UTIL_INFO_RANK=§7Rang: §e{0} -UTIL_INFO_COLOR=§7Farbersetzung: {0} -UTIL_INFO_REPLAY=§7Replaywiedergabe: {0} +UTIL_INFO_RANK=§7Rank: §e{0} +UTIL_INFO_COLOR=§Color translation: {0} +UTIL_INFO_REPLAY=§7Replay playback: {0} UTIL_INFO_FORMAT=§7Format: §e{0} -UTIL_INFO_STATUS=§cStatus: §c{0}: {1} -UTIL_INFO_MEMBER=§7Mitglieder: §e{0} -UTIL_INFO_ACTION_LOAD=[Laden] -UTIL_INFO_ACTION_LOAD_HOVER=§eSchematic laden +UTIL_INFO_STATUS=§cState: §c{0}: {1} +UTIL_INFO_MEMBER=§7Members: §e{0} +UTIL_INFO_ACTION_LOAD=[Load] +UTIL_INFO_ACTION_LOAD_HOVER=§eLoad schematic UTIL_INFO_ACTION_DOWNLOAD=[Download] -UTIL_INFO_ACTION_DOWNLOAD_HOVER=§eSchematic downloaden -UTIL_INFO_ACTION_TYPE=[Typ ändern] -UTIL_INFO_ACTION_TYPE_HOVER=§eSchematic Typ ändern -UTIL_INFO_ACTION_ADD=[Hinzufügen] -UTIL_INFO_ACTION_ADD_HOVER=§eMember hinzufügen -UTIL_INFO_ACTION_REMOVE=[Entfernen] -UTIL_INFO_ACTION_REMOVE_HOVER=§eMember entfernen -UTIL_INFO_ACTION_MOVE=[Verschieben] -UTIL_INFO_ACTION_MOVE_HOVER=§eSchematic verschieben -UTIL_INFO_ACTION_RENAME=[Umbenennen] -UTIL_INFO_ACTION_RENAME_HOVER=§eSchematic umbenennen -UTIL_INFO_ACTION_DELETE=[Löschen] -UTIL_INFO_ACTION_DELETE_HOVER=§eSchematic löschen -UTIL_LOAD_NOT_HERE=§cDu kannst hier keine Schematics laden -UTIL_LOAD_NOT_HERE_ALL=§cAuf diesem Bau können keine Schematics geladen werden -UTIL_LOAD_DIR=§cDu kannst keine Ordner Laden -UTIL_LOAD_DONE=§7Schematic §e{0}geladen -UTIL_LOAD_NO_DATA=§cEs konnte keine Daten in der Schematic gefunden werden -UTIL_LOAD_ERROR=§cDie Schematic konnte nicht geladen werden -UTIL_DOWNLOAD_PUNISHED=§cDu darf keine Schematics Downloaden: §f§l{0} -UTIL_DOWNLOAD_NOT_OWN=§cDu darfst nur deine eigenen Schematics herunterladen -UTIL_DOWNLOAD_LINK=Dein Download Link: -UTIL_TYPE_PUNISHED=§cDu darf keine Schematics einsenden: §f§l{0} -UTIL_TYPE_NOT_OWN=§cDu kannst nur deine eigenen Schematics einsenden -UTIL_TYPE_DIR=§cDu kannst keine Ordner einsenden -UTIL_TYPE_NOT_ASSIGNABLE=§cZu diesem Typen können keine Schematics geändert werden -UTIL_TYPE_ALREADY=§cDie Schematic hat schon diesen Typen -UTIL_TYPE_DONE=§aSchematictyp geändert -UTIL_TYPE_FIGHT_ALREADY=§cDu hast diese Schematic bereits eingesendet -UTIL_TYPE_AFTER_DEADLINE=§cVon diesem Typen können keine Schematics mehr eingesendet werden. Einsendeschluss war: {0} -UTIL_TYPE_ERROR=§cDie Schematic ist nicht regelkonform -UTIL_TYPE_EXTEND=§aDer Vorbereitungsserver wird gestartet -UTIL_SUBMIT_TITLE=Schematic ausfahren -UTIL_SUBMIT_REPLAY_ON=§aReplay erlaubt -UTIL_SUBMIT_REPLAY_OFF=§cReplay gesperrt -UTIL_SUBMIT_COLOR_ON=§aPink zu Teamfarbe ersetzen -UTIL_SUBMIT_COLOR_OFF=§cPink nicht ersetzen -UTIL_SUBMIT_DIRECT=§eDirekt einsenden -UTIL_SUBMIT_DIRECT_DONE=§aDie Schematic wird zeitnah überprüft -UTIL_SUBMIT_EXTEND=§eSchematic ausfahren -UTIL_SUBMIT_EXTEND_DONE=§aDer Vorbereitungsserver wird gestartet +UTIL_INFO_ACTION_DOWNLOAD_HOVER=§eDownload schematic +UTIL_INFO_ACTION_TYPE=[Change type] +UTIL_INFO_ACTION_TYPE_HOVER=§eChange schematic type +UTIL_INFO_ACTION_ADD=[Add] +UTIL_INFO_ACTION_ADD_HOVER=§eAdd member +UTIL_INFO_ACTION_REMOVE=[Remove] +UTIL_INFO_ACTION_REMOVE_HOVER=§eRemove member +UTIL_INFO_ACTION_MOVE=[Move] +UTIL_INFO_ACTION_MOVE_HOVER=§eMove schematic +UTIL_INFO_ACTION_RENAME=[Rename] +UTIL_INFO_ACTION_RENAME_HOVER=§eRename schematic +UTIL_INFO_ACTION_DELETE=[Delete] +UTIL_INFO_ACTION_DELETE_HOVER=§eDelete schematic +UTIL_LOAD_NOT_HERE=§cYou cannot load schematics here +UTIL_LOAD_NOT_HERE_ALL=§cSchematics cannot be loaded on this build +UTIL_LOAD_DIR=§cYou cannot load folders +UTIL_LOAD_DONE=§7Schematic §e{0} loaded +UTIL_LOAD_NO_DATA=§cNo data could be found in the Schematic +UTIL_LOAD_ERROR=§cThe schematic could not be loaded +UTIL_DOWNLOAD_PUNISHED=§cYou are not allowed to download schematics: §f§l{0} +UTIL_DOWNLOAD_NOT_OWN=§cYou may download only your own schematics +UTIL_DOWNLOAD_LINK=Your download link: +UTIL_TYPE_PUNISHED=§cYou are not allowed to submit schematics: §f§l{0} +UTIL_TYPE_NOT_OWN=§cYou can only submit your own schematics +UTIL_TYPE_DIR=§cYou cannot submit folders +UTIL_TYPE_NOT_ASSIGNABLE=§cSchematics cannot be changed for this type +UTIL_TYPE_ALREADY=§cThe Schematic already has this type +UTIL_TYPE_DONE=§aChange schematic type +UTIL_TYPE_FIGHT_ALREADY=§cYou have already submitted this schematic +UTIL_TYPE_AFTER_DEADLINE=§cSchematics of this type can no longer be submitted. Deadline was: {0} +UTIL_TYPE_ERROR=§cThe Schematic is not compliant with the rules +UTIL_TYPE_EXTEND=§aThe preparation server is starting +UTIL_SUBMIT_TITLE=Extend Schematic +UTIL_SUBMIT_REPLAY_ON=§aReplay allowed +UTIL_SUBMIT_REPLAY_OFF=§cReplay locked +UTIL_SUBMIT_COLOR_ON=§aReplace pink to team color +UTIL_SUBMIT_COLOR_OFF=§cDo not replace pink +UTIL_SUBMIT_DIRECT=§eSubmit directly +UTIL_SUBMIT_DIRECT_DONE=§aThe Schematic will be reviewed in a timely manner +UTIL_SUBMIT_EXTEND=§eExtend Schematic +UTIL_SUBMIT_EXTEND_DONE=§aThe preparation server is starting -COMMAND_NOT_FOLDER=Das ist eine Schematic und kein Ordner -COMMAND_ENTER_NAME=Namen eingeben -COMMAND_PUNISHMENT_NO_SAVE_EXTERNAL=§cDu kannst nicht auf anderen Baus Schematics machen -COMMAND_PUNISHMENT_NO_SAVE=§cAuf diesem Bau können keine Schematics gemacht werden -COMMAND_SAVE_NO_NAME=§cDu must auch einen Namen für die Schematic nach dem Ordner angeben -COMMAND_SAVE_FOLDER=§cDie Schematic ist ein Ordner -COMMAND_SAVE_NO_OVERWRITE=§cDu darfst diese Schematic nicht überschreiben -COMMAND_SAVE_CLIPBOARD_EMPTY=§cDein Clipboard ist leer -COMMAND_SAVE_ERROR=§cFehler beim Speichern der Schematic -COMMAND_SAVE_DONE=Schematic §e{0} §7gespeichert -COMMAND_SAVE_OVERWRITE=Schematic §e{0} §7überschrieben -COMMAND_ADD_PUNISH=§cDu darfst niemanden auf deine Schematics hinzufügen: §f§l{0} -COMMAND_ADD_NOT_OWNER=§cDu kannst nur auf deine eigenen Sachen jemanden hinzufügen -COMMAND_ADD_USER_PUNISHED=§c{0} darf nicht auf Schematics hinzugefügt werden -COMMAND_ADD_OWN=§cAlso bitte: Das ist deine eigene Schematic! -COMMAND_ADD_PUBLIC=§cFür Public-Anträge bitte bei der Moderation melden -COMMAND_ADD_ALREADY=§c{0} ist bereits auf diese Schematic geaddet -COMMAND_ADD_ADDED=Du hast nun Zugriff auf die Schematic §e{0} §7von §e{1} -COMMAND_ADD_NONE=§cEs wurde kein Spieler hinzugefügt -COMMAND_ADD_ONE=§7Der Spieler $e{0} wurde auf die Schematic hinzugefügt -COMMAND_ADD_MANY=§7Die Spieler $e{0} wurden auf die Schematic hinzugefügt -COMMAND_DELMEM_NOT_OWN=§cDu kannst nur auf deine eigenen Sachen jemanden entfernen -COMMAND_DELMEM_DONE=Der Spieler §e{0} §7hat nun keinen Zugriff mehr auf die Schematic §e{1} -COMMAND_DELMEM_DELETED=§cDu hast nun keinen Zugriff mehr auf die Schematic §e{0} §7von §e{1} -COMMAND_SEARCH_NOT_A_PLAYER=§cDer Spieler §e{0} §cexistiert nicht -COMMAND_LOCKREPLAY=Replays von Kämpfen mit {0} können ab sofort nicht mehr betrachtet werden -COMMAND_REPLACE_COLOR_OFF=In Kämpfen {0} werden pinke Blöcke nicht ersetzt -COMMAND_REPLACE_COLOR_ON=In Kämpfen {0} werden pinke Blöcke ersetzt -COMMAND_DIR_DONE=§7Ordner §e{0} §7erstellt -COMMAND_CHANGE_TYPE_NOT_OWNER=§cDu kannst nur deine eigenen Schematics einsenden -COMMAND_CHANGE_TYPE_SELECT=§eTyp auswählen -COMMAND_MOVE_NOT_OWN=§cDu kannst nur deine eigenen Schems verschieben -COMMAND_MOVE_RECURSIVE=§cDas gibt nur Fehler, vertrau mir -COMMAND_MOVE_DONE=§7Die Schematic ist nun unter §e{0} §7zu finden -COMMAND_RENAME_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen -COMMAND_RENAME_DONE=§7Die Schematic heist nun §e{0} -COMMAND_ADD_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen -COMMAND_ADD_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team -COMMAND_DEL_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen -COMMAND_DEL_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team -COMMAND_DEL_TEAM_NONE=§7Es wurde kein Spieler entfernt -COMMAND_DEL_TEAM_DONE=§7Der Spieler §e{0} §7wurden von der Schematic entfernt -COMMAND_CLEAR_MEMBER_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen -COMMAND_CLEAR_MEMBER_DONE=§7Alle Spieler wurden von der Schematic entfernt -COMMAND_DEL_ALL_MEMBER=§e{0}} §7wurde von §e{1} §7Schematics entfernt -COMMAND_PUBLIC_ON=§aDu bist nun der Public User -COMMAND_PUBLIC_OFF=§cDu bist nun nicht mehr der Public User -COMMAND_DELETE_NOT_OWN=§cDie Schematic gehört dir nicht -COMMAND_DELETE_MEMBER=§aDu hast dich von der Schematic entfernt -COMMAND_DELETE_DIR=§aDer Ordner §e{0}§a wird gelöscht... -COMMAND_DELETE_DIR_FULL=§cDer Ordner muss leer sein, um ihn zu löchen -COMMAND_DELETE_SCHEM=§aDer Schematic §e{0}§a wird gelöscht... +COMMAND_NOT_FOLDER=This is a schematic and not a folder +COMMAND_ENTER_NAME=Insert name +COMMAND_PUNISHMENT_NO_SAVE_EXTERNAL=§cYou can not make schematics on other build server +COMMAND_PUNISHMENT_NO_SAVE=§cSchematics cannot be made on this build +COMMAND_SAVE_NO_NAME=§cYou must also specify a name for the schematic after the folder +COMMAND_SAVE_FOLDER=§cSchematic is a folder +COMMAND_SAVE_NO_OVERWRITE=§cYou must not overwrite this Schematic +COMMAND_SAVE_CLIPBOARD_EMPTY=§cYour clipboard is empty +COMMAND_SAVE_ERROR=§cError while saving the Schematic +COMMAND_SAVE_DONE=Schematic §e{0} §7stored +COMMAND_SAVE_OVERWRITE=Schematic §e{0} §7overwritten +COMMAND_ADD_PUNISH=§cYou may not add anyone to your schematics: §f§l{0} +COMMAND_ADD_NOT_OWNER=§cYou can only add someone to your own stuff +COMMAND_ADD_USER_PUNISHED=§c{0} must not be added to schematics +COMMAND_ADD_OWN=§cSo please: This is your own Schematic! +COMMAND_ADD_PUBLIC=§cFor public requests please contact the moderator +COMMAND_ADD_ALREADY=§c{0} is already added to this schematic +COMMAND_ADD_ADDED=You now have access to the Schematic §e{0} §7of §e{1} +COMMAND_ADD_NONE=§cNo player has been added +COMMAND_ADD_ONE=§7The player §e{0} was added to the schematic +COMMAND_ADD_MANY=§7The players §e{0} were added to the schematic +COMMAND_DELMEM_NOT_OWN=§cYou can only remove someone on your own stuff +COMMAND_DELMEM_DONE=The player §e{0} §7no longer has access to the Schematic §e{1} +COMMAND_DELMEM_DELETED=§cYou now no longer have access to the Schematic §e{0} §7of §e{1} +COMMAND_SEARCH_NOT_A_PLAYER=§cThe player §e{0} §cdoes not exists +COMMAND_LOCKREPLAY=Replays of fights with {0} can no longer be viewed from now on +COMMAND_REPLACE_COLOR_OFF=In fights {0} pink blocks are not replaced +COMMAND_REPLACE_COLOR_ON=In fights {0} pink blocks are replaced +COMMAND_DIR_DONE=§7Directory §e{0} §7created +COMMAND_CHANGE_TYPE_NOT_OWNER=§cYou can only submit your own schematics +COMMAND_CHANGE_TYPE_SELECT=§eSelect type +COMMAND_MOVE_NOT_OWN=§cYou can only move your own shematics +COMMAND_MOVE_RECURSIVE=§cThis only gives mistakes, trust me +COMMAND_MOVE_DONE=§7The schematic can now be found under §e{0} +COMMAND_RENAME_NOT_OWN=§cYou can only do that with your own schematics +COMMAND_RENAME_DONE=§7The schematic is now called §e{0} +COMMAND_ADD_TEAM_NOT_OWN=§cYou can only do that with your own schematics +COMMAND_ADD_TEAM_NOT_IN_TEAM=§cYou are not in any team +COMMAND_DEL_TEAM_NOT_OWN=§cYou can only do that with your own schematics +COMMAND_DEL_TEAM_NOT_IN_TEAM=§cYou are not in any team +COMMAND_DEL_TEAM_NONE=§7No player was removed +COMMAND_DEL_TEAM_DONE=§7The player §e{0} §7were removed from the Schematic +COMMAND_CLEAR_MEMBER_NOT_OWN=§cYou can only do that with your own schematics +COMMAND_CLEAR_MEMBER_DONE=§7All players were removed from the Schematic +COMMAND_DEL_ALL_MEMBER=§e{0} §7has been removed from §e{1} §7Schematics +COMMAND_PUBLIC_ON=§aYou are now the public user +COMMAND_PUBLIC_OFF=§cYou are no longer the public user +COMMAND_DELETE_NOT_OWN=§cThe schematic is not yours +COMMAND_DELETE_MEMBER=§aYou have removed yourself from the Schematic +COMMAND_DELETE_DIR=§aThe folder §e{0}§a is deleted... +COMMAND_DELETE_DIR_FULL=§cThe folder must be empty to delete it +COMMAND_DELETE_SCHEM=§aThe Schematic §e{0}§a is deleted... -HELP_HEADER=§e§lSchematicSystem §8§lHilfe -HELP_VIEW=Finden & Laden -HELP_VIEW_HOVER=Suche oder lade Schematics -HELP_VIEW_1=§8/§7schem §einfo §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic -HELP_VIEW_2=§8/§7schem §elist §8- §7Zeigt dir deine Schematics an -HELP_VIEW_3=§8/§7schem §elist public §8- §7Zeigt alle Public-Schematics -HELP_VIEW_4=§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passenden Schematics -HELP_VIEW_5=§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic -HELP_VIEW_6=§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig) -HELP_EDIT=Speichern & Bearbeiten -HELP_EDIT_HOVER=Modifizierung von Schematics und Ordnern -HELP_EDIT_1=§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic -HELP_EDIT_2=§8/§7schem §eordner §8[§7Ordner§8] - §7Erstelle einen leeren Ordner -HELP_EDIT_3=§8/§7schem §emove §8[§7Schematic§8] [§7Neuer Pfad§8] - §7Verschiebe eine Schematic -HELP_EDIT_4=§8/§7schem §erename §8[§7Schematic§8] [§7Neuer Name§8] - §7Gib der Schematic einen neuen Namen -HELP_EDIT_5=§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic -HELP_EDIT_6=§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic -HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena -HELP_EDIT_8=§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic -HELP_SHARE=Besitzrechte -HELP_SHARE_HOVER=Schematics mit anderen teilen -HELP_SHARE_1=§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu -HELP_SHARE_2=§8/§7schem §edelmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic -HELP_SHARE_3=§8/§7schem §eclearmember §8[§7Schematic§8] - §7Entfernt alle Spieler von der Schematic -HELP_SHARE_4=§8/§7schem §edelallmember §8[§7Spieler§8] - §7Entfernt einen Spieler von allen deinen Schematics -HELP_SHARE_5=§8/§7schem §eaddteam §8[§7Schematic§8] - §7Füge jeden aus deinem Team auf die Schematic hinzu -HELP_SHARE_6=§8/§7schem §edelteam §8[§7Schematic§8] - §7Entferne jeden aus deinem Team von der Schematic +HELP_HEADER=§e§lSchematicSystem §8§lHelp +HELP_VIEW=Find & Load +HELP_VIEW_HOVER=Search or download schematics +HELP_VIEW_1=§8/§7schem §einfo §8[§7schematic§8] - §7Shows information about the schematic +HELP_VIEW_2=§8/§7schem §elist §8- §7Shows you your schematics +HELP_VIEW_3=§8/§7schem §elist public §8- §7Shows all public schematics +HELP_VIEW_4=§8/§7schem §esearch §8[§7keyword§8] - §7Searches for matching schematics +HELP_VIEW_5=§8/§7schem §eload §8[§7schematic§8] - §7Loads a schematic +HELP_VIEW_6=§8/§7schem §edownload §8[§7schematic§8] - §7Gives you a download link (valid for 1 min) +HELP_EDIT=Save & Edit +HELP_EDIT_HOVER=Modification of schematics and folders +HELP_EDIT_1=§8/§7schem §esave §8[§7schematic§8] - §7Saves your clipboard as a schematic +HELP_EDIT_2=§8/§7schem §eordner §8[§7directory§8] - §7Create an empty folder +HELP_EDIT_3=§8/§7schem §emove §8[§7schematic§8] [§7new path§8] - §7Move a schematic +HELP_EDIT_4=§8/§7schem §erename §8[§7schematic§8] [§7new path§8] - §7Give the schematic a new name +HELP_EDIT_5=§8/§7schem §echangetype §8[§7schematic§8] - §7Changes the type of your schematic +HELP_EDIT_6=§8/§7schem §elockreplay §8[§7schematic§8] - §7Locks replays of the schematic +HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7schematic§8] - §7Changes color substitution in the arena +HELP_EDIT_8=§8/§7schem §edelete §8[§7schematic§8] - §7Deletes a schematic +HELP_SHARE=Ownership +HELP_SHARE_HOVER=Share Schematics with others +HELP_SHARE_1=§8/§7schem §eaddmember §8[§7schematic§8] §8[§7Spieler§8] - §7Adds a player to a schematic +HELP_SHARE_2=§8/§7schem §edelmember §8[§7schematic§8] §8[§7Spieler§8] - §7Removes a player from a schematic +HELP_SHARE_3=§8/§7schem §eclearmember §8[§7schematic§8] - §7Removes all players from the schematic +HELP_SHARE_4=§8/§7schem §edelallmember §8[§7player§8] - §7Removes a player from all your schematics +HELP_SHARE_5=§8/§7schem §eaddteam §8[§7schematic§8] - §7Add everyone from your team to the schematic +HELP_SHARE_6=§8/§7schem §edelteam §8[§7schematic§8] - §7Remove everyone from your team from the Schematic GUI_TITLE=Schematics \{1\} -GUI_FOLDER_PROPERTIES=§7Ordnereigenschaften -GUI_INFO_LOAD=§eLaden -GUI_INFO_BACK=§eZurück -GUI_INFO_STATUS=§eStatus {0} +GUI_FOLDER_PROPERTIES=§7Directory properties +GUI_INFO_LOAD=§eLoading +GUI_INFO_BACK=§eBack +GUI_INFO_STATUS=§eState {0} GUI_INFO_STATUS_LORE=§7{0} GUI_INFO_MAT=§e{0} GUI_INFO_TYPE=§e{0} GUI_INFO_DOWNLOAD=§eDownload -GUI_INFO_COLOR=Farbersetzung -GUI_INFO_REPLAY=Replay Wiedergabe -GUI_INFO_REPLAY_OFF=§7Zum §lAusschalten -GUI_INFO_REPLAY_TITLE=Wiedergabe dauerhaft sperren -GUI_INFO_MEMBER=§eMitglieder -GUI_INFO_MOVE=§eVerschieben -GUI_INFO_RENAME=§eUmbenennen -GUI_INFO_RENAME_TITLE={0} umbenennen -GUI_INFO_DELETE=§cLöschen -GUI_INFO_MEMBER_FROM=§7von §e{0} -GUI_INFO_MEMBER_REMOVE=§cZugriff entfernen -GUI_CHANGE_TYPE=Typ ändern -GUI_DELETE_OWN_DELETED=Schematic §e{0} §7gelöscht -GUI_DELETE_OWN_TITLE={0} löschen -GUI_DELETE_MEMBER_TITLE={0} entfernen# -GUI_DELETE_MEMBER_DONE=Zugriff zu Schematic §e{0} §7entfernt -GUI_DELETE_MEMBERS_TITLE=Mitglieder entfernen -GUI_CHANGE_ITEM=Item ändern +GUI_INFO_COLOR=Color translation +GUI_INFO_REPLAY=Replay playback +GUI_INFO_REPLAY_OFF=§7§lTurn off +GUI_INFO_REPLAY_TITLE=Lock playback permanently +GUI_INFO_MEMBER=§eMembers +GUI_INFO_MOVE=§eMove +GUI_INFO_RENAME=§eRename +GUI_INFO_RENAME_TITLE={0} rename +GUI_INFO_DELETE=§cDelete +GUI_INFO_MEMBER_FROM=§7Owner §e{0} +GUI_INFO_MEMBER_REMOVE=§cRemove access +GUI_CHANGE_TYPE=Change type +GUI_DELETE_OWN_DELETED=Schematic §e{0} §7deleted +GUI_DELETE_OWN_TITLE=Delete {0} +GUI_DELETE_MEMBER_TITLE=Remove {0} +GUI_DELETE_MEMBER_DONE=Access to Schematic §e{0} §7removed +GUI_DELETE_MEMBERS_TITLE=Remove members +GUI_CHANGE_ITEM=Change item -AUTO_CHECK_RESULT_NOT_LOAD=Die Schematic konnte nicht geladen werden -AUTO_CHECK_RESULT_TOO_WIDE=Die Schematic ist zu breit ({0} > {1}) -AUTO_CHECK_RESULT_TOO_LONG=Die Schematic ist zu lang ({0} > {1}) -AUTO_CHECK_RESULT_TOO_HIGH=Die Schematic ist zu hoch ({0} > {1}) -AUTO_CHECK_RESULT_TOO_MANY_BLOCK=Der Block {0} wurde {1} mal zu häufig verbaut -AUTO_CHECK_RESULT_TOO_MANY_BLOCKS=Die Blockkombination {0} wurde {1} mal zu häufig verbaut -AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS=Zu viele Blöcke ({0} > {1}) -AUTO_CHECK_RESULT_TOO_MANY_RECORDS=Keine Schallplatten erlaubt ({0} gefunden) -AUTO_CHECK_RESULT_FORBIDDEN_ITEM=In {0}s wurde das verbotene Item {1} {2} mal gefunden -AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT=In {0}s wurde das verbotene Item {1} {2} mal mit Custom-Tag gefunden -AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS=Ein Werfer enthält mehr als {0} Pfeile und Feuerbälle -AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS={0} Werfer enthält mehr als {1} Pfeile und Feuerbälle -AUTO_CHECK_RESULT_NBTS_WARNING={0} {1}s enthalten keine oder inkorrekte NBT-Daten -AUTO_CHECK_RESULT_NBT_WARNING=Ein(e) {0} enthält keine oder inkorrekte NBT-Daten +AUTO_CHECK_RESULT_NOT_LOAD=The schematic could not be loaded +AUTO_CHECK_RESULT_TOO_WIDE=The schematic is too wide ({0} > {1}) +AUTO_CHECK_RESULT_TOO_LONG=The schematic is too long ({0} > {1}) +AUTO_CHECK_RESULT_TOO_HIGH=The schematic is too high ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_BLOCK=The block {0} was used {1} times too often +AUTO_CHECK_RESULT_TOO_MANY_BLOCKS=The block combination {0} was used {1} times too often +AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS=Too many blocks ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_RECORDS=No records allowed ({0} found) +AUTO_CHECK_RESULT_FORBIDDEN_ITEM=In {0}s the forbidden item {1} {2} times was found +AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT=In {0}s the forbidden item {1} {2} times was found with custom tag +AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS=One launcher contains more than {0} arrows and fireballs +AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS={0} launchers contains more than {1} arrows and fireballs +AUTO_CHECK_RESULT_NBTS_WARNING={0} {1}s contain no or incorrect NBT data +AUTO_CHECK_RESULT_NBT_WARNING=One {0} contains no or incorrect NBT data. -SAFE_NODE_NOT_A_DIR=§cDie ausgewählte Schematic ist kein Ordner -SAFE_NODE_ALREADY_IN_DIRECTORY=§cDie Schematic gibt es bereits in diesem Ordner -SAFE_NODE_INVALID_NAME=§cDieser Name ist unzulässig -SAFE_NODE_NOT_OWNER=§cDu bist nicht der Besitzer dieser Schematic +SAFE_NODE_NOT_A_DIR=§cThe selected Schematic is not a folder +SAFE_NODE_ALREADY_IN_DIRECTORY=§cThe schematic is already available in this folder +SAFE_NODE_INVALID_NAME=§cThis name is illegal +SAFE_NODE_NOT_OWNER=§cYou are not the owner of this schematic diff --git a/SchematicSystem_Core/src/SchematicSystem_de.properties b/SchematicSystem_Core/src/SchematicSystem_de.properties new file mode 100644 index 0000000..e6c6994 --- /dev/null +++ b/SchematicSystem_Core/src/SchematicSystem_de.properties @@ -0,0 +1,199 @@ +ON=§aAn +OFF=§cAus +CHANGE=§7Zum Ändern +CLICK=§7anklicken +CURRENT=§7Aktuell: {0} +CONFIRM=§aBestätigen +CANCEL=§cAbbrechen + +UTIL_NAME_REQUIRED=§cDeine Ordner brauchen schon einen Namen +UTIL_NAME_TOO_LONG=§cDer Name der Schematic ist zu lang +UTIL_NAME_INVALID_CHAR=§cDer angegebene Schematicname enthält verbotene Zeichen +UTIL_NAME_FORBIDDEN=§cDer Pfad darf nicht \"§l{0}§c\" enthalten +UTIL_LIST_PATH=§7Aktueller Pfad: §e{0} +UTIL_LIST_BACK_HOVER=§eZurück gehen {0} +UTIL_LIST_FROM= §8von §7{0} +UTIL_LIST_OPEN_DIR=§eOrdner anzeigen +UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten +UTIL_LIST_REMOVE=[Entfernen] +UTIL_LIST_REMOVE_HOVER=§7Entferne dich von dem Ordner +UTIL_LIST_BACK_ARROW_HOVER=§eVorherige Seite +UTIL_LIST_NEXT= Seite ({0}/{0}) »» +UTIL_LIST_NEXT_HOVER=§eNächste Seite +UTIL_INFO_OWNER=§7Besitzer: §e{0} +UTIL_INFO_PARENT=§7Ordner: §e{0} +UTIL_INFO_UPDATED=§7Letzes Update: §e{0} +UTIL_INFO_TYPE=§7Typ: §e{0} +UTIL_INFO_RANK=§7Rang: §e{0} +UTIL_INFO_COLOR=§7Farbersetzung: {0} +UTIL_INFO_REPLAY=§7Replaywiedergabe: {0} +UTIL_INFO_STATUS=§cStatus: §c{0}: {1} +UTIL_INFO_MEMBER=§7Mitglieder: §e{0} +UTIL_INFO_ACTION_LOAD=[Laden] +UTIL_INFO_ACTION_LOAD_HOVER=§eSchematic laden +UTIL_INFO_ACTION_DOWNLOAD_HOVER=§eSchematic downloaden +UTIL_INFO_ACTION_TYPE=[Typ ändern] +UTIL_INFO_ACTION_TYPE_HOVER=§eSchematic Typ ändern +UTIL_INFO_ACTION_ADD=[Hinzufügen] +UTIL_INFO_ACTION_ADD_HOVER=§eMember hinzufügen +UTIL_INFO_ACTION_REMOVE=[Entfernen] +UTIL_INFO_ACTION_REMOVE_HOVER=§eMember entfernen +UTIL_INFO_ACTION_MOVE=[Verschieben] +UTIL_INFO_ACTION_MOVE_HOVER=§eSchematic verschieben +UTIL_INFO_ACTION_RENAME=[Umbenennen] +UTIL_INFO_ACTION_RENAME_HOVER=§eSchematic umbenennen +UTIL_INFO_ACTION_DELETE=[Löschen] +UTIL_INFO_ACTION_DELETE_HOVER=§eSchematic löschen +UTIL_LOAD_NOT_HERE=§cDu kannst hier keine Schematics laden +UTIL_LOAD_NOT_HERE_ALL=§cAuf diesem Bau können keine Schematics geladen werden +UTIL_LOAD_DIR=§cDu kannst keine Ordner Laden +UTIL_LOAD_DONE=§7Schematic §e{0} geladen +UTIL_LOAD_NO_DATA=§cEs konnte keine Daten in der Schematic gefunden werden +UTIL_LOAD_ERROR=§cDie Schematic konnte nicht geladen werden +UTIL_DOWNLOAD_PUNISHED=§cDu darf keine Schematics Downloaden: §f§l{0} +UTIL_DOWNLOAD_NOT_OWN=§cDu darfst nur deine eigenen Schematics herunterladen +UTIL_DOWNLOAD_LINK=Dein Download Link: +UTIL_TYPE_PUNISHED=§cDu darf keine Schematics einsenden: §f§l{0} +UTIL_TYPE_NOT_OWN=§cDu kannst nur deine eigenen Schematics einsenden +UTIL_TYPE_DIR=§cDu kannst keine Ordner einsenden +UTIL_TYPE_NOT_ASSIGNABLE=§cZu diesem Typen können keine Schematics geändert werden +UTIL_TYPE_ALREADY=§cDie Schematic hat schon diesen Typen +UTIL_TYPE_DONE=§aSchematictyp geändert +UTIL_TYPE_FIGHT_ALREADY=§cDu hast diese Schematic bereits eingesendet +UTIL_TYPE_AFTER_DEADLINE=§cVon diesem Typen können keine Schematics mehr eingesendet werden. Einsendeschluss war: {0} +UTIL_TYPE_ERROR=§cDie Schematic ist nicht regelkonform +UTIL_TYPE_EXTEND=§aDer Vorbereitungsserver wird gestartet +UTIL_SUBMIT_TITLE=Schematic ausfahren +UTIL_SUBMIT_REPLAY_ON=§aReplay erlaubt +UTIL_SUBMIT_REPLAY_OFF=§cReplay gesperrt +UTIL_SUBMIT_COLOR_ON=§aPink zu Teamfarbe ersetzen +UTIL_SUBMIT_COLOR_OFF=§cPink nicht ersetzen +UTIL_SUBMIT_DIRECT=§eDirekt einsenden +UTIL_SUBMIT_DIRECT_DONE=§aDie Schematic wird zeitnah überprüft +UTIL_SUBMIT_EXTEND=§eSchematic ausfahren +UTIL_SUBMIT_EXTEND_DONE=§aDer Vorbereitungsserver wird gestartet + +COMMAND_NOT_FOLDER=Das ist eine Schematic und kein Ordner +COMMAND_ENTER_NAME=Namen eingeben +COMMAND_PUNISHMENT_NO_SAVE_EXTERNAL=§cDu kannst nicht auf anderen Baus Schematics machen +COMMAND_PUNISHMENT_NO_SAVE=§cAuf diesem Bau können keine Schematics gemacht werden +COMMAND_SAVE_NO_NAME=§cDu must auch einen Namen für die Schematic nach dem Ordner angeben +COMMAND_SAVE_FOLDER=§cDie Schematic ist ein Ordner +COMMAND_SAVE_NO_OVERWRITE=§cDu darfst diese Schematic nicht überschreiben +COMMAND_SAVE_CLIPBOARD_EMPTY=§cDein Clipboard ist leer +COMMAND_SAVE_ERROR=§cFehler beim Speichern der Schematic +COMMAND_SAVE_DONE=Schematic §e{0} §7gespeichert +COMMAND_SAVE_OVERWRITE=Schematic §e{0} §7überschrieben +COMMAND_ADD_PUNISH=§cDu darfst niemanden auf deine Schematics hinzufügen: §f§l{0} +COMMAND_ADD_NOT_OWNER=§cDu kannst nur auf deine eigenen Sachen jemanden hinzufügen +COMMAND_ADD_USER_PUNISHED=§c{0} darf nicht auf Schematics hinzugefügt werden +COMMAND_ADD_OWN=§cAlso bitte: Das ist deine eigene Schematic! +COMMAND_ADD_PUBLIC=§cFür Public-Anträge bitte bei der Moderation melden +COMMAND_ADD_ALREADY=§c{0} ist bereits auf diese Schematic geaddet +COMMAND_ADD_ADDED=Du hast nun Zugriff auf die Schematic §e{0} §7von §e{1} +COMMAND_ADD_NONE=§cEs wurde kein Spieler hinzugefügt +COMMAND_ADD_ONE=§7Der Spieler §e{0} wurde auf die Schematic hinzugefügt +COMMAND_ADD_MANY=§7Die Spieler §e{0} wurden auf die Schematic hinzugefügt +COMMAND_DELMEM_NOT_OWN=§cDu kannst nur auf deine eigenen Sachen jemanden entfernen +COMMAND_DELMEM_DONE=Der Spieler §e{0} §7hat nun keinen Zugriff mehr auf die Schematic §e{1} +COMMAND_DELMEM_DELETED=§cDu hast nun keinen Zugriff mehr auf die Schematic §e{0} §7von §e{1} +COMMAND_SEARCH_NOT_A_PLAYER=§cDer Spieler §e{0} §cexistiert nicht +COMMAND_LOCKREPLAY=Replays von Kämpfen mit {0} können ab sofort nicht mehr betrachtet werden +COMMAND_REPLACE_COLOR_OFF=In Kämpfen {0} werden pinke Blöcke nicht ersetzt +COMMAND_REPLACE_COLOR_ON=In Kämpfen {0} werden pinke Blöcke ersetzt +COMMAND_DIR_DONE=§7Ordner §e{0} §7erstellt +COMMAND_CHANGE_TYPE_NOT_OWNER=§cDu kannst nur deine eigenen Schematics einsenden +COMMAND_CHANGE_TYPE_SELECT=§eTyp auswählen +COMMAND_MOVE_NOT_OWN=§cDu kannst nur deine eigenen Schems verschieben +COMMAND_MOVE_RECURSIVE=§cDas gibt nur Fehler, vertrau mir +COMMAND_MOVE_DONE=§7Die Schematic ist nun unter §e{0} §7zu finden +COMMAND_RENAME_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_RENAME_DONE=§7Die Schematic heist nun §e{0} +COMMAND_ADD_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_ADD_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team +COMMAND_DEL_TEAM_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_DEL_TEAM_NOT_IN_TEAM=§cDu bist in keinem Team +COMMAND_DEL_TEAM_NONE=§7Es wurde kein Spieler entfernt +COMMAND_DEL_TEAM_DONE=§7Der Spieler §e{0} §7wurden von der Schematic entfernt +COMMAND_CLEAR_MEMBER_NOT_OWN=§cDas kannst du nur bei deinen eigenen Schems machen +COMMAND_CLEAR_MEMBER_DONE=§7Alle Spieler wurden von der Schematic entfernt +COMMAND_DEL_ALL_MEMBER=§e{0} §7wurde von §e{1} §7Schematics entfernt +COMMAND_PUBLIC_ON=§aDu bist nun der Public User +COMMAND_PUBLIC_OFF=§cDu bist nun nicht mehr der Public User +COMMAND_DELETE_NOT_OWN=§cDie Schematic gehört dir nicht +COMMAND_DELETE_MEMBER=§aDu hast dich von der Schematic entfernt +COMMAND_DELETE_DIR=§aDer Ordner §e{0}§a wird gelöscht... +COMMAND_DELETE_DIR_FULL=§cDer Ordner muss leer sein, um ihn zu löschen +COMMAND_DELETE_SCHEM=§aDie Schematic §e{0}§a wird gelöscht... + +HELP_HEADER=§e§lSchematicSystem §8§lHilfe +HELP_VIEW=Finden & Laden +HELP_VIEW_HOVER=Suche oder lade Schematics +HELP_VIEW_1=§8/§7schem §einfo §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic +HELP_VIEW_2=§8/§7schem §elist §8- §7Zeigt dir deine Schematics an +HELP_VIEW_3=§8/§7schem §elist public §8- §7Zeigt alle Public-Schematics +HELP_VIEW_4=§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passenden Schematics +HELP_VIEW_5=§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic +HELP_VIEW_6=§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig) +HELP_EDIT=Speichern & Bearbeiten +HELP_EDIT_HOVER=Modifizierung von Schematics und Ordnern +HELP_EDIT_1=§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic +HELP_EDIT_2=§8/§7schem §eordner §8[§7Ordner§8] - §7Erstelle einen leeren Ordner +HELP_EDIT_3=§8/§7schem §emove §8[§7Schematic§8] [§7Neuer Pfad§8] - §7Verschiebe eine Schematic +HELP_EDIT_4=§8/§7schem §erename §8[§7Schematic§8] [§7Neuer Name§8] - §7Gib der Schematic einen neuen Namen +HELP_EDIT_5=§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic +HELP_EDIT_6=§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic +HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena +HELP_EDIT_8=§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic +HELP_SHARE=Besitzrechte +HELP_SHARE_HOVER=Schematics mit anderen teilen +HELP_SHARE_1=§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu +HELP_SHARE_2=§8/§7schem §edelmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic +HELP_SHARE_3=§8/§7schem §eclearmember §8[§7Schematic§8] - §7Entfernt alle Spieler von der Schematic +HELP_SHARE_4=§8/§7schem §edelallmember §8[§7Spieler§8] - §7Entfernt einen Spieler von allen deinen Schematics +HELP_SHARE_5=§8/§7schem §eaddteam §8[§7Schematic§8] - §7Füge jeden aus deinem Team auf die Schematic hinzu +HELP_SHARE_6=§8/§7schem §edelteam §8[§7Schematic§8] - §7Entferne jeden aus deinem Team von der Schematic + +GUI_TITLE=Schematics \{1\} +GUI_FOLDER_PROPERTIES=§7Ordnereigenschaften +GUI_INFO_LOAD=§eLaden +GUI_INFO_BACK=§eZurück +GUI_INFO_STATUS=§eStatus {0} +GUI_INFO_COLOR=Farbersetzung +GUI_INFO_REPLAY=Replay Wiedergabe +GUI_INFO_REPLAY_OFF=§7Zum §lAusschalten +GUI_INFO_REPLAY_TITLE=Wiedergabe dauerhaft sperren +GUI_INFO_MEMBER=§eMitglieder +GUI_INFO_MOVE=§eVerschieben +GUI_INFO_RENAME=§eUmbenennen +GUI_INFO_RENAME_TITLE={0} umbenennen +GUI_INFO_DELETE=§cLöschen +GUI_INFO_MEMBER_FROM=§7von §e{0} +GUI_INFO_MEMBER_REMOVE=§cZugriff entfernen +GUI_CHANGE_TYPE=Typ ändern +GUI_DELETE_OWN_DELETED=Schematic §e{0} §7gelöscht +GUI_DELETE_OWN_TITLE={0} löschen +GUI_DELETE_MEMBER_TITLE={0} entfernen +GUI_DELETE_MEMBER_DONE=Zugriff zu Schematic §e{0} §7entfernt +GUI_DELETE_MEMBERS_TITLE=Mitglieder entfernen +GUI_CHANGE_ITEM=Item ändern + +AUTO_CHECK_RESULT_NOT_LOAD=Die Schematic konnte nicht geladen werden +AUTO_CHECK_RESULT_TOO_WIDE=Die Schematic ist zu breit ({0} > {1}) +AUTO_CHECK_RESULT_TOO_LONG=Die Schematic ist zu lang ({0} > {1}) +AUTO_CHECK_RESULT_TOO_HIGH=Die Schematic ist zu hoch ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_BLOCK=Der Block {0} wurde {1} mal zu häufig verbaut +AUTO_CHECK_RESULT_TOO_MANY_BLOCKS=Die Blockkombination {0} wurde {1} mal zu häufig verbaut +AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS=Zu viele Blöcke ({0} > {1}) +AUTO_CHECK_RESULT_TOO_MANY_RECORDS=Keine Schallplatten erlaubt ({0} gefunden) +AUTO_CHECK_RESULT_FORBIDDEN_ITEM=In {0}s wurde das verbotene Item {1} {2} mal gefunden +AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT=In {0}s wurde das verbotene Item {1} {2} mal mit Custom-Tag gefunden +AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS=Ein Werfer enthält mehr als {0} Pfeile und Feuerbälle +AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS={0} Werfer enthält mehr als {1} Pfeile und Feuerbälle +AUTO_CHECK_RESULT_NBTS_WARNING={0} {1}s enthalten keine oder inkorrekte NBT-Daten +AUTO_CHECK_RESULT_NBT_WARNING=Ein(e) {0} enthält keine oder inkorrekte NBT-Daten + +SAFE_NODE_NOT_A_DIR=§cDie ausgewählte Schematic ist kein Ordner +SAFE_NODE_ALREADY_IN_DIRECTORY=§cDie Schematic gibt es bereits in diesem Ordner +SAFE_NODE_INVALID_NAME=§cDieser Name ist unzulässig +SAFE_NODE_NOT_OWNER=§cDu bist nicht der Besitzer dieser Schematic diff --git a/SchematicSystem_Core/src/SchematicSystem_en.properties b/SchematicSystem_Core/src/SchematicSystem_en.properties deleted file mode 100644 index e69de29..0000000 From 52a154a6c448d19c0b9db2b7e515dad87c346997 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 1 Jun 2022 22:19:57 +0200 Subject: [PATCH 11/16] Hotfix: Message --- SchematicSystem_Core/src/SchematicSystem.properties | 2 +- .../schematicsystem/commands/SchematicCommandUtils.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index f7772fd..a1b4d21 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -54,7 +54,7 @@ UTIL_INFO_ACTION_MOVE=[Move] UTIL_INFO_ACTION_MOVE_HOVER=§eMove schematic UTIL_INFO_ACTION_RENAME=[Rename] UTIL_INFO_ACTION_RENAME_HOVER=§eRename schematic -UTIL_INFO_ACTION_DELETE=[Delete] +UTIL_INFO_ACTION_DELETE=[Delete] UTIL_INFO_ACTION_DELETE_HOVER=§eDelete schematic UTIL_LOAD_NOT_HERE=§cYou cannot load schematics here UTIL_LOAD_NOT_HERE_ALL=§cSchematics cannot be loaded on this build diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index cecee5f..c347964 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -104,14 +104,14 @@ public class SchematicCommandUtils { StringBuilder nodeString = new StringBuilder(); if (node.isDir()) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)).append(" "); } else { SchematicType type = node.getSchemtype(); if (type != SchematicType.Normal) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())).append(" "); } } - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)).append(" "); nodeString.append(behavior.getRenderHook().apply(node.getName())); From 2cad972c5c378d452761757c7a9b79011b25f4dd Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 1 Jun 2022 22:23:34 +0200 Subject: [PATCH 12/16] Hotfix: Message #2 --- SchematicSystem_Core/src/SchematicSystem.properties | 4 ++-- SchematicSystem_Core/src/SchematicSystem_de.properties | 4 ++-- .../schematicsystem/commands/SchematicCommandUtils.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index a1b4d21..f72591e 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -17,8 +17,8 @@ UTIL_LIST_BACK=§e../ UTIL_LIST_BACK_HOVER=§eBack {0} UTIL_LIST_DIR=§7§lDIR UTIL_LIST_TYPE=§8§l{0} -UTIL_LIST_BASE= §e -UTIL_LIST_FROM= §8Owner §7{0} +UTIL_LIST_BASE=§l §e +UTIL_LIST_FROM=§l §8Owner §7{0} UTIL_LIST_OPEN_DIR=§eShow directory UTIL_LIST_OPEN_SCHEM=§eManage schematics UTIL_LIST_REMOVE=[Remove] diff --git a/SchematicSystem_Core/src/SchematicSystem_de.properties b/SchematicSystem_Core/src/SchematicSystem_de.properties index e6c6994..364e4d7 100644 --- a/SchematicSystem_Core/src/SchematicSystem_de.properties +++ b/SchematicSystem_Core/src/SchematicSystem_de.properties @@ -12,7 +12,7 @@ UTIL_NAME_INVALID_CHAR=§cDer angegebene Schematicname enthält verbotene Zeiche UTIL_NAME_FORBIDDEN=§cDer Pfad darf nicht \"§l{0}§c\" enthalten UTIL_LIST_PATH=§7Aktueller Pfad: §e{0} UTIL_LIST_BACK_HOVER=§eZurück gehen {0} -UTIL_LIST_FROM= §8von §7{0} +UTIL_LIST_FROM=§l §8von §7{0} UTIL_LIST_OPEN_DIR=§eOrdner anzeigen UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten UTIL_LIST_REMOVE=[Entfernen] @@ -42,7 +42,7 @@ UTIL_INFO_ACTION_MOVE=[Verschieben] UTIL_INFO_ACTION_MOVE_HOVER=§eSchematic verschieben UTIL_INFO_ACTION_RENAME=[Umbenennen] UTIL_INFO_ACTION_RENAME_HOVER=§eSchematic umbenennen -UTIL_INFO_ACTION_DELETE=[Löschen] +UTIL_INFO_ACTION_DELETE=[Löschen] UTIL_INFO_ACTION_DELETE_HOVER=§eSchematic löschen UTIL_LOAD_NOT_HERE=§cDu kannst hier keine Schematics laden UTIL_LOAD_NOT_HERE_ALL=§cAuf diesem Bau können keine Schematics geladen werden diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index c347964..cecee5f 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -104,14 +104,14 @@ public class SchematicCommandUtils { StringBuilder nodeString = new StringBuilder(); if (node.isDir()) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)).append(" "); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)); } else { SchematicType type = node.getSchemtype(); if (type != SchematicType.Normal) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())).append(" "); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())); } } - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)).append(" "); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)); nodeString.append(behavior.getRenderHook().apply(node.getName())); From 93ec17f92943ab08b5327928ac7d175c05a289f4 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 1 Jun 2022 22:25:13 +0200 Subject: [PATCH 13/16] Hotfix: Message #3 --- SchematicSystem_Core/src/SchematicSystem.properties | 4 ++-- SchematicSystem_Core/src/SchematicSystem_de.properties | 2 +- .../schematicsystem/commands/SchematicCommandUtils.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index f72591e..100f34c 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -17,8 +17,8 @@ UTIL_LIST_BACK=§e../ UTIL_LIST_BACK_HOVER=§eBack {0} UTIL_LIST_DIR=§7§lDIR UTIL_LIST_TYPE=§8§l{0} -UTIL_LIST_BASE=§l §e -UTIL_LIST_FROM=§l §8Owner §7{0} +UTIL_LIST_BASE=§e +UTIL_LIST_FROM=§8Owner §7{0} UTIL_LIST_OPEN_DIR=§eShow directory UTIL_LIST_OPEN_SCHEM=§eManage schematics UTIL_LIST_REMOVE=[Remove] diff --git a/SchematicSystem_Core/src/SchematicSystem_de.properties b/SchematicSystem_Core/src/SchematicSystem_de.properties index 364e4d7..d70518b 100644 --- a/SchematicSystem_Core/src/SchematicSystem_de.properties +++ b/SchematicSystem_Core/src/SchematicSystem_de.properties @@ -12,7 +12,7 @@ UTIL_NAME_INVALID_CHAR=§cDer angegebene Schematicname enthält verbotene Zeiche UTIL_NAME_FORBIDDEN=§cDer Pfad darf nicht \"§l{0}§c\" enthalten UTIL_LIST_PATH=§7Aktueller Pfad: §e{0} UTIL_LIST_BACK_HOVER=§eZurück gehen {0} -UTIL_LIST_FROM=§l §8von §7{0} +UTIL_LIST_FROM=§8von §7{0} UTIL_LIST_OPEN_DIR=§eOrdner anzeigen UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten UTIL_LIST_REMOVE=[Entfernen] diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index cecee5f..e21de74 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -104,11 +104,11 @@ public class SchematicCommandUtils { StringBuilder nodeString = new StringBuilder(); if (node.isDir()) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)).append(" "); } else { SchematicType type = node.getSchemtype(); if (type != SchematicType.Normal) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())); + nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.name())).append(" "); } } nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)); @@ -120,7 +120,7 @@ public class SchematicCommandUtils { } if (node.getOwner() != user.getId()) { - nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_FROM", player, SteamwarUser.get(node.getOwner()).getUserName())); + nodeString.append(" ").append(SchematicSystem.MESSAGE.parse("UTIL_LIST_FROM", player, SteamwarUser.get(node.getOwner()).getUserName())); } TextComponent schematics = new TextComponent(nodeString.toString()); From 88a7b664224dec92ddd780312f251906d8b88410 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 1 Jun 2022 22:28:11 +0200 Subject: [PATCH 14/16] Hotfix: Message #4 --- SchematicSystem_Core/src/SchematicSystem.properties | 2 +- SchematicSystem_Core/src/SchematicSystem_de.properties | 2 +- .../schematicsystem/commands/SchematicCommandUtils.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem_Core/src/SchematicSystem.properties index 100f34c..f3a2f19 100644 --- a/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem_Core/src/SchematicSystem.properties @@ -25,7 +25,7 @@ UTIL_LIST_REMOVE=[Remove] UTIL_LIST_REMOVE_HOVER=§7Remove yourself from the directory UTIL_LIST_BACK_ARROW=«« UTIL_LIST_BACK_ARROW_HOVER=§ePrevious page -UTIL_LIST_NEXT= Page ({0}/{0}) »» +UTIL_LIST_NEXT=Page ({0}/{1}) »» UTIL_LIST_NEXT_HOVER=§eNext page UTIL_INFO_SCHEM=§7Schematic: §e{0} UTIL_INFO_NAME=§7Name: §e{0} diff --git a/SchematicSystem_Core/src/SchematicSystem_de.properties b/SchematicSystem_Core/src/SchematicSystem_de.properties index d70518b..a9d085d 100644 --- a/SchematicSystem_Core/src/SchematicSystem_de.properties +++ b/SchematicSystem_Core/src/SchematicSystem_de.properties @@ -18,7 +18,7 @@ UTIL_LIST_OPEN_SCHEM=§eSchematic verwalten UTIL_LIST_REMOVE=[Entfernen] UTIL_LIST_REMOVE_HOVER=§7Entferne dich von dem Ordner UTIL_LIST_BACK_ARROW_HOVER=§eVorherige Seite -UTIL_LIST_NEXT= Seite ({0}/{0}) »» +UTIL_LIST_NEXT=Seite ({0}/{1}) »» UTIL_LIST_NEXT_HOVER=§eNächste Seite UTIL_INFO_OWNER=§7Besitzer: §e{0} UTIL_INFO_PARENT=§7Ordner: §e{0} diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index e21de74..d0fd9e8 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -144,6 +144,7 @@ public class SchematicCommandUtils { } TextComponent beforePage = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_BACK_ARROW", false, player); + beforePage.addExtra(" "); if (chunk > 0) { beforePage.setColor(ChatColor.YELLOW); beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_BACK_ARROW_HOVER", false, player)})); From 94f91840941a84a74c267df7ac19ef9d4c1b7a6f Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 7 Jun 2022 20:48:20 +0200 Subject: [PATCH 15/16] Update Network Protocol --- .../schematicsystem/commands/SchematicCommandUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java index d0fd9e8..18b3140 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -19,9 +19,10 @@ package de.steamwar.schematicsystem.commands; -import de.steamwar.comms.packets.PrepareSchemPacket; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; +import de.steamwar.network.NetworkSender; +import de.steamwar.network.packets.client.PrepareSchemPacket; import de.steamwar.providers.BauServerInfo; import de.steamwar.schematicsystem.AutoCheckResult; import de.steamwar.schematicsystem.CheckSchemType; @@ -37,7 +38,6 @@ import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.IntFunction; import java.util.function.UnaryOperator; @@ -410,7 +410,7 @@ public class SchematicCommandUtils { if (extend == null) { submitSchemGUI(player, node, type); } else if (extend == SchematicCommand.Extend.AUSFAHREN) { - new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); + NetworkSender.send(new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()).getId(), node.getId(), type.toDB())); SchematicSystem.MESSAGE.send("UTIL_TYPE_EXTEND", player); } } @@ -432,7 +432,7 @@ public class SchematicCommandUtils { player.closeInventory(); }); inv.setItem(8, SWItem.getDye(10), (byte) 10, SchematicSystem.MESSAGE.parse("UTIL_SUBMIT_EXTEND", player), click -> { - new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); + NetworkSender.send(new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()).getId(), node.getId(), type.toDB())); SchematicSystem.MESSAGE.send("UTIL_SUBMIT_EXTEND_DONE", player); player.closeInventory(); }); From 3ae6387cae4e9f37bae0f3ed4c223b84086daae8 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 13 Jun 2022 22:20:49 +0200 Subject: [PATCH 16/16] Hotfix cannot find property --- .../src/de/steamwar/schematicsystem/AutoCheckResult.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java index 2f69c9e..994324e 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/AutoCheckResult.java @@ -67,7 +67,7 @@ public class AutoCheckResult { for(Map.Entry, Integer> entry : limitedMaterials.entrySet()) { if(entry.getValue() < 0) { - errors.put((entry.getKey().size() == 1 ? "AUTO_CHECK_RESULT_TOO_MANY_BLOCK " : "AUTO_CHECK_RESULT_TOO_MANY_BLOCKS"), new Object[]{String.join(" ", entry.getKey()), -entry.getValue()}); + errors.put((entry.getKey().size() == 1 ? "AUTO_CHECK_RESULT_TOO_MANY_BLOCK" : "AUTO_CHECK_RESULT_TOO_MANY_BLOCKS"), new Object[]{String.join(" ", entry.getKey()), -entry.getValue()}); } }