diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fd2792b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,44 @@ +* text eol=lf + +*.[jJ][aA][rR] binary + +*.[pP][nN][gG] binary +*.[jJ][pP][gG] binary +*.[jJ][pP][eE][gG] binary +*.[gG][iI][fF] binary +*.[tT][iI][fF] binary +*.[tT][iI][fF][fF] binary +*.[iI][cC][oO] binary +*.[sS][vV][gG] text +*.[eE][pP][sS] binary +*.[xX][cC][fF] binary + +*.[kK][aA][rR] binary +*.[mM]4[aA] binary +*.[mM][iI][dD] binary +*.[mM][iI][dD][iI] binary +*.[mM][pP]3 binary +*.[oO][gG][gG] binary +*.[rR][aA] binary + +*.7[zZ] binary +*.[gG][zZ] binary +*.[tT][aA][rR] binary +*.[tT][gG][zZ] binary +*.[zZ][iI][pP] binary + +*.[tT][cC][nN] binary +*.[sS][oO] binary +*.[dD][lL][lL] binary +*.[dD][yY][lL][iI][bB] binary +*.[pP][sS][dD] binary +*.[tT][tT][fF] binary +*.[oO][tT][fF] binary + +*.[pP][aA][tT][cC][hH] -text + +*.[bB][aA][tT] text eol=crlf +*.[cC][mM][dD] text eol=crlf +*.[pP][sS]1 text eol=crlf + +*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary diff --git a/build.gradle b/build.gradle index c09bee2..18afe43 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,44 @@ -//version: 1652851397 +//version: 1675013090 /* -DO NOT CHANGE THIS FILE! - -Also, you may replace this file at any time if there is an update available. -Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/build.gradle for updates. -*/ + DO NOT CHANGE THIS FILE! + Also, you may replace this file at any time if there is an update available. + Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/master/build.gradle for updates. + */ +import com.diffplug.blowdryer.Blowdryer import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar +import com.matthewprenger.cursegradle.CurseArtifact +import com.matthewprenger.cursegradle.CurseRelation +import com.modrinth.minotaur.dependencies.ModDependency +import com.modrinth.minotaur.dependencies.VersionDependency import org.gradle.internal.logging.text.StyledTextOutput.Style import org.gradle.internal.logging.text.StyledTextOutputFactory +import org.jetbrains.gradle.ext.* +import java.nio.file.Files +import java.nio.file.Paths import java.util.concurrent.TimeUnit +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream buildscript { repositories { + mavenLocal() + mavenCentral() + maven { name 'forge' url 'https://maven.minecraftforge.net' } + maven { + // GTNH RetroFuturaGradle and ASM Fork + name "GTNH Maven" + url "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" + allowInsecureProtocol = true + } maven { name 'sonatype' url 'https://oss.sonatype.org/content/repositories/snapshots/' @@ -28,31 +47,31 @@ buildscript { name 'Scala CI dependencies' url 'https://repo1.maven.org/maven2/' } - maven { - name 'jitpack' - url 'https://jitpack.io' - } - } - dependencies { - classpath 'com.github.GTNewHorizons:ForgeGradle:1.2.7' } } - plugins { id 'java-library' - id 'idea' + id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.7" id 'eclipse' id 'scala' id 'maven-publish' - id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false - id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false - id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false - id 'org.ajoberstar.grgit' version '4.1.1' - id 'com.github.johnrengelman.shadow' version '4.0.4' - id 'com.palantir.git-version' version '0.13.0' apply false - id 'de.undercouch.download' version '5.0.1' - id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false + id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false + id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false + id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false + id 'org.ajoberstar.grgit' version '4.1.1' // 4.1.1 is the last jvm8 supporting version ,unused, available for addon.gradle + id 'com.github.johnrengelman.shadow' version '7.1.2' apply false + id 'com.palantir.git-version' version '0.13.0' apply false // 0.13.0 is the last jvm8 supporting version + id 'de.undercouch.download' version '5.3.0' + id 'com.github.gmazzo.buildconfig' version '3.1.0' apply false // Unused, available for addon.gradle + id 'com.diffplug.spotless' version '6.7.2' apply false + id 'com.modrinth.minotaur' version '2.+' apply false + id 'com.matthewprenger.cursegradle' version '1.4.0' apply false + id 'com.gtnewhorizons.retrofuturagradle' version '1.0.18' } +boolean settingsupdated = verifySettingsGradle() +settingsupdated = verifyGitAttributes() || settingsupdated +if (settingsupdated) + throw new GradleException("Settings has been updated, please re-run task.") if (project.file('.git/HEAD').isFile()) { apply plugin: 'com.palantir.git-version' @@ -60,27 +79,9 @@ if (project.file('.git/HEAD').isFile()) { def out = services.get(StyledTextOutputFactory).create('an-output') -apply plugin: 'forge' - def projectJavaVersion = JavaLanguageVersion.of(8) -java { - toolchain { - languageVersion.set(projectJavaVersion) - } -} - -idea { - module { - inheritOutputDirs = true - downloadJavadoc = true - downloadSources = true - } -} - -if(JavaVersion.current() != JavaVersion.VERSION_1_8) { - throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current()) -} +boolean disableSpotless = project.hasProperty("disableSpotless") ? project.disableSpotless.toBoolean() : false checkPropertyExists("modName") checkPropertyExists("modId") @@ -89,10 +90,7 @@ checkPropertyExists("autoUpdateBuildScript") checkPropertyExists("minecraftVersion") checkPropertyExists("forgeVersion") checkPropertyExists("replaceGradleTokenInFile") -checkPropertyExists("gradleTokenModId") -checkPropertyExists("gradleTokenModName") checkPropertyExists("gradleTokenVersion") -checkPropertyExists("gradleTokenGroupName") checkPropertyExists("apiPackage") checkPropertyExists("accessTransformersFile") checkPropertyExists("usesMixins") @@ -103,68 +101,175 @@ checkPropertyExists("containsMixinsAndOrCoreModOnly") checkPropertyExists("usesShadowedDependencies") checkPropertyExists("developmentEnvironmentUserName") -boolean noPublishedSources = project.findProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false -boolean usesMixinDebug = project.findProperty('usesMixinDebug') ?: project.usesMixins.toBoolean() +propertyDefaultIfUnset("generateGradleTokenClass", "") +propertyDefaultIfUnset("includeWellKnownRepositories", true) +propertyDefaultIfUnset("noPublishedSources", false) +propertyDefaultIfUnset("usesMixinDebug", project.usesMixins) +propertyDefaultIfUnset("forceEnableMixins", false) +propertyDefaultIfUnset("channel", "stable") +propertyDefaultIfUnset("mappingsVersion", "12") +propertyDefaultIfUnset("modrinthProjectId", "") +propertyDefaultIfUnset("modrinthRelations", "") +propertyDefaultIfUnset("curseForgeProjectId", "") +propertyDefaultIfUnset("curseForgeRelations", "") +propertyDefaultIfUnset("minimizeShadowedDependencies", true) +// Deprecated properties (kept for backwards compat) +propertyDefaultIfUnset("gradleTokenModId", "") +propertyDefaultIfUnset("gradleTokenModName", "") +propertyDefaultIfUnset("gradleTokenGroupName", "") + +propertyDefaultIfUnset("enableModernJavaSyntax", false) // On by default for new projects only +propertyDefaultIfUnset("enableGenericInjection", false) // On by default for new projects only + +project.extensions.add(Blowdryer, "Blowdryer", Blowdryer) // Make blowdryer available in "apply from:" scripts +if (!disableSpotless) { + apply plugin: 'com.diffplug.spotless' + apply from: Blowdryer.file('spotless.gradle') +} String javaSourceDir = "src/main/java/" String scalaSourceDir = "src/main/scala/" String kotlinSourceDir = "src/main/kotlin/" -String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") -String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") -String targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") -if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { +if (usesShadowedDependencies.toBoolean()) { + apply plugin: "com.github.johnrengelman.shadow" +} + +java { + toolchain { + if (enableModernJavaSyntax.toBoolean()) { + languageVersion.set(JavaLanguageVersion.of(17)) + } else { + languageVersion.set(projectJavaVersion) + } + vendor.set(JvmVendorSpec.ADOPTIUM) + } + if (!noPublishedSources) { + withSourcesJar() + } +} + +configurations { + create("runtimeOnlyNonPublishable") { + description = "Runtime only dependencies that are not published alongside the jar" + canBeConsumed = false + canBeResolved = false + } +} + +if (enableModernJavaSyntax.toBoolean()) { + dependencies { + annotationProcessor 'com.github.bsideup.jabel:jabel-javac-plugin:1.0.0' + compileOnly('com.github.bsideup.jabel:jabel-javac-plugin:1.0.0') { + transitive = false // We only care about the 1 annotation class + } + } + + tasks.withType(JavaCompile).configureEach { + if (it.name in ["compileMcLauncherJava", "compilePatchedMcJava"]) { + return + } + sourceCompatibility = 17 // for the IDE support + options.release.set(8) + + javaCompiler.set(javaToolchains.compilerFor { + languageVersion.set(JavaLanguageVersion.of(17)) + vendor.set(JvmVendorSpec.ADOPTIUM) + }) + } +} + +eclipse { + classpath { + downloadSources = true + downloadJavadoc = true + } +} + +final String modGroupPath = modGroup.toString().replace('.' as char, '/' as char) +final String apiPackagePath = apiPackage.toString().replace('.' as char, '/' as char) + +String targetPackageJava = javaSourceDir + modGroupPath +String targetPackageScala = scalaSourceDir + modGroupPath +String targetPackageKotlin = kotlinSourceDir + modGroupPath +if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin) } -if(apiPackage) { - targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") - targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") - targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") - if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { +if (apiPackage) { + targetPackageJava = javaSourceDir + modGroupPath + "/" + apiPackagePath + targetPackageScala = scalaSourceDir + modGroupPath + "/" + apiPackagePath + targetPackageKotlin = kotlinSourceDir + modGroupPath + "/" + apiPackagePath + if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin) } } -if(accessTransformersFile) { +if (accessTransformersFile) { String targetFile = "src/main/resources/META-INF/" + accessTransformersFile - if(!getFile(targetFile).exists()) { + if (!getFile(targetFile).exists()) { throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile) } -} - -if(usesMixins.toBoolean()) { - if(mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) { - throw new GradleException("\"mixinPlugin\" requires \"mixinsPackage\" and \"mixinPlugin\" to be set!") + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(targetFile) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(targetFile) +} else { + boolean atsFound = false + for (File at : sourceSets.getByName("main").resources.files) { + if (at.name.toLowerCase().endsWith("_at.cfg")) { + atsFound = true + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(at) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(at) + } } - - targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/") - targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/") - targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/") - if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { - throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin) + for (File at : sourceSets.getByName("api").resources.files) { + if (at.name.toLowerCase().endsWith("_at.cfg")) { + atsFound = true + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(at) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(at) + } } - - String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java" - String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".scala" - String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java" - String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".kt" - if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) { - throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin) + if (atsFound) { + logger.warn("Found and added access transformers in the resources folder, please configure gradle.properties to explicitly mention them by name") } } -if(coreModClass) { - String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java" - String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".scala" - String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java" - String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".kt" - if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) { +if (usesMixins.toBoolean()) { + if (mixinsPackage.isEmpty()) { + throw new GradleException("\"usesMixins\" requires \"mixinsPackage\" to be set!") + } + final String mixinPackagePath = mixinsPackage.toString().replaceAll("\\.", "/") + final String mixinPluginPath = mixinPlugin.toString().replaceAll("\\.", "/") + + targetPackageJava = javaSourceDir + modGroupPath + "/" + mixinPackagePath + targetPackageScala = scalaSourceDir + modGroupPath + "/" + mixinPackagePath + targetPackageKotlin = kotlinSourceDir + modGroupPath + "/" + mixinPackagePath + if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) { + throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin) + } + + if (!mixinPlugin.isEmpty()) { + String targetFileJava = javaSourceDir + modGroupPath + "/" + mixinPluginPath + ".java" + String targetFileScala = scalaSourceDir + modGroupPath + "/" + mixinPluginPath + ".scala" + String targetFileScalaJava = scalaSourceDir + modGroupPath + "/" + mixinPluginPath + ".java" + String targetFileKotlin = kotlinSourceDir + modGroupPath + "/" + mixinPluginPath + ".kt" + if (!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) { + throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin) + } + } +} + +if (coreModClass) { + final String coreModPath = coreModClass.toString().replaceAll("\\.", "/") + String targetFileJava = javaSourceDir + modGroupPath + "/" + coreModPath + ".java" + String targetFileScala = scalaSourceDir + modGroupPath + "/" + coreModPath + ".scala" + String targetFileScalaJava = scalaSourceDir + modGroupPath + "/" + coreModPath + ".java" + String targetFileKotlin = kotlinSourceDir + modGroupPath + "/" + coreModPath + ".kt" + if (!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) { throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin) } } -configurations.all { +configurations.configureEach { resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS) // Make sure GregTech build won't time out @@ -189,142 +294,238 @@ try { catch (Exception ignored) { out.style(Style.Failure).text( 'This mod must be version controlled by Git AND the repository must provide at least one tag,\n' + - 'or the VERSION override must be set! ').style(Style.SuccessHeader).text('(Do NOT download from GitHub using the ZIP option, instead\n' + + 'or the VERSION override must be set! ').style(Style.SuccessHeader).text('(Do NOT download from GitHub using the ZIP option, instead\n' + 'clone the repository, see ').style(Style.Info).text('https://gtnh.miraheze.org/wiki/Development').style(Style.SuccessHeader).println(' for details.)' ) versionOverride = 'NO-GIT-TAG-SET' identifiedVersion = versionOverride } -version = minecraftVersion + '-' + identifiedVersion +version = identifiedVersion ext { modVersion = identifiedVersion } -if(identifiedVersion == versionOverride) { +if (identifiedVersion == versionOverride) { out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7') } group = modGroup -if(project.hasProperty("customArchiveBaseName") && customArchiveBaseName) { +if (project.hasProperty("customArchiveBaseName") && customArchiveBaseName) { archivesBaseName = customArchiveBaseName -} -else { +} else { archivesBaseName = modId } -def arguments = [] -def jvmArguments = [] - -if (usesMixins.toBoolean()) { - arguments += [ - "--tweakClass org.spongepowered.asm.launch.MixinTweaker" - ] - if (usesMixinDebug.toBoolean()) { - jvmArguments += [ - "-Dmixin.debug.countInjections=true", - "-Dmixin.debug.verbose=true", - "-Dmixin.debug.export=true" - ] - } -} minecraft { - version = minecraftVersion + '-' + forgeVersion + '-' + minecraftVersion - runDir = 'run' - if (replaceGradleTokenInFile) { - replaceIn replaceGradleTokenInFile - if(gradleTokenModId) { - replace gradleTokenModId, modId + for (f in replaceGradleTokenInFile.split(',')) { + tagReplacementFiles.add f } - if(gradleTokenModName) { - replace gradleTokenModName, modName - } - if(gradleTokenVersion) { - replace gradleTokenVersion, modVersion - } - if(gradleTokenGroupName) { - replace gradleTokenGroupName, modGroup + } + if (gradleTokenModId) { + injectedTags.put gradleTokenModId, modId + } + if (gradleTokenModName) { + injectedTags.put gradleTokenModName, modName + } + if (gradleTokenVersion) { + injectedTags.put gradleTokenVersion, modVersion + } + if (gradleTokenGroupName) { + injectedTags.put gradleTokenGroupName, modGroup + } + if (enableGenericInjection.toBoolean()) { + injectMissingGenerics.set(true) + } + + // Enable assertions in the current mod + extraRunJvmArguments.add("-ea:${modGroup}") + + if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { + extraTweakClasses.add("org.spongepowered.asm.launch.MixinTweaker") + + if (usesMixinDebug.toBoolean()) { + extraRunJvmArguments.addAll([ + "-Dmixin.debug.countInjections=true", + "-Dmixin.debug.verbose=true", + "-Dmixin.debug.export=true" + ]) } } - clientIntellijRun { - args(arguments) - jvmArgs(jvmArguments) + // Blowdryer is present in some old mod builds, do not propagate it further as a dependency + // IC2 has no reobf jars in its Maven + groupsToExcludeFromAutoReobfMapping.addAll(["com.diffplug", "com.diffplug.durian", "net.industrial-craft"]) +} - if(developmentEnvironmentUserName) { - args("--username", developmentEnvironmentUserName) +if (generateGradleTokenClass) { + tasks.injectTags.outputClassName.set(generateGradleTokenClass) +} + +// Custom reobf auto-mappings +configurations.configureEach { + dependencies.configureEach { dep -> + if (dep instanceof org.gradle.api.artifacts.ExternalModuleDependency) { + if (dep.group == "net.industrial-craft" && dep.name == "industrialcraft-2") { + // https://www.curseforge.com/minecraft/mc-mods/industrial-craft/files/2353971 + project.dependencies.reobfJarConfiguration("curse.maven:ic2-242638:2353971") + } } } - - serverIntellijRun { - args(arguments) - jvmArgs(jvmArguments) - } } -if(file('addon.gradle').exists()) { +// Ensure tests have access to minecraft classes +sourceSets { + test { + java { + compileClasspath += sourceSets.patchedMc.output + sourceSets.mcLauncher.output + runtimeClasspath += sourceSets.patchedMc.output + sourceSets.mcLauncher.output + } + } +} + +if (file('addon.gradle').exists()) { apply from: 'addon.gradle' } +// Allow unsafe repos but warn +repositories.configureEach { repo -> + if (repo instanceof org.gradle.api.artifacts.repositories.UrlArtifactRepository) { + if (repo.getUrl() != null && repo.getUrl().getScheme() == "http" && !repo.allowInsecureProtocol) { + logger.warn("Deprecated: Allowing insecure connections for repo '${repo.name}' - add 'allowInsecureProtocol = true'") + repo.allowInsecureProtocol = true + } + } +} + apply from: 'repositories.gradle' configurations { - implementation.extendsFrom(shadowImplementation) // TODO: remove after all uses are refactored - implementation.extendsFrom(shadowCompile) - implementation.extendsFrom(shadeCompile) + for (config in [compileClasspath, runtimeClasspath, testCompileClasspath, testRuntimeClasspath]) { + config.extendsFrom(runtimeOnlyNonPublishable) + if (usesShadowedDependencies.toBoolean()) { + config.extendsFrom(shadowImplementation) + // TODO: remove Compile after all uses are refactored to Implementation + config.extendsFrom(shadeCompile) + config.extendsFrom(shadowCompile) + } + } + // A "bag-of-dependencies"-style configuration for backwards compatibility, gets put in "api" + create("compile") { + description = "Deprecated: use api or implementation instead, gets put in api" + canBeConsumed = false + canBeResolved = false + visible = false + } + create("testCompile") { + description = "Deprecated: use testImplementation instead" + canBeConsumed = false + canBeResolved = false + visible = false + } + api.extendsFrom(compile) + testImplementation.extendsFrom(testCompile) +} + +afterEvaluate { + if (!configurations.compile.allDependencies.empty || !configurations.testCompile.allDependencies.empty) { + logger.warn("This project uses deprecated `compile` dependencies, please migrate to using `api` and `implementation`") + logger.warn("For more details, see https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/master/dependencies.gradle") + } } repositories { maven { name 'Overmind forge repo mirror' url 'https://gregtech.overminddl1.com/' + mavenContent { + excludeGroup("net.minecraftforge") // missing the `universal` artefact + } } - if(usesMixins.toBoolean()) { + maven { + name = "GTNH Maven" + url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" + allowInsecureProtocol = true + } + if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { + if (usesMixinDebug.toBoolean()) { + maven { + name = "Fabric Maven" + url = "https://maven.fabricmc.net/" + } + } + } + if (includeWellKnownRepositories.toBoolean()) { maven { - name 'sponge' - url 'https://repo.spongepowered.org/repository/maven-public' + name "CurseMaven" + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } } maven { - url 'https://jitpack.io' + name = "ic2" + url = "https://maven.ic2.player.to/" + metadataSources { + mavenPom() + artifact() + } + } + maven { + name = "ic2-mirror" + url = "https://maven2.ic2.player.to/" + metadataSources { + mavenPom() + artifact() + } + } + maven { + name "MMD Maven" + url "https://maven.mcmoddev.com/" } } } dependencies { - if(usesMixins.toBoolean()) { + if (usesMixins.toBoolean()) { annotationProcessor('org.ow2.asm:asm-debug-all:5.0.3') annotationProcessor('com.google.guava:guava:24.1.1-jre') annotationProcessor('com.google.code.gson:gson:2.8.6') - annotationProcessor('org.spongepowered:mixin:0.8-SNAPSHOT') - // using 0.8 to workaround a issue in 0.7 which fails mixin application - compile('com.github.GTNewHorizons:SpongePoweredMixin:0.7.12-GTNH') { - // Mixin includes a lot of dependencies that are too up-to-date - exclude module: 'launchwrapper' - exclude module: 'guava' - exclude module: 'gson' - exclude module: 'commons-io' - exclude module: 'log4j-core' + annotationProcessor('com.gtnewhorizon:gtnhmixins:2.1.10:processor') + if (usesMixinDebug.toBoolean()) { + runtimeOnlyNonPublishable('org.jetbrains:intellij-fernflower:1.2.1.16') } - compile('com.github.GTNewHorizons:SpongeMixins:1.5.0') + } + if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { + implementation('com.gtnewhorizon:gtnhmixins:2.1.10') } } apply from: 'dependencies.gradle' def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json' -def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + mixingConfigRefMap -def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg" +def mixinTmpDir = buildDir.path + File.separator + 'tmp' + File.separator + 'mixins' +def refMap = "${mixinTmpDir}" + File.separator + mixingConfigRefMap +def mixinSrg = "${mixinTmpDir}" + File.separator + "mixins.srg" -task generateAssets { - if (usesMixins.toBoolean()) { - def mixinConfigFile = getFile("/src/main/resources/mixins." + modId + ".json"); +tasks.register('generateAssets') { + group = "GTNH Buildscript" + description = "Generates a mixin config file at /src/main/resources/mixins.modid.json if needed" + onlyIf { usesMixins.toBoolean() } + doLast { + def mixinConfigFile = getFile("/src/main/resources/mixins." + modId + ".json") if (!mixinConfigFile.exists()) { + def mixinPluginLine = "" + if (!mixinPlugin.isEmpty()) { + // We might not have a mixin plugin if we're using early/late mixins + mixinPluginLine += """\n "plugin": "${modGroup}.${mixinPlugin}", """ + } + mixinConfigFile.text = """{ "required": true, - "minVersion": "0.7.11", - "package": "${modGroup}.${mixinsPackage}", - "plugin": "${modGroup}.${mixinPlugin}", + "minVersion": "0.8.5-GTNH", + "package": "${modGroup}.${mixinsPackage}",${mixinPluginLine} "refmap": "${mixingConfigRefMap}", "target": "@env(DEFAULT)", "compatibilityLevel": "JAVA_8", @@ -337,205 +538,142 @@ task generateAssets { } } -task relocateShadowJar(type: ConfigureShadowRelocation) { - target = tasks.shadowJar - prefix = modGroup + ".shadow" +if (usesMixins.toBoolean()) { + tasks.named("reobfJar", ReobfuscatedJar).configure { + extraSrgFiles.from(mixinSrg) + } } -shadowJar { - project.configurations.shadeCompile.each { dep -> - from(project.zipTree(dep)) { - exclude 'META-INF', 'META-INF/**' +if (usesMixins.toBoolean()) { + tasks.named("compileJava", JavaCompile).configure { + doFirst { + new File(mixinTmpDir).mkdirs() } - } - - manifest { - attributes(getManifestAttributes()) - } - - minimize() // This will only allow shading for actually used classes - configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile] - dependsOn(relocateShadowJar) -} - -jar { - project.configurations.shadeCompile.each { dep -> - from(project.zipTree(dep)) { - exclude 'META-INF', 'META-INF/**' - } - } - - manifest { - attributes(getManifestAttributes()) - } - - if(usesShadowedDependencies.toBoolean()) { - dependsOn(shadowJar) - enabled = false - } -} - -reobf { - if(usesMixins.toBoolean()) { - addExtraSrgFile mixinSrg - } -} - -afterEvaluate { - if(usesMixins.toBoolean()) { - tasks.compileJava { - options.compilerArgs += [ - "-AreobfSrgFile=${tasks.reobf.srg}", - "-AoutSrgFile=${mixinSrg}", - "-AoutRefMapFile=${refMap}", - // Elan: from what I understand they are just some linter configs so you get some warning on how to properly code - "-XDenableSunApiLintControl", - "-XDignore.symbol.file" - ] - } - } -} - -runClient { - if(developmentEnvironmentUserName) { - arguments += [ - "--username", - developmentEnvironmentUserName + options.compilerArgs += [ + "-AreobfSrgFile=${tasks.reobfJar.srg.get().asFile}", + "-AoutSrgFile=${mixinSrg}", + "-AoutRefMapFile=${refMap}", + // Elan: from what I understand they are just some linter configs so you get some warning on how to properly code + "-XDenableSunApiLintControl", + "-XDignore.symbol.file" ] } - - args(arguments) - jvmArgs(jvmArguments) } -runServer { - args(arguments) - jvmArgs(jvmArguments) -} - -tasks.withType(JavaExec).configureEach { - javaLauncher.set( - javaToolchains.launcherFor { - languageVersion = projectJavaVersion - } - ) -} - -processResources { +tasks.named("processResources", ProcessResources).configure { // this will ensure that this task is redone when the versions change. inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version + inputs.property "mcversion", project.minecraft.mcVersion + exclude("spotless.gradle") - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - // replace modVersion and minecraftVersion - expand "minecraftVersion": project.minecraft.version, + // replace stuff in mcmod.info, nothing else. replaces ${key} with value in text + filesMatching("mcmod.info") { + expand "minecraftVersion": project.minecraft.mcVersion, "modVersion": modVersion, "modId": modId, "modName": modName } - if(usesMixins.toBoolean()) { + if (usesMixins.toBoolean()) { from refMap } - - // copy everything else that's not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } } def getManifestAttributes() { def manifestAttributes = [:] - if(!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) { + if (!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) { manifestAttributes += ["FMLCorePluginContainsFMLMod": true] } - if(accessTransformersFile) { - manifestAttributes += ["FMLAT" : accessTransformersFile.toString()] + if (accessTransformersFile) { + manifestAttributes += ["FMLAT": accessTransformersFile.toString()] } - if(coreModClass) { + if (coreModClass) { manifestAttributes += ["FMLCorePlugin": modGroup + "." + coreModClass] } - if(usesMixins.toBoolean()) { + if (usesMixins.toBoolean()) { manifestAttributes += [ - "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker", - "MixinConfigs" : "mixins." + modId + ".json", - "ForceLoadAsMod" : !containsMixinsAndOrCoreModOnly.toBoolean() + "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker", + "MixinConfigs" : "mixins." + modId + ".json", + "ForceLoadAsMod": !containsMixinsAndOrCoreModOnly.toBoolean() ] } return manifestAttributes } -task sourcesJar(type: Jar) { - from (sourceSets.main.allSource) - from (file("$projectDir/LICENSE")) - getArchiveClassifier().set('sources') -} - -task shadowDevJar(type: ShadowJar) { - project.configurations.shadeCompile.each { dep -> - from(project.zipTree(dep)) { - exclude 'META-INF', 'META-INF/**' - } - } - - from sourceSets.main.output - getArchiveClassifier().set("dev") - +tasks.named("jar", Jar).configure { manifest { attributes(getManifestAttributes()) } - - minimize() // This will only allow shading for actually used classes - configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile] } -task relocateShadowDevJar(type: ConfigureShadowRelocation) { - target = tasks.shadowDevJar - prefix = modGroup + ".shadow" -} - -task circularResolverJar(type: Jar) { - dependsOn(relocateShadowDevJar) - dependsOn(shadowDevJar) - enabled = false -} - -task devJar(type: Jar) { - project.configurations.shadeCompile.each { dep -> - from(project.zipTree(dep)) { - exclude 'META-INF', 'META-INF/**' +if (usesShadowedDependencies.toBoolean()) { + tasks.register('relocateShadowJar', ConfigureShadowRelocation) { + target = tasks.shadowJar + prefix = modGroup + ".shadow" + } + tasks.named("shadowJar", ShadowJar).configure { + manifest { + attributes(getManifestAttributes()) } + + if (minimizeShadowedDependencies.toBoolean()) { + minimize() // This will only allow shading for actually used classes + } + configurations = [ + project.configurations.shadowImplementation, + project.configurations.shadowCompile, + project.configurations.shadeCompile + ] + archiveClassifier.set('dev') + dependsOn(relocateShadowJar) } - - from sourceSets.main.output - getArchiveClassifier().set("dev") - - manifest { - attributes(getManifestAttributes()) - } - - if(usesShadowedDependencies.toBoolean()) { - dependsOn(circularResolverJar) + configurations.runtimeElements.outgoing.artifacts.clear() + configurations.apiElements.outgoing.artifacts.clear() + configurations.runtimeElements.outgoing.artifact(tasks.named("shadowJar", ShadowJar)) + configurations.apiElements.outgoing.artifact(tasks.named("shadowJar", ShadowJar)) + tasks.named("jar", Jar) { enabled = false + finalizedBy(tasks.shadowJar) + } + tasks.named("reobfJar", ReobfuscatedJar) { + inputJar.set(tasks.named("shadowJar", ShadowJar).flatMap({it.archiveFile})) + } + AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.components.findByName("java") + javaComponent.withVariantsFromConfiguration(configurations.shadowRuntimeElements) { + skip() + } + for (runTask in ["runClient", "runServer"]) { + tasks.named(runTask).configure { + dependsOn("shadowJar") + } + } +} +ext.publishableDevJar = usesShadowedDependencies.toBoolean() ? tasks.shadowJar : tasks.jar +ext.publishableObfJar = tasks.reobfJar + +tasks.named('extractForgeUserdev', Copy).configure { efu -> + doLast { + // Fix CoFH-repackaged CCL not finding mappings + project.copy { + from(mcpTasks.userdevDir("conf")) + into(new File(project.buildDir, "unpacked/conf")) + } } } -task apiJar(type: Jar) { - from (sourceSets.main.allSource) { - include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**' +tasks.register('apiJar', Jar) { + from(sourceSets.main.allSource) { + include modGroupPath + "/" + apiPackagePath + '/**' } - from (sourceSets.main.output) { - include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**' + from(sourceSets.main.output) { + include modGroupPath + "/" + apiPackagePath + '/**' } - from (sourceSets.main.resources.srcDirs) { + from(sourceSets.main.resources.srcDirs) { include("LICENSE") } @@ -543,19 +681,79 @@ task apiJar(type: Jar) { } artifacts { - if(!noPublishedSources) { - archives sourcesJar + if (!noPublishedSources) { + archives tasks.named("sourcesJar") } - archives devJar - if(apiPackage) { - archives apiJar + if (apiPackage) { + archives tasks.named("apiJar") } } -// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID), -// and isn't strictly needed with the POM so just disable it. -tasks.withType(GenerateModuleMetadata) { - enabled = false +idea { + module { + downloadJavadoc = true + downloadSources = true + } + project { + settings { + runConfigurations { + "1. Run Client"(Gradle) { + taskNames = ["runClient"] + } + "2. Run Server"(Gradle) { + taskNames = ["runServer"] + } + "3. Run Obfuscated Client"(Gradle) { + taskNames = ["runObfClient"] + } + "4. Run Obfuscated Server"(Gradle) { + taskNames = ["runObfServer"] + } + if (!disableSpotless) { + "5. Apply spotless"(Gradle) { + taskNames = ["spotlessApply"] + } + } + def coreModArgs = "" + if (coreModClass) { + coreModArgs = ' "-Dfml.coreMods.load=' + modGroup + '.' + coreModClass + '"' + } + "Run Client (IJ Native)"(Application) { + mainClass = "GradleStart" + moduleName = project.name + ".main" + afterEvaluate { + workingDirectory = tasks.runClient.workingDir.absolutePath + programParameters = tasks.runClient.calculateArgs(project).collect { '"' + it + '"' }.join(' ') + jvmArgs = tasks.runClient.calculateJvmArgs(project).collect { '"' + it + '"' }.join(' ') + + ' ' + tasks.runClient.systemProperties.collect { '"-D' + it.key + '=' + it.value.toString() + '"' }.join(' ') + + coreModArgs + } + } + "Run Server (IJ Native)"(Application) { + mainClass = "GradleStartServer" + moduleName = project.name + ".main" + afterEvaluate { + workingDirectory = tasks.runServer.workingDir.absolutePath + programParameters = tasks.runServer.calculateArgs(project).collect { '"' + it + '"' }.join(' ') + jvmArgs = tasks.runServer.calculateJvmArgs(project).collect { '"' + it + '"' }.join(' ') + + ' ' + tasks.runServer.systemProperties.collect { '"-D' + it.key + '=' + it.value.toString() + '"' }.join(' ') + + coreModArgs + } + } + } + compiler.javac { + afterEvaluate { + moduleJavacAdditionalOptions = [ + (project.name + ".main"): tasks.compileJava.options.compilerArgs.collect { '"' + it + '"' }.join(' ') + ] + } + } + } + } +} + +tasks.named("processIdeaSettings").configure { + dependsOn("injectTags") } // workaround variable hiding in pom processing @@ -563,48 +761,24 @@ def projectConfigs = project.configurations publishing { publications { - maven(MavenPublication) { + create("maven", MavenPublication) { from components.java - if(usesShadowedDependencies.toBoolean()) { - artifact source: shadowJar, classifier: "" - } - if(!noPublishedSources) { - artifact source: sourcesJar, classifier: "sources" - } - artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev" + if (apiPackage) { - artifact source: apiJar, classifier: "api" + artifact apiJar } groupId = System.getenv("ARTIFACT_GROUP_ID") ?: "com.github.GTNewHorizons" artifactId = System.getenv("ARTIFACT_ID") ?: project.name // Using the identified version, not project.version as it has the prepended 1.7.10 version = System.getenv("RELEASE_VERSION") ?: identifiedVersion - - // remove extra garbage from minecraft and minecraftDeps configuration - pom.withXml { - def badArtifacts = [:].withDefault {[] as Set} - for (configuration in [projectConfigs.minecraft, projectConfigs.minecraftDeps]) { - for (dependency in configuration.allDependencies) { - badArtifacts[dependency.group == null ? "" : dependency.group] += dependency.name - } - } - // example for specifying extra stuff to ignore - // badArtifacts["org.example.group"] += "artifactName" - - Node pomNode = asNode() - pomNode.dependencies.'*'.findAll() { - badArtifacts[it.groupId.text()].contains(it.artifactId.text()) - }.each() { - it.parent().remove(it) - } - } } } repositories { maven { url = "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases" + allowInsecureProtocol = true credentials { username = System.getenv("MAVEN_USER") ?: "NONE" password = System.getenv("MAVEN_PASSWORD") ?: "NONE" @@ -613,38 +787,186 @@ publishing { } } +if (modrinthProjectId.size() != 0 && System.getenv("MODRINTH_TOKEN") != null) { + apply plugin: 'com.modrinth.minotaur' + + File changelogFile = new File(System.getenv("CHANGELOG_FILE") ?: "CHANGELOG.md") + + modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = modrinthProjectId + versionNumber = identifiedVersion + versionType = identifiedVersion.endsWith("-pre") ? "beta" : "release" + changelog = changelogFile.exists() ? changelogFile.getText("UTF-8") : "" + uploadFile = publishableObfJar + additionalFiles = getSecondaryArtifacts() + gameVersions = [minecraftVersion] + loaders = ["forge"] + debugMode = false + } + + if (modrinthRelations.size() != 0) { + String[] deps = modrinthRelations.split(";") + deps.each { dep -> + if (dep.size() == 0) { + return + } + String[] parts = dep.split(":") + String[] qual = parts[0].split("-") + addModrinthDep(qual[0], qual[1], parts[1]) + } + } + if (usesMixins.toBoolean()) { + addModrinthDep("required", "project", "gtnhmixins") + } + tasks.modrinth.dependsOn(build) + tasks.publish.dependsOn(tasks.modrinth) +} + +if (curseForgeProjectId.size() != 0 && System.getenv("CURSEFORGE_TOKEN") != null) { + apply plugin: 'com.matthewprenger.cursegradle' + + File changelogFile = new File(System.getenv("CHANGELOG_FILE") ?: "CHANGELOG.md") + + curseforge { + apiKey = System.getenv("CURSEFORGE_TOKEN") + project { + id = curseForgeProjectId + if (changelogFile.exists()) { + changelogType = "markdown" + changelog = changelogFile + } + releaseType = identifiedVersion.endsWith("-pre") ? "beta" : "release" + addGameVersion minecraftVersion + addGameVersion "Forge" + mainArtifact publishableObfJar + for (artifact in getSecondaryArtifacts()) addArtifact artifact + } + + options { + javaIntegration = false + forgeGradleIntegration = false + debug = false + } + } + + if (curseForgeRelations.size() != 0) { + String[] deps = curseForgeRelations.split(";") + deps.each { dep -> + if (dep.size() == 0) { + return + } + String[] parts = dep.split(":") + addCurseForgeRelation(parts[0], parts[1]) + } + } + if (usesMixins.toBoolean()) { + addCurseForgeRelation("requiredDependency", "gtnhmixins") + } + tasks.curseforge.dependsOn(build) + tasks.publish.dependsOn(tasks.curseforge) +} + +def addModrinthDep(String scope, String type, String name) { + com.modrinth.minotaur.dependencies.Dependency dep; + if (!(scope in ["required", "optional", "incompatible", "embedded"])) { + throw new Exception("Invalid modrinth dependency scope: " + scope) + } + switch (type) { + case "project": + dep = new ModDependency(name, scope) + break + case "version": + dep = new VersionDependency(name, scope) + break + default: + throw new Exception("Invalid modrinth dependency type: " + type) + } + project.modrinth.dependencies.add(dep) +} + +def addCurseForgeRelation(String type, String name) { + if (!(type in ["requiredDependency", "embeddedLibrary", "optionalDependency", "tool", "incompatible"])) { + throw new Exception("Invalid CurseForge relation type: " + type) + } + CurseArtifact artifact = project.curseforge.curseProjects[0].mainArtifact + CurseRelation rel = (artifact.curseRelations ?: (artifact.curseRelations = new CurseRelation())) + rel."$type"(name) +} + // Updating -task updateBuildScript { +tasks.register('updateBuildScript') { + group = 'GTNH Buildscript' + description = 'Updates the build script to the latest version' + doLast { - if (performBuildScriptUpdate(projectDir.toString())) return + if (performBuildScriptUpdate()) return print("Build script already up-to-date!") } } -if (isNewBuildScriptVersionAvailable(projectDir.toString())) { +if (!project.getGradle().startParameter.isOffline() && !Boolean.getBoolean('DISABLE_BUILDSCRIPT_UPDATE_CHECK') && isNewBuildScriptVersionAvailable()) { if (autoUpdateBuildScript.toBoolean()) { - performBuildScriptUpdate(projectDir.toString()) + performBuildScriptUpdate() } else { out.style(Style.SuccessHeader).println("Build script update available! Run 'gradle updateBuildScript'") } } static URL availableBuildScriptUrl() { - new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/main/build.gradle") + new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/build.gradle") } -boolean performBuildScriptUpdate(String projectDir) { - if (isNewBuildScriptVersionAvailable(projectDir)) { - def buildscriptFile = getFile("build.gradle") - availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } } - out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!") +static URL exampleSettingsGradleUrl() { + new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/settings.gradle.example") +} + +static URL exampleGitAttributesUrl() { + new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/.gitattributes") +} + + +boolean verifyGitAttributes() { + def gitattributesFile = getFile(".gitattributes") + if (!gitattributesFile.exists()) { + println("Downloading default .gitattributes") + exampleGitAttributesUrl().withInputStream { i -> gitattributesFile.withOutputStream { it << i } } + exec { + workingDir '.' + commandLine 'git', 'add', '--renormalize', '.' + } return true } return false } -boolean isNewBuildScriptVersionAvailable(String projectDir) { +boolean verifySettingsGradle() { + def settingsFile = getFile("settings.gradle") + if (!settingsFile.exists()) { + println("Downloading default settings.gradle") + exampleSettingsGradleUrl().withInputStream { i -> settingsFile.withOutputStream { it << i } } + return true + } + return false +} + +boolean performBuildScriptUpdate() { + if (isNewBuildScriptVersionAvailable()) { + def buildscriptFile = getFile("build.gradle") + availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } } + def out = services.get(StyledTextOutputFactory).create('buildscript-update-output') + out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!") + boolean settingsupdated = verifySettingsGradle() + settingsupdated = verifyGitAttributes() || settingsupdated + if (settingsupdated) + throw new GradleException("Settings has been updated, please re-run task.") + return true + } + return false +} + +boolean isNewBuildScriptVersionAvailable() { Map parameters = ["connectTimeout": 2000, "readTimeout": 2000] String currentBuildScript = getFile("build.gradle").getText() @@ -658,18 +980,78 @@ boolean isNewBuildScriptVersionAvailable(String projectDir) { static String getVersionHash(String buildScriptContent) { String versionLine = buildScriptContent.find("^//version: [a-z0-9]*") - if(versionLine != null) { + if (versionLine != null) { return versionLine.split(": ").last() } return "" } -configure(updateBuildScript) { - group = 'forgegradle' - description = 'Updates the build script to the latest version' +// Parameter Deobfuscation + +tasks.register('deobfParams') { + group = 'GTNH Buildscript' + description = 'Rename all obfuscated parameter names inherited from Minecraft classes' + doLast { // TODO + + String mcpDir = "$project.gradle.gradleUserHomeDir/caches/minecraft/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion" + String mcpZIP = "$mcpDir/mcp_$channel-$mappingsVersion-${minecraftVersion}.zip" + String paramsCSV = "$mcpDir/params.csv" + + download.run { + src "https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion-$minecraftVersion/mcp_$channel-$mappingsVersion-${minecraftVersion}.zip" + dest mcpZIP + overwrite false + } + + if (!file(paramsCSV).exists()) { + println("Extracting MCP archive ...") + copy { + from(zipTree(mcpZIP)) + into(mcpDir) + } + } + + println("Parsing params.csv ...") + Map params = new HashMap<>() + Files.lines(Paths.get(paramsCSV)).forEach { line -> + String[] cells = line.split(",") + if (cells.length > 2 && cells[0].matches("p_i?\\d+_\\d+_")) { + params.put(cells[0], cells[1]) + } + } + + out.style(Style.Success).println("Modified ${replaceParams(file("$projectDir/src/main/java"), params)} files!") + out.style(Style.Failure).println("Don't forget to verify that the code still works as before!\n It could be broken due to duplicate variables existing now\n or parameters taking priority over other variables.") + } } -// Deobfuscation +static int replaceParams(File file, Map params) { + int fileCount = 0 + + if (file.isDirectory()) { + for (File f : file.listFiles()) { + fileCount += replaceParams(f, params) + } + return fileCount + } + println("Visiting ${file.getName()} ...") + try { + String content = new String(Files.readAllBytes(file.toPath())) + int hash = content.hashCode() + params.forEach { key, value -> + content = content.replaceAll(key, value) + } + if (hash != content.hashCode()) { + Files.write(file.toPath(), content.getBytes("UTF-8")) + return 1 + } + } catch (Exception e) { + e.printStackTrace() + } + return 0 +} + +// Dependency Deobfuscation def deobf(String sourceURL) { try { @@ -678,42 +1060,75 @@ def deobf(String sourceURL) { //get rid of directories: int lastSlash = fileName.lastIndexOf("/") - if(lastSlash > 0) { + if (lastSlash > 0) { fileName = fileName.substring(lastSlash + 1) } //get rid of extension: - if(fileName.endsWith(".jar")) { + if (fileName.endsWith(".jar") || fileName.endsWith(".litemod")) { fileName = fileName.substring(0, fileName.lastIndexOf(".")) } String hostName = url.getHost() - if(hostName.startsWith("www.")) { + if (hostName.startsWith("www.")) { hostName = hostName.substring(4) } List parts = Arrays.asList(hostName.split("\\.")) Collections.reverse(parts) hostName = String.join(".", parts) - return deobf(sourceURL, hostName + "/" + fileName) - } catch(Exception e) { - return deobf(sourceURL, "deobf/" + String.valueOf(sourceURL.hashCode())) + return deobf(sourceURL, "$hostName/$fileName") + } catch (Exception ignored) { + return deobf(sourceURL, "deobf/${sourceURL.hashCode()}") + } +} + +def deobfMaven(String repoURL, String mavenDep) { + if (!repoURL.endsWith("/")) { + repoURL += "/" + } + String[] parts = mavenDep.split(":") + parts[0] = parts[0].replace('.', '/') + def jarURL = repoURL + parts[0] + "/" + parts[1] + "/" + parts[2] + "/" + parts[1] + "-" + parts[2] + ".jar" + return deobf(jarURL) +} + +def deobfCurse(String curseDep) { + try { + return deobfMaven("https://www.cursemaven.com/", "curse.maven:$curseDep") + } catch (Exception ignored) { + out.style(Style.Failure).println("Failed to get $curseDep from cursemaven.") } } // The method above is to be preferred. Use this method if the filename is not at the end of the URL. -def deobf(String sourceURL, String fileName) { - String cacheDir = System.getProperty("user.home") + "/.gradle/caches/" - String bon2Dir = cacheDir + "forge_gradle/deobf" - String bon2File = bon2Dir + "/BON2-2.5.0.jar" - String obfFile = cacheDir + "modules-2/files-2.1/" + fileName + ".jar" - String deobfFile = cacheDir + "modules-2/files-2.1/" + fileName + "-deobf.jar" +def deobf(String sourceURL, String rawFileName) { + String bon2Version = "2.5.1" + String fileName = URLDecoder.decode(rawFileName, "UTF-8") + String cacheDir = "$project.gradle.gradleUserHomeDir/caches" + String bon2Dir = "$cacheDir/forge_gradle/deobf" + String bon2File = "$bon2Dir/BON2-${bon2Version}.jar" + String obfFile = "$cacheDir/modules-2/files-2.1/${fileName}.jar" + String deobfFile = "$cacheDir/modules-2/files-2.1/${fileName}-deobf.jar" - if(file(deobfFile).exists()) { + if (file(deobfFile).exists()) { return files(deobfFile) } + String mappingsVer + String remoteMappings = project.hasProperty('remoteMappings') ? project.remoteMappings : 'https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/' + if (remoteMappings) { + String id = "${forgeVersion.split("\\.")[3]}-$minecraftVersion" + String mappingsZIP = "$cacheDir/forge_gradle/maven_downloader/de/oceanlabs/mcp/mcp_snapshot_nodoc/$id/mcp_snapshot_nodoc-${id}.zip" + + zipMappings(mappingsZIP, remoteMappings, bon2Dir) + + mappingsVer = "snapshot_$id" + } else { + mappingsVer = "${channel}_$mappingsVersion" + } + download.run { - src 'https://github.com/GTNewHorizons/BON2/releases/download/2.5.0/BON2-2.5.0.CUSTOM-all.jar' + src "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases/com/github/parker8283/BON2/$bon2Version-CUSTOM/BON2-$bon2Version-CUSTOM-all.jar" dest bon2File quiet true overwrite false @@ -727,14 +1142,48 @@ def deobf(String sourceURL, String fileName) { } exec { - commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', '1.7.10', '--mappingsVer', 'stable_12', '--notch' + commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', minecraftVersion, '--mappingsVer', mappingsVer, '--notch' workingDir bon2Dir - standardOutput = new ByteArrayOutputStream() + standardOutput = new FileOutputStream("${deobfFile}.log") } return files(deobfFile) } +def zipMappings(String zipPath, String url, String bon2Dir) { + File zipFile = new File(zipPath) + if (zipFile.exists()) { + return + } + + String fieldsCache = "$bon2Dir/data/fields.csv" + String methodsCache = "$bon2Dir/data/methods.csv" + + download.run { + src "${url}fields.csv" + dest fieldsCache + quiet true + } + download.run { + src "${url}methods.csv" + dest methodsCache + quiet true + } + + zipFile.getParentFile().mkdirs() + ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)) + + zos.putNextEntry(new ZipEntry("fields.csv")) + Files.copy(Paths.get(fieldsCache), zos) + zos.closeEntry() + + zos.putNextEntry(new ZipEntry("methods.csv")) + Files.copy(Paths.get(methodsCache), zos) + zos.closeEntry() + + zos.close() +} + // Helper methods def checkPropertyExists(String propertyName) { @@ -743,6 +1192,21 @@ def checkPropertyExists(String propertyName) { } } +def propertyDefaultIfUnset(String propertyName, defaultValue) { + if (!project.hasProperty(propertyName) || project.property(propertyName) == "") { + project.ext.setProperty(propertyName, defaultValue) + } +} + def getFile(String relativePath) { return new File(projectDir, relativePath) } + +def getSecondaryArtifacts() { + // Because noPublishedSources from the beginning of the script is somehow not visible here... + boolean noPublishedSources = project.hasProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false + def secondaryArtifacts = [publishableDevJar] + if (!noPublishedSources) secondaryArtifacts += [sourcesJar] + if (apiPackage) secondaryArtifacts += [apiJar] + return secondaryArtifacts +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf..ccebba7 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3ab0b72..f398c33 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 83f2acf..79a61d4 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,113 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # 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"` +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # 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" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # 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 - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -105,84 +140,105 @@ 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=$((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" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" 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, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# 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" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9618d8d..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,10 +25,14 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @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" @@ -37,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,38 +65,26 @@ 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% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 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 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..01ea5f1 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,28 @@ + +pluginManagement { + repositories { + maven { + // RetroFuturaGradle + name "GTNH Maven" + url "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" + allowInsecureProtocol = true + mavenContent { + includeGroup("com.gtnewhorizons.retrofuturagradle") + } + } + gradlePluginPortal() + mavenCentral() + mavenLocal() + } +} + +plugins { + id 'com.diffplug.blowdryerSetup' version '1.6.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0' // Provides java toolchains +} + +blowdryerSetup { + repoSubfolder 'gtnhShared' + github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.2.0') + //devLocal '.' // Use this when testing config updates locally +} diff --git a/src/main/java/mcp/mobius/waila/addons/thermaldynamics/HUDHandlerDuct.java b/src/main/java/mcp/mobius/waila/addons/thermaldynamics/HUDHandlerDuct.java index fdf718f..9e69e38 100644 --- a/src/main/java/mcp/mobius/waila/addons/thermaldynamics/HUDHandlerDuct.java +++ b/src/main/java/mcp/mobius/waila/addons/thermaldynamics/HUDHandlerDuct.java @@ -1,71 +1,71 @@ -package mcp.mobius.waila.addons.thermaldynamics; - -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import mcp.mobius.waila.cbcore.LangUtil; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; - -import java.util.List; - -/** - * Created by Lordmau5 on 28.02.2015. - */ -public class HUDHandlerDuct implements IWailaDataProvider { - - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig("thermaldynamics.fluiductsFluid")) return currenttip; - - FluidStack fluid = FluidStack.loadFluidStackFromNBT(accessor.getNBTData()); - - String name = ""; - - try{ - name += String.format(" < %s >", fluid.getFluid().getLocalizedName(fluid)); - } catch (NullPointerException f){ - name += " " + LangUtil.translateG("hud.msg.empty"); - } - - currenttip.add(name); - return currenttip; - } - - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig("thermaldynamics.fluiductsAmount")) return currenttip; - - int amount = 0; - - NBTTagCompound tag = accessor.getNBTData(); - if (tag.hasKey("Amount")) - amount = accessor.getNBTInteger(tag, "Amount"); - - currenttip.add(String.format(" %d / 1000 mB", amount)); - - return currenttip; - } - - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return currenttip; - } - - @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z) { - if (te != null) - te.writeToNBT(tag); - return tag; - } - -} +package mcp.mobius.waila.addons.thermaldynamics; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import mcp.mobius.waila.cbcore.LangUtil; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +import java.util.List; + +/** + * Created by Lordmau5 on 28.02.2015. + */ +public class HUDHandlerDuct implements IWailaDataProvider { + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + if (!config.getConfig("thermaldynamics.fluiductsFluid")) return currenttip; + + FluidStack fluid = FluidStack.loadFluidStackFromNBT(accessor.getNBTData()); + + String name = ""; + + try{ + name += String.format(" < %s >", fluid.getFluid().getLocalizedName(fluid)); + } catch (NullPointerException f){ + name += " " + LangUtil.translateG("hud.msg.empty"); + } + + currenttip.add(name); + return currenttip; + } + + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + if (!config.getConfig("thermaldynamics.fluiductsAmount")) return currenttip; + + int amount = 0; + + NBTTagCompound tag = accessor.getNBTData(); + if (tag.hasKey("Amount")) + amount = accessor.getNBTInteger(tag, "Amount"); + + currenttip.add(String.format(" %d / 1000 mB", amount)); + + return currenttip; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return currenttip; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z) { + if (te != null) + te.writeToNBT(tag); + return tag; + } + +} diff --git a/src/main/java/mcp/mobius/waila/addons/thermaldynamics/ThermalDynamicsModule.java b/src/main/java/mcp/mobius/waila/addons/thermaldynamics/ThermalDynamicsModule.java index f1827e0..c0cb863 100644 --- a/src/main/java/mcp/mobius/waila/addons/thermaldynamics/ThermalDynamicsModule.java +++ b/src/main/java/mcp/mobius/waila/addons/thermaldynamics/ThermalDynamicsModule.java @@ -1,44 +1,44 @@ -package mcp.mobius.waila.addons.thermaldynamics; - -import mcp.mobius.waila.Waila; -import mcp.mobius.waila.api.impl.ModuleRegistrar; -import org.apache.logging.log4j.Level; - -public class ThermalDynamicsModule { - - public static Class TileFluidDuct = null; - - public static void register(){ - // XXX : We register the Fluiduct - try{ - TileFluidDuct = Class.forName("cofh.thermaldynamics.ducts.fluid.TileFluidDuct"); - - ModuleRegistrar.instance().addConfigRemote("Thermal Dynamics", "thermaldynamics.fluidDuctsFluid"); - ModuleRegistrar.instance().addConfigRemote("Thermal Dynamics", "thermaldynamics.fluidDuctsAmount"); - ModuleRegistrar.instance().registerHeadProvider(new HUDHandlerDuct(), TileFluidDuct); - ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerDuct(), TileFluidDuct); - ModuleRegistrar.instance().registerNBTProvider (new HUDHandlerDuct(), TileFluidDuct); - - } catch (Exception e){ - Waila.log.log(Level.WARN, "[Thermal Dynamics] Error while loading FluidDuct hooks." + e); - } - - // XXX : We register the IBlockInfo interface - /* - try{ - IBlockInfo = Class.forName("cofh.api.block.IBlockInfo"); - IBlockInfo_getBlockInfo = IBlockInfo.getMethod("getBlockInfo", IBlockAccess.class, int.class, int.class, int.class, ForgeDirection.class, EntityPlayer.class, List.class, boolean.class); - - - //ModuleRegistrar.instance().addConfigRemote("Thermal Expansion", "thermalexpansion.energyhandler"); - ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerIBlockInfo(), IBlockInfo); - ModuleRegistrar.instance().registerNBTProvider (new HUDHandlerIBlockInfo(), IBlockInfo); - - } catch (Exception e){ - Waila.log.log(Level.WARN, "[Thermal Expansion] Error while loading IBlockInfo hooks." + e); - } - */ - } - - -} +package mcp.mobius.waila.addons.thermaldynamics; + +import mcp.mobius.waila.Waila; +import mcp.mobius.waila.api.impl.ModuleRegistrar; +import org.apache.logging.log4j.Level; + +public class ThermalDynamicsModule { + + public static Class TileFluidDuct = null; + + public static void register(){ + // XXX : We register the Fluiduct + try{ + TileFluidDuct = Class.forName("cofh.thermaldynamics.ducts.fluid.TileFluidDuct"); + + ModuleRegistrar.instance().addConfigRemote("Thermal Dynamics", "thermaldynamics.fluidDuctsFluid"); + ModuleRegistrar.instance().addConfigRemote("Thermal Dynamics", "thermaldynamics.fluidDuctsAmount"); + ModuleRegistrar.instance().registerHeadProvider(new HUDHandlerDuct(), TileFluidDuct); + ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerDuct(), TileFluidDuct); + ModuleRegistrar.instance().registerNBTProvider (new HUDHandlerDuct(), TileFluidDuct); + + } catch (Exception e){ + Waila.log.log(Level.WARN, "[Thermal Dynamics] Error while loading FluidDuct hooks." + e); + } + + // XXX : We register the IBlockInfo interface + /* + try{ + IBlockInfo = Class.forName("cofh.api.block.IBlockInfo"); + IBlockInfo_getBlockInfo = IBlockInfo.getMethod("getBlockInfo", IBlockAccess.class, int.class, int.class, int.class, ForgeDirection.class, EntityPlayer.class, List.class, boolean.class); + + + //ModuleRegistrar.instance().addConfigRemote("Thermal Expansion", "thermalexpansion.energyhandler"); + ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerIBlockInfo(), IBlockInfo); + ModuleRegistrar.instance().registerNBTProvider (new HUDHandlerIBlockInfo(), IBlockInfo); + + } catch (Exception e){ + Waila.log.log(Level.WARN, "[Thermal Expansion] Error while loading IBlockInfo hooks." + e); + } + */ + } + + +} diff --git a/src/main/resources/assets/waila/lang/cs_CZ.lang b/src/main/resources/assets/waila/lang/cs_CZ.lang index f23becd..e1f161e 100644 --- a/src/main/resources/assets/waila/lang/cs_CZ.lang +++ b/src/main/resources/assets/waila/lang/cs_CZ.lang @@ -1,148 +1,148 @@ -screen.button.waila=Waila -screen.button.modules=Moduly -screen.label.scale=Mìøítko -screen.label.dragtuto=Chytni HUD pro nastavení jeho pozice. - -screen.button.default=Defaultní -screen.button.cancel=Zrušit -screen.button.ok=Ok -screen.button.yes=Ano -screen.button.no=Ne -screen.button.back=Zpìt -screen.button.hidden=Skrytý -screen.button.visible=Viditelný -screen.button.maintained=Spravované -screen.button.toggled=Pøepnuté - -choice.showhidewaila=Zobrazit/Skrýt Wailu -choice.showhideidmeta=Zobrazit ID:Metadata -choice.toggledmaintained=Pøepnuté/Spravované -choice.showliquids=Tekutiny -choice.shifttoggledblock=Pliž se pro pøepnutí blokù -choice.shifttoggledents=Pliž se pro pøepnutí entit -screen.button.configureaspect=Nastavení vzhledu... - -enchant.title.name=Jméno -enchant.title.minlvl=Minimální lvl -enchant.title.maxlvl=Maximální lvl -enchant.title.weight=Hmotnost -enchant.label.enchantability=Oèarovatelnost - -waila.keybind.wailaconfig=[Waila] Nastavení obrazu -waila.keybind.wailadisplay=[Waila] Zobrazit/Skrýt -waila.keybind.liquid=[Waila] Zobrazit tekutiny -waila.keybind.recipe=[Waila] Zobrazit recept -waila.keybind.usage=[Waila] Zobrazit použití -waila.keybind.testing=[Waila] Testování - -client.msg.norecipe=Nenalezen žádný recept. -client.msg.nousage=Nenalezeno žádné využití. - -hud.msg.none= -hud.msg.empty= -hud.msg.output=Výstup -hud.msg.input=Vstup -hud.msg.out=Ven -hud.msg.in=Dovnitø -hud.msg.power=Energie -hud.msg.storage=Úložištì -hud.msg.stored=Uloženo -hud.msg.any=Jakýkoliv -hud.msg.mode=Mód -hud.msg.maxpower=Maximální Energie -hud.msg.trigger=Spouštìè -hud.msg.maxio=Maximální propustnost - -hud.msg.send=Odeslat -hud.msg.recv=Obdržet -hud.msg.item=Pøedmìt -hud.msg.fluid=Tekutina -hud.msg.energ=Energie -hud.msg.frequency=Frekvence - -hud.msg.owner=Vlastník -hud.msg.public=Veøejné -hud.msg.restricted=Omezené -hud.msg.private=Soukromé - -hud.msg.white=Bílá -hud.msg.orange=Oranžová -hud.msg.magenta=Purpurová -hud.msg.lblue=Svìtle modrá -hud.msg.yellow=Žlutá -hud.msg.lime=Svìtle zelená -hud.msg.pink=Rùžová -hud.msg.gray=Šedá -hud.msg.lgray=Svìtle šedá -hud.msg.cyan=Tyrkysová -hud.msg.purple=Fialová -hud.msg.blue=Modrá -hud.msg.brown=Hnìdá -hud.msg.green=Zelená -hud.msg.red=Èervená -hud.msg.black=Èerná - -hud.msg.growth=Rùst -hud.msg.mature=Stáøí -hud.msg.off=Vypnuto -hud.msg.on=Zapnuto -hud.msg.state=Stav -hud.msg.delay=Prodleva -hud.msg.comparator=Porovnávaè -hud.msg.substractor=Substraktor -hud.msg.record=Záznam - -hud.msg.offers=Poskytuje -hud.msg.demands=Požaduje - -option.appeng.monitorcontent=Obsah monitoru -option.bb.content=Obsah barelu -option.bc.tankamount=Množství tekutiny -option.bc.tanktype=Typ tekutiny -option.enderstorage.colors=Barvy -option.ic2.inputeumach=Maximální pøíjem EU [Stroje] -option.ic2.inputeuother=Maximální pøíjem EU [Ostatní] -option.ic2.inputeu=Maximální pøijem EU -option.ic2.outputeu=Maximální výstup EU -option.ic2.storage=Uloženo energie -option.ic2.consump=Zobrazit spotøebu -option.ic2.tradeomat=Zobrazit Trade-O-Mat požadavek -option.thaumcraft.storedvis=Úložištì kondenzátoru -option.thermalexpansion.energyhandler=Zobrazit úložištì RF -option.thermalexpansion.energycell=Zobrazit ECell VSTUP/VÝSTUP -option.thermalexpansion.fluidtype=Zobrazit typ tekutiny -option.thermalexpansion.fluidamount=Zobrazit množství tekutiny -option.thermalexpansion.tankmode=Zobrazit mód nádrže -option.thermalexpansion.tesssendrecv=Tesseract mode -option.thermalexpansion.tessfreq=Frekvence Teseraktu -option.thermalexpansion.owner=Zobrazit majitele -option.thermalexpansion.conditemmode=Zobrazit mód Itemduktu -option.vanilla.spawntype=Typ spawneru -option.vanilla.growthvalue=Hodnota rùstu -option.vanilla.leverstate=Stav páky -option.vanilla.repeater=Prodleva opakovaèe -option.vanilla.comparator=Mód porovnávaèe -option.vanilla.redstone=Ruditová energie -option.vanilla.jukebox=Jukeboxový disk -option.vanilla.silverfish=Skrýt rybenku -option.etb.displaydata=Zobrazit data slotu -option.enderio.inout=Zobrazit vstup/výstup -option.enderio.storage=Zobrazit uskladnìné MJ -option.enderio.owner=Zobrazit majitele bloku -option.enderio.channel=Zobrazit kanál nadkrychle -option.bcapi.storage=Zobrazit uskladnìné MJ -option.bcapi.consump=Zobrazit maximální energii -option.bcapi.trigger=Zobrazit spouštìjící se energii -option.pr.showio=Zobrazit IO brány -option.pr.showdata=Zobrazit data bran -option.extrautilities.fluidamount=Zobrazit množství tekutin -option.openblocks.fluidamount=Zobrazit množství tekutin -option.railcraft.fluidamount=Zobrazit množství tekutin -option.secretrooms.hide=Skrýt camo bloky -option.carpenters.hide=Skrýt camo bloky -option.stevescarts.showall=Zobrazit data -option.stevescarts.colorblind=Barevný mód -option.stevescarts.shifttoggle=Shift pro pøepnutí -option.general.showhp=Zobrazit zdraví entit -option.general.showcrop=Zobrazit rùst plodin +screen.button.waila=Waila +screen.button.modules=Moduly +screen.label.scale=Mìøítko +screen.label.dragtuto=Chytni HUD pro nastavení jeho pozice. + +screen.button.default=Defaultní +screen.button.cancel=Zrušit +screen.button.ok=Ok +screen.button.yes=Ano +screen.button.no=Ne +screen.button.back=Zpìt +screen.button.hidden=Skrytý +screen.button.visible=Viditelný +screen.button.maintained=Spravované +screen.button.toggled=Pøepnuté + +choice.showhidewaila=Zobrazit/Skrýt Wailu +choice.showhideidmeta=Zobrazit ID:Metadata +choice.toggledmaintained=Pøepnuté/Spravované +choice.showliquids=Tekutiny +choice.shifttoggledblock=Pliž se pro pøepnutí blokù +choice.shifttoggledents=Pliž se pro pøepnutí entit +screen.button.configureaspect=Nastavení vzhledu... + +enchant.title.name=Jméno +enchant.title.minlvl=Minimální lvl +enchant.title.maxlvl=Maximální lvl +enchant.title.weight=Hmotnost +enchant.label.enchantability=Oèarovatelnost + +waila.keybind.wailaconfig=[Waila] Nastavení obrazu +waila.keybind.wailadisplay=[Waila] Zobrazit/Skrýt +waila.keybind.liquid=[Waila] Zobrazit tekutiny +waila.keybind.recipe=[Waila] Zobrazit recept +waila.keybind.usage=[Waila] Zobrazit použití +waila.keybind.testing=[Waila] Testování + +client.msg.norecipe=Nenalezen žádný recept. +client.msg.nousage=Nenalezeno žádné využití. + +hud.msg.none= +hud.msg.empty= +hud.msg.output=Výstup +hud.msg.input=Vstup +hud.msg.out=Ven +hud.msg.in=Dovnitø +hud.msg.power=Energie +hud.msg.storage=Úložištì +hud.msg.stored=Uloženo +hud.msg.any=Jakýkoliv +hud.msg.mode=Mód +hud.msg.maxpower=Maximální Energie +hud.msg.trigger=Spouštìè +hud.msg.maxio=Maximální propustnost + +hud.msg.send=Odeslat +hud.msg.recv=Obdržet +hud.msg.item=Pøedmìt +hud.msg.fluid=Tekutina +hud.msg.energ=Energie +hud.msg.frequency=Frekvence + +hud.msg.owner=Vlastník +hud.msg.public=Veøejné +hud.msg.restricted=Omezené +hud.msg.private=Soukromé + +hud.msg.white=Bílá +hud.msg.orange=Oranžová +hud.msg.magenta=Purpurová +hud.msg.lblue=Svìtle modrá +hud.msg.yellow=Žlutá +hud.msg.lime=Svìtle zelená +hud.msg.pink=Rùžová +hud.msg.gray=Šedá +hud.msg.lgray=Svìtle šedá +hud.msg.cyan=Tyrkysová +hud.msg.purple=Fialová +hud.msg.blue=Modrá +hud.msg.brown=Hnìdá +hud.msg.green=Zelená +hud.msg.red=Èervená +hud.msg.black=Èerná + +hud.msg.growth=Rùst +hud.msg.mature=Stáøí +hud.msg.off=Vypnuto +hud.msg.on=Zapnuto +hud.msg.state=Stav +hud.msg.delay=Prodleva +hud.msg.comparator=Porovnávaè +hud.msg.substractor=Substraktor +hud.msg.record=Záznam + +hud.msg.offers=Poskytuje +hud.msg.demands=Požaduje + +option.appeng.monitorcontent=Obsah monitoru +option.bb.content=Obsah barelu +option.bc.tankamount=Množství tekutiny +option.bc.tanktype=Typ tekutiny +option.enderstorage.colors=Barvy +option.ic2.inputeumach=Maximální pøíjem EU [Stroje] +option.ic2.inputeuother=Maximální pøíjem EU [Ostatní] +option.ic2.inputeu=Maximální pøijem EU +option.ic2.outputeu=Maximální výstup EU +option.ic2.storage=Uloženo energie +option.ic2.consump=Zobrazit spotøebu +option.ic2.tradeomat=Zobrazit Trade-O-Mat požadavek +option.thaumcraft.storedvis=Úložištì kondenzátoru +option.thermalexpansion.energyhandler=Zobrazit úložištì RF +option.thermalexpansion.energycell=Zobrazit ECell VSTUP/VÝSTUP +option.thermalexpansion.fluidtype=Zobrazit typ tekutiny +option.thermalexpansion.fluidamount=Zobrazit množství tekutiny +option.thermalexpansion.tankmode=Zobrazit mód nádrže +option.thermalexpansion.tesssendrecv=Tesseract mode +option.thermalexpansion.tessfreq=Frekvence Teseraktu +option.thermalexpansion.owner=Zobrazit majitele +option.thermalexpansion.conditemmode=Zobrazit mód Itemduktu +option.vanilla.spawntype=Typ spawneru +option.vanilla.growthvalue=Hodnota rùstu +option.vanilla.leverstate=Stav páky +option.vanilla.repeater=Prodleva opakovaèe +option.vanilla.comparator=Mód porovnávaèe +option.vanilla.redstone=Ruditová energie +option.vanilla.jukebox=Jukeboxový disk +option.vanilla.silverfish=Skrýt rybenku +option.etb.displaydata=Zobrazit data slotu +option.enderio.inout=Zobrazit vstup/výstup +option.enderio.storage=Zobrazit uskladnìné MJ +option.enderio.owner=Zobrazit majitele bloku +option.enderio.channel=Zobrazit kanál nadkrychle +option.bcapi.storage=Zobrazit uskladnìné MJ +option.bcapi.consump=Zobrazit maximální energii +option.bcapi.trigger=Zobrazit spouštìjící se energii +option.pr.showio=Zobrazit IO brány +option.pr.showdata=Zobrazit data bran +option.extrautilities.fluidamount=Zobrazit množství tekutin +option.openblocks.fluidamount=Zobrazit množství tekutin +option.railcraft.fluidamount=Zobrazit množství tekutin +option.secretrooms.hide=Skrýt camo bloky +option.carpenters.hide=Skrýt camo bloky +option.stevescarts.showall=Zobrazit data +option.stevescarts.colorblind=Barevný mód +option.stevescarts.shifttoggle=Shift pro pøepnutí +option.general.showhp=Zobrazit zdraví entit +option.general.showcrop=Zobrazit rùst plodin option.thaumcraft.aspects=Zobrazit aspekty \ No newline at end of file diff --git a/src/main/resources/assets/waila/lang/de_DE.lang b/src/main/resources/assets/waila/lang/de_DE.lang index 97fd018..50bcb8c 100644 --- a/src/main/resources/assets/waila/lang/de_DE.lang +++ b/src/main/resources/assets/waila/lang/de_DE.lang @@ -1,148 +1,148 @@ -screen.button.waila=Waila -screen.button.modules=Module -screen.label.scale=Maße -screen.label.dragtuto=Verschiebe das HUD, um seine Position zu ändern. - -screen.button.default=Standard -screen.button.cancel=Abbrechen -screen.button.ok=Ok -screen.button.yes=Ja -screen.button.no=Nein -screen.button.back=Zurück -screen.button.hidden=Versteckt -screen.button.visible=Sichtbar -screen.button.maintained=Gewartet -screen.button.toggled=Geschaltet - -choice.showhidewaila=Zeige/Verstecke Waila -choice.showhideidmeta=Zeige ID:Metadata -choice.toggledmaintained=Geschaltet/Gewartet -choice.showliquids=Flüssigkeiten -choice.shifttoggledblock=Blöcke schleichend umschalten -choice.shifttoggledents=Lebewesen schleichend umschalten -screen.button.configureaspect=Konfiguriere Aspekt... - -enchant.title.name=Name -enchant.title.minlvl=Min lvl -enchant.title.maxlvl=Max lvl -enchant.title.weight=Gewicht -enchant.label.enchantability=Verzauberbarkeit - -waila.keybind.wailaconfig=[Waila] Config-Bildschirm -waila.keybind.wailadisplay=[Waila] Zeigen/Verstecken -waila.keybind.liquid=[Waila] Zeige Flüssigkeiten -waila.keybind.recipe=[Waila] Zeige Rezept -waila.keybind.usage=[Waila] Zeige Nutzung -waila.keybind.testing=[Waila] Testen - -client.msg.norecipe=Kein Rezept gefunden. -client.msg.nousage=Keine Nutzung gefunden. - -hud.msg.none= -hud.msg.empty= -hud.msg.output=Output -hud.msg.input=Input -hud.msg.out=Out -hud.msg.in=In -hud.msg.power=Energie -hud.msg.storage=Speicher -hud.msg.stored=Gespeichert -hud.msg.any=Jegliches -hud.msg.mode=Modus -hud.msg.maxpower=Max Energie -hud.msg.trigger=Trigger -hud.msg.maxio=Max IO - -hud.msg.send=Senden -hud.msg.recv=Empfangen -hud.msg.item=Item -hud.msg.fluid=Flüssigk. -hud.msg.energ=Energie -hud.msg.frequency=Frequenz - -hud.msg.owner=Besitzer -hud.msg.public=Öffentlich -hud.msg.restricted=Eingeschränkt -hud.msg.private=Privat - -hud.msg.white=Weiß -hud.msg.orange=Orange -hud.msg.magenta=Magenta -hud.msg.lblue=HBlau -hud.msg.yellow=Gelb -hud.msg.lime=HGrün -hud.msg.pink=Pink -hud.msg.gray=Grau -hud.msg.lgray=HGrau -hud.msg.cyan=Türkis -hud.msg.purple=Violett -hud.msg.blue=Blau -hud.msg.brown=Braun -hud.msg.green=Grün -hud.msg.red=Rot -hud.msg.black=Schwarz - -hud.msg.growth=Wachstum -hud.msg.mature=Erwachsen -hud.msg.off=Aus -hud.msg.on=An -hud.msg.state=Status -hud.msg.delay=Verzögerung -hud.msg.comparator=Komparator -hud.msg.substractor=Substraktor -hud.msg.record=Platte - -hud.msg.offers=Angebote -hud.msg.demands=Bedarf - -option.appeng.monitorcontent=Monitorinhalt -option.bb.content=Fassinhalt -option.bc.tankamount=Flüssigk.-Menge -option.bc.tanktype=Flüssigk.-Typ -option.enderstorage.colors=Farben -option.ic2.inputeumach=Max EU-Input [Maschinen] -option.ic2.inputeuother=Max EU-Input [Anderes] -option.ic2.inputeu=Max EU-Input -option.ic2.outputeu=Max EU-Output -option.ic2.storage=Energie gespeichert -option.ic2.consump=Zeige Verbrauch -option.ic2.tradeomat=Zeige Tauschautomaten-Forderung -option.thaumcraft.storedvis=Kondensatorspeicher -option.thermalexpansion.energyhandler=Zeige RO-Speicher -option.thermalexpansion.energycell=Zeige EZellen IN/OUT -option.thermalexpansion.fluidtype=Zeige Flüssigk.-Typ -option.thermalexpansion.fluidamount=Zeige Flüssigk.-Menge -option.thermalexpansion.tankmode=Zeige Tankmodus -option.thermalexpansion.tesssendrecv=Tesseraktmodus -option.thermalexpansion.tessfreq=Tesseraktfrequenz -option.thermalexpansion.owner=Zeige Besitzer -option.thermalexpansion.conditemmode=Zeige Itemduktmodus -option.vanilla.spawntype=Spawner-Typ -option.vanilla.growthvalue=Wachstumswert -option.vanilla.leverstate=Hebelstatus -option.vanilla.repeater=Repeater-Verzögerung -option.vanilla.comparator=Komparatormodus -option.vanilla.redstone=Redstone-Stärke -option.vanilla.jukebox=Musikbox-Platte -option.vanilla.silverfish=Silberfisch verdecken -option.etb.displaydata=Zeige Sockeldaten -option.enderio.inout=Zeige Input/Output -option.enderio.storage=Zeige gespeicherte MJ -option.enderio.owner=Zeige Block-Besitzer -option.enderio.channel=Zeige Hypercube-Kanal -option.bcapi.storage=Zeige gespeicherte MJ -option.bcapi.consump=Zeige maximale Energie -option.bcapi.trigger=Zeige Startenergie -option.pr.showio=Zeige Gatter IO -option.pr.showdata=Zeige Gatterdaten -option.extrautilities.fluidamount=Zeige Flüssigk.-Menge -option.openblocks.fluidamount=Zeige Flüssigk.-Menge -option.railcraft.fluidamount=Zeige Flüssigk.-Menge -option.secretrooms.hide=Getarnte Blöcke verdecken -option.carpenters.hide=Getarnte Blöcke verdecken -option.stevescarts.showall=Zeige Daten -option.stevescarts.colorblind=Farbenblind-Modus -option.stevescarts.shifttoggle=Schleichend Umschalten -option.general.showhp=Zeige Gesundheit von Lebewesen -option.general.showcrop=Zeige Pflanzenwachstum -option.thaumcraft.aspects=Zeige Aspekte +screen.button.waila=Waila +screen.button.modules=Module +screen.label.scale=Maße +screen.label.dragtuto=Verschiebe das HUD, um seine Position zu ändern. + +screen.button.default=Standard +screen.button.cancel=Abbrechen +screen.button.ok=Ok +screen.button.yes=Ja +screen.button.no=Nein +screen.button.back=Zurück +screen.button.hidden=Versteckt +screen.button.visible=Sichtbar +screen.button.maintained=Gewartet +screen.button.toggled=Geschaltet + +choice.showhidewaila=Zeige/Verstecke Waila +choice.showhideidmeta=Zeige ID:Metadata +choice.toggledmaintained=Geschaltet/Gewartet +choice.showliquids=Flüssigkeiten +choice.shifttoggledblock=Blöcke schleichend umschalten +choice.shifttoggledents=Lebewesen schleichend umschalten +screen.button.configureaspect=Konfiguriere Aspekt... + +enchant.title.name=Name +enchant.title.minlvl=Min lvl +enchant.title.maxlvl=Max lvl +enchant.title.weight=Gewicht +enchant.label.enchantability=Verzauberbarkeit + +waila.keybind.wailaconfig=[Waila] Config-Bildschirm +waila.keybind.wailadisplay=[Waila] Zeigen/Verstecken +waila.keybind.liquid=[Waila] Zeige Flüssigkeiten +waila.keybind.recipe=[Waila] Zeige Rezept +waila.keybind.usage=[Waila] Zeige Nutzung +waila.keybind.testing=[Waila] Testen + +client.msg.norecipe=Kein Rezept gefunden. +client.msg.nousage=Keine Nutzung gefunden. + +hud.msg.none= +hud.msg.empty= +hud.msg.output=Output +hud.msg.input=Input +hud.msg.out=Out +hud.msg.in=In +hud.msg.power=Energie +hud.msg.storage=Speicher +hud.msg.stored=Gespeichert +hud.msg.any=Jegliches +hud.msg.mode=Modus +hud.msg.maxpower=Max Energie +hud.msg.trigger=Trigger +hud.msg.maxio=Max IO + +hud.msg.send=Senden +hud.msg.recv=Empfangen +hud.msg.item=Item +hud.msg.fluid=Flüssigk. +hud.msg.energ=Energie +hud.msg.frequency=Frequenz + +hud.msg.owner=Besitzer +hud.msg.public=Öffentlich +hud.msg.restricted=Eingeschränkt +hud.msg.private=Privat + +hud.msg.white=Weiß +hud.msg.orange=Orange +hud.msg.magenta=Magenta +hud.msg.lblue=HBlau +hud.msg.yellow=Gelb +hud.msg.lime=HGrün +hud.msg.pink=Pink +hud.msg.gray=Grau +hud.msg.lgray=HGrau +hud.msg.cyan=Türkis +hud.msg.purple=Violett +hud.msg.blue=Blau +hud.msg.brown=Braun +hud.msg.green=Grün +hud.msg.red=Rot +hud.msg.black=Schwarz + +hud.msg.growth=Wachstum +hud.msg.mature=Erwachsen +hud.msg.off=Aus +hud.msg.on=An +hud.msg.state=Status +hud.msg.delay=Verzögerung +hud.msg.comparator=Komparator +hud.msg.substractor=Substraktor +hud.msg.record=Platte + +hud.msg.offers=Angebote +hud.msg.demands=Bedarf + +option.appeng.monitorcontent=Monitorinhalt +option.bb.content=Fassinhalt +option.bc.tankamount=Flüssigk.-Menge +option.bc.tanktype=Flüssigk.-Typ +option.enderstorage.colors=Farben +option.ic2.inputeumach=Max EU-Input [Maschinen] +option.ic2.inputeuother=Max EU-Input [Anderes] +option.ic2.inputeu=Max EU-Input +option.ic2.outputeu=Max EU-Output +option.ic2.storage=Energie gespeichert +option.ic2.consump=Zeige Verbrauch +option.ic2.tradeomat=Zeige Tauschautomaten-Forderung +option.thaumcraft.storedvis=Kondensatorspeicher +option.thermalexpansion.energyhandler=Zeige RO-Speicher +option.thermalexpansion.energycell=Zeige EZellen IN/OUT +option.thermalexpansion.fluidtype=Zeige Flüssigk.-Typ +option.thermalexpansion.fluidamount=Zeige Flüssigk.-Menge +option.thermalexpansion.tankmode=Zeige Tankmodus +option.thermalexpansion.tesssendrecv=Tesseraktmodus +option.thermalexpansion.tessfreq=Tesseraktfrequenz +option.thermalexpansion.owner=Zeige Besitzer +option.thermalexpansion.conditemmode=Zeige Itemduktmodus +option.vanilla.spawntype=Spawner-Typ +option.vanilla.growthvalue=Wachstumswert +option.vanilla.leverstate=Hebelstatus +option.vanilla.repeater=Repeater-Verzögerung +option.vanilla.comparator=Komparatormodus +option.vanilla.redstone=Redstone-Stärke +option.vanilla.jukebox=Musikbox-Platte +option.vanilla.silverfish=Silberfisch verdecken +option.etb.displaydata=Zeige Sockeldaten +option.enderio.inout=Zeige Input/Output +option.enderio.storage=Zeige gespeicherte MJ +option.enderio.owner=Zeige Block-Besitzer +option.enderio.channel=Zeige Hypercube-Kanal +option.bcapi.storage=Zeige gespeicherte MJ +option.bcapi.consump=Zeige maximale Energie +option.bcapi.trigger=Zeige Startenergie +option.pr.showio=Zeige Gatter IO +option.pr.showdata=Zeige Gatterdaten +option.extrautilities.fluidamount=Zeige Flüssigk.-Menge +option.openblocks.fluidamount=Zeige Flüssigk.-Menge +option.railcraft.fluidamount=Zeige Flüssigk.-Menge +option.secretrooms.hide=Getarnte Blöcke verdecken +option.carpenters.hide=Getarnte Blöcke verdecken +option.stevescarts.showall=Zeige Daten +option.stevescarts.colorblind=Farbenblind-Modus +option.stevescarts.shifttoggle=Schleichend Umschalten +option.general.showhp=Zeige Gesundheit von Lebewesen +option.general.showcrop=Zeige Pflanzenwachstum +option.thaumcraft.aspects=Zeige Aspekte diff --git a/src/main/resources/assets/waila/lang/nl_NL.lang b/src/main/resources/assets/waila/lang/nl_NL.lang index 59f48bd..2b8c9ff 100644 --- a/src/main/resources/assets/waila/lang/nl_NL.lang +++ b/src/main/resources/assets/waila/lang/nl_NL.lang @@ -1,117 +1,117 @@ -screen.button.waila=Waila -screen.button.modules=Modules -screen.label.scale=Schaal -screen.label.dragtuto=Sleep de HUD om zijn positie in te stellen. - -screen.button.default=Standaard -screen.button.cancel=Annuleren -screen.button.ok=Ok -screen.button.yes=Ja -screen.button.no=Nee -screen.button.back=Terug -screen.button.hidden=Verborgen -screen.button.visible=Zichtbaar -screen.button.maintained=Gehandhaafd -screen.button.toggled=Omgeschakeld - -choice.showhidewaila=Toon/Verberg Waila -choice.showhideidmeta=Toon ID:Metadata -choice.toggledmaintained=Omgeschakeld/Gehandhaafd -choice.showliquids=Vloeistoffen -screen.button.configureaspect=Configureer aspect... - -enchant.title.name=Naam -enchant.title.minlvl=Min lvl -enchant.title.maxlvl=Max lvl -enchant.title.weight=Gewicht -enchant.label.enchantability=Enchantbaarheid - -waila.keybind.wailaconfig=[Waila] Configuratiescherm -waila.keybind.wailadisplay=[Waila] Toon/Verberg -waila.keybind.liquid=[Waila] Toon vloeistoffen -waila.keybind.recipe=[Waila] Toon recepten -waila.keybind.usage=[Waila] Toon gebruik -waila.keybind.testing=[Waila] Testen - -client.msg.norecipe=Geen recept gevonden. -client.msg.nousage=Geen gebruik gevonden. - -hud.msg.none= -hud.msg.empty= -hud.msg.output=Uitvoer -hud.msg.input=Invoer -hud.msg.out=Uit -hud.msg.in=In -hud.msg.power=Vermogen -hud.msg.storage=Opslag -hud.msg.any=Om het even welke -hud.msg.mode=Modus - -hud.msg.send=Zend -hud.msg.recv=Ontv -hud.msg.item=Item -hud.msg.fluid=Vloeistof -hud.msg.energ=Energie -hud.msg.frequency=Frequentie - -hud.msg.owner=Eigenaar -hud.msg.public=Publiek -hud.msg.restricted=Begrensd -hud.msg.private=Priv� - -hud.msg.white=Wit -hud.msg.orange=Oranje -hud.msg.magenta=Magenta -hud.msg.lblue=LBlauw -hud.msg.yellow=Geel -hud.msg.lime=Limoen -hud.msg.pink=Roze -hud.msg.gray=Grijs -hud.msg.lgray=LGrijs -hud.msg.cyan=Cyaan -hud.msg.purple=Paars -hud.msg.blue=Blauw -hud.msg.brown=Bruin -hud.msg.green=Groen -hud.msg.red=Rood -hud.msg.black=Zwart - -hud.msg.growth=Groei -hud.msg.mature=Volwassen -hud.msg.off=Af -hud.msg.on=Aan -hud.msg.state=Status -hud.msg.delay=Vertraging -hud.msg.comparator=Vergelijker -hud.msg.substractor=Aftrekker -hud.msg.record=Neem op - -option.appeng.monitorcontent=Scherm inhoud -option.bb.content=Ton inhoud -option.bc.tankamount=Vloeistofhoeveelheid -option.bc.tanktype=Vloeistoftype -option.enderstorage.colors=Kleuren -option.ic2.inputeumach=Max EU invoer [Machines] -option.ic2.inputeuother=Max EU invoer [Andere] -option.ic2.inputeu=Max EU invoer -option.ic2.outputeu=Max EU uitvoer -option.ic2.storage=Opgeslagen energie -option.thaumcraft.storedvis=Condensator opslag -option.thermalexpansion.energyhandler=Toon RF opslag -option.thermalexpansion.energycell=Toon ECell IN/UIT -option.thermalexpansion.fluidtype=Toon vloeistoftype -option.thermalexpansion.fluidamount=Toon vloeistofhoeveelheid -option.thermalexpansion.tankmode=Toon tank modus -option.thermalexpansion.tesssendrecv=Tesseract modus -option.thermalexpansion.tessfreq=Tesseract frequentie -option.thermalexpansion.owner=Toon eigenaar -option.vanilla.spawntype=Spawner type -option.vanilla.growthvalue=Groei hoeveelheid -option.vanilla.leverstate=Hendel status -option.vanilla.repeater=Herhaler vertraging -option.vanilla.comparator=Vergelijker modus -option.vanilla.redstone=Redstone vermogen -option.vanilla.jukebox=Jukebox schijf -option.extrautilities.fluidamount=Toon vloeistofhoeveelheid -option.openblocks.fluidamount=Toon vloeistofhoeveelheid +screen.button.waila=Waila +screen.button.modules=Modules +screen.label.scale=Schaal +screen.label.dragtuto=Sleep de HUD om zijn positie in te stellen. + +screen.button.default=Standaard +screen.button.cancel=Annuleren +screen.button.ok=Ok +screen.button.yes=Ja +screen.button.no=Nee +screen.button.back=Terug +screen.button.hidden=Verborgen +screen.button.visible=Zichtbaar +screen.button.maintained=Gehandhaafd +screen.button.toggled=Omgeschakeld + +choice.showhidewaila=Toon/Verberg Waila +choice.showhideidmeta=Toon ID:Metadata +choice.toggledmaintained=Omgeschakeld/Gehandhaafd +choice.showliquids=Vloeistoffen +screen.button.configureaspect=Configureer aspect... + +enchant.title.name=Naam +enchant.title.minlvl=Min lvl +enchant.title.maxlvl=Max lvl +enchant.title.weight=Gewicht +enchant.label.enchantability=Enchantbaarheid + +waila.keybind.wailaconfig=[Waila] Configuratiescherm +waila.keybind.wailadisplay=[Waila] Toon/Verberg +waila.keybind.liquid=[Waila] Toon vloeistoffen +waila.keybind.recipe=[Waila] Toon recepten +waila.keybind.usage=[Waila] Toon gebruik +waila.keybind.testing=[Waila] Testen + +client.msg.norecipe=Geen recept gevonden. +client.msg.nousage=Geen gebruik gevonden. + +hud.msg.none= +hud.msg.empty= +hud.msg.output=Uitvoer +hud.msg.input=Invoer +hud.msg.out=Uit +hud.msg.in=In +hud.msg.power=Vermogen +hud.msg.storage=Opslag +hud.msg.any=Om het even welke +hud.msg.mode=Modus + +hud.msg.send=Zend +hud.msg.recv=Ontv +hud.msg.item=Item +hud.msg.fluid=Vloeistof +hud.msg.energ=Energie +hud.msg.frequency=Frequentie + +hud.msg.owner=Eigenaar +hud.msg.public=Publiek +hud.msg.restricted=Begrensd +hud.msg.private=Priv� + +hud.msg.white=Wit +hud.msg.orange=Oranje +hud.msg.magenta=Magenta +hud.msg.lblue=LBlauw +hud.msg.yellow=Geel +hud.msg.lime=Limoen +hud.msg.pink=Roze +hud.msg.gray=Grijs +hud.msg.lgray=LGrijs +hud.msg.cyan=Cyaan +hud.msg.purple=Paars +hud.msg.blue=Blauw +hud.msg.brown=Bruin +hud.msg.green=Groen +hud.msg.red=Rood +hud.msg.black=Zwart + +hud.msg.growth=Groei +hud.msg.mature=Volwassen +hud.msg.off=Af +hud.msg.on=Aan +hud.msg.state=Status +hud.msg.delay=Vertraging +hud.msg.comparator=Vergelijker +hud.msg.substractor=Aftrekker +hud.msg.record=Neem op + +option.appeng.monitorcontent=Scherm inhoud +option.bb.content=Ton inhoud +option.bc.tankamount=Vloeistofhoeveelheid +option.bc.tanktype=Vloeistoftype +option.enderstorage.colors=Kleuren +option.ic2.inputeumach=Max EU invoer [Machines] +option.ic2.inputeuother=Max EU invoer [Andere] +option.ic2.inputeu=Max EU invoer +option.ic2.outputeu=Max EU uitvoer +option.ic2.storage=Opgeslagen energie +option.thaumcraft.storedvis=Condensator opslag +option.thermalexpansion.energyhandler=Toon RF opslag +option.thermalexpansion.energycell=Toon ECell IN/UIT +option.thermalexpansion.fluidtype=Toon vloeistoftype +option.thermalexpansion.fluidamount=Toon vloeistofhoeveelheid +option.thermalexpansion.tankmode=Toon tank modus +option.thermalexpansion.tesssendrecv=Tesseract modus +option.thermalexpansion.tessfreq=Tesseract frequentie +option.thermalexpansion.owner=Toon eigenaar +option.vanilla.spawntype=Spawner type +option.vanilla.growthvalue=Groei hoeveelheid +option.vanilla.leverstate=Hendel status +option.vanilla.repeater=Herhaler vertraging +option.vanilla.comparator=Vergelijker modus +option.vanilla.redstone=Redstone vermogen +option.vanilla.jukebox=Jukebox schijf +option.extrautilities.fluidamount=Toon vloeistofhoeveelheid +option.openblocks.fluidamount=Toon vloeistofhoeveelheid option.railcraft.fluidamount=Toon vloeistofhoeveelheid \ No newline at end of file diff --git a/src/main/resources/assets/waila/lang/ru_RU.lang b/src/main/resources/assets/waila/lang/ru_RU.lang index 5974f56..2ac8dfc 100644 --- a/src/main/resources/assets/waila/lang/ru_RU.lang +++ b/src/main/resources/assets/waila/lang/ru_RU.lang @@ -1,148 +1,148 @@ -screen.button.waila=Waila -screen.button.modules=Модули -screen.label.scale=Размер -screen.label.dragtuto=Тащите интерфейс, чтобы изменить позицию. - -screen.button.default=По умолчанию -screen.button.cancel=Отмена -screen.button.ok=Ок -screen.button.yes=Да -screen.button.no=Нет -screen.button.back=Назад -screen.button.hidden=Скрывать -screen.button.visible=Показывать -screen.button.maintained=При нажатой клавише -screen.button.toggled=Вкл./Выкл. гор. клавишей - -choice.showhidewaila=Показывать/Скрывать Waila -choice.showhideidmeta=Показывать ID:Метаданные -choice.toggledmaintained=Переключ./Нажатая клав. -choice.showliquids=Жидкости -choice.shifttoggledblock=Приседание показывает блоки -choice.shifttoggledents=Приседание показывает сущностей -screen.button.configureaspect=Настроить внешний вид... - -enchant.title.name=Название -enchant.title.minlvl=Мин. уровень -enchant.title.maxlvl=Макс. уровень -enchant.title.weight=Вес -enchant.label.enchantability=Зачарование - -waila.keybind.wailaconfig=[Waila] Меню настроек -waila.keybind.wailadisplay=[Waila] Показать/Скрыть -waila.keybind.liquid=[Waila] Показать жидкости -waila.keybind.recipe=[Waila] Показать рецепт -waila.keybind.usage=[Waila] Показать применение -waila.keybind.testing=[Waila] Тестировать - -client.msg.norecipe=Рецептов не найдено. -client.msg.nousage=Применений не найдено. - -hud.msg.none=<Ничего> -hud.msg.empty=<Пусто> -hud.msg.output=Вывод -hud.msg.input=Ввод -hud.msg.out=Из -hud.msg.in=В -hud.msg.power=Энергия -hud.msg.storage=Хранилище -hud.msg.stored=Хранится -hud.msg.any=Всё -hud.msg.mode=Режим -hud.msg.maxpower=Макс. энергия -hud.msg.trigger=Триггер -hud.msg.maxio=Макс. ввод/вывод - -hud.msg.send=Передача -hud.msg.recv=Приём -hud.msg.item=Предмет -hud.msg.fluid=Жидкость -hud.msg.energ=Энергия -hud.msg.frequency=Частота - -hud.msg.owner=Владелец -hud.msg.public=Публичный -hud.msg.restricted=Ограниченный -hud.msg.private=Приватный - -hud.msg.white=Белый -hud.msg.orange=Оранжевый -hud.msg.magenta=Сиреневый -hud.msg.lblue=Светло-синий -hud.msg.yellow=Жёлтый -hud.msg.lime=Светло-зелёный -hud.msg.pink=Розовый -hud.msg.gray=Серый -hud.msg.lgray=Светло-серый -hud.msg.cyan=Бирюзовый -hud.msg.purple=Фиолетовый -hud.msg.blue=Синий -hud.msg.brown=Коричневый -hud.msg.green=Зелёный -hud.msg.red=Красный -hud.msg.black=Чёрный - -hud.msg.growth=Рост -hud.msg.mature=Вырос -hud.msg.off=Выкл. -hud.msg.on=Вкл. -hud.msg.state=Статус -hud.msg.delay=Задержка -hud.msg.comparator=Компаратор -hud.msg.substractor=Вычитатель -hud.msg.record=Пластинка - -hud.msg.offers=Предложения -hud.msg.demands=Запросы - -option.appeng.monitorcontent=Содержимое монитора -option.bb.content=Содержимое бочки -option.bc.tankamount=Кол-во жидкости -option.bc.tanktype=Тип жидкости -option.enderstorage.colors=Цвета -option.ic2.inputeumach=Макс. вход EU [Механизмы] -option.ic2.inputeuother=Макс. вход EU [Другое] -option.ic2.inputeu=Макс. вход EU -option.ic2.outputeu=Макс. выход EU -option.ic2.storage=Хранится энергии -option.ic2.consump=Показывать потребление -option.ic2.tradeomat=Показывать запрос ресурсообменника -option.thaumcraft.storedvis=Заряд конденсатора -option.thermalexpansion.energyhandler=Показывать заряд RF -option.thermalexpansion.energycell=Показывать ввод/вывод Э.батареи -option.thermalexpansion.fluidtype=Показывать тип жидкости -option.thermalexpansion.fluidamount=Показывать кол-во жидкости -option.thermalexpansion.tankmode=Показывать режим цистерны -option.thermalexpansion.tesssendrecv=Режим тессеракта -option.thermalexpansion.tessfreq=Частота тессеракта -option.thermalexpansion.owner=Показывать владельца -option.thermalexpansion.conditemmode=Показывать режим предметных труб -option.vanilla.spawntype=Тип спаунера -option.vanilla.growthvalue=Стадия роста -option.vanilla.leverstate=Положение рычага -option.vanilla.repeater=Задержка повторителя -option.vanilla.comparator=Режим компаратора -option.vanilla.redstone=Сила красного камня -option.vanilla.jukebox=Пластинка в проигрывателе -option.vanilla.silverfish=Спрятать чешуйницу -option.etb.displaydata=Показывать инф. о сокетах -option.enderio.inout=Показывать ввод/вывод -option.enderio.storage=Показывать заряд MJ -option.enderio.owner=Показывать владельца блока -option.enderio.channel=Показывать канал гиперкуба -option.bcapi.storage=Показывать заряд MJ -option.bcapi.consump=Показывать макс. энергию -option.bcapi.trigger=Показывать энергию активации -option.pr.showio=Показывать ввод/вывод схем -option.pr.showdata=Показывать данные о схемах -option.extrautilities.fluidamount=Показывать кол-во жидкости -option.openblocks.fluidamount=Показывать кол-во жидкости -option.railcraft.fluidamount=Показывать кол-во жидкости -option.secretrooms.hide=Спрятать камуфляжные блоки -option.carpenters.hide=Спрятать камуфляжные блоки -option.stevescarts.showall=Показывать данные -option.stevescarts.colorblind=Режим цветокоррекции -option.stevescarts.shifttoggle=Приседание показывает -option.general.showhp=Показывать здоровье сущностей -option.general.showcrop=Показывать рост растений +screen.button.waila=Waila +screen.button.modules=Модули +screen.label.scale=Размер +screen.label.dragtuto=Тащите интерфейс, чтобы изменить позицию. + +screen.button.default=По умолчанию +screen.button.cancel=Отмена +screen.button.ok=Ок +screen.button.yes=Да +screen.button.no=Нет +screen.button.back=Назад +screen.button.hidden=Скрывать +screen.button.visible=Показывать +screen.button.maintained=При нажатой клавише +screen.button.toggled=Вкл./Выкл. гор. клавишей + +choice.showhidewaila=Показывать/Скрывать Waila +choice.showhideidmeta=Показывать ID:Метаданные +choice.toggledmaintained=Переключ./Нажатая клав. +choice.showliquids=Жидкости +choice.shifttoggledblock=Приседание показывает блоки +choice.shifttoggledents=Приседание показывает сущностей +screen.button.configureaspect=Настроить внешний вид... + +enchant.title.name=Название +enchant.title.minlvl=Мин. уровень +enchant.title.maxlvl=Макс. уровень +enchant.title.weight=Вес +enchant.label.enchantability=Зачарование + +waila.keybind.wailaconfig=[Waila] Меню настроек +waila.keybind.wailadisplay=[Waila] Показать/Скрыть +waila.keybind.liquid=[Waila] Показать жидкости +waila.keybind.recipe=[Waila] Показать рецепт +waila.keybind.usage=[Waila] Показать применение +waila.keybind.testing=[Waila] Тестировать + +client.msg.norecipe=Рецептов не найдено. +client.msg.nousage=Применений не найдено. + +hud.msg.none=<Ничего> +hud.msg.empty=<Пусто> +hud.msg.output=Вывод +hud.msg.input=Ввод +hud.msg.out=Из +hud.msg.in=В +hud.msg.power=Энергия +hud.msg.storage=Хранилище +hud.msg.stored=Хранится +hud.msg.any=Всё +hud.msg.mode=Режим +hud.msg.maxpower=Макс. энергия +hud.msg.trigger=Триггер +hud.msg.maxio=Макс. ввод/вывод + +hud.msg.send=Передача +hud.msg.recv=Приём +hud.msg.item=Предмет +hud.msg.fluid=Жидкость +hud.msg.energ=Энергия +hud.msg.frequency=Частота + +hud.msg.owner=Владелец +hud.msg.public=Публичный +hud.msg.restricted=Ограниченный +hud.msg.private=Приватный + +hud.msg.white=Белый +hud.msg.orange=Оранжевый +hud.msg.magenta=Сиреневый +hud.msg.lblue=Светло-синий +hud.msg.yellow=Жёлтый +hud.msg.lime=Светло-зелёный +hud.msg.pink=Розовый +hud.msg.gray=Серый +hud.msg.lgray=Светло-серый +hud.msg.cyan=Бирюзовый +hud.msg.purple=Фиолетовый +hud.msg.blue=Синий +hud.msg.brown=Коричневый +hud.msg.green=Зелёный +hud.msg.red=Красный +hud.msg.black=Чёрный + +hud.msg.growth=Рост +hud.msg.mature=Вырос +hud.msg.off=Выкл. +hud.msg.on=Вкл. +hud.msg.state=Статус +hud.msg.delay=Задержка +hud.msg.comparator=Компаратор +hud.msg.substractor=Вычитатель +hud.msg.record=Пластинка + +hud.msg.offers=Предложения +hud.msg.demands=Запросы + +option.appeng.monitorcontent=Содержимое монитора +option.bb.content=Содержимое бочки +option.bc.tankamount=Кол-во жидкости +option.bc.tanktype=Тип жидкости +option.enderstorage.colors=Цвета +option.ic2.inputeumach=Макс. вход EU [Механизмы] +option.ic2.inputeuother=Макс. вход EU [Другое] +option.ic2.inputeu=Макс. вход EU +option.ic2.outputeu=Макс. выход EU +option.ic2.storage=Хранится энергии +option.ic2.consump=Показывать потребление +option.ic2.tradeomat=Показывать запрос ресурсообменника +option.thaumcraft.storedvis=Заряд конденсатора +option.thermalexpansion.energyhandler=Показывать заряд RF +option.thermalexpansion.energycell=Показывать ввод/вывод Э.батареи +option.thermalexpansion.fluidtype=Показывать тип жидкости +option.thermalexpansion.fluidamount=Показывать кол-во жидкости +option.thermalexpansion.tankmode=Показывать режим цистерны +option.thermalexpansion.tesssendrecv=Режим тессеракта +option.thermalexpansion.tessfreq=Частота тессеракта +option.thermalexpansion.owner=Показывать владельца +option.thermalexpansion.conditemmode=Показывать режим предметных труб +option.vanilla.spawntype=Тип спаунера +option.vanilla.growthvalue=Стадия роста +option.vanilla.leverstate=Положение рычага +option.vanilla.repeater=Задержка повторителя +option.vanilla.comparator=Режим компаратора +option.vanilla.redstone=Сила красного камня +option.vanilla.jukebox=Пластинка в проигрывателе +option.vanilla.silverfish=Спрятать чешуйницу +option.etb.displaydata=Показывать инф. о сокетах +option.enderio.inout=Показывать ввод/вывод +option.enderio.storage=Показывать заряд MJ +option.enderio.owner=Показывать владельца блока +option.enderio.channel=Показывать канал гиперкуба +option.bcapi.storage=Показывать заряд MJ +option.bcapi.consump=Показывать макс. энергию +option.bcapi.trigger=Показывать энергию активации +option.pr.showio=Показывать ввод/вывод схем +option.pr.showdata=Показывать данные о схемах +option.extrautilities.fluidamount=Показывать кол-во жидкости +option.openblocks.fluidamount=Показывать кол-во жидкости +option.railcraft.fluidamount=Показывать кол-во жидкости +option.secretrooms.hide=Спрятать камуфляжные блоки +option.carpenters.hide=Спрятать камуфляжные блоки +option.stevescarts.showall=Показывать данные +option.stevescarts.colorblind=Режим цветокоррекции +option.stevescarts.shifttoggle=Приседание показывает +option.general.showhp=Показывать здоровье сущностей +option.general.showcrop=Показывать рост растений option.thaumcraft.aspects=Показывать аспекты \ No newline at end of file