diff --git a/.github/workflows/check-local-changes.yml b/.github/workflows/check-local-changes.yml index 0609d67e89d..439bd4ba2a0 100644 --- a/.github/workflows/check-local-changes.yml +++ b/.github/workflows/check-local-changes.yml @@ -40,8 +40,8 @@ jobs: - name: Gen package infos run: ./gradlew generatePackageInfos - - name: Gen patches - run: ./gradlew :neoforge:genPatches + - name: Gen patches and ATs + run: ./gradlew :neoforge:genPatches :neoforge:generateAccessTransformers :neoforge:generateFinalizeSpawnTargets - name: Run datagen with Gradle run: ./gradlew :neoforge:runData :tests:runData diff --git a/build.gradle b/build.gradle index fbc90b7d61c..e9303586e8a 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ import java.util.regex.Pattern plugins { id 'net.neoforged.gradleutils' version '3.0.0' - id 'com.diffplug.spotless' version '6.22.0' apply false + id 'dev.lukebemish.immaculate' version '0.1.6' apply false id 'net.neoforged.licenser' version '0.7.5' id 'neoforge.formatting-conventions' id 'neoforge.versioning' @@ -56,14 +56,14 @@ license { } // Put spotless here because it wants the files to live inside the project root -spotless { - java { - target rootProject.fileTree("src", { +immaculate { + workflows.named("java") { + files.from rootProject.fileTree("src", { include "**/*.java" }) } - format 'patches', { - target rootProject.fileTree("patches") + workflows.register("patches") { + files.from(rootProject.fileTree("patches")) custom 'noImportChanges', { String fileContents -> if (fileContents.contains('+import') || fileContents.contains('-import')) { @@ -72,28 +72,22 @@ spotless { return fileContents } - def interfaceChange = Pattern.compile('^[-+].*(implements|(interface.*extends)).*\$', Pattern.UNIX_LINES | Pattern.MULTILINE) - custom 'noInterfaceRemoval', { String fileContents -> - def interfaceChanges = fileContents.findAll(interfaceChange) + def interfaceChange = Pattern.compile('[-+].*(implements|(interface.*extends))(.*)\\{') + custom 'noInterfaceModifications', { String fileContents -> + def interfaceChanges = fileContents.lines().filter { it.matches(interfaceChange) }.toList() if (interfaceChanges.isEmpty()) return fileContents - String removalChange = "" + String oldInterfaces = "" + // we expect interface additions/removals in pairs of - and then + interfaceChanges.each { String change -> + final match = change =~ interfaceChange + match.find() + final values = match.group(3).trim() if (change.startsWith('-')) { - //Skip the - and the ending brace - int implementsIndex = change.indexOf("implements") - if (implementsIndex == -1) implementsIndex = change.indexOf("extends") - //It should never still be -1 based on our initial matching regex, but if it does fail so we can figure out why - if (implementsIndex == -1) implementsIndex = 1 - removalChange = change.substring(implementsIndex, change.length() - 1).trim() - } else if (!removalChange.isEmpty() && !change.contains(removalChange)) { - throw new GradleException("Removal of interfaces via patches is not allowed!") - } else { - removalChange = "" + oldInterfaces = values + } else if (oldInterfaces != values) { + throw new GradleException("Modification of interfaces via patches is not allowed!") } } - if (!removalChange.isEmpty()) { - throw new GradleException("Removal of interfaces via patches is not allowed!") - } return fileContents } @@ -152,7 +146,5 @@ spotless { custom 'jetbrainsNullablePatches', { String fileContents -> fileContents.replace('@javax.annotation.Nullable', '@org.jetbrains.annotations.Nullable') } - - bumpThisNumberIfACustomStepChanges(5) } } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 6d0ce4c5af1..7c272aa20ad 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -23,4 +23,6 @@ dependencies { implementation "com.google.code.gson:gson:${gradle.parent.ext.gson_version}" implementation "io.codechicken:DiffPatch:${gradle.parent.ext.diffpatch_version}" + + implementation "org.ow2.asm:asm:${gradle.parent.ext.asm_version}" } diff --git a/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle b/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle index e0f554b8205..0a26b947823 100644 --- a/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle +++ b/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle @@ -1,6 +1,6 @@ import java.util.regex.Matcher -project.plugins.apply('com.diffplug.spotless') +project.plugins.apply('dev.lukebemish.immaculate') abstract class GeneratePackageInfos extends DefaultTask { @InputFiles @@ -36,15 +36,19 @@ final generatePackageInfos = tasks.register('generatePackageInfos', GeneratePack it.files.from fileTree("src/main/java") } -spotless { - java { - endWithNewline() - indentWithSpaces() - removeUnusedImports() - toggleOffOn() - // Pin version to 4.31 because of a Spotless bug https://github.com/diffplug/spotless/issues/1992 - eclipse('4.31').configFile rootProject.file('codeformat/formatter-config.xml') - importOrder() +immaculate { + workflows.register('java') { + java() + trailingNewline() + noTabs() + googleFixImports() + toggleOff = 'spotless:off' + toggleOn = 'spotless:on' + eclipse { + version '3.37.0' + config = rootProject.file('codeformat/formatter-config.xml') + } + // courtesy of diffplug/spotless#240 // https://github.com/diffplug/spotless/issues/240#issuecomment-385206606 @@ -63,14 +67,13 @@ spotless { custom 'jetbrainsNullable', { String fileContents -> fileContents.replace('javax.annotation.Nullable', 'org.jetbrains.annotations.Nullable') } - bumpThisNumberIfACustomStepChanges(3) } } tasks.named('licenseFormat').configure { mustRunAfter generatePackageInfos } -tasks.named('spotlessApply').configure { +tasks.named('immaculateApply').configure { mustRunAfter generatePackageInfos mustRunAfter tasks.named('licenseFormat') } @@ -78,13 +81,13 @@ tasks.named('spotlessApply').configure { tasks.register('applyAllFormatting', Task) { dependsOn generatePackageInfos dependsOn tasks.named('licenseFormat') - dependsOn tasks.named('spotlessApply') + dependsOn tasks.named('immaculateApply') group = 'verification' } tasks.register('checkFormatting', Task) { dependsOn 'licenseCheck' - dependsOn 'spotlessCheck' + dependsOn 'immaculateCheck' group = 'verification' } diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java new file mode 100644 index 00000000000..0158087e5a5 --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java @@ -0,0 +1,179 @@ +package net.neoforged.neodev; + +import net.neoforged.neodev.utils.FileUtils; +import net.neoforged.neodev.utils.SerializablePredicate; +import net.neoforged.neodev.utils.structure.ClassInfo; +import net.neoforged.neodev.utils.structure.ClassStructureVisitor; +import net.neoforged.neodev.utils.structure.FieldInfo; +import net.neoforged.neodev.utils.structure.MethodInfo; +import org.gradle.api.DefaultTask; +import org.gradle.api.Named; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; +import org.objectweb.asm.Opcodes; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * This task is used to generate access transformers based on a set of rules defined in the buildscript. + */ +public abstract class GenerateAccessTransformers extends DefaultTask { + public static final Modifier PUBLIC = new Modifier("public", false, Opcodes.ACC_PUBLIC); + public static final Modifier PROTECTED = new Modifier("protected", false, Opcodes.ACC_PUBLIC, Opcodes.ACC_PROTECTED); + + @InputFile + public abstract RegularFileProperty getInput(); + + @OutputFile + public abstract RegularFileProperty getAccessTransformer(); + + @Input + public abstract ListProperty getGroups(); + + @TaskAction + public void exec() throws IOException { + // First we collect all classes + var targets = ClassStructureVisitor.readJar(getInput().getAsFile().get()); + + var groupList = getGroups().get(); + + List[] groups = new List[groupList.size()]; + for (int i = 0; i < groupList.size(); i++) { + groups[i] = new ArrayList<>(); + } + + // Now we check each class against each group and see if the group wants to handle it + for (ClassInfo value : targets.values()) { + for (int i = 0; i < groupList.size(); i++) { + var group = groupList.get(i); + if (group.classMatch.test(value)) { + var lastInner = value.name().lastIndexOf("$"); + // Skip anonymous classes + if (lastInner >= 0 && Character.isDigit(value.name().charAt(lastInner + 1))) { + continue; + } + + // fieldMatch is non-null only for field ATs + if (group.fieldMatch != null) { + for (var field : value.fields()) { + if (group.fieldMatch.test(field) && !group.modifier.test(field.access())) { + groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + field.name()); + } + } + } + // methodMatch is non-null only for group ATs + else if (group.methodMatch != null) { + for (var method : value.methods()) { + if (group.methodMatch.test(method) && !group.modifier.test(method.access())) { + groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + method.name() + method.descriptor()); + } + } + } + // If there's neither a field nor a method predicate, this is a class AT + else if (!group.modifier.test(value.access().intValue())) { + groups[i].add(group.modifier.name + " " + value.name().replace('/', '.')); + + // If we AT a record we must ensure that its constructors have the same AT + if (value.hasSuperclass("java/lang/Record")) { + for (MethodInfo method : value.methods()) { + if (method.name().equals("")) { + groups[i].add(group.modifier.name + " " + value.name().replace('/', '.') + " " + method.name() + method.descriptor()); + } + } + } + } + } + } + } + + // Dump the ATs + var text = new StringBuilder(); + + text.append("# This file is generated based on the rules defined in the buildscript. DO NOT modify it manually.\n# Add more rules in the buildscript and then run the generateAccessTransformers task to update this file.\n\n"); + + for (int i = 0; i < groups.length; i++) { + // Check if the group found no targets. If it didn't, there's probably an error in the test and it should be reported + if (groups[i].isEmpty()) { + throw new IllegalStateException("Generated AT group '" + groupList.get(i).name + "' found no entries!"); + } + text.append("# ").append(groupList.get(i).name).append('\n'); + text.append(groups[i].stream().sorted().collect(Collectors.joining("\n"))); + text.append('\n'); + + if (i < groups.length - 1) text.append('\n'); + } + + var outFile = getAccessTransformer().getAsFile().get().toPath(); + if (!Files.exists(outFile.getParent())) { + Files.createDirectories(outFile.getParent()); + } + + FileUtils.writeStringSafe(outFile, text.toString(), StandardCharsets.UTF_8); + } + + public void classGroup(String name, Modifier modifier, SerializablePredicate match) { + getGroups().add(new AtGroup(name, modifier, match, null, null)); + } + + public void methodGroup(String name, Modifier modifier, SerializablePredicate targetTest, SerializablePredicate methodTest) { + getGroups().add(new AtGroup(name, modifier, targetTest, methodTest, null)); + } + + public void fieldGroup(String name, Modifier modifier, SerializablePredicate targetTest, SerializablePredicate fieldTest) { + getGroups().add(new AtGroup(name, modifier, targetTest, null, fieldTest)); + } + + public SerializablePredicate named(String name) { + return target -> target.getName().equals(name); + } + + public SerializablePredicate classesWithSuperclass(String superClass) { + return target -> target.hasSuperclass(superClass); + } + + public SerializablePredicate innerClassesOf(String parent) { + var parentFullName = parent + "$"; + return target -> target.name().startsWith(parentFullName); + } + + public SerializablePredicate methodsReturning(String type) { + var endMatch = ")L" + type + ";"; + return methodInfo -> methodInfo.descriptor().endsWith(endMatch); + } + + public SerializablePredicate fieldsOfType(SerializablePredicate type) { + return value -> type.test(value.type()); + } + + public SerializablePredicate matchAny() { + return value -> true; + } + + public record AtGroup(String name, Modifier modifier, SerializablePredicate classMatch, + @Nullable SerializablePredicate methodMatch, @Nullable SerializablePredicate fieldMatch) implements Serializable { + } + + public record Modifier(String name, boolean isFinal, int... validOpcodes) implements Serializable { + public boolean test(int value) { + if (isFinal && (value & Opcodes.ACC_FINAL) == 0) return false; + + for (int validOpcode : validOpcodes) { + if ((value & validOpcode) != 0) { + return true; + } + } + return false; + } + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateFinalizeSpawnTargets.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateFinalizeSpawnTargets.java new file mode 100644 index 00000000000..bb0a1da1b16 --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateFinalizeSpawnTargets.java @@ -0,0 +1,81 @@ +package net.neoforged.neodev; + +import com.google.gson.GsonBuilder; +import net.neoforged.neodev.utils.AsmUtils; +import net.neoforged.neodev.utils.FileUtils; +import org.gradle.api.DefaultTask; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * This task is used to generate targets for the finalizeSpawn MethodRedirector coremod. + */ +public abstract class GenerateFinalizeSpawnTargets extends DefaultTask { + @InputFile + public abstract RegularFileProperty getInput(); + + @OutputFile + public abstract RegularFileProperty getOutput(); + + @TaskAction + public void exec() throws IOException { + var visitor = new Visitor(); + AsmUtils.visitAllClasses( + getInput().getAsFile().get(), + visitor, + ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + + var classList = List.copyOf(visitor.matchedClasses); + + FileUtils.writeStringSafe( + getOutput().getAsFile().get().toPath(), + new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(classList), + StandardCharsets.UTF_8); + } + + static class Visitor extends ClassVisitor { + final Set matchedClasses = new TreeSet<>(); + String currentClass = null; + + protected Visitor() { + super(Opcodes.ASM9); + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + currentClass = name; + } + + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + // Ignore these classes as we special case them + if (currentClass.equals("net/minecraft/world/level/BaseSpawner") + || currentClass.equals("net/minecraft/world/level/block/entity/trialspawner/TrialSpawner")) { + return null; + } + + return new MethodVisitor(api) { + @Override + public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) { + if (opcode == Opcodes.INVOKEVIRTUAL + && name.equals("finalizeSpawn") + && descriptor.equals("(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;")) { + matchedClasses.add(currentClass); + } + } + }; + } + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateSourcePatches.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateSourcePatches.java index c6e1c7e7302..25a3ab21c43 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/GenerateSourcePatches.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateSourcePatches.java @@ -9,6 +9,8 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; @@ -25,9 +27,14 @@ abstract class GenerateSourcePatches extends DefaultTask { @PathSensitive(PathSensitivity.RELATIVE) public abstract DirectoryProperty getModifiedSources(); + @Optional @OutputFile public abstract RegularFileProperty getPatchesJar(); + @Optional + @OutputDirectory + public abstract DirectoryProperty getPatchesFolder(); + @Inject public GenerateSourcePatches() {} @@ -37,7 +44,7 @@ public void generateSourcePatches() throws IOException { .logTo(getLogger()::lifecycle) .baseInput(MultiInput.detectedArchive(getOriginalJar().get().getAsFile().toPath())) .changedInput(MultiInput.folder(getModifiedSources().get().getAsFile().toPath())) - .patchesOutput(MultiOutput.detectedArchive(getPatchesJar().get().getAsFile().toPath())) + .patchesOutput(getPatchesJar().isPresent() ? MultiOutput.detectedArchive(getPatchesJar().get().getAsFile().toPath()) : MultiOutput.folder(getPatchesFolder().getAsFile().get().toPath())) .autoHeader(true) .level(io.codechicken.diffpatch.util.LogLevel.WARN) .summary(false) diff --git a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java index d38f91f46bb..58a9596d8f4 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java @@ -70,26 +70,69 @@ public void apply(Project project) { // Task must run on sync to have MC resources available for IDEA nondelegated builds. NeoDevFacade.runTaskOnProjectSync(project, createSourceArtifacts); + // Obtain clean binary artifacts, needed to be able to generate ATs + var createCleanArtifacts = tasks.register("createCleanArtifacts", CreateCleanArtifacts.class, task -> { + task.setGroup(INTERNAL_GROUP); + task.setDescription("This task retrieves various files for the Minecraft version without applying NeoForge patches to them"); + var cleanArtifactsDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/clean")); + task.getRawClientJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-client.jar"))); + task.getCleanClientJar().set(cleanArtifactsDir.map(dir -> dir.file("client.jar"))); + task.getRawServerJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-server.jar"))); + task.getCleanServerJar().set(cleanArtifactsDir.map(dir -> dir.file("server.jar"))); + task.getCleanJoinedJar().set(cleanArtifactsDir.map(dir -> dir.file("joined.jar"))); + task.getMergedMappings().set(cleanArtifactsDir.map(dir -> dir.file("merged-mappings.txt"))); + task.getNeoFormArtifact().set(mcAndNeoFormVersion.map(version -> "net.neoforged:neoform:" + version + "@zip")); + }); + + var genAts = project.getRootProject().file("src/main/resources/META-INF/accesstransformergenerated.cfg"); + + var genAtsTask = tasks.register("generateAccessTransformers", GenerateAccessTransformers.class, task -> { + task.setGroup(GROUP); + task.setDescription("Generate access transformers based on a set of rules defined in the buildscript"); + task.getInput().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanJoinedJar)); + task.getAccessTransformer().set(genAts); + }); + // 2. Apply AT to the source jar from 1. - var atFile = project.getRootProject().file("src/main/resources/META-INF/accesstransformer.cfg"); + var atFiles = List.of( + project.getRootProject().file("src/main/resources/META-INF/accesstransformer.cfg"), + genAts + ); var applyAt = configureAccessTransformer( project, - configurations, createSourceArtifacts, neoDevBuildDir, - atFile); + atFiles); + + applyAt.configure(task -> task.mustRunAfter(genAtsTask)); + + // 3. Apply interface injections after the ATs + // this jar is only used for the patches in the repo + var applyInterfaceInjection = project.getTasks().register("applyInterfaceInjection", TransformSources.class, task -> { + task.getInputJar().set(applyAt.flatMap(TransformSources::getOutputJar)); + task.getInterfaceInjectionData().from(project.getRootProject().file("src/main/resources/META-INF/injected-interfaces.json")); + task.getOutputJar().set(neoDevBuildDir.map(dir -> dir.file("artifacts/interface-injected-sources.jar"))); + }); + + tasks.withType(TransformSources.class, task -> { + task.setGroup(INTERNAL_GROUP); + task.classpath(configurations.getExecutableTool(Tools.JST)); + + task.getLibraries().from(configurations.neoFormClasspath); + task.getLibrariesFile().set(neoDevBuildDir.map(dir -> dir.file("minecraft-libraries-for-" + task.getName() + ".txt"))); + }); - // 3. Apply patches to the source jar from 2. + // 4. Apply patches to the source jar from 3. var patchesFolder = project.getRootProject().file("patches"); var applyPatches = tasks.register("applyPatches", ApplyPatches.class, task -> { task.setGroup(INTERNAL_GROUP); - task.getOriginalJar().set(applyAt.flatMap(ApplyAccessTransformer::getOutputJar)); + task.getOriginalJar().set(applyInterfaceInjection.flatMap(TransformSources::getOutputJar)); task.getPatchesFolder().set(patchesFolder); task.getPatchedJar().set(neoDevBuildDir.map(dir -> dir.file("artifacts/patched-sources.jar"))); task.getRejectsFolder().set(project.getRootProject().file("rejects")); }); - // 4. Unpack jar from 3. + // 5. Unpack jar from 4. var mcSourcesPath = project.file("src/main/java"); tasks.register("setup", Sync.class, task -> { task.setGroup(GROUP); @@ -157,14 +200,22 @@ public void apply(Project project) { * OTHER TASKS */ - // Generate source patches into a patch archive. + // Generate source patches into a patch archive, based on the jar with injected interfaces. var genSourcePatches = tasks.register("generateSourcePatches", GenerateSourcePatches.class, task -> { task.setGroup(INTERNAL_GROUP); - task.getOriginalJar().set(applyAt.flatMap(ApplyAccessTransformer::getOutputJar)); + task.getOriginalJar().set(applyInterfaceInjection.flatMap(TransformSources::getOutputJar)); task.getModifiedSources().set(project.file("src/main/java")); task.getPatchesJar().set(neoDevBuildDir.map(dir -> dir.file("source-patches.zip"))); }); + // Generate source patches that are based on the production environment (without separate interface injection) + var genProductionPatches = tasks.register("generateProductionSourcePatches", GenerateSourcePatches.class, task -> { + task.setGroup(INTERNAL_GROUP); + task.getOriginalJar().set(applyAt.flatMap(TransformSources::getOutputJar)); + task.getModifiedSources().set(project.file("src/main/java")); + task.getPatchesFolder().set(neoDevBuildDir.map(dir -> dir.dir("production-source-patches"))); + }); + // Update the patch/ folder with the current patches. tasks.register("genPatches", Sync.class, task -> { task.setGroup(GROUP); @@ -212,25 +263,12 @@ public void apply(Project project) { jarJarTask.configure(task -> task.setGroup(INTERNAL_GROUP)); universalJar.configure(task -> task.from(jarJarTask)); - var createCleanArtifacts = tasks.register("createCleanArtifacts", CreateCleanArtifacts.class, task -> { - task.setGroup(INTERNAL_GROUP); - task.setDescription("This task retrieves various files for the Minecraft version without applying NeoForge patches to them"); - var cleanArtifactsDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/clean")); - task.getRawClientJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-client.jar"))); - task.getCleanClientJar().set(cleanArtifactsDir.map(dir -> dir.file("client.jar"))); - task.getRawServerJar().set(cleanArtifactsDir.map(dir -> dir.file("raw-server.jar"))); - task.getCleanServerJar().set(cleanArtifactsDir.map(dir -> dir.file("server.jar"))); - task.getCleanJoinedJar().set(cleanArtifactsDir.map(dir -> dir.file("joined.jar"))); - task.getMergedMappings().set(cleanArtifactsDir.map(dir -> dir.file("merged-mappings.txt"))); - task.getNeoFormArtifact().set(mcAndNeoFormVersion.map(version -> "net.neoforged:neoform:" + version + "@zip")); - }); - var binaryPatchOutputs = configureBinaryPatchCreation( project, configurations, createCleanArtifacts, neoDevBuildDir, - patchesFolder + genProductionPatches.flatMap(GenerateSourcePatches::getPatchesFolder) ); // Launcher profile = the version.json file used by the Minecraft launcher. @@ -390,13 +428,13 @@ public void apply(Project project) { task.from(writeUserDevConfig.flatMap(CreateUserDevConfig::getUserDevConfig), spec -> { spec.rename(s -> "config.json"); }); - task.from(atFile, spec -> { + task.from(atFiles, spec -> { spec.into("ats/"); }); task.from(binaryPatchOutputs.binaryPatchesForMerged(), spec -> { spec.rename(s -> "joined.lzma"); }); - task.from(project.zipTree(genSourcePatches.flatMap(GenerateSourcePatches::getPatchesJar)), spec -> { + task.from(project.fileTree(genProductionPatches.flatMap(GenerateSourcePatches::getPatchesFolder)), spec -> { spec.into("patches/"); }); }); @@ -429,24 +467,19 @@ public void apply(Project project) { setupProductionServerTest(project, installerJar); } - private static TaskProvider configureAccessTransformer( + private static TaskProvider configureAccessTransformer( Project project, - NeoDevConfigurations configurations, TaskProvider createSourceArtifacts, Provider neoDevBuildDir, - File atFile) { + List atFiles) { // Pass -PvalidateAccessTransformers to validate ATs. var validateAts = project.getProviders().gradleProperty("validateAccessTransformers").map(p -> true).orElse(false); - return project.getTasks().register("applyAccessTransformer", ApplyAccessTransformer.class, task -> { - task.setGroup(INTERNAL_GROUP); - task.classpath(configurations.getExecutableTool(Tools.JST)); + return project.getTasks().register("applyAccessTransformer", TransformSources.class, task -> { task.getInputJar().set(createSourceArtifacts.flatMap(CreateMinecraftArtifacts::getSourcesArtifact)); - task.getAccessTransformer().set(atFile); - task.getValidate().set(validateAts); + task.getAccessTransformers().from(atFiles); + task.getValidateAccessTransformers().set(validateAts); task.getOutputJar().set(neoDevBuildDir.map(dir -> dir.file("artifacts/access-transformed-sources.jar"))); - task.getLibraries().from(configurations.neoFormClasspath); - task.getLibrariesFile().set(neoDevBuildDir.map(dir -> dir.file("minecraft-libraries-for-jst.txt"))); }); } @@ -454,7 +487,7 @@ private static BinaryPatchOutputs configureBinaryPatchCreation(Project project, NeoDevConfigurations configurations, TaskProvider createCleanArtifacts, Provider neoDevBuildDir, - File sourcesPatchesFolder) { + Provider sourcesPatchesFolder) { var tasks = project.getTasks(); var artConfig = configurations.getExecutableTool(Tools.AUTO_RENAMING_TOOL); diff --git a/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java b/buildSrc/src/main/java/net/neoforged/neodev/TransformSources.java similarity index 53% rename from buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java rename to buildSrc/src/main/java/net/neoforged/neodev/TransformSources.java index 7131cc8fddc..a62bfd92a62 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/ApplyAccessTransformer.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/TransformSources.java @@ -7,8 +7,10 @@ import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; @@ -17,22 +19,27 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; /** - * Runs JavaSourceTransformer to apply - * access transformers to the Minecraft source code for extending the access level of existing classes/methods/etc. - *

- * Note that at runtime, FML also applies access transformers. + * Runs JavaSourceTransformer over the Minecraft source code. */ -abstract class ApplyAccessTransformer extends JavaExec { - @InputFile - public abstract RegularFileProperty getInputJar(); - - @InputFile - public abstract RegularFileProperty getAccessTransformer(); +abstract class TransformSources extends JavaExec { + @Optional + @InputFiles + public abstract ConfigurableFileCollection getAccessTransformers(); @Input - public abstract Property getValidate(); + @Optional + public abstract Property getValidateAccessTransformers(); + + @Optional + @InputFiles + public abstract ConfigurableFileCollection getInterfaceInjectionData(); + + @InputFile + public abstract RegularFileProperty getInputJar(); @OutputFile public abstract RegularFileProperty getOutputJar(); @@ -45,7 +52,7 @@ abstract class ApplyAccessTransformer extends JavaExec { public abstract RegularFileProperty getLibrariesFile(); @Inject - public ApplyAccessTransformer() {} + public TransformSources() {} @Override @TaskAction @@ -59,13 +66,37 @@ public void exec() { throw new UncheckedIOException("Failed to write libraries for JST.", exception); } - args( - "--enable-accesstransformers", - "--access-transformer", getAccessTransformer().getAsFile().get().getAbsolutePath(), - "--access-transformer-validation", getValidate().get() ? "error" : "log", - "--libraries-list", getLibrariesFile().getAsFile().get().getAbsolutePath(), + var args = new ArrayList<>(Arrays.asList( + "--libraries-list", getLibrariesFile().getAsFile().get().getAbsolutePath() + )); + + if (!getAccessTransformers().isEmpty()) { + args.addAll(Arrays.asList( + "--enable-accesstransformers", + "--access-transformer-validation", getValidateAccessTransformers().get() ? "error" : "log" + )); + for (var file : getAccessTransformers().getFiles()) { + args.addAll(Arrays.asList( + "--access-transformer", file.getAbsolutePath() + )); + } + } + + if (!getInterfaceInjectionData().isEmpty()) { + args.add("--enable-interface-injection"); + + for (var file : getInterfaceInjectionData().getFiles()) { + args.addAll(Arrays.asList( + "--interface-injection-data", file.getAbsolutePath() + )); + } + } + + args.addAll(Arrays.asList( getInputJar().getAsFile().get().getAbsolutePath(), - getOutputJar().getAsFile().get().getAbsolutePath()); + getOutputJar().getAsFile().get().getAbsolutePath())); + + args(args); super.exec(); } diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/AsmUtils.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/AsmUtils.java new file mode 100644 index 00000000000..0cc3fdb747d --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/AsmUtils.java @@ -0,0 +1,27 @@ +package net.neoforged.neodev.utils; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; + +import java.io.File; +import java.io.IOException; +import java.util.zip.ZipFile; + +public final class AsmUtils { + private AsmUtils() {} + + public static void visitAllClasses(File jarFile, ClassVisitor visitor, int parsingOptions) throws IOException { + try (var zip = new ZipFile(jarFile)) { + var entries = zip.entries(); + while (entries.hasMoreElements()) { + var next = entries.nextElement(); + if (next.isDirectory() || !next.getName().endsWith(".class")) continue; + + try (var in = zip.getInputStream(next)) { + var reader = new ClassReader(in); + reader.accept(visitor, parsingOptions); + } + } + } + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java new file mode 100644 index 00000000000..9a42b1669e3 --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/SerializablePredicate.java @@ -0,0 +1,10 @@ +package net.neoforged.neodev.utils; + +import java.io.Serializable; +import java.util.function.Predicate; + +@FunctionalInterface +public interface SerializablePredicate extends Serializable, Predicate { + @Override + boolean test(T value); +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java new file mode 100644 index 00000000000..a9a4102f12c --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassInfo.java @@ -0,0 +1,27 @@ +package net.neoforged.neodev.utils.structure; + +import org.apache.commons.lang3.mutable.MutableInt; +import org.gradle.api.Named; + +import java.util.List; + +public record ClassInfo(String name, MutableInt access, List parents, List methods, + List fields) implements Named { + public void addMethod(String name, String desc, int access) { + this.methods.add(new MethodInfo(name, desc, access)); + } + + public boolean hasSuperclass(String name) { + for (ClassInfo parent : parents) { + if (parent.hasSuperclass(name)) { + return true; + } + } + return this.name.equals(name); + } + + @Override + public String getName() { + return name; + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java new file mode 100644 index 00000000000..c5384d2906a --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/ClassStructureVisitor.java @@ -0,0 +1,74 @@ +package net.neoforged.neodev.utils.structure; + +import net.neoforged.neodev.utils.AsmUtils; +import org.apache.commons.lang3.mutable.MutableInt; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public final class ClassStructureVisitor extends ClassVisitor { + private final Map classes; + ClassInfo current; + + private ClassStructureVisitor(Map classes) { + super(Opcodes.ASM9); + this.classes = classes; + } + + public static Map readJar(File file) throws IOException { + var map = new HashMap(); + AsmUtils.visitAllClasses( + file, + new ClassStructureVisitor(map), + ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + return map; + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + current = getClass(name); + current.access().setValue(access); + if (superName != null) { + current.parents().add(getClass(superName)); + } + for (String iface : interfaces) { + current.parents().add(getClass(iface)); + } + } + + @Override + public void visitInnerClass(String name, String outerName, String innerName, int access) { + if (name.equals(current.name())) { + current.access().setValue(access); + } + } + + @Override + public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { + current.fields().add(new FieldInfo(name, getClass(Type.getType(descriptor).getInternalName()), access)); + return null; + } + + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + current.addMethod(name, descriptor, access); + return null; + } + + private ClassInfo getClass(String name) { + var existing = classes.get(name); + if (existing != null) return existing; + existing = new ClassInfo(name, new MutableInt(0), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + classes.put(name, existing); + return existing; + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java new file mode 100644 index 00000000000..378c634a8e0 --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/FieldInfo.java @@ -0,0 +1,10 @@ +package net.neoforged.neodev.utils.structure; + +import org.gradle.api.Named; + +public record FieldInfo(String name, ClassInfo type, int access) implements Named { + @Override + public String getName() { + return name; + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java new file mode 100644 index 00000000000..8ec02e36780 --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/utils/structure/MethodInfo.java @@ -0,0 +1,10 @@ +package net.neoforged.neodev.utils.structure; + +import org.gradle.api.Named; + +public record MethodInfo(String name, String descriptor, int access) implements Named { + @Override + public String getName() { + return name; + } +} diff --git a/coremods/build.gradle b/coremods/build.gradle index 127e7ec9dfc..dc92c1c7b84 100644 --- a/coremods/build.gradle +++ b/coremods/build.gradle @@ -1,6 +1,5 @@ plugins { id 'java-library' - id 'com.diffplug.spotless' id 'net.neoforged.licenser' id 'neoforge.formatting-conventions' } diff --git a/coremods/src/main/resources/net/neoforged/neoforge/coremods/finalize_spawn_targets.json b/coremods/src/main/resources/net/neoforged/neoforge/coremods/finalize_spawn_targets.json index 494cd63bc2e..bf18b458103 100644 --- a/coremods/src/main/resources/net/neoforged/neoforge/coremods/finalize_spawn_targets.json +++ b/coremods/src/main/resources/net/neoforged/neoforge/coremods/finalize_spawn_targets.json @@ -1,24 +1,24 @@ [ - "net/minecraft/server/commands/RaidCommand", - "net/minecraft/server/commands/SummonCommand", - "net/minecraft/world/entity/EntityType", - "net/minecraft/world/entity/ai/village/VillageSiege", - "net/minecraft/world/entity/animal/frog/Tadpole", - "net/minecraft/world/entity/animal/horse/SkeletonTrapGoal", - "net/minecraft/world/entity/monster/Evoker$EvokerSummonSpellGoal", - "net/minecraft/world/entity/monster/Spider", - "net/minecraft/world/entity/monster/Strider", - "net/minecraft/world/entity/monster/Zombie", - "net/minecraft/world/entity/monster/ZombieVillager", - "net/minecraft/world/entity/npc/CatSpawner", - "net/minecraft/world/entity/npc/Villager", - "net/minecraft/world/entity/raid/Raid", - "net/minecraft/world/level/NaturalSpawner", - "net/minecraft/world/level/levelgen/PatrolSpawner", - "net/minecraft/world/level/levelgen/PhantomSpawner", - "net/minecraft/world/level/levelgen/structure/structures/OceanMonumentPieces$OceanMonumentPiece", - "net/minecraft/world/level/levelgen/structure/structures/OceanRuinPieces$OceanRuinPiece", - "net/minecraft/world/level/levelgen/structure/structures/SwampHutPiece", - "net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionPieces$WoodlandMansionPiece", - "net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate" + "net/minecraft/server/commands/RaidCommand", + "net/minecraft/server/commands/SummonCommand", + "net/minecraft/world/entity/EntityType", + "net/minecraft/world/entity/ai/village/VillageSiege", + "net/minecraft/world/entity/animal/frog/Tadpole", + "net/minecraft/world/entity/animal/horse/SkeletonTrapGoal", + "net/minecraft/world/entity/monster/Evoker$EvokerSummonSpellGoal", + "net/minecraft/world/entity/monster/Spider", + "net/minecraft/world/entity/monster/Strider", + "net/minecraft/world/entity/monster/Zombie", + "net/minecraft/world/entity/monster/ZombieVillager", + "net/minecraft/world/entity/npc/CatSpawner", + "net/minecraft/world/entity/npc/Villager", + "net/minecraft/world/entity/raid/Raid", + "net/minecraft/world/level/NaturalSpawner", + "net/minecraft/world/level/levelgen/PatrolSpawner", + "net/minecraft/world/level/levelgen/PhantomSpawner", + "net/minecraft/world/level/levelgen/structure/structures/OceanMonumentPieces$OceanMonumentPiece", + "net/minecraft/world/level/levelgen/structure/structures/OceanRuinPieces$OceanRuinPiece", + "net/minecraft/world/level/levelgen/structure/structures/SwampHutPiece", + "net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionPieces$WoodlandMansionPiece", + "net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate" ] \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 00f2af575d9..9c80c037df6 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -27,7 +27,7 @@ Contributing to NeoForge - If possible, write an automated test under the tests project. See [NEOGAMETESTS.md](NEOGAMETESTS.md) for more info. 10. Run `gradlew genPatches` to generate patch-files from the patched sources 11. Run `gradlew applyAllFormatting` to automatically format sources -12. Check correct formatting with `gradlew spotlessCheck` +12. Check correct formatting with `gradlew checkFormatting` 13. Commit & Push 14. Make PR diff --git a/gradle.properties b/gradle.properties index 3ab3c77e910..c4bfeb5e247 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,7 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. -org.gradle.jvmargs=-Xmx3G +# This is required to provide enough memory for recompilation +# (see also projects/neoforged/build.gradle, where the compile tasks is set to have enough memory when forked) +org.gradle.jvmargs=-Xmx2G org.gradle.daemon=true org.gradle.parallel=true org.gradle.caching=true @@ -21,7 +22,7 @@ neoform_version=20241203.161809 neoforge_snapshot_next_stable=21.5 # renovate: net.neoforged.jst:jst-cli-bundle -jst_version=1.0.45 +jst_version=1.0.67 legacyinstaller_version=3.0.+ # renovate: net.neoforged:AutoRenamingTool art_version=2.0.3 diff --git a/patches/com/mojang/blaze3d/vertex/PoseStack.java.patch b/patches/com/mojang/blaze3d/vertex/PoseStack.java.patch deleted file mode 100644 index c3b47049f8b..00000000000 --- a/patches/com/mojang/blaze3d/vertex/PoseStack.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/com/mojang/blaze3d/vertex/PoseStack.java -+++ b/com/mojang/blaze3d/vertex/PoseStack.java -@@ -14,7 +_,7 @@ - import org.joml.Vector3f; - - @OnlyIn(Dist.CLIENT) --public class PoseStack { -+public class PoseStack implements net.neoforged.neoforge.client.extensions.IPoseStackExtension { - private final Deque poseStack = Util.make(Queues.newArrayDeque(), p_85848_ -> { - Matrix4f matrix4f = new Matrix4f(); - Matrix3f matrix3f = new Matrix3f(); diff --git a/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch b/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch index 30c19c43bf7..de103fa5b94 100644 --- a/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch +++ b/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch @@ -1,14 +1,5 @@ --- a/com/mojang/blaze3d/vertex/VertexConsumer.java +++ b/com/mojang/blaze3d/vertex/VertexConsumer.java -@@ -13,7 +_,7 @@ - import org.lwjgl.system.MemoryStack; - - @OnlyIn(Dist.CLIENT) --public interface VertexConsumer { -+public interface VertexConsumer extends net.neoforged.neoforge.client.extensions.IVertexConsumerExtension { - VertexConsumer addVertex(float p_350761_, float p_350704_, float p_350711_); - - VertexConsumer setColor(int p_350535_, int p_350875_, int p_350886_, int p_350775_); @@ -131,11 +_,14 @@ f5 = p_331397_[i1] * p_85992_ * 255.0F; } diff --git a/patches/com/mojang/blaze3d/vertex/VertexFormatElement.java.patch b/patches/com/mojang/blaze3d/vertex/VertexFormatElement.java.patch index 58433a6f82c..cb320950112 100644 --- a/patches/com/mojang/blaze3d/vertex/VertexFormatElement.java.patch +++ b/patches/com/mojang/blaze3d/vertex/VertexFormatElement.java.patch @@ -16,16 +16,14 @@ @OnlyIn(Dist.CLIENT) public static enum Type { FLOAT(4, "Float", 5126), -@@ -113,7 +_,8 @@ +@@ -113,6 +_,7 @@ } @OnlyIn(Dist.CLIENT) -- public static enum Usage { + @net.neoforged.fml.common.asm.enumextension.NamedEnum -+ public static enum Usage implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public static enum Usage implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { POSITION( "Position", - (p_349733_, p_349734_, p_349735_, p_349736_, p_349737_) -> GlStateManager._vertexAttribPointer( @@ -163,6 +_,10 @@ @OnlyIn(Dist.CLIENT) public interface SetupState { diff --git a/patches/com/mojang/math/Transformation.java.patch b/patches/com/mojang/math/Transformation.java.patch index ee4ad52b536..0b7d57931dd 100644 --- a/patches/com/mojang/math/Transformation.java.patch +++ b/patches/com/mojang/math/Transformation.java.patch @@ -1,20 +1,9 @@ --- a/com/mojang/math/Transformation.java +++ b/com/mojang/math/Transformation.java -@@ -13,7 +_,7 @@ - import org.joml.Quaternionf; - import org.joml.Vector3f; - --public final class Transformation { -+public final class Transformation implements net.neoforged.neoforge.common.extensions.ITransformationExtension { - private final Matrix4f matrix; - public static final Codec CODEC = RecordCodecBuilder.create( - p_269604_ -> p_269604_.group( -@@ -157,6 +_,19 @@ - @Override - public int hashCode() { +@@ -159,6 +_,19 @@ return Objects.hash(this.matrix); -+ } -+ + } + + private Matrix3f normalTransform = null; + public Matrix3f getNormalMatrix() { + checkNormalTransform(); @@ -26,6 +15,8 @@ + normalTransform.invert(); + normalTransform.transpose(); + } - } - ++ } ++ public Transformation slerp(Transformation p_175938_, float p_175939_) { + Vector3f vector3f = this.getTranslation(); + Quaternionf quaternionf = this.getLeftRotation(); diff --git a/patches/net/minecraft/advancements/Advancement.java.patch b/patches/net/minecraft/advancements/Advancement.java.patch index 8a488857dc6..4faeee7d894 100644 --- a/patches/net/minecraft/advancements/Advancement.java.patch +++ b/patches/net/minecraft/advancements/Advancement.java.patch @@ -8,12 +8,3 @@ public Advancement( Optional p_300893_, -@@ -111,7 +_,7 @@ - }); - } - -- public static class Builder { -+ public static class Builder implements net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension { - private Optional parent = Optional.empty(); - private Optional display = Optional.empty(); - private AdvancementRewards rewards = AdvancementRewards.EMPTY; diff --git a/patches/net/minecraft/client/KeyMapping.java.patch b/patches/net/minecraft/client/KeyMapping.java.patch index 3fb1afaedfc..2c47949a5dd 100644 --- a/patches/net/minecraft/client/KeyMapping.java.patch +++ b/patches/net/minecraft/client/KeyMapping.java.patch @@ -1,11 +1,8 @@ --- a/net/minecraft/client/KeyMapping.java +++ b/net/minecraft/client/KeyMapping.java -@@ -15,9 +_,9 @@ - import net.neoforged.api.distmarker.OnlyIn; - +@@ -17,7 +_,7 @@ @OnlyIn(Dist.CLIENT) --public class KeyMapping implements Comparable { -+public class KeyMapping implements Comparable, net.neoforged.neoforge.client.extensions.IKeyMappingExtension { + public class KeyMapping implements Comparable, net.neoforged.neoforge.client.extensions.IKeyMappingExtension { private static final Map ALL = Maps.newHashMap(); - private static final Map MAP = Maps.newHashMap(); + private static final net.neoforged.neoforge.client.settings.KeyMappingLookup MAP = new net.neoforged.neoforge.client.settings.KeyMappingLookup(); diff --git a/patches/net/minecraft/client/Minecraft.java.patch b/patches/net/minecraft/client/Minecraft.java.patch index c43825a3508..04429bcce30 100644 --- a/patches/net/minecraft/client/Minecraft.java.patch +++ b/patches/net/minecraft/client/Minecraft.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/Minecraft.java +++ b/net/minecraft/client/Minecraft.java -@@ -250,7 +_,7 @@ - import org.slf4j.Logger; - - @OnlyIn(Dist.CLIENT) --public class Minecraft extends ReentrantBlockableEventLoop implements WindowEventHandler { -+public class Minecraft extends ReentrantBlockableEventLoop implements WindowEventHandler, net.neoforged.neoforge.client.extensions.IMinecraftExtension { - static Minecraft instance; - private static final Logger LOGGER = LogUtils.getLogger(); - public static final boolean ON_OSX = Util.getPlatform() == Util.OS.OSX; @@ -432,7 +_,6 @@ } }, Util.nonCriticalIoPool()); diff --git a/patches/net/minecraft/client/gui/Font.java.patch b/patches/net/minecraft/client/gui/Font.java.patch index f147a8bcdca..30fa8897c41 100644 --- a/patches/net/minecraft/client/gui/Font.java.patch +++ b/patches/net/minecraft/client/gui/Font.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/gui/Font.java +++ b/net/minecraft/client/gui/Font.java -@@ -32,7 +_,7 @@ - import org.joml.Matrix4f; - - @OnlyIn(Dist.CLIENT) --public class Font { -+public class Font implements net.neoforged.neoforge.client.extensions.IFontExtension { - private static final float EFFECT_DEPTH = 0.01F; - public static final float SHADOW_DEPTH = 0.03F; - public static final int NO_SHADOW = 0; @@ -42,6 +_,8 @@ private final Function fonts; final boolean filterFishyGlyphs; diff --git a/patches/net/minecraft/client/gui/Gui.java.patch b/patches/net/minecraft/client/gui/Gui.java.patch index 333bdeda698..f48725af159 100644 --- a/patches/net/minecraft/client/gui/Gui.java.patch +++ b/patches/net/minecraft/client/gui/Gui.java.patch @@ -386,7 +386,7 @@ this.toolHighlightTimer = (int)(40.0 * this.minecraft.options.notificationDisplayTime().get()); } else if (this.toolHighlightTimer > 0) { this.toolHighlightTimer--; -@@ -1321,8 +_,17 @@ +@@ -1321,6 +_,15 @@ } } @@ -400,11 +400,8 @@ + } + @OnlyIn(Dist.CLIENT) -- public static enum HeartType { -+ public static enum HeartType implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public static enum HeartType implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { CONTAINER( - ResourceLocation.withDefaultNamespace("hud/heart/container"), - ResourceLocation.withDefaultNamespace("hud/heart/container_blinking"), @@ -1438,8 +_,13 @@ } else { gui$hearttype = NORMAL; diff --git a/patches/net/minecraft/client/gui/GuiGraphics.java.patch b/patches/net/minecraft/client/gui/GuiGraphics.java.patch index 472cc1b8367..54f09a0d26f 100644 --- a/patches/net/minecraft/client/gui/GuiGraphics.java.patch +++ b/patches/net/minecraft/client/gui/GuiGraphics.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/gui/GuiGraphics.java +++ b/net/minecraft/client/gui/GuiGraphics.java -@@ -52,7 +_,7 @@ - import org.joml.Vector2ic; - - @OnlyIn(Dist.CLIENT) --public class GuiGraphics { -+public class GuiGraphics implements net.neoforged.neoforge.client.extensions.IGuiGraphicsExtension { - public static final float MAX_GUI_Z = 10000.0F; - public static final float MIN_GUI_Z = -10000.0F; - private static final int EXTRA_SPACE_AFTER_FIRST_TOOLTIP_LINE = 2; @@ -229,6 +_,11 @@ } diff --git a/patches/net/minecraft/client/gui/components/AbstractWidget.java.patch b/patches/net/minecraft/client/gui/components/AbstractWidget.java.patch index 6022c53dcfb..998248a6395 100644 --- a/patches/net/minecraft/client/gui/components/AbstractWidget.java.patch +++ b/patches/net/minecraft/client/gui/components/AbstractWidget.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/gui/components/AbstractWidget.java +++ b/net/minecraft/client/gui/components/AbstractWidget.java -@@ -25,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public abstract class AbstractWidget implements Renderable, GuiEventListener, LayoutElement, NarratableEntry { -+public abstract class AbstractWidget implements Renderable, GuiEventListener, LayoutElement, NarratableEntry, net.neoforged.neoforge.client.extensions.IAbstractWidgetExtension { - private static final double PERIOD_PER_SCROLLED_PIXEL = 0.5; - private static final double MIN_SCROLL_PERIOD = 3.0; - protected int width; @@ -123,6 +_,8 @@ renderScrollingString(p_281857_, p_282790_, this.getMessage(), i, this.getY(), j, this.getY() + this.getHeight(), p_282944_); } diff --git a/patches/net/minecraft/client/gui/font/providers/GlyphProviderType.java.patch b/patches/net/minecraft/client/gui/font/providers/GlyphProviderType.java.patch index f3abf97df80..e9a7272d9c5 100644 --- a/patches/net/minecraft/client/gui/font/providers/GlyphProviderType.java.patch +++ b/patches/net/minecraft/client/gui/font/providers/GlyphProviderType.java.patch @@ -1,15 +1,13 @@ --- a/net/minecraft/client/gui/font/providers/GlyphProviderType.java +++ b/net/minecraft/client/gui/font/providers/GlyphProviderType.java -@@ -8,7 +_,8 @@ +@@ -8,6 +_,7 @@ import net.neoforged.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) --public enum GlyphProviderType implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.NamedEnum -+public enum GlyphProviderType implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum GlyphProviderType implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { BITMAP("bitmap", BitmapProvider.Definition.CODEC), TTF("ttf", TrueTypeGlyphProviderDefinition.CODEC), - SPACE("space", SpaceProvider.Definition.CODEC), @@ -31,5 +_,9 @@ public MapCodec mapCodec() { diff --git a/patches/net/minecraft/client/model/HumanoidModel.java.patch b/patches/net/minecraft/client/model/HumanoidModel.java.patch index 94cf1ee81c8..ddddb0a77a4 100644 --- a/patches/net/minecraft/client/model/HumanoidModel.java.patch +++ b/patches/net/minecraft/client/model/HumanoidModel.java.patch @@ -18,15 +18,6 @@ } } -@@ -372,7 +_,7 @@ - } - - @OnlyIn(Dist.CLIENT) -- public static enum ArmPose { -+ public static enum ArmPose implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { - EMPTY(false), - ITEM(false), - BLOCK(false), @@ -385,13 +_,31 @@ BRUSH(false); diff --git a/patches/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch b/patches/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch index 285c14a5b27..e766df72708 100644 --- a/patches/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch +++ b/patches/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/renderer/DimensionSpecialEffects.java +++ b/net/minecraft/client/renderer/DimensionSpecialEffects.java -@@ -13,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public abstract class DimensionSpecialEffects { -+public abstract class DimensionSpecialEffects implements net.neoforged.neoforge.client.extensions.IDimensionSpecialEffectsExtension { - private static final Object2ObjectMap EFFECTS = Util.make(new Object2ObjectArrayMap<>(), p_108881_ -> { - DimensionSpecialEffects.OverworldEffects dimensionspecialeffects$overworldeffects = new DimensionSpecialEffects.OverworldEffects(); - p_108881_.defaultReturnValue(dimensionspecialeffects$overworldeffects); @@ -36,7 +_,7 @@ } diff --git a/patches/net/minecraft/client/renderer/block/model/BlockModel.java.patch b/patches/net/minecraft/client/renderer/block/model/BlockModel.java.patch index cfe8c768a8f..95b1f391bda 100644 --- a/patches/net/minecraft/client/renderer/block/model/BlockModel.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/BlockModel.java.patch @@ -1,11 +1,7 @@ --- a/net/minecraft/client/renderer/block/model/BlockModel.java +++ b/net/minecraft/client/renderer/block/model/BlockModel.java -@@ -26,15 +_,17 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public class BlockModel implements UnbakedModel { -+public class BlockModel implements UnbakedModel, net.neoforged.neoforge.client.model.ExtendedUnbakedModel { +@@ -29,12 +_,14 @@ + public class BlockModel implements UnbakedModel, net.neoforged.neoforge.client.model.ExtendedUnbakedModel { @VisibleForTesting public static final Gson GSON = new GsonBuilder() + .registerTypeHierarchyAdapter(UnbakedModel.class, new net.neoforged.neoforge.client.model.UnbakedModelParser.Deserializer()) @@ -19,13 +15,14 @@ .create(); private final List elements; @Nullable -@@ -49,7 +_,14 @@ +@@ -49,7 +_,15 @@ private UnbakedModel parent; @Nullable private final ResourceLocation parentLocation; + @Nullable -+ private final com.mojang.math.Transformation transformation; ++ private final com.mojang.math.Transformation rootTransform; + private final net.neoforged.neoforge.client.RenderTypeGroup renderTypeGroup; ++ private final java.util.Map partVisibility; + /** + * @deprecated Neo: use {@link net.neoforged.neoforge.client.model.UnbakedModelParser#parse(Reader)} instead @@ -34,11 +31,11 @@ public static BlockModel fromStream(Reader p_111462_) { return GsonHelper.fromJson(GSON, p_111462_, BlockModel.class); } -@@ -62,12 +_,27 @@ +@@ -62,12 +_,29 @@ @Nullable UnbakedModel.GuiLight p_387948_, @Nullable ItemTransforms p_273480_ ) { -+ this(p_273263_, p_272668_, p_386899_, p_272676_, p_387948_, p_273480_, null, net.neoforged.neoforge.client.RenderTypeGroup.EMPTY); ++ this(p_273263_, p_272668_, p_386899_, p_272676_, p_387948_, p_273480_, null, net.neoforged.neoforge.client.RenderTypeGroup.EMPTY, java.util.Map.of()); + } + + public BlockModel( @@ -48,8 +45,9 @@ + @Nullable Boolean p_272676_, + @Nullable UnbakedModel.GuiLight p_387948_, + @Nullable ItemTransforms p_273480_, -+ @Nullable com.mojang.math.Transformation transformation, -+ net.neoforged.neoforge.client.RenderTypeGroup renderTypeGroup ++ @Nullable com.mojang.math.Transformation rootTransform, ++ net.neoforged.neoforge.client.RenderTypeGroup renderTypeGroup, ++ java.util.Map partVisibility + ) { this.elements = p_272668_; this.hasAmbientOcclusion = p_272676_; @@ -57,8 +55,9 @@ this.textureSlots = p_386899_; this.parentLocation = p_273263_; this.transforms = p_273480_; -+ this.transformation = transformation; ++ this.rootTransform = rootTransform; + this.renderTypeGroup = renderTypeGroup; ++ this.partVisibility = partVisibility; } @Nullable @@ -78,42 +77,31 @@ } @Nullable -@@ -125,6 +_,16 @@ +@@ -125,6 +_,13 @@ return this.parentLocation; } + @Override + public void fillAdditionalProperties(net.minecraft.util.context.ContextMap.Builder propertiesBuilder) { -+ if (this.transformation != null) { -+ propertiesBuilder.withParameter(net.neoforged.neoforge.client.model.NeoForgeModelProperties.TRANSFORM, this.transformation); -+ } -+ if (!this.renderTypeGroup.isEmpty()) { -+ propertiesBuilder.withParameter(net.neoforged.neoforge.client.model.NeoForgeModelProperties.RENDER_TYPE, this.renderTypeGroup); -+ } ++ net.neoforged.neoforge.client.model.NeoForgeModelProperties.fillRootTransformProperty(propertiesBuilder, this.rootTransform); ++ net.neoforged.neoforge.client.model.NeoForgeModelProperties.fillRenderTypeProperty(propertiesBuilder, this.renderTypeGroup); ++ net.neoforged.neoforge.client.model.NeoForgeModelProperties.fillPartVisibilityProperty(propertiesBuilder, this.partVisibility); + } + @OnlyIn(Dist.CLIENT) public static class Deserializer implements JsonDeserializer { public BlockModel deserialize(JsonElement p_111498_, Type p_111499_, JsonDeserializationContext p_111500_) throws JsonParseException { -@@ -145,7 +_,20 @@ +@@ -145,7 +_,12 @@ } ResourceLocation resourcelocation = s.isEmpty() ? null : ResourceLocation.parse(s); - return new BlockModel(resourcelocation, list, textureslots$data, obool, unbakedmodel$guilight, itemtransforms); + -+ com.mojang.math.Transformation rootTransform = null; -+ if (jsonobject.has("transform")) { -+ JsonElement transform = jsonobject.get("transform"); -+ rootTransform = p_111500_.deserialize(transform, com.mojang.math.Transformation.class); -+ } -+ -+ var renderTypeGroup = net.neoforged.neoforge.client.RenderTypeGroup.EMPTY; -+ if (jsonobject.has("render_type")) { -+ var renderTypeHintName = GsonHelper.getAsString(jsonobject, "render_type"); -+ renderTypeGroup = net.neoforged.neoforge.client.NamedRenderTypeManager.get(ResourceLocation.parse(renderTypeHintName)); -+ } ++ var rootTransform = net.neoforged.neoforge.client.model.NeoForgeModelProperties.deserializeRootTransform(jsonobject, p_111500_); ++ var renderTypeGroup = net.neoforged.neoforge.client.model.NeoForgeModelProperties.deserializeRenderType(jsonobject); ++ var partVisibility = net.neoforged.neoforge.client.model.NeoForgeModelProperties.deserializePartVisibility(jsonobject); + -+ return new BlockModel(resourcelocation, list, textureslots$data, obool, unbakedmodel$guilight, itemtransforms, rootTransform, renderTypeGroup); ++ return new BlockModel(resourcelocation, list, textureslots$data, obool, unbakedmodel$guilight, itemtransforms, rootTransform, renderTypeGroup, partVisibility); } private TextureSlots.Data getTextureMap(JsonObject p_111510_) { diff --git a/patches/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch b/patches/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch index 4028b1df800..2f8078c3215 100644 --- a/patches/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/renderer/block/model/ItemModelGenerator.java +++ b/net/minecraft/client/renderer/block/model/ItemModelGenerator.java -@@ -20,7 +_,7 @@ - import org.joml.Vector3f; - - @OnlyIn(Dist.CLIENT) --public class ItemModelGenerator implements UnbakedModel { -+public class ItemModelGenerator implements UnbakedModel, net.neoforged.neoforge.client.model.ExtendedUnbakedModel { - public static final ResourceLocation GENERATED_ITEM_MODEL_ID = ResourceLocation.withDefaultNamespace("builtin/generated"); - public static final List LAYERS = List.of("layer0", "layer1", "layer2", "layer3", "layer4"); - private static final float MIN_Z = 7.5F; @@ -43,13 +_,23 @@ } diff --git a/patches/net/minecraft/client/renderer/blockentity/BlockEntityRenderer.java.patch b/patches/net/minecraft/client/renderer/blockentity/BlockEntityRenderer.java.patch deleted file mode 100644 index be61f89054c..00000000000 --- a/patches/net/minecraft/client/renderer/blockentity/BlockEntityRenderer.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/client/renderer/blockentity/BlockEntityRenderer.java -+++ b/net/minecraft/client/renderer/blockentity/BlockEntityRenderer.java -@@ -8,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public interface BlockEntityRenderer { -+public interface BlockEntityRenderer extends net.neoforged.neoforge.client.extensions.IBlockEntityRendererExtension { - void render(T p_112307_, float p_112308_, PoseStack p_112309_, MultiBufferSource p_112310_, int p_112311_, int p_112312_); - - default boolean shouldRenderOffScreen(T p_112306_) { diff --git a/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch b/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch index 0ffe05b0dcf..0fa6c8a6207 100644 --- a/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch +++ b/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch @@ -37,7 +37,7 @@ + int[] aint = itemstackrenderstate$layerrenderstate.prepareTintLayers(tints.length); + System.arraycopy(tints, 0, aint, 0, tints.length); + -+ itemstackrenderstate$layerrenderstate.setupBlockModel(this.model, pass.getRenderType(p_386443_)); ++ itemstackrenderstate$layerrenderstate.setupBlockModel(pass, pass.getRenderType(p_386443_)); + }); } diff --git a/patches/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch b/patches/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch index 9f4cd214c1b..09b32e3a14e 100644 --- a/patches/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch +++ b/patches/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch @@ -14,7 +14,7 @@ void render(PoseStack p_387607_, MultiBufferSource p_386763_, int p_387589_, int p_388775_) { p_387607_.pushPose(); + if (model != null) -+ net.neoforged.neoforge.client.ClientHooks.handleCameraTransforms(p_387607_, model, displayContext, ItemStackRenderState.this.isLeftHand); ++ model.applyTransform(displayContext, p_387607_, ItemStackRenderState.this.isLeftHand); + else this.transform().apply(ItemStackRenderState.this.isLeftHand, p_387607_); p_387607_.translate(-0.5F, -0.5F, -0.5F); diff --git a/patches/net/minecraft/client/resources/model/BakedModel.java.patch b/patches/net/minecraft/client/resources/model/BakedModel.java.patch index e2ff9814850..6c812decd03 100644 --- a/patches/net/minecraft/client/resources/model/BakedModel.java.patch +++ b/patches/net/minecraft/client/resources/model/BakedModel.java.patch @@ -1,11 +1,9 @@ --- a/net/minecraft/client/resources/model/BakedModel.java +++ b/net/minecraft/client/resources/model/BakedModel.java -@@ -12,7 +_,9 @@ - import net.neoforged.api.distmarker.OnlyIn; +@@ -13,6 +_,8 @@ @OnlyIn(Dist.CLIENT) --public interface BakedModel { -+public interface BakedModel extends net.neoforged.neoforge.client.extensions.IBakedModelExtension { + public interface BakedModel extends net.neoforged.neoforge.client.extensions.IBakedModelExtension { + /**@deprecated Forge: Use {@link #getQuads(BlockState, Direction, RandomSource, net.neoforged.neoforge.client.model.data.ModelData, net.minecraft.client.renderer.RenderType)}*/ + @Deprecated List getQuads(@Nullable BlockState p_235039_, @Nullable Direction p_235040_, RandomSource p_235041_); diff --git a/patches/net/minecraft/client/resources/model/DelegateBakedModel.java.patch b/patches/net/minecraft/client/resources/model/DelegateBakedModel.java.patch index 572e01296c7..c8e7eda04c4 100644 --- a/patches/net/minecraft/client/resources/model/DelegateBakedModel.java.patch +++ b/patches/net/minecraft/client/resources/model/DelegateBakedModel.java.patch @@ -49,8 +49,8 @@ + } + + @Override -+ public BakedModel applyTransform(net.minecraft.world.item.ItemDisplayContext transformType, com.mojang.blaze3d.vertex.PoseStack poseStack, boolean applyLeftHandTransform) { -+ return this.parent.applyTransform(transformType, poseStack, applyLeftHandTransform); ++ public void applyTransform(net.minecraft.world.item.ItemDisplayContext transformType, com.mojang.blaze3d.vertex.PoseStack poseStack, boolean applyLeftHandTransform) { ++ this.parent.applyTransform(transformType, poseStack, applyLeftHandTransform); + } + + @Override diff --git a/patches/net/minecraft/client/resources/model/ModelBaker.java.patch b/patches/net/minecraft/client/resources/model/ModelBaker.java.patch deleted file mode 100644 index db7b52b0bf9..00000000000 --- a/patches/net/minecraft/client/resources/model/ModelBaker.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/client/resources/model/ModelBaker.java -+++ b/net/minecraft/client/resources/model/ModelBaker.java -@@ -6,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public interface ModelBaker { -+public interface ModelBaker extends net.neoforged.neoforge.client.extensions.IModelBakerExtension { - BakedModel bake(ResourceLocation p_250776_, ModelState p_251280_); - - SpriteGetter sprites(); diff --git a/patches/net/minecraft/client/resources/model/ModelManager.java.patch b/patches/net/minecraft/client/resources/model/ModelManager.java.patch index 0586b6732fe..6d61dcad6a5 100644 --- a/patches/net/minecraft/client/resources/model/ModelManager.java.patch +++ b/patches/net/minecraft/client/resources/model/ModelManager.java.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/client/resources/model/ModelManager.java +++ b/net/minecraft/client/resources/model/ModelManager.java -@@ -83,11 +_,13 @@ +@@ -83,11 +_,14 @@ private BakedModel missingModel; private ItemModel missingItemModel; private Object2IntMap modelGroups = Object2IntMaps.emptyMap(); + private final java.util.concurrent.atomic.AtomicReference modelBakery = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private Map bakedStandaloneModels = Map.of(); public ModelManager(TextureManager p_119406_, BlockColors p_119407_, int p_119408_) { this.blockColors = p_119407_; @@ -61,10 +62,11 @@ p_252136_.popPush("dispatch"); Map map = createBlockStateToModelDispatch(modelbakery$bakingresult.blockStateModels(), modelbakery$bakingresult.missingModel()); CompletableFuture completablefuture = CompletableFuture.allOf( -@@ -304,6 +_,7 @@ +@@ -304,6 +_,8 @@ this.modelGroups = p_248996_.modelGroups; this.missingModel = modelbakery$bakingresult.missingModel(); this.missingItemModel = modelbakery$bakingresult.missingItemModel(); ++ this.bakedStandaloneModels = modelbakery$bakingresult.standaloneModels(); + net.neoforged.neoforge.client.ClientHooks.onModelBake(this, modelbakery$bakingresult, this.modelBakery.get()); p_251960_.popPush("cache"); this.blockModelShaper.replaceCache(p_248996_.modelCache); @@ -77,7 +79,7 @@ return this.atlases.getAtlas(p_119429_); } -@@ -360,5 +_,9 @@ +@@ -360,5 +_,13 @@ SpecialBlockModelRenderer specialBlockModelRenderer, CompletableFuture readyForUpload ) { @@ -85,5 +87,9 @@ + + public ModelBakery getModelBakery() { + return this.modelBakery.get(); ++ } ++ ++ public BakedModel getStandaloneModel(ResourceLocation location) { ++ return this.bakedStandaloneModels.getOrDefault(location, this.missingModel); } } diff --git a/patches/net/minecraft/client/resources/model/MultiPartBakedModel.java.patch b/patches/net/minecraft/client/resources/model/MultiPartBakedModel.java.patch index 012bbbffabd..9c908670673 100644 --- a/patches/net/minecraft/client/resources/model/MultiPartBakedModel.java.patch +++ b/patches/net/minecraft/client/resources/model/MultiPartBakedModel.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/resources/model/MultiPartBakedModel.java +++ b/net/minecraft/client/resources/model/MultiPartBakedModel.java -@@ -16,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public class MultiPartBakedModel extends DelegateBakedModel { -+public class MultiPartBakedModel extends DelegateBakedModel implements net.neoforged.neoforge.client.model.IDynamicBakedModel { - private final List selectors; - private final Map selectorCache = new Reference2ObjectOpenHashMap<>(); - @@ -33,11 +_,7 @@ this.selectors = p_119462_; } diff --git a/patches/net/minecraft/client/resources/model/UnbakedModel.java.patch b/patches/net/minecraft/client/resources/model/UnbakedModel.java.patch index 965a6a63041..e554a061a31 100644 --- a/patches/net/minecraft/client/resources/model/UnbakedModel.java.patch +++ b/patches/net/minecraft/client/resources/model/UnbakedModel.java.patch @@ -1,11 +1,6 @@ --- a/net/minecraft/client/resources/model/UnbakedModel.java +++ b/net/minecraft/client/resources/model/UnbakedModel.java -@@ -9,10 +_,14 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public interface UnbakedModel extends ResolvableModel { -+public interface UnbakedModel extends ResolvableModel, net.neoforged.neoforge.client.extensions.IUnbakedModelExtension { +@@ -13,6 +_,10 @@ boolean DEFAULT_AMBIENT_OCCLUSION = true; UnbakedModel.GuiLight DEFAULT_GUI_LIGHT = UnbakedModel.GuiLight.SIDE; diff --git a/patches/net/minecraft/client/resources/model/WeightedBakedModel.java.patch b/patches/net/minecraft/client/resources/model/WeightedBakedModel.java.patch index ecca5f27539..05d5e04219a 100644 --- a/patches/net/minecraft/client/resources/model/WeightedBakedModel.java.patch +++ b/patches/net/minecraft/client/resources/model/WeightedBakedModel.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/client/resources/model/WeightedBakedModel.java +++ b/net/minecraft/client/resources/model/WeightedBakedModel.java -@@ -12,7 +_,7 @@ - import net.neoforged.api.distmarker.OnlyIn; - - @OnlyIn(Dist.CLIENT) --public class WeightedBakedModel extends DelegateBakedModel { -+public class WeightedBakedModel extends DelegateBakedModel implements net.neoforged.neoforge.client.model.IDynamicBakedModel { - private final SimpleWeightedRandomList list; - - public WeightedBakedModel(SimpleWeightedRandomList p_371780_) { @@ -20,8 +_,15 @@ this.list = p_371780_; } diff --git a/patches/net/minecraft/commands/CommandSourceStack.java.patch b/patches/net/minecraft/commands/CommandSourceStack.java.patch deleted file mode 100644 index 09ebb7cb46e..00000000000 --- a/patches/net/minecraft/commands/CommandSourceStack.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/commands/CommandSourceStack.java -+++ b/net/minecraft/commands/CommandSourceStack.java -@@ -46,7 +_,7 @@ - import net.minecraft.world.phys.Vec2; - import net.minecraft.world.phys.Vec3; - --public class CommandSourceStack implements ExecutionCommandSource, SharedSuggestionProvider { -+public class CommandSourceStack implements ExecutionCommandSource, SharedSuggestionProvider, net.neoforged.neoforge.common.extensions.ICommandSourceStackExtension { - public static final SimpleCommandExceptionType ERROR_NOT_PLAYER = new SimpleCommandExceptionType(Component.translatable("permissions.requires.player")); - public static final SimpleCommandExceptionType ERROR_NOT_ENTITY = new SimpleCommandExceptionType(Component.translatable("permissions.requires.entity")); - public final CommandSource source; diff --git a/patches/net/minecraft/core/Holder.java.patch b/patches/net/minecraft/core/Holder.java.patch index 4cb8ce7c06c..b9282b7b3ef 100644 --- a/patches/net/minecraft/core/Holder.java.patch +++ b/patches/net/minecraft/core/Holder.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/core/Holder.java +++ b/net/minecraft/core/Holder.java -@@ -11,7 +_,7 @@ - import net.minecraft.resources.ResourceLocation; - import net.minecraft.tags.TagKey; - --public interface Holder { -+public interface Holder extends net.neoforged.neoforge.common.extensions.IHolderExtension { - T value(); - - boolean isBound(); @@ -229,6 +_,14 @@ } } diff --git a/patches/net/minecraft/core/HolderLookup.java.patch b/patches/net/minecraft/core/HolderLookup.java.patch index aa44414fdbb..152c9748c38 100644 --- a/patches/net/minecraft/core/HolderLookup.java.patch +++ b/patches/net/minecraft/core/HolderLookup.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/core/HolderLookup.java +++ b/net/minecraft/core/HolderLookup.java -@@ -26,7 +_,7 @@ - return this.listTags().map(HolderSet.Named::key); - } - -- public interface Provider extends HolderGetter.Provider { -+ public interface Provider extends HolderGetter.Provider, net.neoforged.neoforge.common.extensions.IHolderLookupProviderExtension { - Stream>> listRegistryKeys(); - - default Stream> listRegistries() { @@ -96,6 +_,18 @@ }; } diff --git a/patches/net/minecraft/core/HolderSet.java.patch b/patches/net/minecraft/core/HolderSet.java.patch index 6c2a44d7f0b..cf5fbcc5337 100644 --- a/patches/net/minecraft/core/HolderSet.java.patch +++ b/patches/net/minecraft/core/HolderSet.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/core/HolderSet.java +++ b/net/minecraft/core/HolderSet.java -@@ -15,7 +_,7 @@ - import net.minecraft.util.RandomSource; - import org.jetbrains.annotations.VisibleForTesting; - --public interface HolderSet extends Iterable> { -+public interface HolderSet extends Iterable>, net.neoforged.neoforge.common.extensions.IHolderSetExtension { - Stream> stream(); - - int size(); @@ -182,6 +_,9 @@ void bind(List> p_205836_) { diff --git a/patches/net/minecraft/core/Registry.java.patch b/patches/net/minecraft/core/Registry.java.patch index b12790d266b..8989ba6a7b8 100644 --- a/patches/net/minecraft/core/Registry.java.patch +++ b/patches/net/minecraft/core/Registry.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/core/Registry.java +++ b/net/minecraft/core/Registry.java -@@ -21,7 +_,7 @@ - import net.minecraft.util.ExtraCodecs; - import net.minecraft.util.RandomSource; - --public interface Registry extends Keyable, HolderLookup.RegistryLookup, IdMap { -+public interface Registry extends Keyable, HolderLookup.RegistryLookup, IdMap, net.neoforged.neoforge.registries.IRegistryExtension { - @Override - ResourceKey> key(); - @@ -48,7 +_,7 @@ } diff --git a/patches/net/minecraft/core/component/DataComponentHolder.java.patch b/patches/net/minecraft/core/component/DataComponentHolder.java.patch deleted file mode 100644 index d8a88115de6..00000000000 --- a/patches/net/minecraft/core/component/DataComponentHolder.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/core/component/DataComponentHolder.java -+++ b/net/minecraft/core/component/DataComponentHolder.java -@@ -3,7 +_,7 @@ - import java.util.stream.Stream; - import javax.annotation.Nullable; - --public interface DataComponentHolder { -+public interface DataComponentHolder extends net.neoforged.neoforge.common.extensions.IDataComponentHolderExtension { - DataComponentMap getComponents(); - - @Nullable diff --git a/patches/net/minecraft/core/component/DataComponentMap.java.patch b/patches/net/minecraft/core/component/DataComponentMap.java.patch deleted file mode 100644 index d87add71077..00000000000 --- a/patches/net/minecraft/core/component/DataComponentMap.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/core/component/DataComponentMap.java -+++ b/net/minecraft/core/component/DataComponentMap.java -@@ -134,7 +_,7 @@ - }; - } - -- public static class Builder { -+ public static class Builder implements net.neoforged.neoforge.common.extensions.IDataComponentMapBuilderExtensions { - private final Reference2ObjectMap, Object> map = new Reference2ObjectArrayMap<>(); - - Builder() { diff --git a/patches/net/minecraft/data/recipes/RecipeOutput.java.patch b/patches/net/minecraft/data/recipes/RecipeOutput.java.patch index 18206b3385b..a2675ba98db 100644 --- a/patches/net/minecraft/data/recipes/RecipeOutput.java.patch +++ b/patches/net/minecraft/data/recipes/RecipeOutput.java.patch @@ -1,14 +1,12 @@ --- a/net/minecraft/data/recipes/RecipeOutput.java +++ b/net/minecraft/data/recipes/RecipeOutput.java -@@ -6,8 +_,10 @@ - import net.minecraft.resources.ResourceKey; +@@ -7,7 +_,9 @@ import net.minecraft.world.item.crafting.Recipe; --public interface RecipeOutput { + public interface RecipeOutput extends net.neoforged.neoforge.common.extensions.IRecipeOutputExtension { - void accept(ResourceKey> p_380042_, Recipe p_312328_, @Nullable AdvancementHolder p_312176_); -+public interface RecipeOutput extends net.neoforged.neoforge.common.extensions.IRecipeOutputExtension { -+ default void accept(ResourceKey> p_312249_, Recipe p_312328_, @Nullable AdvancementHolder p_312176_) { -+ accept(p_312249_, p_312328_, p_312176_, new net.neoforged.neoforge.common.conditions.ICondition[0]); ++ default void accept(ResourceKey> p_380042_, Recipe p_312328_, @Nullable AdvancementHolder p_312176_) { ++ accept(p_380042_, p_312328_, p_312176_, new net.neoforged.neoforge.common.conditions.ICondition[0]); + } Advancement.Builder advancement(); diff --git a/patches/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch b/patches/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch index 2bdb95ee8d6..77d5adc360b 100644 --- a/patches/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch +++ b/patches/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch @@ -61,8 +61,7 @@ + return new IntrinsicHolderTagsProvider.IntrinsicTagAppender<>(tagbuilder, this.keyExtractor, this.modId); } -- public static class IntrinsicTagAppender extends TagsProvider.TagAppender { -+ public static class IntrinsicTagAppender extends TagsProvider.TagAppender implements net.neoforged.neoforge.common.extensions.IIntrinsicHolderTagAppenderExtension { + public static class IntrinsicTagAppender extends TagsProvider.TagAppender implements net.neoforged.neoforge.common.extensions.IIntrinsicHolderTagAppenderExtension { private final Function> keyExtractor; - IntrinsicTagAppender(TagBuilder p_256108_, Function> p_256433_) { diff --git a/patches/net/minecraft/data/tags/TagsProvider.java.patch b/patches/net/minecraft/data/tags/TagsProvider.java.patch index 7cf15ff1f62..ce4a79ab1f2 100644 --- a/patches/net/minecraft/data/tags/TagsProvider.java.patch +++ b/patches/net/minecraft/data/tags/TagsProvider.java.patch @@ -108,12 +108,7 @@ return this.builders.computeIfAbsent(p_236452_.location(), p_236442_ -> TagBuilder.create()); } -@@ -127,11 +_,19 @@ - }); - } - -- public static class TagAppender { -+ public static class TagAppender implements net.neoforged.neoforge.common.extensions.ITagAppenderExtension { +@@ -131,7 +_,15 @@ private final TagBuilder builder; protected TagAppender(TagBuilder p_256426_) { diff --git a/patches/net/minecraft/network/FriendlyByteBuf.java.patch b/patches/net/minecraft/network/FriendlyByteBuf.java.patch index b6e2de94ff4..33a5e0bf6ec 100644 --- a/patches/net/minecraft/network/FriendlyByteBuf.java.patch +++ b/patches/net/minecraft/network/FriendlyByteBuf.java.patch @@ -1,22 +1,12 @@ --- a/net/minecraft/network/FriendlyByteBuf.java +++ b/net/minecraft/network/FriendlyByteBuf.java -@@ -67,7 +_,7 @@ - import org.joml.Quaternionf; - import org.joml.Vector3f; - --public class FriendlyByteBuf extends ByteBuf { -+public class FriendlyByteBuf extends ByteBuf implements net.neoforged.neoforge.common.extensions.IFriendlyByteBufExtension { - public static final int DEFAULT_NBT_QUOTA = 2097152; - private final ByteBuf source; - public static final short MAX_STRING_LENGTH = 32767; -@@ -1623,5 +_,10 @@ - @Override +@@ -1624,4 +_,9 @@ public boolean release(int p_130347_) { return this.source.release(p_130347_); -+ } + } + + @org.jetbrains.annotations.ApiStatus.Internal + public ByteBuf getSource() { + return this.source; - } ++ } } diff --git a/patches/net/minecraft/network/protocol/PacketFlow.java.patch b/patches/net/minecraft/network/protocol/PacketFlow.java.patch deleted file mode 100644 index 1a455bdb82b..00000000000 --- a/patches/net/minecraft/network/protocol/PacketFlow.java.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/network/protocol/PacketFlow.java -+++ b/net/minecraft/network/protocol/PacketFlow.java -@@ -1,6 +_,6 @@ - package net.minecraft.network.protocol; - --public enum PacketFlow { -+public enum PacketFlow implements net.neoforged.neoforge.common.extensions.IPacketFlowExtension { - SERVERBOUND("serverbound"), - CLIENTBOUND("clientbound"); - diff --git a/patches/net/minecraft/network/protocol/common/ClientCommonPacketListener.java.patch b/patches/net/minecraft/network/protocol/common/ClientCommonPacketListener.java.patch deleted file mode 100644 index 1b6b85fcf95..00000000000 --- a/patches/net/minecraft/network/protocol/common/ClientCommonPacketListener.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/network/protocol/common/ClientCommonPacketListener.java -+++ b/net/minecraft/network/protocol/common/ClientCommonPacketListener.java -@@ -2,7 +_,7 @@ - - import net.minecraft.network.protocol.cookie.ClientCookiePacketListener; - --public interface ClientCommonPacketListener extends ClientCookiePacketListener { -+public interface ClientCommonPacketListener extends ClientCookiePacketListener, net.neoforged.neoforge.common.extensions.IClientCommonPacketListenerExtension { - void handleKeepAlive(ClientboundKeepAlivePacket p_295236_); - - void handlePing(ClientboundPingPacket p_296451_); diff --git a/patches/net/minecraft/network/protocol/common/ServerCommonPacketListener.java.patch b/patches/net/minecraft/network/protocol/common/ServerCommonPacketListener.java.patch deleted file mode 100644 index c503189ba12..00000000000 --- a/patches/net/minecraft/network/protocol/common/ServerCommonPacketListener.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/network/protocol/common/ServerCommonPacketListener.java -+++ b/net/minecraft/network/protocol/common/ServerCommonPacketListener.java -@@ -2,7 +_,7 @@ - - import net.minecraft.network.protocol.cookie.ServerCookiePacketListener; - --public interface ServerCommonPacketListener extends ServerCookiePacketListener { -+public interface ServerCommonPacketListener extends ServerCookiePacketListener, net.neoforged.neoforge.common.extensions.IServerCommonPacketListenerExtension { - void handleKeepAlive(ServerboundKeepAlivePacket p_296457_); - - void handlePong(ServerboundPongPacket p_294309_); diff --git a/patches/net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener.java.patch b/patches/net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener.java.patch deleted file mode 100644 index 6badab3f246..00000000000 --- a/patches/net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener.java -+++ b/net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener.java -@@ -3,7 +_,7 @@ - import net.minecraft.network.ConnectionProtocol; - import net.minecraft.network.protocol.common.ServerCommonPacketListener; - --public interface ServerConfigurationPacketListener extends ServerCommonPacketListener { -+public interface ServerConfigurationPacketListener extends ServerCommonPacketListener, net.neoforged.neoforge.common.extensions.IServerConfigurationPacketListenerExtension { - @Override - default ConnectionProtocol protocol() { - return ConnectionProtocol.CONFIGURATION; diff --git a/patches/net/minecraft/network/protocol/game/ServerGamePacketListener.java.patch b/patches/net/minecraft/network/protocol/game/ServerGamePacketListener.java.patch deleted file mode 100644 index 141ddf719f8..00000000000 --- a/patches/net/minecraft/network/protocol/game/ServerGamePacketListener.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/network/protocol/game/ServerGamePacketListener.java -+++ b/net/minecraft/network/protocol/game/ServerGamePacketListener.java -@@ -4,7 +_,7 @@ - import net.minecraft.network.protocol.common.ServerCommonPacketListener; - import net.minecraft.network.protocol.ping.ServerPingPacketListener; - --public interface ServerGamePacketListener extends ServerPingPacketListener, ServerCommonPacketListener { -+public interface ServerGamePacketListener extends ServerPingPacketListener, ServerCommonPacketListener, net.neoforged.neoforge.common.extensions.IServerGamePacketListenerExtension { - @Override - default ConnectionProtocol protocol() { - return ConnectionProtocol.PLAY; diff --git a/patches/net/minecraft/resources/ResourceKey.java.patch b/patches/net/minecraft/resources/ResourceKey.java.patch index f4deb2c344d..bad91232f88 100644 --- a/patches/net/minecraft/resources/ResourceKey.java.patch +++ b/patches/net/minecraft/resources/ResourceKey.java.patch @@ -1,25 +1,16 @@ --- a/net/minecraft/resources/ResourceKey.java +++ b/net/minecraft/resources/ResourceKey.java -@@ -9,7 +_,7 @@ - import net.minecraft.core.registries.Registries; - import net.minecraft.network.codec.StreamCodec; - --public class ResourceKey { -+public class ResourceKey implements Comparable> { - private static final ConcurrentMap> VALUES = new MapMaker().weakValues().makeMap(); - private final ResourceLocation registryName; - private final ResourceLocation location; -@@ -64,6 +_,13 @@ - - public ResourceKey> registryKey() { +@@ -66,6 +_,13 @@ return createRegistryKey(this.registryName); -+ } -+ + } + + @Override + public int compareTo(ResourceKey o) { + int ret = this.registry().compareTo(o.registry()); + if (ret == 0) ret = this.location().compareTo(o.location()); + return ret; - } - ++ } ++ static record InternKey(ResourceLocation registry, ResourceLocation location) { + } + } diff --git a/patches/net/minecraft/server/ReloadableServerResources.java.patch b/patches/net/minecraft/server/ReloadableServerResources.java.patch index fae77e4d24e..e21a3d9448a 100644 --- a/patches/net/minecraft/server/ReloadableServerResources.java.patch +++ b/patches/net/minecraft/server/ReloadableServerResources.java.patch @@ -6,7 +6,7 @@ this.functionLibrary = new ServerFunctionLibrary(p_206859_, this.commands.getDispatcher()); + // Neo: Store registries and create context object + this.registryLookup = p_361583_; -+ this.context = new net.neoforged.neoforge.common.conditions.ConditionContext(this.postponedTags, p_250695_); ++ this.context = new net.neoforged.neoforge.common.conditions.ConditionContext(this.postponedTags, p_362982_.compositeAccess(), p_250695_); } public ServerFunctionLibrary getFunctionLibrary() { diff --git a/patches/net/minecraft/server/dedicated/DedicatedServer.java.patch b/patches/net/minecraft/server/dedicated/DedicatedServer.java.patch index 1085bf08f84..295c2952349 100644 --- a/patches/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/patches/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -44,7 +44,7 @@ return true; } } -@@ -277,6 +_,10 @@ +@@ -277,6 +_,13 @@ if (this.queryThreadGs4 != null) { this.queryThreadGs4.stop(); } @@ -52,6 +52,9 @@ + this.dediLanPinger.interrupt(); + this.dediLanPinger = null; + } ++ ++ // Neo: Forcibly stop the FileWatcher default instance, to prevent it from blocking normal JVM exit; see #1626 ++ com.electronwill.nightconfig.core.file.FileWatcher.defaultInstance().stop(); } @Override diff --git a/patches/net/minecraft/server/level/ChunkMap.java.patch b/patches/net/minecraft/server/level/ChunkMap.java.patch index d6dcc919098..e8f758a180f 100644 --- a/patches/net/minecraft/server/level/ChunkMap.java.patch +++ b/patches/net/minecraft/server/level/ChunkMap.java.patch @@ -48,6 +48,27 @@ p_294215_.connection.chunkSender.dropChunk(p_294215_, p_294758_); } +@@ -955,6 +_,20 @@ + } + } + ++ void collectForceTickingChunks(List list) { ++ var itr = distanceManager.forcedTickets.long2ObjectEntrySet().fastIterator(); ++ while (itr.hasNext()) { ++ var entry = itr.next(); ++ ChunkHolder holder = this.visibleChunkMap.get(entry.getLongKey()); ++ if (holder != null && !entry.getValue().isEmpty()) { ++ var chunk = holder.getTickingChunk(); ++ if (chunk != null) { ++ list.add(chunk); ++ } ++ } ++ } ++ } ++ + boolean anyPlayerCloseEnoughForSpawning(ChunkPos p_183880_) { + return !this.distanceManager.hasPlayersNearby(p_183880_.toLong()) ? false : this.anyPlayerCloseEnoughForSpawningInternal(p_183880_); + } @@ -1059,6 +_,7 @@ this.playerMap.unIgnorePlayer(p_140185_); } diff --git a/patches/net/minecraft/server/level/DistanceManager.java.patch b/patches/net/minecraft/server/level/DistanceManager.java.patch index fb0d0488214..34d75c7433d 100644 --- a/patches/net/minecraft/server/level/DistanceManager.java.patch +++ b/patches/net/minecraft/server/level/DistanceManager.java.patch @@ -4,7 +4,7 @@ final Executor mainThreadExecutor; private long ticketTickCounter; private int simulationDistance = 10; -+ private final Long2ObjectOpenHashMap>> forcedTickets = new Long2ObjectOpenHashMap<>(); ++ final Long2ObjectOpenHashMap>> forcedTickets = new Long2ObjectOpenHashMap<>(); protected DistanceManager(Executor p_140774_, Executor p_140775_) { TaskScheduler taskscheduler = TaskScheduler.wrapExecutor("player ticket throttler", p_140775_); @@ -13,8 +13,8 @@ this.ticketTracker.update(p_140785_, p_140786_.getTicketLevel(), true); } + if (p_140786_.isForceTicks()) { -+ SortedArraySet> tickets = forcedTickets.computeIfAbsent(p_140785_, e -> SortedArraySet.create(4)); -+ tickets.addOrGet(ticket); ++ SortedArraySet> tickets = forcedTickets.computeIfAbsent(p_140785_, e -> SortedArraySet.create(4)); ++ tickets.addOrGet(ticket); + } } @@ -25,10 +25,10 @@ this.ticketTracker.update(p_140819_, getTicketLevelAt(sortedarrayset), false); + + if (p_140820_.isForceTicks()) { -+ SortedArraySet> tickets = forcedTickets.get(p_140819_); -+ if (tickets != null) { -+ tickets.remove(p_140820_); -+ } ++ SortedArraySet> tickets = forcedTickets.get(p_140819_); ++ if (tickets != null) { ++ tickets.remove(p_140820_); ++ } + } } @@ -63,8 +63,8 @@ + } + + public boolean shouldForceTicks(long chunkPos) { -+ SortedArraySet> tickets = forcedTickets.get(chunkPos); -+ return tickets != null && !tickets.isEmpty(); ++ SortedArraySet> tickets = forcedTickets.get(chunkPos); ++ return tickets != null && !tickets.isEmpty(); } private void dumpTickets(String p_143208_) { diff --git a/patches/net/minecraft/server/level/ServerChunkCache.java.patch b/patches/net/minecraft/server/level/ServerChunkCache.java.patch index d56419a0922..5a5ade2f1e9 100644 --- a/patches/net/minecraft/server/level/ServerChunkCache.java.patch +++ b/patches/net/minecraft/server/level/ServerChunkCache.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -52,7 +_,7 @@ - import net.minecraft.world.level.storage.LevelStorageSource; - import org.slf4j.Logger; - --public class ServerChunkCache extends ChunkSource { -+public class ServerChunkCache extends ChunkSource implements net.neoforged.neoforge.common.extensions.IServerChunkCacheExtension { - private static final Logger LOGGER = LogUtils.getLogger(); - private final DistanceManager distanceManager; - public final ServerLevel level; @@ -165,6 +_,10 @@ } } @@ -28,15 +19,19 @@ ChunkAccess chunkaccess1 = chunkholder.getChunkIfPresent(ChunkStatus.FULL); if (chunkaccess1 != null) { this.storeInCache(i, chunkaccess1, ChunkStatus.FULL); -@@ -384,7 +_,7 @@ +@@ -384,10 +_,11 @@ private void collectTickingChunks(List p_363421_) { this.chunkMap.forEachSpawnCandidateChunk(p_381767_ -> { LevelChunk levelchunk = p_381767_.getTickingChunk(); - if (levelchunk != null && this.level.isNaturalSpawningAllowed(p_381767_.getPos())) { -+ if (levelchunk != null && this.level.isNaturalSpawningAllowed(p_381767_.getPos()) || this.distanceManager.shouldForceTicks(p_381767_.getPos().toLong())) { ++ if (levelchunk != null && this.level.isNaturalSpawningAllowed(p_381767_.getPos()) && !this.distanceManager.shouldForceTicks(p_381767_.getPos().toLong())) { // Neo: we add force ticked chunks in the list below p_363421_.add(levelchunk); } }); ++ chunkMap.collectForceTickingChunks(p_363421_); + } + + private void tickChunks(ProfilerFiller p_364065_, long p_361343_, List p_360873_) { @@ -480,11 +_,17 @@ } diff --git a/patches/net/minecraft/server/packs/PackResources.java.patch b/patches/net/minecraft/server/packs/PackResources.java.patch deleted file mode 100644 index 9ad60847cd9..00000000000 --- a/patches/net/minecraft/server/packs/PackResources.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/packs/PackResources.java -+++ b/net/minecraft/server/packs/PackResources.java -@@ -11,7 +_,7 @@ - import net.minecraft.server.packs.repository.KnownPack; - import net.minecraft.server.packs.resources.IoSupplier; - --public interface PackResources extends AutoCloseable { -+public interface PackResources extends AutoCloseable, net.neoforged.neoforge.common.extensions.IPackResourcesExtension { - String METADATA_EXTENSION = ".mcmeta"; - String PACK_META = "pack.mcmeta"; - diff --git a/patches/net/minecraft/server/packs/PackType.java.patch b/patches/net/minecraft/server/packs/PackType.java.patch index ebc29fdb6e2..b46adf47391 100644 --- a/patches/net/minecraft/server/packs/PackType.java.patch +++ b/patches/net/minecraft/server/packs/PackType.java.patch @@ -1,21 +1,12 @@ --- a/net/minecraft/server/packs/PackType.java +++ b/net/minecraft/server/packs/PackType.java -@@ -1,6 +_,6 @@ - package net.minecraft.server.packs; - --public enum PackType { -+public enum PackType implements net.minecraft.util.StringRepresentable { - CLIENT_RESOURCES("assets"), - SERVER_DATA("data"); - -@@ -12,5 +_,10 @@ - +@@ -13,4 +_,9 @@ public String getDirectory() { return this.directory; -+ } + } + + @Override + public String getSerializedName() { + return name().toLowerCase(); - } ++ } } diff --git a/patches/net/minecraft/tags/TagBuilder.java.patch b/patches/net/minecraft/tags/TagBuilder.java.patch index 9d8a64fbbbe..b9be606b52c 100644 --- a/patches/net/minecraft/tags/TagBuilder.java.patch +++ b/patches/net/minecraft/tags/TagBuilder.java.patch @@ -1,11 +1,9 @@ --- a/net/minecraft/tags/TagBuilder.java +++ b/net/minecraft/tags/TagBuilder.java -@@ -4,7 +_,17 @@ - import java.util.List; +@@ -5,6 +_,16 @@ import net.minecraft.resources.ResourceLocation; --public class TagBuilder { -+public class TagBuilder implements net.neoforged.neoforge.common.extensions.ITagBuilderExtension { + public class TagBuilder implements net.neoforged.neoforge.common.extensions.ITagBuilderExtension { + // FORGE: Remove entries are used for datagen. + private final List removeEntries = new ArrayList<>(); + public java.util.stream.Stream getRemoveEntries() { return this.removeEntries.stream(); } diff --git a/patches/net/minecraft/world/MenuProvider.java.patch b/patches/net/minecraft/world/MenuProvider.java.patch deleted file mode 100644 index 4823532c3a9..00000000000 --- a/patches/net/minecraft/world/MenuProvider.java.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/world/MenuProvider.java -+++ b/net/minecraft/world/MenuProvider.java -@@ -3,6 +_,6 @@ - import net.minecraft.network.chat.Component; - import net.minecraft.world.inventory.MenuConstructor; - --public interface MenuProvider extends MenuConstructor { -+public interface MenuProvider extends MenuConstructor, net.neoforged.neoforge.client.extensions.IMenuProviderExtension { - Component getDisplayName(); - } diff --git a/patches/net/minecraft/world/damagesource/DamageEffects.java.patch b/patches/net/minecraft/world/damagesource/DamageEffects.java.patch index 1055ddb0c8d..ad82114ac98 100644 --- a/patches/net/minecraft/world/damagesource/DamageEffects.java.patch +++ b/patches/net/minecraft/world/damagesource/DamageEffects.java.patch @@ -1,16 +1,14 @@ --- a/net/minecraft/world/damagesource/DamageEffects.java +++ b/net/minecraft/world/damagesource/DamageEffects.java -@@ -5,7 +_,9 @@ +@@ -5,6 +_,8 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.util.StringRepresentable; --public enum DamageEffects implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.NamedEnum +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+public enum DamageEffects implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum DamageEffects implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { HURT("hurt", SoundEvents.PLAYER_HURT), THORNS("thorns", SoundEvents.THORNS_HIT), - DROWNING("drowning", SoundEvents.PLAYER_HURT_DROWN), @@ -15,11 +_,33 @@ public static final Codec CODEC = StringRepresentable.fromEnum(DamageEffects::values); diff --git a/patches/net/minecraft/world/damagesource/DamageScaling.java.patch b/patches/net/minecraft/world/damagesource/DamageScaling.java.patch index 150fa2ae4ca..5185beb98f6 100644 --- a/patches/net/minecraft/world/damagesource/DamageScaling.java.patch +++ b/patches/net/minecraft/world/damagesource/DamageScaling.java.patch @@ -1,16 +1,15 @@ --- a/net/minecraft/world/damagesource/DamageScaling.java +++ b/net/minecraft/world/damagesource/DamageScaling.java -@@ -3,20 +_,55 @@ +@@ -3,6 +_,8 @@ import com.mojang.serialization.Codec; import net.minecraft.util.StringRepresentable; --public enum DamageScaling implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.NamedEnum +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+public enum DamageScaling implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum DamageScaling implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { NEVER("never"), WHEN_CAUSED_BY_LIVING_NON_PLAYER("when_caused_by_living_non_player"), - ALWAYS("always"); +@@ -10,13 +_,46 @@ public static final Codec CODEC = StringRepresentable.fromEnum(DamageScaling::values); private final String id; diff --git a/patches/net/minecraft/world/damagesource/DeathMessageType.java.patch b/patches/net/minecraft/world/damagesource/DeathMessageType.java.patch index a575f01d40e..a78a0e40465 100644 --- a/patches/net/minecraft/world/damagesource/DeathMessageType.java.patch +++ b/patches/net/minecraft/world/damagesource/DeathMessageType.java.patch @@ -1,16 +1,15 @@ --- a/net/minecraft/world/damagesource/DeathMessageType.java +++ b/net/minecraft/world/damagesource/DeathMessageType.java -@@ -3,20 +_,55 @@ +@@ -3,6 +_,8 @@ import com.mojang.serialization.Codec; import net.minecraft.util.StringRepresentable; --public enum DeathMessageType implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.NamedEnum +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+public enum DeathMessageType implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum DeathMessageType implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { DEFAULT("default"), FALL_VARIANTS("fall_variants"), - INTENTIONAL_GAME_DESIGN("intentional_game_design"); +@@ -10,13 +_,46 @@ public static final Codec CODEC = StringRepresentable.fromEnum(DeathMessageType::values); private final String id; diff --git a/patches/net/minecraft/world/effect/MobEffect.java.patch b/patches/net/minecraft/world/effect/MobEffect.java.patch index ed25ba16ea3..6ffb32f3e09 100644 --- a/patches/net/minecraft/world/effect/MobEffect.java.patch +++ b/patches/net/minecraft/world/effect/MobEffect.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/effect/MobEffect.java +++ b/net/minecraft/world/effect/MobEffect.java -@@ -36,7 +_,7 @@ - import net.minecraft.world.flag.FeatureFlagSet; - import net.minecraft.world.flag.FeatureFlags; - --public class MobEffect implements FeatureElement { -+public class MobEffect implements FeatureElement, net.neoforged.neoforge.common.extensions.IMobEffectExtension { - public static final Codec> CODEC = BuiltInRegistries.MOB_EFFECT.holderByNameCodec(); - public static final StreamCodec> STREAM_CODEC = ByteBufCodecs.holderRegistry(Registries.MOB_EFFECT); - private static final int AMBIENT_ALPHA = Mth.floor(38.25F); @@ -65,6 +_,16 @@ this.particleFactory = p_333515_ -> p_333716_; } diff --git a/patches/net/minecraft/world/entity/Entity.java.patch b/patches/net/minecraft/world/entity/Entity.java.patch index 35d70c49b2f..b8e2a06fbb8 100644 --- a/patches/net/minecraft/world/entity/Entity.java.patch +++ b/patches/net/minecraft/world/entity/Entity.java.patch @@ -4,7 +4,7 @@ import net.minecraft.world.scores.Team; import org.slf4j.Logger; --public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder { +-public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, net.neoforged.neoforge.common.extensions.IEntityExtension { +public abstract class Entity extends net.neoforged.neoforge.attachment.AttachmentHolder implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, net.neoforged.neoforge.common.extensions.IEntityExtension { private static final Logger LOGGER = LogUtils.getLogger(); public static final String ID_TAG = "id"; diff --git a/patches/net/minecraft/world/entity/LivingEntity.java.patch b/patches/net/minecraft/world/entity/LivingEntity.java.patch index 2527407caef..e32dd8f9da8 100644 --- a/patches/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/net/minecraft/world/entity/LivingEntity.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -136,7 +_,7 @@ - import net.minecraft.world.scores.Scoreboard; - import org.slf4j.Logger; - --public abstract class LivingEntity extends Entity implements Attackable { -+public abstract class LivingEntity extends Entity implements Attackable, net.neoforged.neoforge.common.extensions.ILivingEntityExtension { - private static final Logger LOGGER = LogUtils.getLogger(); - private static final String TAG_ACTIVE_EFFECTS = "active_effects"; - private static final ResourceLocation SPEED_MODIFIER_POWDER_SNOW_ID = ResourceLocation.withDefaultNamespace("powder_snow"); @@ -178,13 +_,18 @@ public static final float EXTRA_RENDER_CULLING_SIZE_WITH_BIG_HAT = 0.5F; public static final float DEFAULT_BABY_SCALE = 0.5F; diff --git a/patches/net/minecraft/world/entity/MobCategory.java.patch b/patches/net/minecraft/world/entity/MobCategory.java.patch index f6931a27a47..82a67a6f1ca 100644 --- a/patches/net/minecraft/world/entity/MobCategory.java.patch +++ b/patches/net/minecraft/world/entity/MobCategory.java.patch @@ -1,15 +1,13 @@ --- a/net/minecraft/world/entity/MobCategory.java +++ b/net/minecraft/world/entity/MobCategory.java -@@ -3,7 +_,8 @@ +@@ -3,6 +_,7 @@ import com.mojang.serialization.Codec; import net.minecraft.util.StringRepresentable; --public enum MobCategory implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.NamedEnum -+public enum MobCategory implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum MobCategory implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { MONSTER("monster", 70, false, false, 128), CREATURE("creature", 10, true, true, 128), - AMBIENT("ambient", 15, true, false, 128), @@ -56,5 +_,9 @@ public int getNoDespawnDistance() { diff --git a/patches/net/minecraft/world/entity/Shearable.java.patch b/patches/net/minecraft/world/entity/Shearable.java.patch index 58aef72f93f..bd44536e0fe 100644 --- a/patches/net/minecraft/world/entity/Shearable.java.patch +++ b/patches/net/minecraft/world/entity/Shearable.java.patch @@ -4,12 +4,11 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; --public interface Shearable { +/** + * @deprecated Neo: Use {@link net.neoforged.neoforge.common.IShearable} instead. + */ +@Deprecated -+public interface Shearable extends net.neoforged.neoforge.common.IShearable { + public interface Shearable extends net.neoforged.neoforge.common.IShearable { + /** + * @deprecated Neo: Use {@link net.neoforged.neoforge.common.IShearable#onSheared(net.minecraft.world.entity.player.Player, net.minecraft.world.item.ItemStack, net.minecraft.world.level.Level, net.minecraft.core.BlockPos)} instead. + */ diff --git a/patches/net/minecraft/world/entity/ai/attributes/Attribute.java.patch b/patches/net/minecraft/world/entity/ai/attributes/Attribute.java.patch index 3863a37e988..28a6452f6cf 100644 --- a/patches/net/minecraft/world/entity/ai/attributes/Attribute.java.patch +++ b/patches/net/minecraft/world/entity/ai/attributes/Attribute.java.patch @@ -1,20 +1,9 @@ --- a/net/minecraft/world/entity/ai/attributes/Attribute.java +++ b/net/minecraft/world/entity/ai/attributes/Attribute.java -@@ -9,7 +_,7 @@ - import net.minecraft.network.codec.ByteBufCodecs; - import net.minecraft.network.codec.StreamCodec; - --public class Attribute { -+public class Attribute implements net.neoforged.neoforge.common.extensions.IAttributeExtension { - public static final Codec> CODEC = BuiltInRegistries.ATTRIBUTE.holderByNameCodec(); - public static final StreamCodec> STREAM_CODEC = ByteBufCodecs.holderRegistry(Registries.ATTRIBUTE); - private final double defaultValue; -@@ -50,6 +_,21 @@ - - public ChatFormatting getStyle(boolean p_347715_) { +@@ -52,6 +_,21 @@ return this.sentiment.getStyle(p_347715_); -+ } -+ + } + + // Neo: Patch in the default implementation of IAttributeExtension#getMergedStyle since we need access to Attribute#sentiment + + protected static final net.minecraft.network.chat.TextColor MERGED_RED = net.minecraft.network.chat.TextColor.fromRgb(0xF93131); @@ -28,6 +17,8 @@ + case NEGATIVE -> isPositive ? MERGED_RED : MERGED_BLUE; + case NEUTRAL -> MERGED_GRAY; + }; - } - ++ } ++ public static enum Sentiment { + POSITIVE, + NEUTRAL, diff --git a/patches/net/minecraft/world/entity/player/Player.java.patch b/patches/net/minecraft/world/entity/player/Player.java.patch index 52a2dd2d7c7..5323ec6b622 100644 --- a/patches/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/net/minecraft/world/entity/player/Player.java.patch @@ -1,11 +1,9 @@ --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -117,7 +_,8 @@ - import net.minecraft.world.scores.Team; +@@ -118,6 +_,7 @@ import org.slf4j.Logger; --public abstract class Player extends LivingEntity { -+public abstract class Player extends LivingEntity implements net.neoforged.neoforge.common.extensions.IPlayerExtension { + public abstract class Player extends LivingEntity implements net.neoforged.neoforge.common.extensions.IPlayerExtension { + public static final String PERSISTED_NBT_TAG = "PlayerPersisted"; private static final Logger LOGGER = LogUtils.getLogger(); public static final HumanoidArm DEFAULT_MAIN_HAND = HumanoidArm.RIGHT; diff --git a/patches/net/minecraft/world/entity/raid/Raid.java.patch b/patches/net/minecraft/world/entity/raid/Raid.java.patch index 1518312f9ef..7c1a8abeece 100644 --- a/patches/net/minecraft/world/entity/raid/Raid.java.patch +++ b/patches/net/minecraft/world/entity/raid/Raid.java.patch @@ -18,15 +18,6 @@ Raider raider1 = null; if (i == this.getNumGroups(Difficulty.NORMAL)) { raider1 = EntityType.PILLAGER.create(this.level, EntitySpawnReason.EVENT); -@@ -828,7 +_,7 @@ - } - } - -- public static enum RaiderType { -+ public static enum RaiderType implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { - VINDICATOR(EntityType.VINDICATOR, new int[]{0, 0, 2, 0, 1, 4, 2, 5}), - EVOKER(EntityType.EVOKER, new int[]{0, 0, 0, 0, 0, 1, 1, 2}), - PILLAGER(EntityType.PILLAGER, new int[]{0, 4, 3, 3, 4, 4, 4, 2}), @@ -836,12 +_,26 @@ RAVAGER(EntityType.RAVAGER, new int[]{0, 0, 0, 1, 0, 1, 0, 2}); diff --git a/patches/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch b/patches/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch index c389491313b..b75343a303b 100644 --- a/patches/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch +++ b/patches/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/entity/vehicle/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java -@@ -45,7 +_,7 @@ - import net.minecraft.world.phys.shapes.Shapes; - import net.minecraft.world.phys.shapes.VoxelShape; - --public abstract class AbstractBoat extends VehicleEntity implements Leashable { -+public abstract class AbstractBoat extends VehicleEntity implements Leashable, net.neoforged.neoforge.common.extensions.IAbstractBoatExtension { - private static final EntityDataAccessor DATA_ID_PADDLE_LEFT = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.BOOLEAN); - private static final EntityDataAccessor DATA_ID_PADDLE_RIGHT = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.BOOLEAN); - private static final EntityDataAccessor DATA_ID_BUBBLE_TIME = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.INT); @@ -478,7 +_,7 @@ for (int i2 = i1; i2 < j1; i2++) { blockpos$mutableblockpos.set(l1, k1, i2); diff --git a/patches/net/minecraft/world/inventory/GrindstoneMenu.java.patch b/patches/net/minecraft/world/inventory/GrindstoneMenu.java.patch index fce1cf64627..132f01160c0 100644 --- a/patches/net/minecraft/world/inventory/GrindstoneMenu.java.patch +++ b/patches/net/minecraft/world/inventory/GrindstoneMenu.java.patch @@ -54,7 +54,7 @@ int l = j + k + i * 5 / 100; int i1 = 1; - if (!p_332723_.isDamageableItem()) { -+ if (!p_332723_.isDamageableItem() || !p_332723_.isRepairable()) { ++ if (!p_332723_.isDamageableItem() || !p_332723_.isCombineRepairable()) { if (p_332723_.getMaxStackSize() < 2 || !ItemStack.matches(p_332723_, p_332686_)) { return ItemStack.EMPTY; } @@ -62,7 +62,7 @@ if (itemstack.isDamageableItem()) { itemstack.set(DataComponents.MAX_DAMAGE, i); itemstack.setDamageValue(Math.max(i - l, 0)); -+ if (!p_332686_.isRepairable()) itemstack.setDamageValue(p_332723_.getDamageValue()); ++ if (!p_332686_.isCombineRepairable()) itemstack.setDamageValue(p_332723_.getDamageValue()); } this.mergeEnchantsFrom(itemstack, p_332686_); diff --git a/patches/net/minecraft/world/inventory/MenuType.java.patch b/patches/net/minecraft/world/inventory/MenuType.java.patch index 7d0eaf4e2d5..180fe2e4bf8 100644 --- a/patches/net/minecraft/world/inventory/MenuType.java.patch +++ b/patches/net/minecraft/world/inventory/MenuType.java.patch @@ -1,26 +1,17 @@ --- a/net/minecraft/world/inventory/MenuType.java +++ b/net/minecraft/world/inventory/MenuType.java -@@ -8,7 +_,7 @@ - import net.minecraft.world.flag.FeatureFlagSet; - import net.minecraft.world.flag.FeatureFlags; - --public class MenuType implements FeatureElement { -+public class MenuType implements FeatureElement, net.neoforged.neoforge.common.extensions.IMenuTypeExtension { - public static final MenuType GENERIC_9x1 = register("generic_9x1", ChestMenu::oneRow); - public static final MenuType GENERIC_9x2 = register("generic_9x2", ChestMenu::twoRows); - public static final MenuType GENERIC_9x3 = register("generic_9x3", ChestMenu::threeRows); -@@ -52,6 +_,14 @@ +@@ -55,6 +_,14 @@ + } - public T create(int p_39986_, Inventory p_39987_) { - return this.constructor.create(p_39986_, p_39987_); -+ } -+ -+ @Override + @Override + public T create(int windowId, Inventory playerInv, net.minecraft.network.RegistryFriendlyByteBuf extraData) { + if (this.constructor instanceof net.neoforged.neoforge.network.IContainerFactory) { + return ((net.neoforged.neoforge.network.IContainerFactory) this.constructor).create(windowId, playerInv, extraData); + } + return create(windowId, playerInv); ++ } ++ ++ @Override + public FeatureFlagSet requiredFeatures() { + return this.requiredFeatures; } - - @Override diff --git a/patches/net/minecraft/world/inventory/RecipeBookType.java.patch b/patches/net/minecraft/world/inventory/RecipeBookType.java.patch index a178e91a5f5..8a3cdd55ebb 100644 --- a/patches/net/minecraft/world/inventory/RecipeBookType.java.patch +++ b/patches/net/minecraft/world/inventory/RecipeBookType.java.patch @@ -3,9 +3,8 @@ @@ -1,8 +_,13 @@ package net.minecraft.world.inventory; --public enum RecipeBookType { +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+public enum RecipeBookType implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum RecipeBookType implements net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { CRAFTING, FURNACE, BLAST_FURNACE, diff --git a/patches/net/minecraft/world/item/DispensibleContainerItem.java.patch b/patches/net/minecraft/world/item/DispensibleContainerItem.java.patch index 0c745137ad1..5eb1a31c739 100644 --- a/patches/net/minecraft/world/item/DispensibleContainerItem.java.patch +++ b/patches/net/minecraft/world/item/DispensibleContainerItem.java.patch @@ -1,11 +1,6 @@ --- a/net/minecraft/world/item/DispensibleContainerItem.java +++ b/net/minecraft/world/item/DispensibleContainerItem.java -@@ -6,9 +_,10 @@ - import net.minecraft.world.level.Level; - import net.minecraft.world.phys.BlockHitResult; - --public interface DispensibleContainerItem { -+public interface DispensibleContainerItem extends net.neoforged.neoforge.common.extensions.IDispensibleContainerItemExtension { +@@ -10,5 +_,6 @@ default void checkExtraContent(@Nullable Player p_150817_, Level p_150818_, ItemStack p_150819_, BlockPos p_150820_) { } diff --git a/patches/net/minecraft/world/item/Item.java.patch b/patches/net/minecraft/world/item/Item.java.patch index f4964bdec54..1b76d96038e 100644 --- a/patches/net/minecraft/world/item/Item.java.patch +++ b/patches/net/minecraft/world/item/Item.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/item/Item.java +++ b/net/minecraft/world/item/Item.java -@@ -70,7 +_,7 @@ - import net.minecraft.world.phys.Vec3; - import org.slf4j.Logger; - --public class Item implements FeatureElement, ItemLike { -+public class Item implements FeatureElement, ItemLike, net.neoforged.neoforge.common.extensions.IItemExtension { - public static final Codec> CODEC = BuiltInRegistries.ITEM - .holderByNameCodec() - .validate( @@ -79,7 +_,7 @@ : DataResult.success(p_381630_) ); @@ -18,7 +9,7 @@ public static final ResourceLocation BASE_ATTACK_DAMAGE_ID = ResourceLocation.withDefaultNamespace("base_attack_damage"); public static final ResourceLocation BASE_ATTACK_SPEED_ID = ResourceLocation.withDefaultNamespace("base_attack_speed"); public static final int DEFAULT_MAX_STACK_SIZE = 64; -@@ -110,7 +_,7 @@ +@@ -110,12 +_,13 @@ this.components = p_41383_.buildAndValidateComponents(Component.translatable(this.descriptionId), p_41383_.effectiveModel()); this.craftingRemainingItem = p_41383_.craftingRemainingItem; this.requiredFeatures = p_41383_.requiredFeatures; @@ -27,6 +18,12 @@ String s = this.getClass().getSimpleName(); if (!s.endsWith("Item")) { LOGGER.error("Item classes should end with Item and {} doesn't.", s); + } + } ++ this.canCombineRepair = p_41383_.canCombineRepair; + } + + @Deprecated @@ -127,6 +_,15 @@ return this.components; } @@ -76,7 +73,7 @@ public final ItemStack getCraftingRemainder() { return this.craftingRemainingItem == null ? ItemStack.EMPTY : new ItemStack(this.craftingRemainingItem); } -@@ -302,7 +_,12 @@ +@@ -302,7 +_,14 @@ } public boolean useOnRelease(ItemStack p_41464_) { @@ -84,21 +81,27 @@ + return p_41464_.getItem() == Items.CROSSBOW; + } + ++ protected final boolean canCombineRepair; ++ + @Override -+ public boolean isRepairable(ItemStack stack) { -+ return stack.has(DataComponents.REPAIRABLE) && isDamageable(stack); ++ public boolean isCombineRepairable(ItemStack stack) { ++ return canCombineRepair && isDamageable(stack); } public ItemStack getDefaultInstance() { -@@ -326,7 +_,7 @@ - return false; - } +@@ -337,6 +_,12 @@ + private ResourceKey id; + private DependantName descriptionId = ITEM_DESCRIPTION_ID; + private DependantName model = ResourceKey::location; ++ private boolean canCombineRepair = true; ++ ++ public Item.Properties setNoCombineRepair() { ++ canCombineRepair = false; ++ return this; ++ } -- public static class Properties { -+ public static class Properties implements net.neoforged.neoforge.common.extensions.IItemPropertiesExtensions { - private static final DependantName BLOCK_DESCRIPTION_ID = p_371954_ -> Util.makeDescriptionId("block", p_371954_.location()); - private static final DependantName ITEM_DESCRIPTION_ID = p_371511_ -> Util.makeDescriptionId("item", p_371511_.location()); - private final DataComponentMap.Builder components = DataComponentMap.builder().addAll(DataComponents.COMMON_ITEM_COMPONENTS); + public Item.Properties food(FoodProperties p_41490_) { + return this.food(p_41490_, Consumables.DEFAULT_FOOD); @@ -437,6 +_,7 @@ } diff --git a/patches/net/minecraft/world/item/ItemDisplayContext.java.patch b/patches/net/minecraft/world/item/ItemDisplayContext.java.patch index 8b3daba123e..fd1d65cbc6e 100644 --- a/patches/net/minecraft/world/item/ItemDisplayContext.java.patch +++ b/patches/net/minecraft/world/item/ItemDisplayContext.java.patch @@ -1,17 +1,15 @@ --- a/net/minecraft/world/item/ItemDisplayContext.java +++ b/net/minecraft/world/item/ItemDisplayContext.java -@@ -5,7 +_,10 @@ +@@ -5,6 +_,9 @@ import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; --public enum ItemDisplayContext implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.IndexedEnum +@net.neoforged.fml.common.asm.enumextension.NamedEnum(1) +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+public enum ItemDisplayContext implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum ItemDisplayContext implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { NONE(0, "none"), THIRD_PERSON_LEFT_HAND(1, "thirdperson_lefthand"), - THIRD_PERSON_RIGHT_HAND(2, "thirdperson_righthand"), @@ -20,10 +_,22 @@ public static final IntFunction BY_ID = ByIdMap.continuous(ItemDisplayContext::getId, values(), ByIdMap.OutOfBoundsStrategy.ZERO); private final byte id; diff --git a/patches/net/minecraft/world/item/ItemStack.java.patch b/patches/net/minecraft/world/item/ItemStack.java.patch index f826fb0dfc7..02635eecc58 100644 --- a/patches/net/minecraft/world/item/ItemStack.java.patch +++ b/patches/net/minecraft/world/item/ItemStack.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -97,7 +_,7 @@ - import org.apache.commons.lang3.mutable.MutableBoolean; - import org.slf4j.Logger; - --public final class ItemStack implements DataComponentHolder { -+public final class ItemStack implements DataComponentHolder, net.neoforged.neoforge.common.extensions.IItemStackExtension, net.neoforged.neoforge.common.MutableDataComponentHolder { - private static final List OP_NBT_WARNING = List.of( - Component.translatable("item.op_warning.line1").withStyle(ChatFormatting.RED, ChatFormatting.BOLD), - Component.translatable("item.op_warning.line2").withStyle(ChatFormatting.RED), @@ -242,6 +_,10 @@ return !this.isEmpty() && this.components.hasNonDefault(p_389426_); } diff --git a/patches/net/minecraft/world/item/ItemUseAnimation.java.patch b/patches/net/minecraft/world/item/ItemUseAnimation.java.patch index 9e2141275ff..81b65c326f4 100644 --- a/patches/net/minecraft/world/item/ItemUseAnimation.java.patch +++ b/patches/net/minecraft/world/item/ItemUseAnimation.java.patch @@ -1,17 +1,15 @@ --- a/net/minecraft/world/item/ItemUseAnimation.java +++ b/net/minecraft/world/item/ItemUseAnimation.java -@@ -8,7 +_,10 @@ +@@ -8,6 +_,9 @@ import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; --public enum ItemUseAnimation implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.IndexedEnum +@net.neoforged.fml.common.asm.enumextension.NamedEnum(1) +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.BIDIRECTIONAL) -+public enum ItemUseAnimation implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum ItemUseAnimation implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { NONE(0, "none"), EAT(1, "eat"), - DRINK(2, "drink"), @@ -39,5 +_,9 @@ @Override public String getSerializedName() { diff --git a/patches/net/minecraft/world/item/Rarity.java.patch b/patches/net/minecraft/world/item/Rarity.java.patch index b2d929a1261..3f8da0a2eff 100644 --- a/patches/net/minecraft/world/item/Rarity.java.patch +++ b/patches/net/minecraft/world/item/Rarity.java.patch @@ -1,17 +1,15 @@ --- a/net/minecraft/world/item/Rarity.java +++ b/net/minecraft/world/item/Rarity.java -@@ -9,7 +_,10 @@ +@@ -9,6 +_,9 @@ import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; --public enum Rarity implements StringRepresentable { +@net.neoforged.fml.common.asm.enumextension.IndexedEnum +@net.neoforged.fml.common.asm.enumextension.NamedEnum(1) +@net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.BIDIRECTIONAL) -+public enum Rarity implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public enum Rarity implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { COMMON(0, "common", ChatFormatting.WHITE), UNCOMMON(1, "uncommon", ChatFormatting.YELLOW), - RARE(2, "rare", ChatFormatting.AQUA), @@ -21,19 +_,38 @@ private final int id; private final String name; diff --git a/patches/net/minecraft/world/item/component/FireworkExplosion.java.patch b/patches/net/minecraft/world/item/component/FireworkExplosion.java.patch index ca06424293f..4e6ebf3f46c 100644 --- a/patches/net/minecraft/world/item/component/FireworkExplosion.java.patch +++ b/patches/net/minecraft/world/item/component/FireworkExplosion.java.patch @@ -1,17 +1,15 @@ --- a/net/minecraft/world/item/component/FireworkExplosion.java +++ b/net/minecraft/world/item/component/FireworkExplosion.java -@@ -107,7 +_,10 @@ +@@ -107,6 +_,9 @@ return new FireworkExplosion(this.shape, this.colors, new IntArrayList(p_330678_), this.hasTrail, this.hasTwinkle); } -- public static enum Shape implements StringRepresentable { + @net.neoforged.fml.common.asm.enumextension.IndexedEnum + @net.neoforged.fml.common.asm.enumextension.NamedEnum(1) + @net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.BIDIRECTIONAL) -+ public static enum Shape implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public static enum Shape implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { SMALL_BALL(0, "small_ball"), LARGE_BALL(1, "large_ball"), - STAR(2, "star"), @@ -142,6 +_,10 @@ @Override public String getSerializedName() { diff --git a/patches/net/minecraft/world/item/crafting/RepairItemRecipe.java.patch b/patches/net/minecraft/world/item/crafting/RepairItemRecipe.java.patch index 91780eb1f28..4e7fabb17d7 100644 --- a/patches/net/minecraft/world/item/crafting/RepairItemRecipe.java.patch +++ b/patches/net/minecraft/world/item/crafting/RepairItemRecipe.java.patch @@ -6,8 +6,8 @@ && p_336139_.has(DataComponents.DAMAGE) - && p_335795_.has(DataComponents.DAMAGE); + && p_335795_.has(DataComponents.DAMAGE) -+ && p_336139_.isRepairable() -+ && p_335795_.isRepairable(); ++ && p_336139_.isCombineRepairable() ++ && p_335795_.isCombineRepairable(); } public boolean matches(CraftingInput p_345243_, Level p_44139_) { diff --git a/patches/net/minecraft/world/level/BaseSpawner.java.patch b/patches/net/minecraft/world/level/BaseSpawner.java.patch index 6a423f6cca6..6ffc1f9ea12 100644 --- a/patches/net/minecraft/world/level/BaseSpawner.java.patch +++ b/patches/net/minecraft/world/level/BaseSpawner.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/BaseSpawner.java +++ b/net/minecraft/world/level/BaseSpawner.java -@@ -26,7 +_,7 @@ - import net.minecraft.world.phys.AABB; - import org.slf4j.Logger; - --public abstract class BaseSpawner { -+public abstract class BaseSpawner implements net.neoforged.neoforge.common.extensions.IOwnedSpawner { - public static final String SPAWN_DATA_TAG = "SpawnData"; - private static final Logger LOGGER = LogUtils.getLogger(); - private static final int EVENT_SPAWN = 1; @@ -151,16 +_,14 @@ entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F); diff --git a/patches/net/minecraft/world/level/BlockAndTintGetter.java.patch b/patches/net/minecraft/world/level/BlockAndTintGetter.java.patch deleted file mode 100644 index 26fcdd0c467..00000000000 --- a/patches/net/minecraft/world/level/BlockAndTintGetter.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/BlockAndTintGetter.java -+++ b/net/minecraft/world/level/BlockAndTintGetter.java -@@ -4,7 +_,7 @@ - import net.minecraft.core.Direction; - import net.minecraft.world.level.lighting.LevelLightEngine; - --public interface BlockAndTintGetter extends BlockGetter { -+public interface BlockAndTintGetter extends BlockGetter, net.neoforged.neoforge.common.extensions.IBlockAndTintGetterExtension { - float getShade(Direction p_45522_, boolean p_45523_); - - LevelLightEngine getLightEngine(); diff --git a/patches/net/minecraft/world/level/BlockGetter.java.patch b/patches/net/minecraft/world/level/BlockGetter.java.patch index 60f517c0ab7..e5a442ea0cc 100644 --- a/patches/net/minecraft/world/level/BlockGetter.java.patch +++ b/patches/net/minecraft/world/level/BlockGetter.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/BlockGetter.java +++ b/net/minecraft/world/level/BlockGetter.java -@@ -20,7 +_,7 @@ - import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.VoxelShape; - --public interface BlockGetter extends LevelHeightAccessor { -+public interface BlockGetter extends LevelHeightAccessor, net.neoforged.neoforge.common.extensions.IBlockGetterExtension { - int MAX_BLOCK_ITERATIONS_ALONG_TRAVEL = 16; - - @Nullable @@ -36,7 +_,7 @@ FluidState getFluidState(BlockPos p_45569_); diff --git a/patches/net/minecraft/world/level/Level.java.patch b/patches/net/minecraft/world/level/Level.java.patch index e76860b35bd..fa99b6ae50f 100644 --- a/patches/net/minecraft/world/level/Level.java.patch +++ b/patches/net/minecraft/world/level/Level.java.patch @@ -4,7 +4,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Scoreboard; --public abstract class Level implements LevelAccessor, AutoCloseable { +-public abstract class Level implements LevelAccessor, AutoCloseable, net.neoforged.neoforge.common.extensions.ILevelExtension { +public abstract class Level extends net.neoforged.neoforge.attachment.AttachmentHolder implements LevelAccessor, AutoCloseable, net.neoforged.neoforge.common.extensions.ILevelExtension { public static final Codec> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION); public static final ResourceKey OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld")); diff --git a/patches/net/minecraft/world/level/LevelReader.java.patch b/patches/net/minecraft/world/level/LevelReader.java.patch deleted file mode 100644 index bab6ca4b115..00000000000 --- a/patches/net/minecraft/world/level/LevelReader.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/LevelReader.java -+++ b/net/minecraft/world/level/LevelReader.java -@@ -22,7 +_,7 @@ - import net.minecraft.world.level.levelgen.Heightmap; - import net.minecraft.world.phys.AABB; - --public interface LevelReader extends BlockAndTintGetter, CollisionGetter, SignalGetter, BiomeManager.NoiseBiomeSource { -+public interface LevelReader extends BlockAndTintGetter, CollisionGetter, SignalGetter, BiomeManager.NoiseBiomeSource, net.neoforged.neoforge.common.extensions.ILevelReaderExtension { - @Nullable - ChunkAccess getChunk(int p_46823_, int p_46824_, ChunkStatus p_330944_, boolean p_46826_); - diff --git a/patches/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch b/patches/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch index b0904a498af..752f0067145 100644 --- a/patches/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch +++ b/patches/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch @@ -1,16 +1,14 @@ --- a/net/minecraft/world/level/biome/BiomeSpecialEffects.java +++ b/net/minecraft/world/level/biome/BiomeSpecialEffects.java -@@ -242,7 +_,9 @@ +@@ -242,6 +_,8 @@ } } -- public static enum GrassColorModifier implements StringRepresentable { + @net.neoforged.fml.common.asm.enumextension.NamedEnum + @net.neoforged.fml.common.asm.enumextension.NetworkedEnum(net.neoforged.fml.common.asm.enumextension.NetworkedEnum.NetworkCheck.CLIENTBOUND) -+ public static enum GrassColorModifier implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { + public static enum GrassColorModifier implements StringRepresentable, net.neoforged.fml.common.asm.enumextension.IExtensibleEnum { NONE("none") { @Override - public int modifyColor(double p_48081_, double p_48082_, int p_48083_) { @@ -264,12 +_,22 @@ }; diff --git a/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch b/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch index cf64085b389..48e5efa9b94 100644 --- a/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch +++ b/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/block/BaseRailBlock.java +++ b/net/minecraft/world/level/block/BaseRailBlock.java -@@ -23,7 +_,7 @@ - import net.minecraft.world.phys.shapes.CollisionContext; - import net.minecraft.world.phys.shapes.VoxelShape; - --public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBlock { -+public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBlock, net.neoforged.neoforge.common.extensions.IBaseRailBlockExtension { - protected static final VoxelShape FLAT_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 2.0, 16.0); - protected static final VoxelShape HALF_BLOCK_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 8.0, 16.0); - public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; @@ -51,7 +_,7 @@ @Override diff --git a/patches/net/minecraft/world/level/block/Block.java.patch b/patches/net/minecraft/world/level/block/Block.java.patch index 651346f4506..756f4874c0e 100644 --- a/patches/net/minecraft/world/level/block/Block.java.patch +++ b/patches/net/minecraft/world/level/block/Block.java.patch @@ -1,11 +1,6 @@ --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -60,11 +_,11 @@ - import net.minecraft.world.phys.shapes.VoxelShape; - import org.slf4j.Logger; - --public class Block extends BlockBehaviour implements ItemLike { -+public class Block extends BlockBehaviour implements ItemLike, net.neoforged.neoforge.common.extensions.IBlockExtension { +@@ -64,7 +_,7 @@ public static final MapCodec CODEC = simpleCodec(Block::new); private static final Logger LOGGER = LogUtils.getLogger(); private final Holder.Reference builtInRegistryHolder = BuiltInRegistries.BLOCK.createIntrusiveHolder(this); diff --git a/patches/net/minecraft/world/level/block/BucketPickup.java.patch b/patches/net/minecraft/world/level/block/BucketPickup.java.patch index ae9ee774cc4..15c2a238266 100644 --- a/patches/net/minecraft/world/level/block/BucketPickup.java.patch +++ b/patches/net/minecraft/world/level/block/BucketPickup.java.patch @@ -1,11 +1,7 @@ --- a/net/minecraft/world/level/block/BucketPickup.java +++ b/net/minecraft/world/level/block/BucketPickup.java -@@ -9,8 +_,9 @@ - import net.minecraft.world.level.LevelAccessor; - import net.minecraft.world.level.block.state.BlockState; - --public interface BucketPickup { -+public interface BucketPickup extends net.neoforged.neoforge.common.extensions.IBucketPickupExtension { +@@ -12,5 +_,6 @@ + public interface BucketPickup extends net.neoforged.neoforge.common.extensions.IBucketPickupExtension { ItemStack pickupBlock(@Nullable Player p_294682_, LevelAccessor p_152719_, BlockPos p_152720_, BlockState p_152721_); + @Deprecated//Forge: Use state sensitive variant instead diff --git a/patches/net/minecraft/world/level/block/DeadBushBlock.java.patch b/patches/net/minecraft/world/level/block/DeadBushBlock.java.patch deleted file mode 100644 index 6f13c44fe00..00000000000 --- a/patches/net/minecraft/world/level/block/DeadBushBlock.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/DeadBushBlock.java -+++ b/net/minecraft/world/level/block/DeadBushBlock.java -@@ -9,7 +_,7 @@ - import net.minecraft.world.phys.shapes.CollisionContext; - import net.minecraft.world.phys.shapes.VoxelShape; - --public class DeadBushBlock extends BushBlock { -+public class DeadBushBlock extends BushBlock implements net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(DeadBushBlock::new); - protected static final float AABB_OFFSET = 6.0F; - protected static final VoxelShape SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 13.0, 14.0); diff --git a/patches/net/minecraft/world/level/block/Fallable.java.patch b/patches/net/minecraft/world/level/block/Fallable.java.patch deleted file mode 100644 index 4f0be6f7e3f..00000000000 --- a/patches/net/minecraft/world/level/block/Fallable.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/Fallable.java -+++ b/net/minecraft/world/level/block/Fallable.java -@@ -7,7 +_,7 @@ - import net.minecraft.world.level.Level; - import net.minecraft.world.level.block.state.BlockState; - --public interface Fallable { -+public interface Fallable extends net.neoforged.neoforge.common.extensions.IFallableExtension { - default void onLand(Level p_153220_, BlockPos p_153221_, BlockState p_153222_, BlockState p_153223_, FallingBlockEntity p_153224_) { - } - diff --git a/patches/net/minecraft/world/level/block/LeavesBlock.java.patch b/patches/net/minecraft/world/level/block/LeavesBlock.java.patch deleted file mode 100644 index 7807a016b13..00000000000 --- a/patches/net/minecraft/world/level/block/LeavesBlock.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/LeavesBlock.java -+++ b/net/minecraft/world/level/block/LeavesBlock.java -@@ -26,7 +_,7 @@ - import net.minecraft.world.phys.shapes.Shapes; - import net.minecraft.world.phys.shapes.VoxelShape; - --public class LeavesBlock extends Block implements SimpleWaterloggedBlock { -+public class LeavesBlock extends Block implements SimpleWaterloggedBlock, net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(LeavesBlock::new); - public static final int DECAY_DISTANCE = 7; - public static final IntegerProperty DISTANCE = BlockStateProperties.DISTANCE; diff --git a/patches/net/minecraft/world/level/block/SeagrassBlock.java.patch b/patches/net/minecraft/world/level/block/SeagrassBlock.java.patch deleted file mode 100644 index f596a92bef0..00000000000 --- a/patches/net/minecraft/world/level/block/SeagrassBlock.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/SeagrassBlock.java -+++ b/net/minecraft/world/level/block/SeagrassBlock.java -@@ -23,7 +_,7 @@ - import net.minecraft.world.phys.shapes.CollisionContext; - import net.minecraft.world.phys.shapes.VoxelShape; - --public class SeagrassBlock extends BushBlock implements BonemealableBlock, LiquidBlockContainer { -+public class SeagrassBlock extends BushBlock implements BonemealableBlock, LiquidBlockContainer, net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(SeagrassBlock::new); - protected static final float AABB_OFFSET = 6.0F; - protected static final VoxelShape SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 12.0, 14.0); diff --git a/patches/net/minecraft/world/level/block/TallGrassBlock.java.patch b/patches/net/minecraft/world/level/block/TallGrassBlock.java.patch deleted file mode 100644 index 9e99ad43d62..00000000000 --- a/patches/net/minecraft/world/level/block/TallGrassBlock.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/TallGrassBlock.java -+++ b/net/minecraft/world/level/block/TallGrassBlock.java -@@ -12,7 +_,7 @@ - import net.minecraft.world.phys.shapes.CollisionContext; - import net.minecraft.world.phys.shapes.VoxelShape; - --public class TallGrassBlock extends BushBlock implements BonemealableBlock { -+public class TallGrassBlock extends BushBlock implements BonemealableBlock, net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(TallGrassBlock::new); - protected static final float AABB_OFFSET = 6.0F; - protected static final VoxelShape SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 13.0, 14.0); diff --git a/patches/net/minecraft/world/level/block/VineBlock.java.patch b/patches/net/minecraft/world/level/block/VineBlock.java.patch index 70537e1e0e5..2f39745cfd2 100644 --- a/patches/net/minecraft/world/level/block/VineBlock.java.patch +++ b/patches/net/minecraft/world/level/block/VineBlock.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/block/VineBlock.java +++ b/net/minecraft/world/level/block/VineBlock.java -@@ -25,7 +_,7 @@ - import net.minecraft.world.phys.shapes.Shapes; - import net.minecraft.world.phys.shapes.VoxelShape; - --public class VineBlock extends Block { -+public class VineBlock extends Block implements net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(VineBlock::new); - public static final BooleanProperty UP = PipeBlock.UP; - public static final BooleanProperty NORTH = PipeBlock.NORTH; @@ -192,7 +_,7 @@ @Override protected void randomTick(BlockState p_222655_, ServerLevel p_222656_, BlockPos p_222657_, RandomSource p_222658_) { diff --git a/patches/net/minecraft/world/level/block/WebBlock.java.patch b/patches/net/minecraft/world/level/block/WebBlock.java.patch deleted file mode 100644 index 46e92a07149..00000000000 --- a/patches/net/minecraft/world/level/block/WebBlock.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/WebBlock.java -+++ b/net/minecraft/world/level/block/WebBlock.java -@@ -10,7 +_,7 @@ - import net.minecraft.world.level.block.state.BlockState; - import net.minecraft.world.phys.Vec3; - --public class WebBlock extends Block { -+public class WebBlock extends Block implements net.neoforged.neoforge.common.IShearable { - public static final MapCodec CODEC = simpleCodec(WebBlock::new); - - @Override diff --git a/patches/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/patches/net/minecraft/world/level/block/entity/BlockEntity.java.patch index c2a70f7e4a1..a63fb7ef6cf 100644 --- a/patches/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/patches/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -4,7 +4,7 @@ import net.minecraft.world.level.block.state.BlockState; import org.slf4j.Logger; --public abstract class BlockEntity { +-public abstract class BlockEntity implements net.neoforged.neoforge.common.extensions.IBlockEntityExtension { +public abstract class BlockEntity extends net.neoforged.neoforge.attachment.AttachmentHolder implements net.neoforged.neoforge.common.extensions.IBlockEntityExtension { private static final Logger LOGGER = LogUtils.getLogger(); + @Deprecated // Neo: always use getType() diff --git a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch index 7e157d8a3bc..0f84d9658f6 100644 --- a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch +++ b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java +++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java -@@ -44,7 +_,7 @@ - import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.CollisionContext; - --public final class TrialSpawner { -+public final class TrialSpawner implements net.neoforged.neoforge.common.extensions.IOwnedSpawner { - public static final String NORMAL_CONFIG_TAG_NAME = "normal_config"; - public static final String OMINOUS_CONFIG_TAG_NAME = "ominous_config"; - public static final int DETECT_PLAYER_SPAWN_BUFFER = 40; @@ -237,9 +_,9 @@ } diff --git a/patches/net/minecraft/world/level/block/state/BlockState.java.patch b/patches/net/minecraft/world/level/block/state/BlockState.java.patch deleted file mode 100644 index bbfe37b02e7..00000000000 --- a/patches/net/minecraft/world/level/block/state/BlockState.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/state/BlockState.java -+++ b/net/minecraft/world/level/block/state/BlockState.java -@@ -7,7 +_,7 @@ - import net.minecraft.world.level.block.Block; - import net.minecraft.world.level.block.state.properties.Property; - --public class BlockState extends BlockBehaviour.BlockStateBase { -+public class BlockState extends BlockBehaviour.BlockStateBase implements net.neoforged.neoforge.common.extensions.IBlockStateExtension { - public static final Codec CODEC = codec(BuiltInRegistries.BLOCK.byNameCodec(), Block::defaultBlockState).stable(); - - public BlockState(Block p_61042_, Reference2ObjectArrayMap, Comparable> p_326238_, MapCodec p_61044_) { diff --git a/patches/net/minecraft/world/level/chunk/ChunkAccess.java.patch b/patches/net/minecraft/world/level/chunk/ChunkAccess.java.patch index 303f56095aa..e8913c06ca7 100644 --- a/patches/net/minecraft/world/level/chunk/ChunkAccess.java.patch +++ b/patches/net/minecraft/world/level/chunk/ChunkAccess.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/net/minecraft/world/level/chunk/ChunkAccess.java -@@ -57,7 +_,7 @@ - import net.minecraft.world.ticks.TickContainerAccess; - import org.slf4j.Logger; - --public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, LightChunk, StructureAccess { -+public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, LightChunk, StructureAccess, net.neoforged.neoforge.attachment.IAttachmentHolder { - public static final int NO_FILLED_SECTION = -1; - private static final Logger LOGGER = LogUtils.getLogger(); - private static final LongSet EMPTY_REFERENCE_SET = new LongOpenHashSet(); @@ -327,10 +_,19 @@ @Override diff --git a/patches/net/minecraft/world/level/chunk/LevelChunk.java.patch b/patches/net/minecraft/world/level/chunk/LevelChunk.java.patch index 4a9a08cd9f0..ae2940ed0db 100644 --- a/patches/net/minecraft/world/level/chunk/LevelChunk.java.patch +++ b/patches/net/minecraft/world/level/chunk/LevelChunk.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -52,7 +_,7 @@ - import net.minecraft.world.ticks.TickContainerAccess; - import org.slf4j.Logger; - --public class LevelChunk extends ChunkAccess { -+public class LevelChunk extends ChunkAccess implements net.neoforged.neoforge.attachment.IAttachmentHolder { - static final Logger LOGGER = LogUtils.getLogger(); - private static final TickingBlockEntity NULL_TICKER = new TickingBlockEntity() { - @Override @@ -146,6 +_,7 @@ this.setAllStarts(p_196851_.getAllStarts()); this.setAllReferences(p_196851_.getAllReferences()); diff --git a/patches/net/minecraft/world/level/material/Fluid.java.patch b/patches/net/minecraft/world/level/material/Fluid.java.patch index 918a9f72f44..68b0cad7bf0 100644 --- a/patches/net/minecraft/world/level/material/Fluid.java.patch +++ b/patches/net/minecraft/world/level/material/Fluid.java.patch @@ -1,25 +1,16 @@ --- a/net/minecraft/world/level/material/Fluid.java +++ b/net/minecraft/world/level/material/Fluid.java -@@ -21,7 +_,7 @@ - import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.VoxelShape; - --public abstract class Fluid { -+public abstract class Fluid implements net.neoforged.neoforge.common.extensions.IFluidExtension { - public static final IdMapper FLUID_STATE_REGISTRY = new IdMapper<>(); - protected final StateDefinition stateDefinition; - private FluidState defaultFluidState; -@@ -101,6 +_,13 @@ - } +@@ -102,6 +_,13 @@ public abstract VoxelShape getShape(FluidState p_76137_, BlockGetter p_76138_, BlockPos p_76139_); -+ + + private net.neoforged.neoforge.fluids.FluidType forgeFluidType; + @Override + public net.neoforged.neoforge.fluids.FluidType getFluidType() { + if (forgeFluidType == null) forgeFluidType = net.neoforged.neoforge.common.CommonHooks.getVanillaFluidType(this); + return forgeFluidType; + } - ++ public Optional getPickupSound() { return Optional.empty(); + } diff --git a/patches/net/minecraft/world/level/material/FluidState.java.patch b/patches/net/minecraft/world/level/material/FluidState.java.patch index acc03677a45..78a1d9d156d 100644 --- a/patches/net/minecraft/world/level/material/FluidState.java.patch +++ b/patches/net/minecraft/world/level/material/FluidState.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/material/FluidState.java +++ b/net/minecraft/world/level/material/FluidState.java -@@ -22,7 +_,7 @@ - import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.VoxelShape; - --public final class FluidState extends StateHolder { -+public final class FluidState extends StateHolder implements net.neoforged.neoforge.common.extensions.IFluidStateExtension { - public static final Codec CODEC = codec(BuiltInRegistries.FLUID.byNameCodec(), Fluid::defaultFluidState).stable(); - public static final int AMOUNT_MAX = 9; - public static final int AMOUNT_FULL = 8; @@ -114,6 +_,7 @@ return this.getType() == p_192918_; } diff --git a/projects/neoforge/build.gradle b/projects/neoforge/build.gradle index bc5638d3ed4..38ddc0d546e 100644 --- a/projects/neoforge/build.gradle +++ b/projects/neoforge/build.gradle @@ -1,6 +1,7 @@ import net.neoforged.jarcompatibilitychecker.gradle.JCCPlugin import net.neoforged.jarcompatibilitychecker.gradle.CompatibilityTask import net.neoforged.jarcompatibilitychecker.gradle.ProvideNeoForgeJarTask +import net.neoforged.neodev.GenerateFinalizeSpawnTargets plugins { id 'java-library' @@ -161,6 +162,79 @@ neoDev { } } +generateAccessTransformers { + // Make all state shards public + classGroup( + 'render state shard classes', PUBLIC, + innerClassesOf('net/minecraft/client/renderer/RenderStateShard') + ) + // Make all state shard fields public + fieldGroup( + 'render state shards', PUBLIC, + named('net/minecraft/client/renderer/RenderStateShard'), + fieldsOfType(classesWithSuperclass('net/minecraft/client/renderer/RenderStateShard')) + ) + + // Make all block constructors public so they can be used by mods + methodGroup( + 'block constructors', PUBLIC, + classesWithSuperclass('net/minecraft/world/level/block/Block'), + named('') + ) + // Make all particle constructors public so they can be used by mods + methodGroup( + 'particle constructors', PUBLIC, + classesWithSuperclass('net/minecraft/client/particle/Particle'), + named('') + ) + + // Make all criteria methods in the recipe provider protected so mods can use them + methodGroup( + 'recipe criteria', PROTECTED, + named('net/minecraft/data/recipes/RecipeProvider'), + methodsReturning('net/minecraft/advancements/Criterion') + ) + + // getStepSound is package-private and abstract, so mods couldn't otherwise extend from AbstractSkeleton + methodGroup( + 'skeleton step sound', PROTECTED, + classesWithSuperclass('net/minecraft/world/entity/monster/AbstractSkeleton'), + named('getStepSound') + ) + + // Make all noise generator setting factories public so mods can use them for custom dimensions + methodGroup( + 'noise generator', PUBLIC, + named('net/minecraft/world/level/levelgen/NoiseGeneratorSettings'), + methodsReturning('net/minecraft/world/level/levelgen/NoiseGeneratorSettings') + ) + + fieldGroup( + 'biome effects builder', PROTECTED, + named('net/minecraft/world/level/biome/BiomeSpecialEffects$Builder'), + matchAny() + ) + + // Make all creative tab ids accessible + fieldGroup( + 'creative tabs', PUBLIC, + named('net/minecraft/world/item/CreativeModeTabs'), + fieldsOfType(named('net/minecraft/resources/ResourceKey')) + ) +} + +tasks.register("generateFinalizeSpawnTargets", GenerateFinalizeSpawnTargets.class) { + group generateAccessTransformers.group + description "Generate the targets for the finalizeSpawn MethodRedirector coremod" + input = generateAccessTransformers.input + output = rootProject.file("coremods/src/main/resources/net/neoforged/neoforge/coremods/finalize_spawn_targets.json") +} + +tasks.withType(JavaCompile.class).configureEach { + // Increase memory used during compilation, to avoid OutOfMemoryErrors + options.forkOptions.memoryMaximumSize = '2g' +} + tasks.withType(Javadoc.class).configureEach { options.tags = [ 'apiNote:a:API Note:', diff --git a/settings.gradle b/settings.gradle index aff93fdd4ca..8ebcc3b576f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,6 +15,7 @@ plugins { gradle.ext.moddevgradle_plugin_version = moddevgradle_plugin_version gradle.ext.gson_version = gson_version gradle.ext.diffpatch_version = diffpatch_version +gradle.ext.asm_version = asm_version dependencyResolutionManagement { repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS diff --git a/src/generated/resources/data/c/tags/block/stripped_logs.json b/src/generated/resources/data/c/tags/block/stripped_logs.json index ae69c996ad0..d6fc2825b78 100644 --- a/src/generated/resources/data/c/tags/block/stripped_logs.json +++ b/src/generated/resources/data/c/tags/block/stripped_logs.json @@ -8,6 +8,8 @@ "minecraft:stripped_jungle_log", "minecraft:stripped_mangrove_log", "minecraft:stripped_oak_log", - "minecraft:stripped_spruce_log" + "minecraft:stripped_spruce_log", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem" ] } \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/block/stripped_woods.json b/src/generated/resources/data/c/tags/block/stripped_woods.json index 197542891d7..7a1017c8d7e 100644 --- a/src/generated/resources/data/c/tags/block/stripped_woods.json +++ b/src/generated/resources/data/c/tags/block/stripped_woods.json @@ -7,6 +7,8 @@ "minecraft:stripped_jungle_wood", "minecraft:stripped_mangrove_wood", "minecraft:stripped_oak_wood", - "minecraft:stripped_spruce_wood" + "minecraft:stripped_spruce_wood", + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_crimson_hyphae" ] } \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/stripped_logs.json b/src/generated/resources/data/c/tags/item/stripped_logs.json index ae69c996ad0..d6fc2825b78 100644 --- a/src/generated/resources/data/c/tags/item/stripped_logs.json +++ b/src/generated/resources/data/c/tags/item/stripped_logs.json @@ -8,6 +8,8 @@ "minecraft:stripped_jungle_log", "minecraft:stripped_mangrove_log", "minecraft:stripped_oak_log", - "minecraft:stripped_spruce_log" + "minecraft:stripped_spruce_log", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem" ] } \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/stripped_woods.json b/src/generated/resources/data/c/tags/item/stripped_woods.json index 197542891d7..7a1017c8d7e 100644 --- a/src/generated/resources/data/c/tags/item/stripped_woods.json +++ b/src/generated/resources/data/c/tags/item/stripped_woods.json @@ -7,6 +7,8 @@ "minecraft:stripped_jungle_wood", "minecraft:stripped_mangrove_wood", "minecraft:stripped_oak_wood", - "minecraft:stripped_spruce_wood" + "minecraft:stripped_spruce_wood", + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_crimson_hyphae" ] } \ No newline at end of file diff --git a/src/main/java/net/neoforged/neoforge/client/ClientHooks.java b/src/main/java/net/neoforged/neoforge/client/ClientHooks.java index 50750c45cb1..5d3a8c519b1 100644 --- a/src/main/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/main/java/net/neoforged/neoforge/client/ClientHooks.java @@ -114,7 +114,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.RecipeBookType; import net.minecraft.world.inventory.tooltip.TooltipComponent; -import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.GameType; @@ -462,11 +461,6 @@ public static void onModelBake(ModelManager modelManager, ModelBakery.BakingResu ModLoader.postEvent(new ModelEvent.BakingCompleted(modelManager, bakingResult, modelBakery)); } - public static BakedModel handleCameraTransforms(PoseStack poseStack, @Nullable BakedModel model, ItemDisplayContext cameraTransformType, boolean applyLeftHandTransform) { - model = model.applyTransform(cameraTransformType, poseStack, applyLeftHandTransform); - return model; - } - @SuppressWarnings("deprecation") public static Material getBlockMaterial(ResourceLocation loc) { return new Material(TextureAtlas.LOCATION_BLOCKS, loc); diff --git a/src/main/java/net/neoforged/neoforge/client/extensions/IBakedModelExtension.java b/src/main/java/net/neoforged/neoforge/client/extensions/IBakedModelExtension.java index 2567494587c..a6dd4da32dd 100644 --- a/src/main/java/net/neoforged/neoforge/client/extensions/IBakedModelExtension.java +++ b/src/main/java/net/neoforged/neoforge/client/extensions/IBakedModelExtension.java @@ -63,9 +63,8 @@ default TriState useAmbientOcclusion(BlockState state, ModelData data, RenderTyp * Applies a transform for the given {@link ItemTransforms.TransformType} and {@code applyLeftHandTransform}, and * returns the model to be rendered. */ - default BakedModel applyTransform(ItemDisplayContext transformType, PoseStack poseStack, boolean applyLeftHandTransform) { + default void applyTransform(ItemDisplayContext transformType, PoseStack poseStack, boolean applyLeftHandTransform) { self().getTransforms().getTransform(transformType).apply(applyLeftHandTransform, poseStack); - return self(); } default ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { diff --git a/src/main/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java b/src/main/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java new file mode 100644 index 00000000000..d4ca5c5508d --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.model; + +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.block.model.TextureSlots; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.util.context.ContextMap; +import org.jetbrains.annotations.Nullable; + +/** + * Base unbaked model for custom models which support the standard top-level model parameters + * added by vanilla and NeoForge except elements but create the quads from something other + * than the vanilla elements spec. + */ +public abstract class AbstractUnbakedModel implements ExtendedUnbakedModel { + /** + * Holds the standard top-level model parameters except elements. + * {@link UnbakedModel#bake(TextureSlots, ModelBaker, ModelState, boolean, boolean, ItemTransforms, ContextMap)} + * must always use the values given as parameters instead of accessing this parameter directly in order to + * take values collected along the model's parent chain into account. + */ + protected final StandardModelParameters parameters; + private UnbakedModel parent; + + protected AbstractUnbakedModel(StandardModelParameters parameters) { + this.parameters = parameters; + } + + @Override + public void resolveDependencies(Resolver resolver) { + if (this.parameters.parent() != null) { + this.parent = resolver.resolve(this.parameters.parent()); + } + } + + @Nullable + @Override + public Boolean getAmbientOcclusion() { + return this.parameters.ambientOcclusion(); + } + + @Nullable + @Override + public GuiLight getGuiLight() { + return this.parameters.guiLight(); + } + + @Nullable + @Override + public ItemTransforms getTransforms() { + return this.parameters.itemTransforms(); + } + + @Override + public TextureSlots.Data getTextureSlots() { + return this.parameters.textures(); + } + + @Nullable + @Override + public UnbakedModel getParent() { + return this.parent; + } + + @Override + public void fillAdditionalProperties(ContextMap.Builder propertiesBuilder) { + NeoForgeModelProperties.fillRootTransformProperty(propertiesBuilder, this.parameters.rootTransform()); + NeoForgeModelProperties.fillRenderTypeProperty(propertiesBuilder, this.parameters.renderTypeGroup()); + NeoForgeModelProperties.fillPartVisibilityProperty(propertiesBuilder, this.parameters.partVisibility()); + } +} diff --git a/src/main/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java b/src/main/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java index 43dd5a89c86..46c9ad97fc2 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java +++ b/src/main/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java @@ -5,11 +5,21 @@ package net.neoforged.neoforge.client.model; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.mojang.math.Transformation; +import java.util.HashMap; +import java.util.Map; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; import net.minecraft.util.context.ContextKey; +import net.minecraft.util.context.ContextMap; +import net.neoforged.neoforge.client.NamedRenderTypeManager; import net.neoforged.neoforge.client.RenderTypeGroup; +import org.jetbrains.annotations.Nullable; /** * Properties that NeoForge adds for {@link BlockModel}s and {@link UnbakedModel}s. @@ -26,4 +36,82 @@ private NeoForgeModelProperties() {} * Render type to use. For block models, this can be specified under the {@code render_type} JSON key. */ public static final ContextKey RENDER_TYPE = ContextKey.vanilla("render_type"); + + /** + * Part visibilities. For models with named parts (i.e. OBJ and composite), this can be specified under the {@code visibility} JSON key + */ + public static final ContextKey> PART_VISIBILITY = ContextKey.vanilla("part_visibility"); + + /** + * {@return a {@link Transformation} if the {@code transform} key is present, otherwise {@code null}} + */ + @Nullable + public static Transformation deserializeRootTransform(JsonObject jsonObject, JsonDeserializationContext context) { + if (jsonObject.has("transform")) { + JsonElement transform = jsonObject.get("transform"); + return context.deserialize(transform, Transformation.class); + } + return null; + } + + /** + * {@return a {@link RenderTypeGroup} if the {@code render_type} key is present, otherwise {@link RenderTypeGroup#EMPTY}} + */ + public static RenderTypeGroup deserializeRenderType(JsonObject jsonObject) { + if (jsonObject.has("render_type")) { + String renderTypeHintName = GsonHelper.getAsString(jsonObject, "render_type"); + return NamedRenderTypeManager.get(ResourceLocation.parse(renderTypeHintName)); + } + return RenderTypeGroup.EMPTY; + } + + /** + * {@return a map of part visibilities if the {@code visibility} key is present, otherwise an empty map} + */ + public static Map deserializePartVisibility(JsonObject jsonObject) { + Map partVisibility = new HashMap<>(); + if (jsonObject.has("visibility")) { + JsonObject visibility = GsonHelper.getAsJsonObject(jsonObject, "visibility"); + for (Map.Entry part : visibility.entrySet()) { + partVisibility.put(part.getKey(), part.getValue().getAsBoolean()); + } + } + return Map.copyOf(partVisibility); + } + + /** + * Puts the given {@linkplain Transformation root transform} into the given builder if present, overwriting any value specified in a parent model + */ + public static void fillRootTransformProperty(ContextMap.Builder propertiesBuilder, @Nullable Transformation rootTransform) { + if (rootTransform != null) { + propertiesBuilder.withParameter(NeoForgeModelProperties.TRANSFORM, rootTransform); + } + } + + /** + * Puts the given {@link RenderTypeGroup} into the given builder if present, overwriting any value specified in a parent model + */ + public static void fillRenderTypeProperty(ContextMap.Builder propertiesBuilder, RenderTypeGroup renderTypeGroup) { + if (!renderTypeGroup.isEmpty()) { + propertiesBuilder.withParameter(NeoForgeModelProperties.RENDER_TYPE, renderTypeGroup); + } + } + + /** + * Puts the given part visibility into the given builder if present, merging the with values from parent models + * on a per-key basis and overwriting existing keys + */ + public static void fillPartVisibilityProperty(ContextMap.Builder propertiesBuilder, Map partVisibility) { + if (!partVisibility.isEmpty()) { + Map visibility = propertiesBuilder.getOptionalParameter(NeoForgeModelProperties.PART_VISIBILITY); + if (visibility != null) { + visibility = new HashMap<>(visibility); + visibility.putAll(partVisibility); + } else { + visibility = partVisibility; + } + visibility = Map.copyOf(visibility); + propertiesBuilder.withParameter(NeoForgeModelProperties.PART_VISIBILITY, visibility); + } + } } diff --git a/src/main/java/net/neoforged/neoforge/client/model/StandardModelParameters.java b/src/main/java/net/neoforged/neoforge/client/model/StandardModelParameters.java new file mode 100644 index 00000000000..a362d9c1bd9 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/client/model/StandardModelParameters.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.model; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.mojang.math.Transformation; +import java.util.Map; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.block.model.TextureSlots; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.neoforged.neoforge.client.RenderTypeGroup; +import org.jetbrains.annotations.Nullable; + +/** + * Wrapper around all standard top-level model parameters added by vanilla and NeoForge except elements. + *

+ * For use in custom model loaders which want to respect these properties but create the quads from + * something other than the vanilla elements spec. + */ +public record StandardModelParameters( + @Nullable ResourceLocation parent, + TextureSlots.Data textures, + @Nullable ItemTransforms itemTransforms, + @Nullable Boolean ambientOcclusion, + @Nullable UnbakedModel.GuiLight guiLight, + @Nullable Transformation rootTransform, + RenderTypeGroup renderTypeGroup, + Map partVisibility) { + public static StandardModelParameters parse(JsonObject jsonObject, JsonDeserializationContext context) { + String parentName = GsonHelper.getAsString(jsonObject, "parent", ""); + ResourceLocation parent = parentName.isEmpty() ? null : ResourceLocation.parse(parentName); + + TextureSlots.Data textures = TextureSlots.Data.EMPTY; + if (jsonObject.has("textures")) { + JsonObject jsonobject = GsonHelper.getAsJsonObject(jsonObject, "textures"); + textures = TextureSlots.parseTextureMap(jsonobject, TextureAtlas.LOCATION_BLOCKS); + } + + ItemTransforms itemTransforms = null; + if (jsonObject.has("display")) { + JsonObject jsonobject1 = GsonHelper.getAsJsonObject(jsonObject, "display"); + itemTransforms = context.deserialize(jsonobject1, ItemTransforms.class); + } + + Boolean ambientOcclusion = null; + if (jsonObject.has("ambientocclusion")) { + ambientOcclusion = GsonHelper.getAsBoolean(jsonObject, "ambientocclusion"); + } + + UnbakedModel.GuiLight guiLight = null; + if (jsonObject.has("gui_light")) { + guiLight = UnbakedModel.GuiLight.getByName(GsonHelper.getAsString(jsonObject, "gui_light")); + } + + Transformation rootTransform = NeoForgeModelProperties.deserializeRootTransform(jsonObject, context); + RenderTypeGroup renderTypeGroup = NeoForgeModelProperties.deserializeRenderType(jsonObject); + Map partVisibility = NeoForgeModelProperties.deserializePartVisibility(jsonObject); + + return new StandardModelParameters(parent, textures, itemTransforms, ambientOcclusion, guiLight, rootTransform, renderTypeGroup, partVisibility); + } +} diff --git a/src/main/java/net/neoforged/neoforge/client/model/UnbakedCompositeModel.java b/src/main/java/net/neoforged/neoforge/client/model/UnbakedCompositeModel.java index b79dfa0c86b..edb9c1c3b77 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/UnbakedCompositeModel.java +++ b/src/main/java/net/neoforged/neoforge/client/model/UnbakedCompositeModel.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; @@ -23,18 +22,17 @@ import net.minecraft.client.data.models.model.TextureSlot; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.block.model.TextureSlots; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelState; -import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; +import net.minecraft.util.context.ContextMap; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; @@ -48,17 +46,14 @@ /** * A model composed of several named children. */ -public class UnbakedCompositeModel implements UnbakedModel { +public class UnbakedCompositeModel extends AbstractUnbakedModel { private final ImmutableMap children; private final ImmutableList itemPasses; - private final Transformation rootTransform; - private final Map partVisibility; - public UnbakedCompositeModel(ImmutableMap children, ImmutableList itemPasses, Transformation rootTransform, Map partVisibility) { + public UnbakedCompositeModel(ImmutableMap children, ImmutableList itemPasses, StandardModelParameters parameters) { + super(parameters); this.children = children; this.itemPasses = itemPasses; - this.rootTransform = rootTransform; - this.partVisibility = partVisibility; } @Override @@ -67,12 +62,15 @@ public BakedModel bake(TextureSlots slots, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, - ItemTransforms transforms) { + ItemTransforms transforms, + ContextMap additionalProperties) { TextureAtlasSprite particle = baker.findSprite(slots, TextureSlot.PARTICLE.getId()); + Transformation rootTransform = additionalProperties.getOrDefault(NeoForgeModelProperties.TRANSFORM, Transformation.identity()); if (!rootTransform.isIdentity()) state = UnbakedElementsHelper.composeRootTransformIntoModelState(state, rootTransform); + Map partVisibility = additionalProperties.getOrDefault(NeoForgeModelProperties.PART_VISIBILITY, Map.of()); var bakedPartsBuilder = ImmutableMap.builder(); for (var entry : children.entrySet()) { var name = entry.getKey(); @@ -331,25 +329,9 @@ public UnbakedCompositeModel read(JsonObject jsonObject, JsonDeserializationCont } } - final Map partVisibility; - if (jsonObject.has("visibility")) { - partVisibility = new HashMap<>(); - JsonObject visibility = jsonObject.getAsJsonObject("visibility"); - for (Map.Entry part : visibility.entrySet()) { - partVisibility.put(part.getKey(), part.getValue().getAsBoolean()); - } - } else { - partVisibility = Collections.emptyMap(); - } - - final Transformation transformation; - if (jsonObject.has("transform")) { - transformation = BlockModel.GSON.fromJson(jsonObject.get("transform"), Transformation.class); - } else { - transformation = Transformation.identity(); - } + StandardModelParameters parameters = StandardModelParameters.parse(jsonObject, jsonDeserializationContext); - return new UnbakedCompositeModel(children, ImmutableList.copyOf(itemPasses), transformation, partVisibility); + return new UnbakedCompositeModel(children, ImmutableList.copyOf(itemPasses), parameters); } private void readChildren(JsonObject jsonObject, String name, ImmutableMap.Builder children, List itemPasses) { diff --git a/src/main/java/net/neoforged/neoforge/client/model/generators/loaders/CompositeModelBuilder.java b/src/main/java/net/neoforged/neoforge/client/model/generators/loaders/CompositeModelBuilder.java index 75a47b2a077..ca040abe32f 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/generators/loaders/CompositeModelBuilder.java +++ b/src/main/java/net/neoforged/neoforge/client/model/generators/loaders/CompositeModelBuilder.java @@ -16,6 +16,7 @@ import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.client.model.generators.CustomLoaderBuilder; import net.neoforged.neoforge.client.model.generators.ModelBuilder; +import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.data.ExistingFileHelper; public class CompositeModelBuilder> extends CustomLoaderBuilder { @@ -23,17 +24,17 @@ public static > CompositeModelBuilder begin(T paren return new CompositeModelBuilder<>(parent, existingFileHelper); } - private final Map childModels = new LinkedHashMap<>(); + private final Map childModels = new LinkedHashMap<>(); private final List itemRenderOrder = new ArrayList<>(); protected CompositeModelBuilder(T parent, ExistingFileHelper existingFileHelper) { super(ResourceLocation.fromNamespaceAndPath("neoforge", "composite"), parent, existingFileHelper, false); } - public CompositeModelBuilder child(String name, T modelBuilder) { + public CompositeModelBuilder child(String name, ModelFile model) { Preconditions.checkNotNull(name, "name must not be null"); - Preconditions.checkNotNull(modelBuilder, "modelBuilder must not be null"); - childModels.put(name, modelBuilder); + Preconditions.checkNotNull(model, "model must not be null"); + childModels.put(name, model.getLocation()); itemRenderOrder.add(name); return this; } @@ -54,8 +55,8 @@ public JsonObject toJson(JsonObject json) { json = super.toJson(json); JsonObject children = new JsonObject(); - for (Map.Entry entry : childModels.entrySet()) { - children.add(entry.getKey(), entry.getValue().toJson()); + for (Map.Entry entry : childModels.entrySet()) { + children.addProperty(entry.getKey(), entry.getValue().toString()); } json.add("children", children); diff --git a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjLoader.java b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjLoader.java index 0bf9931d93e..eae7373d0e1 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjLoader.java +++ b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjLoader.java @@ -7,20 +7,17 @@ import com.google.common.collect.Maps; import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import com.mojang.math.Transformation; import java.io.FileNotFoundException; -import java.util.HashMap; import java.util.Map; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.util.GsonHelper; +import net.neoforged.neoforge.client.model.StandardModelParameters; import net.neoforged.neoforge.client.model.UnbakedModelLoader; /** @@ -55,22 +52,9 @@ public ObjModel read(JsonObject jsonObject, JsonDeserializationContext jsonDeser boolean flipV = GsonHelper.getAsBoolean(jsonObject, "flip_v", false); boolean emissiveAmbient = GsonHelper.getAsBoolean(jsonObject, "emissive_ambient", true); String mtlOverride = GsonHelper.getAsString(jsonObject, "mtl_override", null); + StandardModelParameters parameters = StandardModelParameters.parse(jsonObject, jsonDeserializationContext); - final Map partVisibility = new HashMap<>(); - if (jsonObject.has("visibility")) { - JsonObject visibility = GsonHelper.getAsJsonObject(jsonObject, "visibility"); - for (Map.Entry part : visibility.entrySet()) { - partVisibility.put(part.getKey(), part.getValue().getAsBoolean()); - } - } - - Transformation transformation = Transformation.identity(); - if (jsonObject.has("transform")) { - JsonElement transform = jsonObject.get("transform"); - transformation = BlockModel.GSON.fromJson(transform, Transformation.class); - } - - return loadModel(new ObjModel.ModelSettings(ResourceLocation.parse(modelLocation), automaticCulling, shadeQuads, flipV, emissiveAmbient, mtlOverride, partVisibility, transformation)); + return loadModel(new ObjModel.ModelSettings(ResourceLocation.parse(modelLocation), automaticCulling, shadeQuads, flipV, emissiveAmbient, mtlOverride, parameters)); } public ObjModel loadModel(ObjModel.ModelSettings settings) { diff --git a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjModel.java b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjModel.java index 98625b04e1f..0dd1244b1e2 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjModel.java +++ b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjModel.java @@ -6,7 +6,8 @@ package net.neoforged.neoforge.client.model.obj; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; import com.mojang.math.Transformation; import java.io.IOException; import java.util.Arrays; @@ -31,8 +32,9 @@ import net.minecraft.util.context.ContextMap; import net.minecraft.world.phys.Vec2; import net.neoforged.neoforge.client.RenderTypeGroup; -import net.neoforged.neoforge.client.model.ExtendedUnbakedModel; +import net.neoforged.neoforge.client.model.AbstractUnbakedModel; import net.neoforged.neoforge.client.model.NeoForgeModelProperties; +import net.neoforged.neoforge.client.model.StandardModelParameters; import net.neoforged.neoforge.client.model.pipeline.QuadBakingVertexConsumer; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.Nullable; @@ -45,7 +47,7 @@ * Supports positions, texture coordinates, normals and colors. The {@link ObjMaterialLibrary material library} * has support for numerous features, including support for {@link ResourceLocation} textures (non-standard). */ -public class ObjModel implements ExtendedUnbakedModel { +public class ObjModel extends AbstractUnbakedModel { private static final Vector4f COLOR_WHITE = new Vector4f(1, 1, 1, 1); private static final Vec2[] DEFAULT_COORDS = { new Vec2(0, 0), @@ -54,7 +56,7 @@ public class ObjModel implements ExtendedUnbakedModel { new Vec2(1, 0), }; - private final Map parts = Maps.newLinkedHashMap(); + private final Multimap parts = MultimapBuilder.linkedHashKeys().arrayListValues().build(); private final List positions = Lists.newArrayList(); private final List texCoords = Lists.newArrayList(); @@ -69,18 +71,15 @@ public class ObjModel implements ExtendedUnbakedModel { public final String mtlOverride; public final ResourceLocation modelLocation; - public final Map partVisibility; - public final Transformation rootTransform; private ObjModel(ModelSettings settings) { + super(settings.parameters); this.modelLocation = settings.modelLocation; this.automaticCulling = settings.automaticCulling; this.shadeQuads = settings.shadeQuads; this.flipV = settings.flipV; this.emissiveAmbient = settings.emissiveAmbient; this.mtlOverride = settings.mtlOverride; - this.partVisibility = settings.partVisibility; - this.rootTransform = settings.rootTransform; } public static ObjModel parse(ObjTokenizer tokenizer, ModelSettings settings) throws IOException { @@ -408,24 +407,16 @@ private Pair makeQuad(int[][] indices, int tintIndex, Vect return Pair.of(quadBaker.bakeQuad(), cull); } - public boolean isComponentVisible(String part, boolean fallback) { - return partVisibility.getOrDefault(part, fallback); - } - @Override public BakedModel bake(TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms, ContextMap additionalProperties) { + Map partVisibility = additionalProperties.getOrDefault(NeoForgeModelProperties.PART_VISIBILITY, Map.of()); var builder = new SimpleBakedModel.Builder(useAmbientOcclusion, usesBlockLight, true, transforms); builder.particle(baker.findSprite(slots, TextureSlot.PARTICLE.getId())); - parts.values().stream().filter(part -> isComponentVisible(part.name(), true)) - .forEach(part -> part.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms)); + parts.values().stream().filter(part -> partVisibility.getOrDefault(part.name(), true)) + .forEach(part -> part.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms, additionalProperties)); return builder.build(additionalProperties.getOrDefault(NeoForgeModelProperties.RENDER_TYPE, RenderTypeGroup.EMPTY)); } - @Override - public void resolveDependencies(Resolver resolver) { - // no dependencies - } - public class ModelObject { public final String name; @@ -439,9 +430,9 @@ public String name() { return name; } - public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms) { + public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms, ContextMap additionalProperties) { for (ModelMesh mesh : meshes) { - mesh.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms); + mesh.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms, additionalProperties); } } @@ -451,18 +442,19 @@ protected void addNamesRecursively(Set names) { } public class ModelGroup extends ModelObject { - final Map parts = Maps.newLinkedHashMap(); + final Multimap parts = MultimapBuilder.linkedHashKeys().arrayListValues().build(); ModelGroup(String name) { super(name); } @Override - public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms) { - super.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms); + public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms, ContextMap additionalProperties) { + super.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms, additionalProperties); - parts.values().stream().filter(part -> isComponentVisible("%s.%s".formatted(name(), part.name()), true)) - .forEach(part -> part.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms)); + Map partVisibility = additionalProperties.getOrDefault(NeoForgeModelProperties.PART_VISIBILITY, Map.of()); + parts.values().stream().filter(part -> partVisibility.getOrDefault("%s.%s".formatted(name(), part.name()), true)) + .forEach(part -> part.addQuads(builder, slots, baker, state, useAmbientOcclusion, usesBlockLight, transforms, additionalProperties)); } @Override @@ -485,14 +477,14 @@ public ModelMesh(@Nullable ObjMaterialLibrary.Material currentMat, @Nullable Str this.smoothingGroup = currentSmoothingGroup; } - public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms) { + public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, ModelBaker baker, ModelState state, boolean useAmbientOcclusion, boolean usesBlockLight, ItemTransforms transforms, ContextMap additionalProperties) { if (mat == null) return; TextureAtlasSprite texture = baker.findSprite(slots, mat.diffuseColorMap); int tintIndex = mat.diffuseTintIndex; Vector4f colorTint = mat.diffuseColor; - var rootTransform = ObjModel.this.rootTransform; + var rootTransform = additionalProperties.getOrDefault(NeoForgeModelProperties.TRANSFORM, Transformation.identity()); var transform = rootTransform.isIdentity() ? state.getRotation() : state.getRotation().compose(rootTransform); for (int[][] face : faces) { Pair quad = makeQuad(face, tintIndex, colorTint, mat.ambientColor, texture, transform); @@ -507,5 +499,5 @@ public void addQuads(SimpleBakedModel.Builder builder, TextureSlots slots, Model public record ModelSettings(ResourceLocation modelLocation, boolean automaticCulling, boolean shadeQuads, boolean flipV, boolean emissiveAmbient, @Nullable String mtlOverride, - Map partVisibility, Transformation rootTransform) {} + StandardModelParameters parameters) {} } diff --git a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java index 11aad1e94ef..6ce29921574 100644 --- a/src/main/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java +++ b/src/main/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java @@ -28,8 +28,7 @@ public ObjTokenizer(InputStream inputStream) { this.lineReader = new BufferedReader(new InputStreamReader(inputStream, Charsets.UTF_8)); } - @Nullable - public String[] readAndSplitLine(boolean ignoreEmptyLines) throws IOException { + public String @Nullable [] readAndSplitLine(boolean ignoreEmptyLines) throws IOException { //noinspection LoopConditionNotUpdatedInsideLoop do { String currentLine = lineReader.readLine(); diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 168192189a1..0476a2610e7 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -79,16 +79,16 @@ import net.neoforged.neoforge.common.advancements.critereon.PiglinCurrencyItemPredicate; import net.neoforged.neoforge.common.advancements.critereon.PiglinNeutralArmorEntityPredicate; import net.neoforged.neoforge.common.advancements.critereon.SnowBootsEntityPredicate; +import net.neoforged.neoforge.common.conditions.AlwaysCondition; import net.neoforged.neoforge.common.conditions.AndCondition; -import net.neoforged.neoforge.common.conditions.FalseCondition; import net.neoforged.neoforge.common.conditions.FeatureFlagsEnabledCondition; import net.neoforged.neoforge.common.conditions.ICondition; -import net.neoforged.neoforge.common.conditions.ItemExistsCondition; import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.conditions.NeverCondition; import net.neoforged.neoforge.common.conditions.NotCondition; import net.neoforged.neoforge.common.conditions.OrCondition; +import net.neoforged.neoforge.common.conditions.RegisteredCondition; import net.neoforged.neoforge.common.conditions.TagEmptyCondition; -import net.neoforged.neoforge.common.conditions.TrueCondition; import net.neoforged.neoforge.common.crafting.BlockTagIngredient; import net.neoforged.neoforge.common.crafting.CompoundIngredient; import net.neoforged.neoforge.common.crafting.CustomDisplayIngredient; @@ -357,13 +357,13 @@ public class NeoForgeMod { private static final DeferredRegister> CONDITION_CODECS = DeferredRegister.create(NeoForgeRegistries.Keys.CONDITION_CODECS, NeoForgeVersion.MOD_ID); public static final DeferredHolder, MapCodec> AND_CONDITION = CONDITION_CODECS.register("and", () -> AndCondition.CODEC); - public static final DeferredHolder, MapCodec> FALSE_CONDITION = CONDITION_CODECS.register("false", () -> FalseCondition.CODEC); - public static final DeferredHolder, MapCodec> ITEM_EXISTS_CONDITION = CONDITION_CODECS.register("item_exists", () -> ItemExistsCondition.CODEC); + public static final DeferredHolder, MapCodec> NEVER_CONDITION = CONDITION_CODECS.register("never", () -> NeverCondition.CODEC); + public static final DeferredHolder, MapCodec>> REGISTERED_CONDITION = CONDITION_CODECS.register("registered", () -> RegisteredCondition.CODEC); public static final DeferredHolder, MapCodec> MOD_LOADED_CONDITION = CONDITION_CODECS.register("mod_loaded", () -> ModLoadedCondition.CODEC); public static final DeferredHolder, MapCodec> NOT_CONDITION = CONDITION_CODECS.register("not", () -> NotCondition.CODEC); public static final DeferredHolder, MapCodec> OR_CONDITION = CONDITION_CODECS.register("or", () -> OrCondition.CODEC); - public static final DeferredHolder, MapCodec> TAG_EMPTY_CONDITION = CONDITION_CODECS.register("tag_empty", () -> TagEmptyCondition.CODEC); - public static final DeferredHolder, MapCodec> TRUE_CONDITION = CONDITION_CODECS.register("true", () -> TrueCondition.CODEC); + public static final DeferredHolder, MapCodec>> TAG_EMPTY_CONDITION = CONDITION_CODECS.register("tag_empty", () -> TagEmptyCondition.CODEC); + public static final DeferredHolder, MapCodec> ALWAYS_CONDITION = CONDITION_CODECS.register("always", () -> AlwaysCondition.CODEC); public static final DeferredHolder, MapCodec> FEATURE_FLAGS_ENABLED_CONDITION = CONDITION_CODECS.register("feature_flags_enabled", () -> FeatureFlagsEnabledCondition.CODEC); private static final DeferredRegister> ENTITY_PREDICATE_CODECS = DeferredRegister.create(Registries.ENTITY_SUB_PREDICATE_TYPE, NeoForgeVersion.MOD_ID); diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java similarity index 61% rename from src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java rename to src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java index 2b93aa46fcc..5837daec19e 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java @@ -7,12 +7,12 @@ import com.mojang.serialization.MapCodec; -public final class TrueCondition implements ICondition { - public static final TrueCondition INSTANCE = new TrueCondition(); +public final class AlwaysCondition implements ICondition { + public static final AlwaysCondition INSTANCE = new AlwaysCondition(); - public static MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); + public static MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); - private TrueCondition() {} + private AlwaysCondition() {} @Override public boolean test(IContext context) { @@ -26,6 +26,6 @@ public MapCodec codec() { @Override public String toString() { - return "true"; + return "always"; } } diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java b/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java index cffc6d01065..e091bd8efbb 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java @@ -10,18 +10,19 @@ import java.util.Map; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.flag.FeatureFlags; -import org.jetbrains.annotations.ApiStatus; public class ConditionContext implements ICondition.IContext { private final Map>, HolderLookup.RegistryLookup> pendingTags; private final FeatureFlagSet enabledFeatures; + private final RegistryAccess registryAccess; - public ConditionContext(List> pendingTags, FeatureFlagSet enabledFeatures) { + public ConditionContext(List> pendingTags, RegistryAccess registryAccess, FeatureFlagSet enabledFeatures) { this.pendingTags = new IdentityHashMap<>(); + this.registryAccess = registryAccess; this.enabledFeatures = enabledFeatures; for (var tags : pendingTags) { @@ -29,13 +30,6 @@ public ConditionContext(List> pendingTags, FeatureFlagSe } } - // Use FeatureFlagSet sensitive constructor - @ApiStatus.ScheduledForRemoval(inVersion = "1.21.4") - @Deprecated(forRemoval = true, since = "1.21.3") - public ConditionContext(List> pendingTags) { - this(pendingTags, FeatureFlags.VANILLA_SET); - } - public void clear() { this.pendingTags.clear(); } @@ -47,6 +41,11 @@ public boolean isTagLoaded(TagKey key) { return lookup != null && lookup.get((TagKey) key).isPresent(); } + @Override + public RegistryAccess registryAccess() { + return registryAccess; + } + @Override public FeatureFlagSet enabledFeatures() { return enabledFeatures; diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java index 6eb0aef8ab3..77805c179e4 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java @@ -18,7 +18,7 @@ */ public record FeatureFlagsEnabledCondition(FeatureFlagSet flags) implements ICondition { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - FeatureFlags.CODEC.fieldOf("flags").forGetter(condition -> condition.flags)).apply(instance, FeatureFlagsEnabledCondition::new)); + FeatureFlags.CODEC.fieldOf("flags").forGetter(FeatureFlagsEnabledCondition::flags)).apply(instance, FeatureFlagsEnabledCondition::new)); public FeatureFlagsEnabledCondition { if (flags.isEmpty()) { diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java index 2c8ca8583d7..3f9ce8004e2 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java @@ -16,6 +16,7 @@ import java.util.Optional; import java.util.function.Function; import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.RegistryOps; import net.minecraft.tags.TagKey; import net.minecraft.util.Unit; @@ -95,6 +96,10 @@ public boolean isTagLoaded(TagKey key) { */ boolean isTagLoaded(TagKey key); + default RegistryAccess registryAccess() { + return RegistryAccess.EMPTY; + } + default FeatureFlagSet enabledFeatures() { // returning the vanilla set causes reports false positives for flags outside of vanilla // return FeatureFlags.VANILLA_SET; diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java b/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java deleted file mode 100644 index ef10000e022..00000000000 --- a/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.conditions; - -import java.util.List; -import net.minecraft.tags.TagKey; -import net.minecraft.world.flag.FeatureFlag; -import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.item.Item; -import org.apache.commons.lang3.ArrayUtils; - -public interface IConditionBuilder { - default ICondition and(ICondition... values) { - return new AndCondition(List.of(values)); - } - - default ICondition FALSE() { - return FalseCondition.INSTANCE; - } - - default ICondition TRUE() { - return TrueCondition.INSTANCE; - } - - default ICondition not(ICondition value) { - return new NotCondition(value); - } - - default ICondition or(ICondition... values) { - return new OrCondition(List.of(values)); - } - - default ICondition itemExists(String namespace, String path) { - return new ItemExistsCondition(namespace, path); - } - - default ICondition modLoaded(String modid) { - return new ModLoadedCondition(modid); - } - - default ICondition tagEmpty(TagKey tag) { - return new TagEmptyCondition(tag.location()); - } - - default ICondition featureFlagsEnabled(FeatureFlagSet requiredFeatures) { - return new FeatureFlagsEnabledCondition(requiredFeatures); - } - - default ICondition featureFlagsEnabled(FeatureFlag... requiredFlags) { - if (requiredFlags.length == 0) { - throw new IllegalArgumentException("FeatureFlagsEnabledCondition requires at least one feature flag."); - } - if (requiredFlags.length == 1) { - return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0])); - } else { - return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0], ArrayUtils.remove(requiredFlags, 0))); - } - } -} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java deleted file mode 100644 index 5d25fefb61e..00000000000 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.conditions; - -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; - -public class ItemExistsCondition implements ICondition { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.fieldOf("item").forGetter(ItemExistsCondition::getItem)) - .apply(builder, ItemExistsCondition::new)); - - private final ResourceLocation item; - - public ItemExistsCondition(String location) { - this(ResourceLocation.parse(location)); - } - - public ItemExistsCondition(String namespace, String path) { - this(ResourceLocation.fromNamespaceAndPath(namespace, path)); - } - - public ItemExistsCondition(ResourceLocation item) { - this.item = item; - } - - @Override - public boolean test(IContext context) { - return BuiltInRegistries.ITEM.containsKey(item); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - public ResourceLocation getItem() { - return item; - } - - @Override - public String toString() { - return "item_exists(\"" + item + "\")"; - } -} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java b/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java new file mode 100644 index 00000000000..9a1b10aefee --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.conditions; + +import java.util.List; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.flag.FeatureFlag; +import net.minecraft.world.flag.FeatureFlagSet; +import org.apache.commons.lang3.ArrayUtils; + +public final class NeoForgeConditions { + public static ICondition and(ICondition... values) { + return new AndCondition(List.of(values)); + } + + public static ICondition never() { + return NeverCondition.INSTANCE; + } + + public static ICondition always() { + return AlwaysCondition.INSTANCE; + } + + public static ICondition not(ICondition value) { + return new NotCondition(value); + } + + public static ICondition or(ICondition... values) { + return new OrCondition(List.of(values)); + } + + public static ICondition registered(ResourceKey registryKey) { + return new RegisteredCondition<>(registryKey); + } + + public static ICondition registered(ResourceKey> registryType, ResourceLocation registryName) { + return registered(ResourceKey.create(registryType, registryName)); + } + + public static ICondition registered(ResourceLocation registryTypeName, ResourceLocation registryName) { + return registered(ResourceKey.createRegistryKey(registryTypeName), registryName); + } + + public static ICondition itemRegistered(ResourceLocation itemName) { + return registered(Registries.ITEM, itemName); + } + + public static ICondition itemRegistered(String namespace, String path) { + return itemRegistered(ResourceLocation.fromNamespaceAndPath(namespace, path)); + } + + public static ICondition itemRegistered(String itemName) { + return itemRegistered(ResourceLocation.parse(itemName)); + } + + public static ICondition modLoaded(String modid) { + return new ModLoadedCondition(modid); + } + + public static ICondition tagEmpty(TagKey tag) { + return new TagEmptyCondition<>(tag); + } + + public static ICondition tagEmpty(ResourceKey> tagType, ResourceLocation tagName) { + return tagEmpty(TagKey.create(tagType, tagName)); + } + + public static ICondition itemTagEmpty(ResourceLocation tagName) { + return tagEmpty(Registries.ITEM, tagName); + } + + public static ICondition itemTagEmpty(String namespace, String tagPath) { + return itemTagEmpty(ResourceLocation.fromNamespaceAndPath(namespace, tagPath)); + } + + public static ICondition itemTagEmpty(String tagName) { + return itemTagEmpty(ResourceLocation.parse(tagName)); + } + + public static ICondition featureFlagsEnabled(FeatureFlagSet requiredFeatures) { + return new FeatureFlagsEnabledCondition(requiredFeatures); + } + + public static ICondition featureFlagsEnabled(FeatureFlag... requiredFlags) { + if (requiredFlags.length == 0) { + throw new IllegalArgumentException("FeatureFlagsEnabledCondition requires at least one feature flag."); + } + if (requiredFlags.length == 1) { + return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0])); + } else { + return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0], ArrayUtils.remove(requiredFlags, 0))); + } + } + + private NeoForgeConditions() { + // NOOP - Utility class, never to be constructed + } +} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java similarity index 65% rename from src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java rename to src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java index 6410e2b8aa3..e0332122285 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java @@ -7,12 +7,12 @@ import com.mojang.serialization.MapCodec; -public final class FalseCondition implements ICondition { - public static final FalseCondition INSTANCE = new FalseCondition(); +public final class NeverCondition implements ICondition { + public static final NeverCondition INSTANCE = new NeverCondition(); - public static final MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); - private FalseCondition() {} + private NeverCondition() {} @Override public boolean test(IContext condition) { @@ -25,6 +25,6 @@ public MapCodec codec() { } public String toString() { - return "false"; + return "never"; } } diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java new file mode 100644 index 00000000000..6e32d5dac7e --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.conditions; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; + +public record RegisteredCondition(ResourceKey registryKey) implements ICondition { + public static final MapCodec> CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(ResourceLocation.CODEC.optionalFieldOf("registry", Registries.ITEM.location()).forGetter(condition -> condition.registryKey().registry()), + ResourceLocation.CODEC.fieldOf("value").forGetter(condition -> condition.registryKey().location())) + .apply(instance, RegisteredCondition::new)); + + private RegisteredCondition(ResourceLocation registryType, ResourceLocation registryName) { + this(ResourceKey.create(ResourceKey.createRegistryKey(registryType), registryName)); + } + + @Override + public boolean test(IContext context) { + return context.registryAccess().holder(registryKey).map(Holder::isBound).orElse(false); + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java index 6da7798cb68..3c46888e500 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java @@ -8,27 +8,18 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -public record TagEmptyCondition(TagKey tag) implements ICondition { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.xmap(loc -> TagKey.create(Registries.ITEM, loc), TagKey::location).fieldOf("tag").forGetter(TagEmptyCondition::tag)) - .apply(builder, TagEmptyCondition::new)); +public record TagEmptyCondition(TagKey tag) implements ICondition { + public static final MapCodec> CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(ResourceLocation.CODEC.optionalFieldOf("registry", Registries.ITEM.location()).forGetter(condition -> condition.tag().registry().location()), + ResourceLocation.CODEC.fieldOf("tag").forGetter(condition -> condition.tag().location())) + .apply(instance, TagEmptyCondition::new)); - public TagEmptyCondition(String location) { - this(ResourceLocation.parse(location)); - } - - public TagEmptyCondition(String namespace, String path) { - this(ResourceLocation.fromNamespaceAndPath(namespace, path)); - } - - public TagEmptyCondition(ResourceLocation tag) { - this(TagKey.create(Registries.ITEM, tag)); + private TagEmptyCondition(ResourceLocation registryType, ResourceLocation tagName) { + this(TagKey.create(ResourceKey.createRegistryKey(registryType), tagName)); } @Override @@ -40,9 +31,4 @@ public boolean test(ICondition.IContext context) { public MapCodec codec() { return CODEC; } - - @Override - public String toString() { - return "tag_empty(\"" + tag.location() + "\")"; - } } diff --git a/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java b/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java index 568fd674d9f..db097c5d3dd 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java @@ -35,7 +35,7 @@ /** *

Dataprovider for using a Codec to generate jsons. * Path names for jsons are derived from the given registry folder and each entry's namespaced id, in the format:

- * + * *
  * {@code /entryid/registryfolder/entrypath.json }
  * 
diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeBlockTagsProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeBlockTagsProvider.java index 09b564d1b0b..259f09187ad 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeBlockTagsProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeBlockTagsProvider.java @@ -147,11 +147,13 @@ public void addTags(HolderLookup.Provider p_256380_) { tag(Tags.Blocks.STRIPPED_LOGS).add( Blocks.STRIPPED_ACACIA_LOG, Blocks.STRIPPED_BAMBOO_BLOCK, Blocks.STRIPPED_BIRCH_LOG, Blocks.STRIPPED_CHERRY_LOG, Blocks.STRIPPED_DARK_OAK_LOG, Blocks.STRIPPED_JUNGLE_LOG, - Blocks.STRIPPED_MANGROVE_LOG, Blocks.STRIPPED_OAK_LOG, Blocks.STRIPPED_SPRUCE_LOG); + Blocks.STRIPPED_MANGROVE_LOG, Blocks.STRIPPED_OAK_LOG, Blocks.STRIPPED_SPRUCE_LOG, + Blocks.STRIPPED_CRIMSON_STEM, Blocks.STRIPPED_WARPED_STEM); tag(Tags.Blocks.STRIPPED_WOODS).add( Blocks.STRIPPED_ACACIA_WOOD, Blocks.STRIPPED_BIRCH_WOOD, Blocks.STRIPPED_CHERRY_WOOD, Blocks.STRIPPED_DARK_OAK_WOOD, Blocks.STRIPPED_JUNGLE_WOOD, Blocks.STRIPPED_MANGROVE_WOOD, - Blocks.STRIPPED_OAK_WOOD, Blocks.STRIPPED_SPRUCE_WOOD); + Blocks.STRIPPED_OAK_WOOD, Blocks.STRIPPED_SPRUCE_WOOD, Blocks.STRIPPED_WARPED_HYPHAE, + Blocks.STRIPPED_CRIMSON_HYPHAE); tag(Tags.Blocks.VILLAGER_JOB_SITES).add( Blocks.BARREL, Blocks.BLAST_FURNACE, Blocks.BREWING_STAND, Blocks.CARTOGRAPHY_TABLE, Blocks.CAULDRON, Blocks.WATER_CAULDRON, Blocks.LAVA_CAULDRON, Blocks.POWDER_SNOW_CAULDRON, diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java index 6640d90439b..3f8a4184a53 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java @@ -249,7 +249,7 @@ default boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, * @param fluid The current fluid state at current position */ default void onDestroyedByPushReaction(BlockState state, Level level, BlockPos pos, Direction pushDirection, FluidState fluid) { - level.setBlock(pos, Blocks.AIR.defaultBlockState(), level.isClientSide ? 11 : 3); + level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_CLIENTS); level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(state)); } diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java index 662f8169441..7db002d6090 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java @@ -129,11 +129,11 @@ default boolean makesPiglinsNeutral(ItemStack stack, LivingEntity wearer) { } /** - * Called by CraftingManager to determine if an item is reparable. + * Determines if an item is repairable by combining, used by Repair recipes and Grindstone. * - * @return True if reparable + * @return True if repairable by combining */ - boolean isRepairable(ItemStack stack); + boolean isCombineRepairable(ItemStack stack); /** * Determines the amount of durability the mending enchantment diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java index 0b18ba462f3..609f9cf52b2 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java @@ -317,12 +317,12 @@ default boolean doesSneakBypassUse(net.minecraft.world.level.LevelReader level, } /** - * Determines if a item is reparable, used by Repair recipes and Grindstone. + * Determines if an item is repairable by combining, used by Repair recipes and Grindstone. * - * @return True if reparable + * @return True if repairable by combining */ - default boolean isRepairable() { - return self().getItem().isRepairable(self()); + default boolean isCombineRepairable() { + return self().getItem().isCombineRepairable(self()); } /** diff --git a/src/main/java/net/neoforged/neoforge/registries/holdersets/AnyHolderSet.java b/src/main/java/net/neoforged/neoforge/registries/holdersets/AnyHolderSet.java index 9e163313c02..446bf5d5801 100644 --- a/src/main/java/net/neoforged/neoforge/registries/holdersets/AnyHolderSet.java +++ b/src/main/java/net/neoforged/neoforge/registries/holdersets/AnyHolderSet.java @@ -80,7 +80,8 @@ public Holder get(int i) { @Override public boolean contains(Holder holder) { - return holder.unwrapKey().map(key -> this.registryLookup.listElementIds().anyMatch(key::equals)).orElse(false); + ResourceKey key = holder.getKey(); + return key != null && this.registryLookup().get(key).isPresent(); } @Override diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1f3cdb8df4a..0497cdda0e8 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,3 +1,4 @@ +# Note: This file is for manually added ATs. When AT entries can be programmatically generated based on fixed rules you may define those rules in the build.gradle file public net.minecraft.advancements.CriteriaTriggers register(Ljava/lang/String;Lnet/minecraft/advancements/CriterionTrigger;)Lnet/minecraft/advancements/CriterionTrigger; # register default net.minecraft.client.KeyMapping isDown # isDown public-f net.minecraft.client.Options keyMappings # keyMappings @@ -47,27 +48,9 @@ public net.minecraft.client.renderer.RenderType create(Ljava/lang/String;Lcom/mo public net.minecraft.client.renderer.RenderType create(Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;IZZLnet/minecraft/client/renderer/RenderType$CompositeState;)Lnet/minecraft/client/renderer/RenderType$CompositeRenderType; # create public net.minecraft.client.renderer.RenderType$OutlineProperty public net.minecraft.client.renderer.RenderType$CompositeState -public net.minecraft.client.renderer.RenderStateShard * protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard blur # blur protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard mipmap # mipmap public net.minecraft.client.renderer.RenderStateShard setupGlintTexturing(F)V -public net.minecraft.client.renderer.RenderStateShard$BooleanStateShard -public net.minecraft.client.renderer.RenderStateShard$ColorLogicStateShard -public net.minecraft.client.renderer.RenderStateShard$CullStateShard -public net.minecraft.client.renderer.RenderStateShard$DepthTestStateShard -public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard -public net.minecraft.client.renderer.RenderStateShard$LayeringStateShard -public net.minecraft.client.renderer.RenderStateShard$LightmapStateShard -public net.minecraft.client.renderer.RenderStateShard$LineStateShard -public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard -public net.minecraft.client.renderer.RenderStateShard$OffsetTexturingStateShard -public net.minecraft.client.renderer.RenderStateShard$OutputStateShard -public net.minecraft.client.renderer.RenderStateShard$OverlayStateShard -public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard -public net.minecraft.client.renderer.RenderStateShard$TextureStateShard -public net.minecraft.client.renderer.RenderStateShard$TexturingStateShard -public net.minecraft.client.renderer.RenderStateShard$TransparencyStateShard -public net.minecraft.client.renderer.RenderStateShard$WriteMaskStateShard #endgroup default net.minecraft.client.renderer.chunk.RenderChunk wrapped public net.minecraft.client.renderer.block.model.BlockElement uvsByFace(Lnet/minecraft/core/Direction;)[F # uvsByFace @@ -118,9 +101,6 @@ public net.minecraft.core.particles.SimpleParticleType (Z)V # constructor protected net.minecraft.data.loot.BlockLootSubProvider createSilkTouchOnlyTable(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createSilkTouchOnlyTable protected net.minecraft.data.loot.BlockLootSubProvider createPotFlowerItemTable(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createPotFlowerItemTable protected net.minecraft.data.loot.BlockLootSubProvider createSelfDropDispatchTable(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition$Builder;Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer$Builder;)Lnet/minecraft/world/level/storage/loot/LootTable$Builder; # createSelfDropDispatchTable -protected net.minecraft.data.recipes.RecipeProvider insideOf(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/advancements/Criterion; # insideOf -protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate;)Lnet/minecraft/advancements/Criterion; # inventoryTrigger -protected net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/advancements/critereon/MinMaxBounds$Ints;Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; # has protected net.minecraft.data.recipes.RecipeProvider getBaseBlock(Lnet/minecraft/data/BlockFamily;Lnet/minecraft/data/BlockFamily$Variant;)Lnet/minecraft/world/level/block/Block; # getBaseBlock protected net.minecraft.data.recipes.RecipeProvider buttonBuilder(Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # buttonBuilder protected net.minecraft.data.recipes.RecipeProvider fenceBuilder(Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # fenceBuilder @@ -134,7 +114,6 @@ protected net.minecraft.data.recipes.RecipeProvider polishedBuilder(Lnet/minecra protected net.minecraft.data.recipes.RecipeProvider pressurePlateBuilder(Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/item/crafting/Ingredient;)Lnet/minecraft/data/recipes/RecipeBuilder; # pressurePlateBuilder protected net.minecraft.data.recipes.RecipeProvider nineBlockStorageRecipes(Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Lnet/minecraft/data/recipes/RecipeCategory;Lnet/minecraft/world/level/ItemLike;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V # nineBlockStorageRecipes protected net.minecraft.data.recipes.RecipeProvider simpleCookingRecipe(Ljava/lang/String;Lnet/minecraft/world/item/crafting/RecipeSerializer;Lnet/minecraft/world/item/crafting/AbstractCookingRecipe$Factory;ILnet/minecraft/world/level/ItemLike;Lnet/minecraft/world/level/ItemLike;F)V # simpleCookingRecipe -protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate$Builder;)Lnet/minecraft/advancements/Criterion; # inventoryTrigger public net.minecraft.data.recipes.RecipeProvider$Runner protected net.minecraft.data.recipes.packs.VanillaRecipeProvider (Lnet/minecraft/core/HolderLookup$Provider;Lnet/minecraft/data/recipes/RecipeOutput;)V public net.minecraft.data.recipes.packs.VanillaRecipeProvider COAL_SMELTABLES # COAL_SMELTABLES @@ -196,10 +175,6 @@ public net.minecraft.world.entity.Mob goalSelector # goalSelector public net.minecraft.world.entity.Mob targetSelector # targetSelector public net.minecraft.world.entity.ai.sensing.SensorType (Ljava/util/function/Supplier;)V # constructor protected net.minecraft.world.entity.item.PrimedTnt explode()V # explode - make it easier to extend TNTEntity with custom explosion logic -protected net.minecraft.world.entity.monster.AbstractSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable -protected net.minecraft.world.entity.monster.Skeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable -protected net.minecraft.world.entity.monster.Stray getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable -protected net.minecraft.world.entity.monster.WitherSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable public net.minecraft.world.entity.npc.VillagerType (Ljava/lang/String;)V # constructor public net.minecraft.world.entity.player.Player closeContainer()V # closeContainer protected net.minecraft.world.entity.projectile.Projectile (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V # constructor @@ -211,20 +186,6 @@ public net.minecraft.world.inventory.AnvilMenu repairItemCountCost # repairItemC public net.minecraft.world.inventory.MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V # constructor public net.minecraft.world.inventory.MenuType$MenuSupplier public net.minecraft.world.item.CreativeModeTab$TabVisibility -public net.minecraft.world.item.CreativeModeTabs COLORED_BLOCKS # COLORED_BLOCKS -public net.minecraft.world.item.CreativeModeTabs SPAWN_EGGS # SPAWN_EGGS -public net.minecraft.world.item.CreativeModeTabs SEARCH # SEARCH -public net.minecraft.world.item.CreativeModeTabs NATURAL_BLOCKS # NATURAL_BLOCKS -public net.minecraft.world.item.CreativeModeTabs BUILDING_BLOCKS # BUILDING_BLOCKS -public net.minecraft.world.item.CreativeModeTabs FUNCTIONAL_BLOCKS # FUNCTIONAL_BLOCKS -public net.minecraft.world.item.CreativeModeTabs COMBAT # COMBAT -public net.minecraft.world.item.CreativeModeTabs OP_BLOCKS # OP_BLOCKS -public net.minecraft.world.item.CreativeModeTabs FOOD_AND_DRINKS # FOOD_AND_DRINKS -public net.minecraft.world.item.CreativeModeTabs TOOLS_AND_UTILITIES # TOOLS_AND_UTILITIES -public net.minecraft.world.item.CreativeModeTabs HOTBAR # HOTBAR -public net.minecraft.world.item.CreativeModeTabs INGREDIENTS # INGREDIENTS -public net.minecraft.world.item.CreativeModeTabs REDSTONE_BLOCKS # REDSTONE_BLOCKS -public net.minecraft.world.item.CreativeModeTabs INVENTORY # INVENTORY #group public net.minecraft.world.item.Item public net.minecraft.world.item.DiggerItem (Lnet/minecraft/world/item/ToolMaterial;Lnet/minecraft/tags/TagKey;FFLnet/minecraft/world/item/Item$Properties;)V #endgroup @@ -252,124 +213,9 @@ public net.minecraft.world.level.biome.BiomeGenerationSettings (Lnet/minec protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder features # features protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder carvers # carvers protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder addFeatureStepsUpTo(I)V # addFeatureStepsUpTo -#group protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder * -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder fogColor # fogColor -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterColor # waterColor -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterFogColor # waterFogColor -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder skyColor # skyColor -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder foliageColorOverride # foliageColorOverride -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorOverride # grassColorOverride -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorModifier # grassColorModifier -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientParticle # ambientParticle -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientLoopSoundEvent # ambientLoopSoundEvent -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientMoodSettings # ambientMoodSettings -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientAdditionsSettings # ambientAdditionsSettings -protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder backgroundMusic # backgroundMusic -#endgroup protected net.minecraft.world.level.biome.MobSpawnSettings$Builder spawners # spawners protected net.minecraft.world.level.biome.MobSpawnSettings$Builder mobSpawnCosts # mobSpawnCosts protected net.minecraft.world.level.biome.MobSpawnSettings$Builder creatureGenerationProbability # creatureGenerationProbability -#group public net.minecraft.world.level.block.Block -public net.minecraft.world.level.block.AttachedStemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.AzaleaBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BarrierBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BaseCoralFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BaseCoralPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BaseCoralPlantTypeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BaseCoralWallFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BigDripleafBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BigDripleafStemBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.BlastFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.ButtonBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;ILnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CactusBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CakeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CandleCakeBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CartographyTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CarvedPumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.ChestBlock (Ljava/util/function/Supplier;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.ChorusFlowerBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.ChorusPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CoralFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CoralPlantBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CoralWallFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CraftingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.CropBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.DeadBushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.DecoratedPotBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.DirtPathBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.DispenserBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.DoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.EnchantingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.EndGatewayBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.EndPortalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.EndRodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.EnderChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.FarmBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.FletchingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.FungusBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.FurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.GrindstoneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.HalfTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.HangingRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.IronBarsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.JigsawBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.JukeboxBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.KelpBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.KelpPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.LadderBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.LecternBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.LeverBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.LiquidBlock (Lnet/minecraft/world/level/material/FlowingFluid;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.LoomBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.MangroveRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.NetherWartBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.NyliumBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PinkPetalsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PipeBlock (FLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PlayerHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PlayerWallHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PoweredRailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PressurePlateBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.PumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RedstoneTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RedstoneWallTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RepeaterBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.RootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SaplingBlock (Lnet/minecraft/world/level/block/grower/TreeGrower;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.ScaffoldingBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SeaPickleBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SeagrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SmithingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SmokerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SnowLayerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SnowyDirtBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SpawnerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.StairBlock (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.StemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.StructureBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.StructureVoidBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.SugarCaneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.TallGrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.TorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.TransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.TrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WallSkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WallTorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WaterlilyBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WaterloggedTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WeatheringCopperDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WeatheringCopperGrateBlock (Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WeightedPressurePlateBlock (ILnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WetSpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WitherSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WitherWallSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -public net.minecraft.world.level.block.WoolCarpetBlock (Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V # constructor -#endgroup public net.minecraft.world.level.block.Block popExperience(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;I)V # popExperience public net.minecraft.world.level.block.Blocks always(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/EntityType;)Ljava/lang/Boolean; # always public net.minecraft.world.level.block.Blocks never(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/EntityType;)Ljava/lang/Boolean; # never @@ -411,13 +257,6 @@ private-f net.minecraft.world.level.levelgen.DebugLevelSource GRID_WIDTH # GRID_ private-f net.minecraft.world.level.levelgen.DebugLevelSource GRID_HEIGHT # GRID_HEIGHT public-f net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator protected net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator iterateNoiseColumn(Lnet/minecraft/world/level/LevelHeightAccessor;Lnet/minecraft/world/level/levelgen/RandomState;IILorg/apache/commons/lang3/mutable/MutableObject;Ljava/util/function/Predicate;)Ljava/util/OptionalInt; # iterateNoiseColumn -#group public net.minecraft.world.level.levelgen.NoiseGeneratorSettings *() -public net.minecraft.world.level.levelgen.NoiseGeneratorSettings caves(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # caves -public net.minecraft.world.level.levelgen.NoiseGeneratorSettings end(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # end -public net.minecraft.world.level.levelgen.NoiseGeneratorSettings overworld(Lnet/minecraft/data/worldgen/BootstrapContext;ZZ)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # overworld -public net.minecraft.world.level.levelgen.NoiseGeneratorSettings floatingIslands(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # floatingIslands -public net.minecraft.world.level.levelgen.NoiseGeneratorSettings nether(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; # nether -#endgroup public net.minecraft.world.level.levelgen.feature.featuresize.FeatureSizeType (Lcom/mojang/serialization/MapCodec;)V # constructor public net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType (Lcom/mojang/serialization/MapCodec;)V # constructor public net.minecraft.world.level.levelgen.feature.rootplacers.RootPlacerType (Lcom/mojang/serialization/MapCodec;)V # constructor @@ -433,49 +272,6 @@ private-f net.minecraft.world.level.storage.loot.LootPool bonusRolls # bonusRoll public net.minecraft.server.network.ServerConfigurationPacketListenerImpl finishCurrentTask(Lnet/minecraft/server/network/ConfigurationTask$Type;)V public com.mojang.blaze3d.vertex.VertexFormatElement$Usage$SetupState -# Below you will find particle constructor ATs -protected net.minecraft.client.particle.AttackSweepParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.BlockMarker (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/block/state/BlockState;)V # constructor -protected net.minecraft.client.particle.BreakingItemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/renderer/item/ItemStackRenderState;)V # constructor -protected net.minecraft.client.particle.BubbleColumnUpParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.BubbleParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.BubblePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.CampfireSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDZ)V # constructor -protected net.minecraft.client.particle.CritParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.DragonBreathParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.DripParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;)V # constructor -protected net.minecraft.client.particle.EndRodParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.FallingDustParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDFFFLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.FireworkParticles$OverlayParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -protected net.minecraft.client.particle.FireworkParticles$SparkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/ParticleEngine;Lnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.FlameParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.FlyStraightTowardsParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDII)V # constructor -protected net.minecraft.client.particle.FlyTowardsPositionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.GlowParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.GustSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDII)V # constructor -protected net.minecraft.client.particle.HeartParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -protected net.minecraft.client.particle.HugeExplosionSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -protected net.minecraft.client.particle.LavaParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -protected net.minecraft.client.particle.MobAppearanceParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -protected net.minecraft.client.particle.NoteParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDD)V # constructor -protected net.minecraft.client.particle.PlayerCloudParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.ReversePortalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.SculkChargeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.SculkChargePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.ShriekParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDI)V # constructor -protected net.minecraft.client.particle.SoulParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.SpellParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.SpitParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.SplashParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.SquidInkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDILnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.SuspendedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/particle/SpriteSet;DDD)V # constructor -protected net.minecraft.client.particle.SuspendedTownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V # constructor -protected net.minecraft.client.particle.TotemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.VibrationSignalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/gameevent/PositionSource;I)V # constructor -protected net.minecraft.client.particle.WakeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V # constructor -protected net.minecraft.client.particle.WaterCurrentDownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V # constructor -# End of particle constructor ATs group - # EnchantmentHelper methods needed for adding custom enchantments public net.minecraft.world.item.enchantment.EnchantmentHelper runIterationOnItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentVisitor;)V public net.minecraft.world.item.enchantment.EnchantmentHelper runIterationOnItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/EquipmentSlot;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentInSlotVisitor;)V diff --git a/src/main/resources/META-INF/accesstransformergenerated.cfg b/src/main/resources/META-INF/accesstransformergenerated.cfg new file mode 100644 index 00000000000..76f5e7fedd5 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformergenerated.cfg @@ -0,0 +1,380 @@ +# This file is generated based on the rules defined in the buildscript. DO NOT modify it manually. +# Add more rules in the buildscript and then run the generateAccessTransformers task to update this file. + +# render state shard classes +public net.minecraft.client.renderer.RenderStateShard$BooleanStateShard +public net.minecraft.client.renderer.RenderStateShard$ColorLogicStateShard +public net.minecraft.client.renderer.RenderStateShard$CullStateShard +public net.minecraft.client.renderer.RenderStateShard$DepthTestStateShard +public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard +public net.minecraft.client.renderer.RenderStateShard$LayeringStateShard +public net.minecraft.client.renderer.RenderStateShard$LightmapStateShard +public net.minecraft.client.renderer.RenderStateShard$LineStateShard +public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard +public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard$Entry +public net.minecraft.client.renderer.RenderStateShard$MultiTextureStateShard$Entry (Lnet/minecraft/resources/ResourceLocation;ZZ)V +public net.minecraft.client.renderer.RenderStateShard$OffsetTexturingStateShard +public net.minecraft.client.renderer.RenderStateShard$OutputStateShard +public net.minecraft.client.renderer.RenderStateShard$OverlayStateShard +public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard +public net.minecraft.client.renderer.RenderStateShard$TextureStateShard +public net.minecraft.client.renderer.RenderStateShard$TexturingStateShard +public net.minecraft.client.renderer.RenderStateShard$TransparencyStateShard +public net.minecraft.client.renderer.RenderStateShard$WriteMaskStateShard + +# render state shards +public net.minecraft.client.renderer.RenderStateShard ADDITIVE_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard BLOCK_SHEET +public net.minecraft.client.renderer.RenderStateShard BLOCK_SHEET_MIPPED +public net.minecraft.client.renderer.RenderStateShard CLOUDS_TARGET +public net.minecraft.client.renderer.RenderStateShard COLOR_DEPTH_WRITE +public net.minecraft.client.renderer.RenderStateShard COLOR_WRITE +public net.minecraft.client.renderer.RenderStateShard CROSSHAIR_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard CRUMBLING_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard CULL +public net.minecraft.client.renderer.RenderStateShard DEFAULT_LINE +public net.minecraft.client.renderer.RenderStateShard DEFAULT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard DEPTH_WRITE +public net.minecraft.client.renderer.RenderStateShard ENTITY_GLINT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard EQUAL_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard GLINT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard GLINT_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard GREATER_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard ITEM_ENTITY_TARGET +public net.minecraft.client.renderer.RenderStateShard LEQUAL_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard LIGHTMAP +public net.minecraft.client.renderer.RenderStateShard LIGHTNING_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard MAIN_TARGET +public net.minecraft.client.renderer.RenderStateShard MOJANG_LOGO_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard NAUSEA_OVERLAY_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard NO_COLOR_LOGIC +public net.minecraft.client.renderer.RenderStateShard NO_CULL +public net.minecraft.client.renderer.RenderStateShard NO_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard NO_LAYERING +public net.minecraft.client.renderer.RenderStateShard NO_LIGHTMAP +public net.minecraft.client.renderer.RenderStateShard NO_OVERLAY +public net.minecraft.client.renderer.RenderStateShard NO_SHADER +public net.minecraft.client.renderer.RenderStateShard NO_TEXTURE +public net.minecraft.client.renderer.RenderStateShard NO_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard OR_REVERSE_COLOR_LOGIC +public net.minecraft.client.renderer.RenderStateShard OUTLINE_TARGET +public net.minecraft.client.renderer.RenderStateShard OVERLAY +public net.minecraft.client.renderer.RenderStateShard OVERLAY_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard PARTICLES_TARGET +public net.minecraft.client.renderer.RenderStateShard PARTICLE_SHADER +public net.minecraft.client.renderer.RenderStateShard POLYGON_OFFSET_LAYERING +public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_LIGHTMAP_SHADER +public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_SHADER +public net.minecraft.client.renderer.RenderStateShard POSITION_COLOR_TEX_LIGHTMAP_SHADER +public net.minecraft.client.renderer.RenderStateShard POSITION_SHADER +public net.minecraft.client.renderer.RenderStateShard POSITION_TEXTURE_COLOR_SHADER +public net.minecraft.client.renderer.RenderStateShard POSITION_TEX_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_CUTOUT_NO_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_ENTITY_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ARMOR_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_BEACON_BEAM_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_BREEZE_WIND_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CLOUDS_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CRUMBLING_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CUTOUT_MIPPED_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_END_GATEWAY_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_END_PORTAL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENERGY_SWIRL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_ALPHA_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_DECAL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_NO_OUTLINE_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SHADOW_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_SOLID_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_EYES_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GLINT_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_GHOST_RECIPE_OVERLAY_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_OVERLAY_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_GUI_TEXT_HIGHLIGHT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LEASH_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LIGHTNING_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_LINES_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_OUTLINE_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_SOLID_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_BACKGROUND_SEE_THROUGH_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_BACKGROUND_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_INTENSITY_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_SEE_THROUGH_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TEXT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRANSLUCENT_MOVING_BLOCK_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_TRIPWIRE_SHADER +public net.minecraft.client.renderer.RenderStateShard RENDERTYPE_WATER_MASK_SHADER +public net.minecraft.client.renderer.RenderStateShard TRANSLUCENT_TARGET +public net.minecraft.client.renderer.RenderStateShard TRANSLUCENT_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard VIEW_OFFSET_Z_LAYERING +public net.minecraft.client.renderer.RenderStateShard VIEW_OFFSET_Z_LAYERING_FORWARD +public net.minecraft.client.renderer.RenderStateShard VIGNETTE_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard WEATHER_TARGET +public net.minecraft.client.renderer.RenderStateShard WORLD_BORDER_LAYERING + +# block constructors +public net.minecraft.world.level.block.AbstractBannerBlock (Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.AbstractCandleBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.AbstractChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Ljava/util/function/Supplier;)V +public net.minecraft.world.level.block.AbstractFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.AttachedStemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.AzaleaBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BarrierBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseCoralFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseCoralPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseCoralPlantTypeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseCoralWallFanBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseEntityBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BasePressurePlateBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/world/level/block/state/properties/BlockSetType;)V +public net.minecraft.world.level.block.BaseRailBlock (ZLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BaseTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BigDripleafBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BigDripleafStemBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BlastFurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.BushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.ButtonBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;ILnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CactusBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CakeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CandleCakeBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CartographyTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CarvedPumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.ChestBlock (Ljava/util/function/Supplier;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.ChorusFlowerBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.ChorusPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CoralFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CoralPlantBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CoralWallFanBlock (Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CraftingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CreakingHeartBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CropBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.CrossCollisionBlock (FFFFFLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DeadBushBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DecoratedPotBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DiodeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DirtPathBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DispenserBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.DoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.EnchantingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.EndGatewayBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.EndPortalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.EndRodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.EnderChestBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.FarmBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.FletchingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.FungusBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.FurnaceBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.GrindstoneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.GrowingPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;Z)V +public net.minecraft.world.level.block.GrowingPlantBodyBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;Z)V +public net.minecraft.world.level.block.GrowingPlantHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;Lnet/minecraft/core/Direction;Lnet/minecraft/world/phys/shapes/VoxelShape;ZD)V +public net.minecraft.world.level.block.HalfTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.HangingRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.HorizontalDirectionalBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.IronBarsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.JigsawBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.JukeboxBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.KelpBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.KelpPlantBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.LadderBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.LecternBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.LeverBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.LiquidBlock (Lnet/minecraft/world/level/material/FlowingFluid;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.LoomBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.MangroveRootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.NetherWartBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.NyliumBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PinkPetalsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PipeBlock (FLnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PlayerHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PlayerWallHeadBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PoweredRailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PressurePlateBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.PumpkinBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RailBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RedstoneTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RedstoneWallTorchBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RepeaterBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RodBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.RootsBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SaplingBlock (Lnet/minecraft/world/level/block/grower/TreeGrower;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.ScaffoldingBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SeaPickleBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SeagrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SignBlock (Lnet/minecraft/world/level/block/state/properties/WoodType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SmithingTableBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SmokerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SnowLayerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SnowyDirtBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SpawnerBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SpreadingSnowyDirtBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.StairBlock (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.StemBlock (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.StructureBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.StructureVoidBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.SugarCaneBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.TallGrassBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.TorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.TransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.TrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WallSkullBlock (Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WallTorchBlock (Lnet/minecraft/core/particles/SimpleParticleType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WaterlilyBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WaterloggedTransparentBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WeatheringCopperDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WeatheringCopperGrateBlock (Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock (Lnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/WeatheringCopper$WeatherState;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WeightedPressurePlateBlock (ILnet/minecraft/world/level/block/state/properties/BlockSetType;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WetSpongeBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WitherSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WitherWallSkullBlock (Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V +public net.minecraft.world.level.block.WoolCarpetBlock (Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;)V + +# particle constructors +public net.minecraft.client.particle.AshParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.AttackSweepParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.BaseAshSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDFFFDDDFLnet/minecraft/client/particle/SpriteSet;FIFZ)V +public net.minecraft.client.particle.BlockMarker (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/block/state/BlockState;)V +public net.minecraft.client.particle.BreakingItemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/renderer/item/ItemStackRenderState;)V +public net.minecraft.client.particle.BreakingItemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/client/renderer/item/ItemStackRenderState;)V +public net.minecraft.client.particle.BubbleColumnUpParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.BubbleParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.BubblePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.CampfireSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDZ)V +public net.minecraft.client.particle.CritParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.DragonBreathParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.DripParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;)V +public net.minecraft.client.particle.DripParticle$CoolingDripHangParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/particles/ParticleOptions;)V +public net.minecraft.client.particle.DripParticle$DripHangParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/particles/ParticleOptions;)V +public net.minecraft.client.particle.DripParticle$DripLandParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;)V +public net.minecraft.client.particle.DripParticle$DripstoneFallAndLandParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/particles/ParticleOptions;)V +public net.minecraft.client.particle.DripParticle$FallAndLandParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/particles/ParticleOptions;)V +public net.minecraft.client.particle.DripParticle$FallingParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;)V +public net.minecraft.client.particle.DripParticle$FallingParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;I)V +public net.minecraft.client.particle.DripParticle$HoneyFallAndLandParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/particles/ParticleOptions;)V +public net.minecraft.client.particle.DustColorTransitionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/core/particles/DustColorTransitionOptions;Lnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.DustParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/core/particles/DustParticleOptions;Lnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.DustParticleBase (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/core/particles/ScalableParticleOptionsBase;Lnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.DustPlumeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.EndRodParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.ExplodeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.FallingDustParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDFFFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.FallingLeavesParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/client/particle/SpriteSet;FFZZFF)V +public net.minecraft.client.particle.FireworkParticles$OverlayParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.FireworkParticles$SparkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/ParticleEngine;Lnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.FlameParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.FlyStraightTowardsParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDII)V +public net.minecraft.client.particle.FlyTowardsPositionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.FlyTowardsPositionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDZLnet/minecraft/client/particle/Particle$LifetimeAlpha;)V +public net.minecraft.client.particle.GlowParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.GustParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.GustSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDII)V +public net.minecraft.client.particle.HeartParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.HugeExplosionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.HugeExplosionSeedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.ItemPickupParticle (Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;)V +public net.minecraft.client.particle.LargeSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.LavaParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.MobAppearanceParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.NoRenderParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.NoRenderParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.NoteParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDD)V +public net.minecraft.client.particle.Particle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.PlayerCloudParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.PortalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.ReversePortalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.RisingParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.SculkChargeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SculkChargePopParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.ShriekParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDI)V +public net.minecraft.client.particle.SimpleAnimatedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/client/particle/SpriteSet;F)V +public net.minecraft.client.particle.SingleQuadParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.SingleQuadParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.SmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SnowflakeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SonicBoomParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SoulParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SpellParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SpitParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SplashParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.SquidInkParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDILnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.SuspendedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/particle/SpriteSet;DDD)V +public net.minecraft.client.particle.SuspendedParticle (Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/particle/SpriteSet;DDDDDD)V +public net.minecraft.client.particle.SuspendedTownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.TextureSheetParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.TextureSheetParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V +public net.minecraft.client.particle.TotemParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.TrackingEmitter (Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/core/particles/ParticleOptions;ILnet/minecraft/world/phys/Vec3;)V +public net.minecraft.client.particle.TrailParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/world/phys/Vec3;I)V +public net.minecraft.client.particle.TrialSpawnerDetectionParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.VibrationSignalParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDLnet/minecraft/world/level/gameevent/PositionSource;I)V +public net.minecraft.client.particle.WakeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.WaterCurrentDownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.WaterDropParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDD)V +public net.minecraft.client.particle.WhiteAshParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V +public net.minecraft.client.particle.WhiteSmokeParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDFLnet/minecraft/client/particle/SpriteSet;)V + +# recipe criteria +protected net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/advancements/critereon/MinMaxBounds$Ints;Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/advancements/Criterion; +protected net.minecraft.data.recipes.RecipeProvider insideOf(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/advancements/Criterion; +protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate$Builder;)Lnet/minecraft/advancements/Criterion; +protected net.minecraft.data.recipes.RecipeProvider inventoryTrigger([Lnet/minecraft/advancements/critereon/ItemPredicate;)Lnet/minecraft/advancements/Criterion; + +# skeleton step sound +protected net.minecraft.world.entity.monster.AbstractSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; +protected net.minecraft.world.entity.monster.Skeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; +protected net.minecraft.world.entity.monster.Stray getStepSound()Lnet/minecraft/sounds/SoundEvent; +protected net.minecraft.world.entity.monster.WitherSkeleton getStepSound()Lnet/minecraft/sounds/SoundEvent; + +# noise generator +public net.minecraft.world.level.levelgen.NoiseGeneratorSettings caves(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; +public net.minecraft.world.level.levelgen.NoiseGeneratorSettings end(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; +public net.minecraft.world.level.levelgen.NoiseGeneratorSettings floatingIslands(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; +public net.minecraft.world.level.levelgen.NoiseGeneratorSettings nether(Lnet/minecraft/data/worldgen/BootstrapContext;)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; +public net.minecraft.world.level.levelgen.NoiseGeneratorSettings overworld(Lnet/minecraft/data/worldgen/BootstrapContext;ZZ)Lnet/minecraft/world/level/levelgen/NoiseGeneratorSettings; + +# biome effects builder +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientAdditionsSettings +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientLoopSoundEvent +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientMoodSettings +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder ambientParticle +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder backgroundMusic +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder backgroundMusicVolume +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder fogColor +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder foliageColorOverride +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorModifier +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder grassColorOverride +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder skyColor +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterColor +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder waterFogColor + +# creative tabs +public net.minecraft.world.item.CreativeModeTabs BUILDING_BLOCKS +public net.minecraft.world.item.CreativeModeTabs COLORED_BLOCKS +public net.minecraft.world.item.CreativeModeTabs COMBAT +public net.minecraft.world.item.CreativeModeTabs FOOD_AND_DRINKS +public net.minecraft.world.item.CreativeModeTabs FUNCTIONAL_BLOCKS +public net.minecraft.world.item.CreativeModeTabs HOTBAR +public net.minecraft.world.item.CreativeModeTabs INGREDIENTS +public net.minecraft.world.item.CreativeModeTabs INVENTORY +public net.minecraft.world.item.CreativeModeTabs NATURAL_BLOCKS +public net.minecraft.world.item.CreativeModeTabs OP_BLOCKS +public net.minecraft.world.item.CreativeModeTabs REDSTONE_BLOCKS +public net.minecraft.world.item.CreativeModeTabs SEARCH +public net.minecraft.world.item.CreativeModeTabs SPAWN_EGGS +public net.minecraft.world.item.CreativeModeTabs TOOLS_AND_UTILITIES diff --git a/src/main/resources/META-INF/injected-interfaces.json b/src/main/resources/META-INF/injected-interfaces.json new file mode 100644 index 00000000000..459a8b4ab79 --- /dev/null +++ b/src/main/resources/META-INF/injected-interfaces.json @@ -0,0 +1,274 @@ +{ + "com/mojang/blaze3d/vertex/PoseStack": [ + "net/neoforged/neoforge/client/extensions/IPoseStackExtension" + ], + "com/mojang/blaze3d/vertex/VertexConsumer": [ + "net/neoforged/neoforge/client/extensions/IVertexConsumerExtension" + ], + "com/mojang/math/Transformation": [ + "net/neoforged/neoforge/common/extensions/ITransformationExtension" + ], + "net/minecraft/advancements/Advancement$Builder": [ + "net/neoforged/neoforge/common/extensions/IAdvancementBuilderExtension" + ], + "net/minecraft/client/KeyMapping": [ + "net/neoforged/neoforge/client/extensions/IKeyMappingExtension" + ], + "net/minecraft/client/Minecraft": [ + "net/neoforged/neoforge/client/extensions/IMinecraftExtension" + ], + "net/minecraft/client/gui/Font": [ + "net/neoforged/neoforge/client/extensions/IFontExtension" + ], + "net/minecraft/client/gui/GuiGraphics": [ + "net/neoforged/neoforge/client/extensions/IGuiGraphicsExtension" + ], + "net/minecraft/client/gui/components/AbstractWidget": [ + "net/neoforged/neoforge/client/extensions/IAbstractWidgetExtension" + ], + "net/minecraft/client/renderer/DimensionSpecialEffects": [ + "net/neoforged/neoforge/client/extensions/IDimensionSpecialEffectsExtension" + ], + "net/minecraft/client/renderer/block/model/BlockModel": [ + "net/neoforged/neoforge/client/model/ExtendedUnbakedModel" + ], + "net/minecraft/client/renderer/block/model/ItemModelGenerator": [ + "net/neoforged/neoforge/client/model/ExtendedUnbakedModel" + ], + "net/minecraft/client/renderer/blockentity/BlockEntityRenderer": [ + "net/neoforged/neoforge/client/extensions/IBlockEntityRendererExtension" + ], + "net/minecraft/client/resources/model/BakedModel": [ + "net/neoforged/neoforge/client/extensions/IBakedModelExtension" + ], + "net/minecraft/client/resources/model/ModelBaker": [ + "net/neoforged/neoforge/client/extensions/IModelBakerExtension" + ], + "net/minecraft/client/resources/model/MultiPartBakedModel": [ + "net/neoforged/neoforge/client/model/IDynamicBakedModel" + ], + "net/minecraft/client/resources/model/UnbakedModel": [ + "net/neoforged/neoforge/client/extensions/IUnbakedModelExtension" + ], + "net/minecraft/client/resources/model/WeightedBakedModel": [ + "net/neoforged/neoforge/client/model/IDynamicBakedModel" + ], + "net/minecraft/commands/CommandSourceStack": [ + "net/neoforged/neoforge/common/extensions/ICommandSourceStackExtension" + ], + "net/minecraft/core/Holder": [ + "net/neoforged/neoforge/common/extensions/IHolderExtension" + ], + "net/minecraft/core/HolderLookup$Provider": [ + "net/neoforged/neoforge/common/extensions/IHolderLookupProviderExtension" + ], + "net/minecraft/core/HolderSet": [ + "net/neoforged/neoforge/common/extensions/IHolderSetExtension" + ], + "net/minecraft/core/Registry": [ + "net/neoforged/neoforge/registries/IRegistryExtension" + ], + "net/minecraft/core/component/DataComponentHolder": [ + "net/neoforged/neoforge/common/extensions/IDataComponentHolderExtension" + ], + "net/minecraft/core/component/DataComponentMap$Builder": [ + "net/neoforged/neoforge/common/extensions/IDataComponentMapBuilderExtensions" + ], + "net/minecraft/data/recipes/RecipeOutput": [ + "net/neoforged/neoforge/common/extensions/IRecipeOutputExtension" + ], + "net/minecraft/data/tags/IntrinsicHolderTagsProvider$IntrinsicTagAppender": [ + "net/neoforged/neoforge/common/extensions/IIntrinsicHolderTagAppenderExtension" + ], + "net/minecraft/data/tags/TagsProvider$TagAppender": [ + "net/neoforged/neoforge/common/extensions/ITagAppenderExtension" + ], + "net/minecraft/network/FriendlyByteBuf": [ + "net/neoforged/neoforge/common/extensions/IFriendlyByteBufExtension" + ], + "net/minecraft/network/protocol/PacketFlow": [ + "net/neoforged/neoforge/common/extensions/IPacketFlowExtension" + ], + "net/minecraft/network/protocol/common/ClientCommonPacketListener": [ + "net/neoforged/neoforge/common/extensions/IClientCommonPacketListenerExtension" + ], + "net/minecraft/network/protocol/common/ServerCommonPacketListener": [ + "net/neoforged/neoforge/common/extensions/IServerCommonPacketListenerExtension" + ], + "net/minecraft/network/protocol/configuration/ServerConfigurationPacketListener": [ + "net/neoforged/neoforge/common/extensions/IServerConfigurationPacketListenerExtension" + ], + "net/minecraft/network/protocol/game/ServerGamePacketListener": [ + "net/neoforged/neoforge/common/extensions/IServerGamePacketListenerExtension" + ], + "net/minecraft/resources/ResourceKey": [ + "java/lang/Comparable>" + ], + "net/minecraft/server/level/ServerChunkCache": [ + "net/neoforged/neoforge/common/extensions/IServerChunkCacheExtension" + ], + "net/minecraft/server/packs/PackResources": [ + "net/neoforged/neoforge/common/extensions/IPackResourcesExtension" + ], + "net/minecraft/server/packs/PackType": [ + "net/minecraft/util/StringRepresentable" + ], + "net/minecraft/server/players/PlayerList": [ + "net/neoforged/neoforge/common/extensions/IPlayerListExtension" + ], + "net/minecraft/tags/TagBuilder": [ + "net/neoforged/neoforge/common/extensions/ITagBuilderExtension" + ], + "net/minecraft/world/MenuProvider": [ + "net/neoforged/neoforge/client/extensions/IMenuProviderExtension" + ], + "net/minecraft/world/effect/MobEffect": [ + "net/neoforged/neoforge/common/extensions/IMobEffectExtension" + ], + "net/minecraft/world/entity/Entity": [ + "net/neoforged/neoforge/common/extensions/IEntityExtension" + ], + "net/minecraft/world/entity/LivingEntity": [ + "net/neoforged/neoforge/common/extensions/ILivingEntityExtension" + ], + "net/minecraft/world/entity/Shearable": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/entity/ai/attributes/Attribute": [ + "net/neoforged/neoforge/common/extensions/IAttributeExtension" + ], + "net/minecraft/world/entity/player/Player": [ + "net/neoforged/neoforge/common/extensions/IPlayerExtension" + ], + "net/minecraft/world/entity/vehicle/AbstractBoat": [ + "net/neoforged/neoforge/common/extensions/IAbstractBoatExtension" + ], + "net/minecraft/world/inventory/MenuType": [ + "net/neoforged/neoforge/common/extensions/IMenuTypeExtension" + ], + "net/minecraft/world/item/DispensibleContainerItem": [ + "net/neoforged/neoforge/common/extensions/IDispensibleContainerItemExtension" + ], + "net/minecraft/world/item/Item": [ + "net/neoforged/neoforge/common/extensions/IItemExtension" + ], + "net/minecraft/world/item/Item$Properties": [ + "net/neoforged/neoforge/common/extensions/IItemPropertiesExtensions" + ], + "net/minecraft/world/item/ItemStack": [ + "net/neoforged/neoforge/common/extensions/IItemStackExtension", + "net/neoforged/neoforge/common/MutableDataComponentHolder" + ], + "net/minecraft/world/level/BaseSpawner": [ + "net/neoforged/neoforge/common/extensions/IOwnedSpawner" + ], + "net/minecraft/world/level/BlockAndTintGetter": [ + "net/neoforged/neoforge/common/extensions/IBlockAndTintGetterExtension" + ], + "net/minecraft/world/level/BlockGetter": [ + "net/neoforged/neoforge/common/extensions/IBlockGetterExtension" + ], + "net/minecraft/world/level/Level": [ + "net/neoforged/neoforge/common/extensions/ILevelExtension" + ], + "net/minecraft/world/level/LevelReader": [ + "net/neoforged/neoforge/common/extensions/ILevelReaderExtension" + ], + "net/minecraft/world/level/block/BaseRailBlock": [ + "net/neoforged/neoforge/common/extensions/IBaseRailBlockExtension" + ], + "net/minecraft/world/level/block/Block": [ + "net/neoforged/neoforge/common/extensions/IBlockExtension" + ], + "net/minecraft/world/level/block/BucketPickup": [ + "net/neoforged/neoforge/common/extensions/IBucketPickupExtension" + ], + "net/minecraft/world/level/block/DeadBushBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/Fallable": [ + "net/neoforged/neoforge/common/extensions/IFallableExtension" + ], + "net/minecraft/world/level/block/LeavesBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/SeagrassBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/TallGrassBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/VineBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/WebBlock": [ + "net/neoforged/neoforge/common/IShearable" + ], + "net/minecraft/world/level/block/entity/BlockEntity": [ + "net/neoforged/neoforge/common/extensions/IBlockEntityExtension" + ], + "net/minecraft/world/level/block/entity/trialspawner/TrialSpawner": [ + "net/neoforged/neoforge/common/extensions/IOwnedSpawner" + ], + "net/minecraft/world/level/block/state/BlockState": [ + "net/neoforged/neoforge/common/extensions/IBlockStateExtension" + ], + "net/minecraft/world/level/chunk/ChunkAccess": [ + "net/neoforged/neoforge/attachment/IAttachmentHolder" + ], + "net/minecraft/world/level/chunk/LevelChunk": [ + "net/neoforged/neoforge/attachment/IAttachmentHolder" + ], + "net/minecraft/world/level/material/Fluid": [ + "net/neoforged/neoforge/common/extensions/IFluidExtension" + ], + "net/minecraft/world/level/material/FluidState": [ + "net/neoforged/neoforge/common/extensions/IFluidStateExtension" + ], + + "com/mojang/blaze3d/vertex/VertexFormatElement$Usage": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/client/gui/Gui$HeartType": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/client/gui/font/providers/GlyphProviderType": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/client/model/HumanoidModel$ArmPose": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/damagesource/DamageEffects": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/damagesource/DamageScaling": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/damagesource/DeathMessageType": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/entity/MobCategory": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/entity/raid/Raid$RaiderType": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/inventory/RecipeBookType": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/item/ItemDisplayContext": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/item/ItemUseAnimation": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/item/Rarity": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/item/component/FireworkExplosion$Shape": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ], + "net/minecraft/world/level/biome/BiomeSpecialEffects$GrassColorModifier": [ + "net/neoforged/fml/common/asm/enumextension/IExtensibleEnum" + ] +} diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index d839c54b6e0..53b17ead2e4 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -18,3 +18,8 @@ license="LGPL v2.1" [[mixins]] config = "neoforge.mixins.json" + +[[accessTransformers]] + file="META-INF/accesstransformer.cfg" +[[accessTransformers]] + file="META-INF/accesstransformergenerated.cfg" diff --git a/src/main/resources/assets/neoforge/lang/cs_cz.json b/src/main/resources/assets/neoforge/lang/cs_cz.json index 737439aebca..d1dc862fc0f 100644 --- a/src/main/resources/assets/neoforge/lang/cs_cz.json +++ b/src/main/resources/assets/neoforge/lang/cs_cz.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Zjednodušený pohled", "fml.resources.modresources": "Zdroje pro %1$s módové soubory", "fml.resources.moddata": "Data pro %1$s soubory módu", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Tento NeoForge build byl vytvořen komunitním členem a proto je §c§lBEZ PODPORY§r", "commands.neoforge.arguments.enum.invalid": "Enum konstanta musí být jedna z %1$s, nalezeno %2$s", "commands.neoforge.dimensions.list": "Aktuálně registrované dimenze typu:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Komponenta %s s hodnotou %s byla smazána", "commands.neoforge.data_components.list.tooltip.modified": "Komponenta %s byla změněna z %s na %s", "commands.neoforge.data_components.list.tooltip.added": "Komponenta %s byla přidána s hodnotou %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Konfigurace pro %s typu %s nalezena na %s", "commands.config.noconfig": "Konfigurace pro %s typu %s nenalezena", "neoforge.update.beta.1": "%sPOZOR: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Nastavení Serveru", "neoforge.configgui.advertiseDedicatedServerToLan": "Oznámit dedikovaný server na LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Zapněte toto nastavení aby dedikovaný server oznamoval lokálním LAN klientům, aby se zobrazoval v Multiplayer obrazovce.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Povolit NeoForge pipelinu renderování blocků - opraví osvětlení různých modelů.", "neoforge.configgui.fullBoundingBoxLadders": "Plně Ohraničující Box u Žebříků", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Je nemožné se připoijit k serveru, jelikož chybí povinné registry map dat, které jsou přítomné na klientu: %s", "neoforge.network.data_maps.missing_their": "Je nemožné se připoijit k serveru, jelikož obsahuje povinné registry map dat, které nejsou přítomné na klientu: %s", "neoforge.network.extensible_enums.no_vanilla_server": "Tento klient nepodporuje vanilla servery, jelikož má mnoho rozšířených enumů v serverovaném připojení", - "neoforge.network.extensible_enums.enum_set_mismatch": "Sada rozšířených enumů na klientovi a na serveru se nerovná. Ujistěte se, že užíváte stejnou NeoForge verzi jako server", "neoforge.network.extensible_enums.enum_entry_mismatch": "Sada hodnot přidaných k rozšířeným enumů na klientu a na serveru se nerovnají. Ujistěte se, že užíváte stejný mód a NeoForge verzi jako server. Pro více informací se podívejte do logu", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/da_dk.json b/src/main/resources/assets/neoforge/lang/da_dk.json index 24e5b59c058..da55fac0e43 100644 --- a/src/main/resources/assets/neoforge/lang/da_dk.json +++ b/src/main/resources/assets/neoforge/lang/da_dk.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sADVARSEL: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/de_de.json b/src/main/resources/assets/neoforge/lang/de_de.json index b1bdcb1ed56..61d3c061429 100644 --- a/src/main/resources/assets/neoforge/lang/de_de.json +++ b/src/main/resources/assets/neoforge/lang/de_de.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Vereinfachte Ansicht", "fml.resources.modresources": "Ressourcen für %1$s Mod-Dateien", "fml.resources.moddata": "Daten für %1$s Mod-Dateien", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag-Datei {0}, bereitgestellt von Mod {100,modinfo,id}, existiert nicht", + "fml.modloadingissue.feature_flags.loading_error": "Fehler beim Laden der FeatureFlag-Daten unter {0} in Mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Diese Version von NeoForge wurde von einem Communitymitglied erstellt und wird daher §c§lNICHT UNTERSTÜTZT§r", "commands.neoforge.arguments.enum.invalid": "Enum-Konstante muss einer der Werte aus %1$s sein, %2$s gefunden", "commands.neoforge.dimensions.list": "Aktuell registrierte Dimensionen nach Typ:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Komponente %s mit Wert %s wurde gelöscht", "commands.neoforge.data_components.list.tooltip.modified": "Komponente %s wurde von %s auf %s geändert", "commands.neoforge.data_components.list.tooltip.added": "Komponente %s wurde mit dem Wert %s hinzugefügt", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Das Abrufen von Rezepten ist nicht verfügbar unter Client-Commands", "commands.config.getwithtype": "Konfiguration für %s vom Typ %s gefunden bei %s", "commands.config.noconfig": "Konfiguration für %s vom Typ %s nicht gefunden", "neoforge.update.beta.1": "%sWARNUNG: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server-Einstellungen", "neoforge.configgui.advertiseDedicatedServerToLan": "Dedizierten Server im LAN anzeigen", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Aktiviere diese Option, um den dedizierten Server zu lokalen LAN-Clients zu senden, sodass er automatisch in deren Mehrspieler-Bildschirmen angezeigt wird.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Zusätzliche Attribute zu erweiterten Schnellinfos", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Aktiviere diese Option, damit zusätzliche Informationen über Attribute eines Items angezeigt werden, wenn \"Erweiterte Schnellinfos\" aktiviert sind.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Licht-Pipeline aktivieren", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Aktiviert die NeoForge Block-Darstellungs-Pipeline - korrigiert die Beleuchtung von benutzerdefinierten Modellen.", "neoforge.configgui.fullBoundingBoxLadders": "Leitern im gesamten Kollisionsbereich", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Kann keine Verbindung zum Server herstellen, da auf dem Server obligatorische Registrierungsdatenkarten fehlen, die auf dem Client vorhanden sind: %s", "neoforge.network.data_maps.missing_their": "Kann keine Verbindung zum Server herstellen, da obligatorische Registrierungsdatenkarten auf dem Server vorhanden sind, die auf dem Client fehlen: %s", "neoforge.network.extensible_enums.no_vanilla_server": "Dieser Client unterstützt Vanilla-Server nicht, da er erweiterte Enums in dem an den Server gerichteten Netzwerk verwendet", - "neoforge.network.extensible_enums.enum_set_mismatch": "Die Menge der erweiterten Enums auf dem Client und dem Server stimmen nicht überein. Stelle sicher, dass du die gleiche NeoForge-Version wie der Server verwendest", "neoforge.network.extensible_enums.enum_entry_mismatch": "Die Werte, die zu erweiterten Enums auf dem Client und dem Server hinzugefügt wurden, stimmen nicht überein. Stelle sicher, dass du die gleichen Mod- und NeoForge-Versionen wie der Server verwendest. Weitere Details findest du im Log", + "neoforge.network.feature_flags.entry_mismatch": "Der Server und der Client verwenden unterschiedliche Sets an benutzerdefinierten FeatureFlags. Stelle sicher, dass du dieselbe Mod- sowie NeoForge-Version wie der Server verwendest. Sieh im Protokoll nach, um weitere Informationen zu erhalten", + "neoforge.network.feature_flags.no_vanilla_server": "Dieser Client unterstützt keine Vanilla-Server, da er benutzerdefinierte FeatureFlags verwendet", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/en_gb.json b/src/main/resources/assets/neoforge/lang/en_gb.json index 5b4cb3ca8c5..1b9d161c688 100644 --- a/src/main/resources/assets/neoforge/lang/en_gb.json +++ b/src/main/resources/assets/neoforge/lang/en_gb.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/eo_uy.json b/src/main/resources/assets/neoforge/lang/eo_uy.json index c496f43d10a..8a18fd04980 100644 --- a/src/main/resources/assets/neoforge/lang/eo_uy.json +++ b/src/main/resources/assets/neoforge/lang/eo_uy.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/es_es.json b/src/main/resources/assets/neoforge/lang/es_es.json index 44d34780d78..37b3c66477a 100644 --- a/src/main/resources/assets/neoforge/lang/es_es.json +++ b/src/main/resources/assets/neoforge/lang/es_es.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Vista simplificada", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Esta versión de NeoForge ha sido creada por un miembro de la comunidad y por lo tanto no es §c§lSOPORTADA§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Dimensiones actualmente registradas por tipo:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Configuración para %s de tipo %s encontrada en %s", "commands.config.noconfig": "Configuración para %s de tipo %s no encontrada", "neoforge.update.beta.1": "%sADVERTENCIA: %sVersión Beta de NeoForge", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Habilitar el pipeline de renderizado de bloques de NeoForge: corrige la iluminación de modelos personalizados.", "neoforge.configgui.fullBoundingBoxLadders": "Escaleras de caja de colisión completa", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "No se puede conectar al servidor ya que al servidor le faltan mapas de datos de registro obligatorios que están presentes en el cliente: %s", "neoforge.network.data_maps.missing_their": "No es posible conectarse al servidor ya que el servidor tiene mapas de datos de registro obligatorios que no están presentes en el cliente: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/et_ee.json b/src/main/resources/assets/neoforge/lang/et_ee.json index f598372b8ae..668cc732650 100644 --- a/src/main/resources/assets/neoforge/lang/et_ee.json +++ b/src/main/resources/assets/neoforge/lang/et_ee.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "See NeoForge versioon loodi kogukonnaliikme poolt ning on seega §c§lMITTETOETATUD§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Hetkel registreeritud dimensioonid tüübi alusel:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Seadistus %s jaoks tüübiga %s leiti asukohast %s", "commands.config.noconfig": "Seadistust %s jaoks tüübiga %s ei leitud", "neoforge.update.beta.1": "%sHOIATUS: %sNeoForge beeta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Luba Forge'i plokirenderduse ootejärjekord - parandab kohandatud mudelite valgustust.", "neoforge.configgui.fullBoundingBoxLadders": "Täieliku piirdekastiga redelid", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/fr_fr.json b/src/main/resources/assets/neoforge/lang/fr_fr.json index 0f3e17ab531..5272f653b0a 100644 --- a/src/main/resources/assets/neoforge/lang/fr_fr.json +++ b/src/main/resources/assets/neoforge/lang/fr_fr.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Ce build de NeoForge a été créé par un membre de la communauté et est donc §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Dimensions actuellement enregistrées par type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Configuration pour %s de type %s trouvée dans %s", "commands.config.noconfig": "La configuration pour %s du type %s est introuvable", "neoforge.update.beta.1": "%sATTENTION: %sNeoForge Bêta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Active la pipeline de rendu des blocs de NeoForge - corrige l'éclairage des modèles personnalisés.", "neoforge.configgui.fullBoundingBoxLadders": "Pleine Boîte de Collisions des Barrières", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Impossible de se connecter au serveur car il manque sur le client des mappages de données de registre : %s", "neoforge.network.data_maps.missing_their": "Impossible de se connecter au serveur car il a des mappages de données de registre obligatoires qui ne sont pas présents sur le client : %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/hu_hu.json b/src/main/resources/assets/neoforge/lang/hu_hu.json index 8e2f3f066b9..de706dc7395 100644 --- a/src/main/resources/assets/neoforge/lang/hu_hu.json +++ b/src/main/resources/assets/neoforge/lang/hu_hu.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/it_it.json b/src/main/resources/assets/neoforge/lang/it_it.json index d2bb100e957..ebd12f05db1 100644 --- a/src/main/resources/assets/neoforge/lang/it_it.json +++ b/src/main/resources/assets/neoforge/lang/it_it.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Questa build di NeoForge è stata creata da un membro della community ed è quindi §c§lNON SUPPORTATA§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Dimensioni attualmente registrate per tipo:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Configurazione per %s di tipo %s trovata in %s", "commands.config.noconfig": "Configurazione per %s di tipo %s non trovata", "neoforge.update.beta.1": "%sATTENZIONE: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Abilita la pipeline di rendering dei blocchi NeoForge - risolve l'illuminazione dei modelli personalizzati.", "neoforge.configgui.fullBoundingBoxLadders": "Scale Tutta la Bounding Box", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Impossibile connettersi al server in quanto manca un registro della mappa dati obbligatorio presente nel client: %s", "neoforge.network.data_maps.missing_their": "Impossibile connettersi al server in quanto presenta un registro della mappa dati obbligatorio assente nel client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/ja_jp.json b/src/main/resources/assets/neoforge/lang/ja_jp.json index 0d3bd7a2bbd..1cf2c54cbad 100644 --- a/src/main/resources/assets/neoforge/lang/ja_jp.json +++ b/src/main/resources/assets/neoforge/lang/ja_jp.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "%1$s個のModファイルのリソース", "fml.resources.moddata": "%1$s個のModファイルのデータ", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "このNeoForgeのビルドはコミュニティメンバーによって作成されたものであり、§c§lサポートされていません§r", "commands.neoforge.arguments.enum.invalid": "%2$sが見つかりましたが、列挙定数は%1$sのいずれかである必要があります", "commands.neoforge.dimensions.list": "現在登録されているディメンション(種類別):", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "%s(種類:%s)の設定が%sで見つかりました", "commands.config.noconfig": "%s(種類:%s)の設定が見つかりません", "neoforge.update.beta.1": "%s警告:%sNeoForge ベータ版", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "NeoForgeのブロックレンダリングパイプラインを有効にします。この機能は、カスタムモデルの光の修正を行います。", "neoforge.configgui.fullBoundingBoxLadders": "はしごの動作条件の変更", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "クライアントに存在する必須の登録データマップがサーバーにないため、サーバーに接続できませんでした:%s", "neoforge.network.data_maps.missing_their": "クライアントに存在しない必須のレジストリデータマップがサーバーにあるため、サーバーに接続できませんでした:%s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "クライアントとサーバーの拡張可能な列挙に追加された値のセットが一致しません。 サーバーと同じバージョンの mod と NeoForge を使用していることを確認してください。詳細はログを参照してください", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[エンティティ: %s | アイテム: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/ko_kr.json b/src/main/resources/assets/neoforge/lang/ko_kr.json index dce0d9ee2d3..89f0084024c 100644 --- a/src/main/resources/assets/neoforge/lang/ko_kr.json +++ b/src/main/resources/assets/neoforge/lang/ko_kr.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "간략하게 보기", "fml.resources.modresources": "모드 파일 %1$s개의 리소스", "fml.resources.moddata": "모드 파일 %1$s개의 데이터", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "이 네오 포지 빌드는 커뮤니티 멤버가 만든 것이며 §c§l공식 지원되지 않습니다§r", "commands.neoforge.arguments.enum.invalid": "잘못된 값입니다. [%1$s] 중 하나가 필요한데, '%2$s'가 입력되었습니다.", "commands.neoforge.dimensions.list": "현재 등록된 차원들:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "모드 %s의 설정 %s이(가) %s에서 발견됨", "commands.config.noconfig": "모드 %s의 설정 %s을(를) 찾을 수 없음", "neoforge.update.beta.1": "%s경고: %s 네오 포지 베타 버전입니다", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "네오 포지의 블록 렌더링 파이프라인을 사용해 모델의 조명 문제를 해결합니다.", "neoforge.configgui.fullBoundingBoxLadders": "사다리 히트박스 전체 검사", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "클라이언트에 필요한 데이터 맵들이 서버에 없어 접속할 수 없습니다: %s", "neoforge.network.data_maps.missing_their": "서버 접속에 필요한 데이터 맵들이 클라이언트에 없어 접속할 수 없습니다: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/ms_my.json b/src/main/resources/assets/neoforge/lang/ms_my.json index 4cd941ba93b..f3182c3a7b6 100644 --- a/src/main/resources/assets/neoforge/lang/ms_my.json +++ b/src/main/resources/assets/neoforge/lang/ms_my.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Komponen %s dengan nilai %s telah dipadamkan", "commands.neoforge.data_components.list.tooltip.modified": "Komponen %s telah diubah suai daripada %s kepada %s", "commands.neoforge.data_components.list.tooltip.added": "Komponen %s telah ditambah dengan nilai %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Tetapan pelayan", "neoforge.configgui.advertiseDedicatedServerToLan": "Iklankan Pelayan Khusus Kepada LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Tetapkan ini kepada true untuk membolehkan pengiklanan pelayan khusus kepada klien LAN tempatan supaya ia muncul dalam skrin Multipemain secara automatik.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "Talian Paip Cahaya NeoForge", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "Klien ini tidak menyokong pelayan vanila kerana ia mempunyai enum lanjutan yang digunakan dalam rangkaian terikat pelayan", - "neoforge.network.extensible_enums.enum_set_mismatch": "Set enum yang boleh diperluaskan pada klien dan pelayan tidak sepadan. Pastikan anda menggunakan versi NeoForge yang sama seperti pelayan", "neoforge.network.extensible_enums.enum_entry_mismatch": "Set nilai yang ditambahkan pada enum yang boleh diperluaskan pada klien dan pelayan tidak sepadan. Pastikan anda menggunakan mod dan versi NeoForge yang sama seperti pelayan. Lihat log untuk butiran lanjut", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/nl_nl.json b/src/main/resources/assets/neoforge/lang/nl_nl.json index fbbb6ff0c2a..7d5299e4531 100644 --- a/src/main/resources/assets/neoforge/lang/nl_nl.json +++ b/src/main/resources/assets/neoforge/lang/nl_nl.json @@ -10,41 +10,41 @@ "fml.menu.modoptions": "Mod Opties...", "fml.menu.mods.info.version": "Versie: %1$s", "fml.menu.mods.info.idstate": "ModID: %1$s Status: {1,lower}", - "fml.menu.mods.info.credits": "Credits: %1$s", - "fml.menu.mods.info.authors": "Authors: %1$s", - "fml.menu.mods.info.displayurl": "Homepage: %1$s", - "fml.menu.mods.info.license": "License: %1$s", + "fml.menu.mods.info.credits": "Vermeldingen: %1$s", + "fml.menu.mods.info.authors": "Auteurs: %1$s", + "fml.menu.mods.info.displayurl": "Startpagina: %1$s", + "fml.menu.mods.info.license": "Licentie: %1$s", "fml.menu.mods.info.securejardisabled": "Beveiligde mod functies uitgeschakeld, update JDK", - "fml.menu.mods.info.signature": "Signature: %1$s", + "fml.menu.mods.info.signature": "Handtekening: %1$s", "fml.menu.mods.info.signature.unsigned": "ONGETEKEND", - "fml.menu.mods.info.trust": "Trust: %1$s", + "fml.menu.mods.info.trust": "Vertrouw: %1$s", "fml.menu.mods.info.trust.noauthority": "Geen", "fml.menu.mods.info.nochildmods": "Geen onderliggende mods gevonden", - "fml.menu.mods.info.childmods": "Child mods: %1$s", - "fml.menu.mods.info.updateavailable": "Update available: %1$s", + "fml.menu.mods.info.childmods": "Onderliggende mods: %1$s", + "fml.menu.mods.info.updateavailable": "Update beschikbaar: %1$s", "fml.menu.mods.info.changelogheader": "Wijzigingen:", - "fml.menu.multiplayer.compatible": "Compatible FML modded server\n{0,choice,1#1 mod|1<%1$s mods} present", + "fml.menu.multiplayer.compatible": "Geschikte FML gemodificeerde server {0,choice,1#1 mod|1<%1$s mods} aanwezig", "fml.menu.multiplayer.incompatible": "Ongeschikte FML-gemodificeerde server", - "fml.menu.multiplayer.incompatible.extra": "Incompatible FML modded server\n%1$s", + "fml.menu.multiplayer.incompatible.extra": "Ongeschikte FML-gemodificeerde server %1$s", "fml.menu.multiplayer.truncated": "Gegevens kunnen onnauwkeurig zijn door protocol groottelimieten.", "fml.menu.multiplayer.vanilla": "Vanilla server", "fml.menu.multiplayer.vanilla.incompatible": "Ongeschikte Vanilla server", - "fml.menu.multiplayer.unknown": "Unknown server %1$s", + "fml.menu.multiplayer.unknown": "Onbekende server %1$s", "fml.menu.multiplayer.serveroutdated": "NeoForge servernetwerk versie is verouderd", "fml.menu.multiplayer.clientoutdated": "NeoForge client netwerk versie is verouderd", "fml.menu.multiplayer.extraservermods": "Server heeft extra mods die mogelijk nodig zijn bij de client", "fml.menu.multiplayer.modsincompatible": "Servermodlijst is niet geschikt", "fml.menu.multiplayer.networkincompatible": "Servernetwerk berichtenlijst is niet geschikt", - "fml.menu.multiplayer.missingdatapackregistries": "Missing required datapack registries: %1$s", + "fml.menu.multiplayer.missingdatapackregistries": "Ontbrekende vereiste gegevenspakketten registraties: %1$s", "fml.menu.branding": "%s (%s mods)", "fml.menu.notification.title": "Opstart Notificatie", "fml.menu.accessdenied.title": "Toegang tot server is geweigerd", - "fml.menu.accessdenied.message": "Fancy Mod Loader could not connect to this server\nThe server %1$s has forbidden modded access", + "fml.menu.accessdenied.message": "Fancy Mod Loader kon geen verbinding maken met deze server\nDe server %1$s heeft toegang tot modded verboden", "fml.menu.backupfailed.title": "Backup mislukt", - "fml.menu.backupfailed.message": "There was an error saving the archive %1$s\nPlease fix the problem and try again", + "fml.menu.backupfailed.message": "Er was een fout bij het opslaan van het archief %1$s \nLos a.u.b. het probleem op en probeer opnieuw", "fml.button.open.file": "Open %1$s", - "fml.button.open.log": "Open log file", - "fml.button.open.crashreport": "Open crash report", + "fml.button.open.log": "Logboekbestand openen", + "fml.button.open.crashreport": "Crashrapport openen", "fml.button.open.mods.folder": "Open Modsmap", "fml.button.continue.launch": "Doorgaan naar het hoofdmenu", "fml.modmismatchscreen.missingmods.client": "Jouw client mist de volgende mods, installeer deze mods om deel te nemen aan deze server:", @@ -54,33 +54,35 @@ "fml.modmismatchscreen.table.youneed": "Je hebt nodig", "fml.modmismatchscreen.table.youhave": "Je hebt", "fml.modmismatchscreen.table.serverhas": "Server heeft", - "fml.modmismatchscreen.additional": "[%1$s additional, see latest.log for the full list]", + "fml.modmismatchscreen.additional": "[%1$s extra, zie latest.log voor de volledige lijst]", "fml.modmismatchscreen.homepage": "Klik om naar de startpagina van deze mod te gaan", "fml.modmismatchscreen.table.reason": "Reden", "fml.modmismatchscreen.table.visit.mod_page": "Open de modpagina van de mod die dit kanaal registreert: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", - "fml.resources.modresources": "Resources for %1$s mod files", - "fml.resources.moddata": "Data for %1$s mod files", + "fml.modmismatchscreen.simplifiedview": "Vereenvoudigde weergave", + "fml.resources.modresources": "Bronnen voor %1$s mod bestanden", + "fml.resources.moddata": "Gegevens voor %1$s mod bestanden", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Deze build van NeoForge was gemaakt door een lid van de gemeenschap en wordt daarom §c§lNIET ONDERSTEUND§r", - "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", + "commands.neoforge.arguments.enum.invalid": "Enum constante moet van %1$s zijn, vond %2$s", "commands.neoforge.dimensions.list": "Momenteel geregistreerde dimensies op type:", - "commands.neoforge.dump.success": "New file created with %s registry's contents is at %s", - "commands.neoforge.dump.failure": "Failed to create new file with %s registry's contents at %s", + "commands.neoforge.dump.success": "Nieuw bestand gemaakt met %s register inhoud is in %s", + "commands.neoforge.dump.failure": "Aanmaken van nieuw bestand met %s register inhoud in %s mislukt", "commands.neoforge.dump.error.unknown_registry": "Onbekend register '%s'", "commands.neoforge.entity.list.invalid": "Ongeldig filter, komt niet overeen met enige entiteiten. Gebruik /neoforge entity list voor een juiste lijst", - "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", + "commands.neoforge.entity.list.invalidworld": "Kon de wereld niet laden voor dimensie %1$s. Selecteer a.u.b. een geldige dimensie.", "commands.neoforge.entity.list.none": "Geen entiteiten gevonden.", - "commands.neoforge.entity.list.single.header": "Entity: %1$s Total: %2$s", - "commands.neoforge.entity.list.multiple.header": "Total: %1$s", - "commands.neoforge.setdim.invalid.entity": "The entity selected (%1$s) is not valid.", - "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", - "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", + "commands.neoforge.entity.list.single.header": "Entiteit: %1$s Totaal: %2$s", + "commands.neoforge.entity.list.multiple.header": "Totaal: %1$s", + "commands.neoforge.setdim.invalid.entity": "Geselecteerde entiteit (%1$s) is niet geldig.", + "commands.neoforge.setdim.invalid.dim": "Het gespecificeerde dimensie-ID (%1$s) is niet geldig.", + "commands.neoforge.setdim.invalid.nochange": "De entiteit geselecteerd (%1$s) is al in de opgegeven dimensie (%2$s).", "commands.neoforge.setdim.deprecated": "Dit commando is afgeschreven voor verwijderd in 1.17, gebruik in plaats daarvan %s.", "commands.neoforge.tps.overall": "Overall: %s TPS (%s ms/tick)", "commands.neoforge.tps.tooltip": "Mean TPS; higher is better. Target TPS: %s", "commands.neoforge.tps.dimension": "%s: %s TPS (%s ms/tick)", "commands.neoforge.tps.dimension.tooltip": "%s (Dimension Type: %s)", - "commands.neoforge.mods.list": "Mod List: %1$s", + "commands.neoforge.mods.list": "Modlijst: %1$s", "commands.neoforge.tracking.entity.enabled": "Het volgen van Entiteiten is ingeschakeld voor %d seconden.", "commands.neoforge.tracking.entity.reset": "Entiteit timing data is gewist!", "commands.neoforge.tracking.invalid": "Ongeldige volggegevens.", @@ -101,12 +103,12 @@ "commands.neoforge.tags.element": "%s : %s", "commands.neoforge.tags.page_info": "%s ", "commands.neoforge.chunkgen.progress_bar_title": "Chunks genereren...", - "commands.neoforge.chunkgen.progress_bar_progress": "Generating %1$s chunks - ", - "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s errors!)", + "commands.neoforge.chunkgen.progress_bar_progress": "%1$s Chunks aan het genereren - ", + "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s fouten!)", "commands.neoforge.chunkgen.already_running": "Genereren is al actief. Voer eerst '/neoforge generate stop' uit en daarna kunt u het genereren opnieuw starten.", - "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", + "commands.neoforge.chunkgen.started": "%1$s chunks worden gegenereerd, in een gebied van %2$sx%3$s chunks (%4$sx%5$s blokken).", "commands.neoforge.chunkgen.success": "Genereren voltooid!", - "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", + "commands.neoforge.chunkgen.error": "Genereren had %1$s fouten! Bekijk het log voor meer informatie.", "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%%)", "commands.neoforge.chunkgen.status": "Generation status! %1$s out of %2$s chunks generated. (%3$s%%)", "commands.neoforge.chunkgen.not_running": "Geen pregeneratie is op dit moment bezig. Run `/neoforge generate help` om commandos te zijn om generatie te starten.", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Configuratie voor %s van type %s gevonden bij %s", "commands.config.noconfig": "Configuratie voor %s van type %s niet gevonden", "neoforge.update.beta.1": "%sWAARSCHUWING: %sNeoForge Beta", @@ -130,12 +133,12 @@ "neoforge.update.newversion": "Nieuwe versie van NeoForge beschikbaar: %s", "neoforge.menu.updatescreen.title": "Mod Update", "neoforge.configuration.uitext.title": "%s Configuration", - "neoforge.configuration.uitext.type.client": "Client Settings", - "neoforge.configuration.uitext.type.server": "Server Settings", - "neoforge.configuration.uitext.type.common": "Common settings", - "neoforge.configuration.uitext.type.startup": "Startup settings", - "neoforge.configuration.uitext.title.client": "%s Client Configuration", - "neoforge.configuration.uitext.title.server": "%s Server Configuration", + "neoforge.configuration.uitext.type.client": "Client Instellingen", + "neoforge.configuration.uitext.type.server": "Server Instellingen", + "neoforge.configuration.uitext.type.common": "Algemene instellingen", + "neoforge.configuration.uitext.type.startup": "Opstart instellingen", + "neoforge.configuration.uitext.title.client": "%s Client Configuratie", + "neoforge.configuration.uitext.title.server": "%s Server Configuratie", "neoforge.configuration.uitext.title.common": "%s Common Configuration", "neoforge.configuration.uitext.title.startup": "%s Startup Configuration", "neoforge.configuration.uitext.notonline": "Settings in here are determined by the server and cannot be changed while online.", @@ -144,39 +147,41 @@ "neoforge.configuration.uitext.unsupportedelement": "This value cannot be edited in the UI. Please contact the mod author about providing a custom UI for it.", "neoforge.configuration.uitext.longstring": "This value is too long to be edited in the UI. Please edit it in the config file.", "neoforge.configuration.uitext.section": "%s...", - "neoforge.configuration.uitext.sectiontext": "Edit", + "neoforge.configuration.uitext.sectiontext": "Bewerken", "neoforge.configuration.uitext.breadcrumb.order": "%1$s %2$s %3$s", "neoforge.configuration.uitext.breadcrumb.separator": ">", "neoforge.configuration.uitext.listelement": "%s:", - "neoforge.configuration.uitext.undo": "Undo", + "neoforge.configuration.uitext.undo": "Herstel", "neoforge.configuration.uitext.undo.tooltip": "Reverts changes on this screen only.", "neoforge.configuration.uitext.reset": "Reset", - "neoforge.configuration.uitext.reset.tooltip": "Reverts everything on this screen to its default value.", + "neoforge.configuration.uitext.reset.tooltip": "Draait alles op dit scherm terug naar zijn standaardwaarde.", "neoforge.configuration.uitext.newlistelement": "+", "neoforge.configuration.uitext.listelementup": "⏶", "neoforge.configuration.uitext.listelementdown": "⏷", "neoforge.configuration.uitext.listelementremove": "❌", - "neoforge.configuration.uitext.rangetooltip": "Range: %s", - "neoforge.configuration.uitext.filenametooltip": "File: \"%s\"", - "neoforge.configuration.uitext.common": "Common Options", - "neoforge.configuration.uitext.client": "Client Options", - "neoforge.configuration.uitext.server": "Server Options", - "neoforge.configuration.uitext.startup": "Startup Options", - "neoforge.configuration.uitext.restart.game.title": "Minecraft needs to be restarted", + "neoforge.configuration.uitext.rangetooltip": "Bereik: %s", + "neoforge.configuration.uitext.filenametooltip": "Bestand: \"%s\"", + "neoforge.configuration.uitext.common": "Algemene opties", + "neoforge.configuration.uitext.client": "Client Opties", + "neoforge.configuration.uitext.server": "Server Opties", + "neoforge.configuration.uitext.startup": "Opstart Opties", + "neoforge.configuration.uitext.restart.game.title": "Minecraft moet opnieuw worden gestart", "neoforge.configuration.uitext.restart.game.text": "One or more of the configuration option that were changed will only take effect when the game is started.", "neoforge.configuration.uitext.restart.server.title": "World needs to be reloaded", "neoforge.configuration.uitext.restart.server.text": "One or more of the configuration option that were changed will only take effect when the world is reloaded.", - "neoforge.configuration.uitext.restart.return": "Ignore", + "neoforge.configuration.uitext.restart.return": "Negeer", "neoforge.configuration.uitext.restart.return.tooltip": "Your changes will have no effect until you restart!", "neoforge.configuration.title": "NeoForge Configuration", - "neoforge.configuration.section.neoforge.client.toml": "Client settings", - "neoforge.configuration.section.neoforge.client.toml.title": "Client settings", - "neoforge.configuration.section.neoforge.common.toml": "Common settings", - "neoforge.configuration.section.neoforge.common.toml.title": "Common settings", - "neoforge.configuration.section.neoforge.server.toml": "Server settings", - "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", + "neoforge.configuration.section.neoforge.client.toml": "Client instellingen", + "neoforge.configuration.section.neoforge.client.toml.title": "Client instellingen", + "neoforge.configuration.section.neoforge.common.toml": "Algemene instellingen", + "neoforge.configuration.section.neoforge.common.toml.title": "Algemene instellingen", + "neoforge.configuration.section.neoforge.server.toml": "Server instellingen", + "neoforge.configuration.section.neoforge.server.toml.title": "Server instellingen", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Schakel de NeoForge blok rendering pijplijn in - fixt verlichting bij aangepaste modellen.", "neoforge.configgui.fullBoundingBoxLadders": "Volledig Omgrensde Doos Ladders", @@ -217,8 +222,8 @@ "neoforge.selectWorld.backupWarning.experimental.additional": "Deze boodschap zal niet nog een keer zichtbaar zijn voor deze wereld.", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resourcepakket", - "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", + "pack.neoforge.source.child": "subdocument", + "neoforge.network.negotiation.failure.mod": "Kanaal van mod \"%1$s\" kon niet verbinden: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Dit kanaal ontbreekt aan de serverzijde, maar is voor de cliënt vereist!", "neoforge.network.negotiation.failure.missing.server.client": "Dit kanaal ontbreekt aan de cliëntzijde, maar is voor de server vereist!", "neoforge.network.negotiation.failure.flow.client.missing": "De cliënt wilt dat de payload stroomt: %s, maar de server ondersteunt dit niet!", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Kan geen verbinding maken met de server omdat het verplichte registry data maps mist die aanwezig zijn op de client: %s", "neoforge.network.data_maps.missing_their": "Kan geen verbinding maken met de server omdat het verplichte registry data maps bevat die niet aanwezig zijn op de client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/pl_pl.json b/src/main/resources/assets/neoforge/lang/pl_pl.json index 79b0616df12..0921dad01d9 100644 --- a/src/main/resources/assets/neoforge/lang/pl_pl.json +++ b/src/main/resources/assets/neoforge/lang/pl_pl.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Widok uproszczony", "fml.resources.modresources": "Zasoby dla plików modyfikacji %1$s", "fml.resources.moddata": "Dane dla %1$s plików modyfikacji", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Ta kompilacja NeoForge została stworzona przez członka społeczności i jest §c§lNIEWSPIERANA§r", "commands.neoforge.arguments.enum.invalid": "Stała Enum musi być jednym z %1$s, znaleziono %2$s", "commands.neoforge.dimensions.list": "Aktualnie zarejestrowane wymiary według typu:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Komponent %s o wartości %s został usunięty", "commands.neoforge.data_components.list.tooltip.modified": "Komponent %s został zmodyfikowany z %s na %s", "commands.neoforge.data_components.list.tooltip.added": "Komponent %s został dodany z wartością %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Opcje dla %s typu %s znaleziona w %s", "commands.config.noconfig": "Opcje dla %s typu %s nie została znaleziona", "neoforge.update.beta.1": "%sUWAGA: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Ustawienia Serwera", "neoforge.configgui.advertiseDedicatedServerToLan": "Reklamuj dedykowany serwer do sieci LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Ustaw to na true, aby włączyć reklamę serwera dedykowanego do lokalnych klientów sieci LAN, tak aby pojawiał się automatycznie na ekranie wieloosobowym.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Zmień wartość tej zmiennej na \"true\", aby aktywować dodatkowe informacje o atrybutach przedmiotów, gdy włączona jest opcja \"advanced tooltips\" (F3+h).", "neoforge.configgui.forgeLightPipelineEnabled": "Lekki Rurociąg NeoForge", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Włącz proces renderowania bloków NeoForge - poprawia oświetlenie modeli niestandardowych.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Nie można połączyć się z serwerem, ponieważ brakuje obowiązkowych map danych rejestru znajdujących się w kliencie: %s", "neoforge.network.data_maps.missing_their": "Nie można połączyć się z serwerem, ponieważ brakuje obowiązkowych map danych rejestru znajdujących się w kliencie: %s", "neoforge.network.extensible_enums.no_vanilla_server": "Ten klient nie obsługuje serwerów vanilla ponieważ posiada rozszerzone enums używane w sieciach związanych z serwerem", - "neoforge.network.extensible_enums.enum_set_mismatch": "Zestaw rozszerzalnych enumerów na kliencie i serwerze nie pasuje. Upewnij się, że używasz tej samej wersji NeoForge co serwer", "neoforge.network.extensible_enums.enum_entry_mismatch": "Zestaw wartości dodanych do rozszerzalnych enumów w kliencie i serwerze nie pasuje. Upewnij się, że używasz tych samych wersji modyfikacji i NeoForge co serwer. Więcej informacji znajdziesz w logu", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/pt_br.json b/src/main/resources/assets/neoforge/lang/pt_br.json index e7f9fc47a4e..2b9d5e09570 100644 --- a/src/main/resources/assets/neoforge/lang/pt_br.json +++ b/src/main/resources/assets/neoforge/lang/pt_br.json @@ -1,7 +1,7 @@ { "fml.menu.mods": "Mods", "fml.menu.mods.title": "Mods", - "fml.menu.mods.normal": "Off", + "fml.menu.mods.normal": "Desligado", "fml.menu.mods.search": "Buscar", "fml.menu.mods.a_to_z": "A-Z", "fml.menu.mods.z_to_a": "Z-A", @@ -11,56 +11,58 @@ "fml.menu.mods.info.version": "Versão: %1$s", "fml.menu.mods.info.idstate": "ModID: %1$s Estado: {1,lower}", "fml.menu.mods.info.credits": "Créditos: %1$s", - "fml.menu.mods.info.authors": "Criadores: %1$s", - "fml.menu.mods.info.displayurl": "Homepage: %1$s", + "fml.menu.mods.info.authors": "Autores: %1$s", + "fml.menu.mods.info.displayurl": "Pagina Inicial: %1$s", "fml.menu.mods.info.license": "Licença: %1$s", "fml.menu.mods.info.securejardisabled": "Funcionalidades de mod seguro desativados, atualize o JDK", "fml.menu.mods.info.signature": "Assinatura: %1$s", "fml.menu.mods.info.signature.unsigned": "NÃO ASSINADO", "fml.menu.mods.info.trust": "Confiança: %1$s", "fml.menu.mods.info.trust.noauthority": "Nenhum", - "fml.menu.mods.info.nochildmods": "Sem mods dependentes", - "fml.menu.mods.info.childmods": "Mods dependentes: %1$s", + "fml.menu.mods.info.nochildmods": "Nenhum mod filho encontrado", + "fml.menu.mods.info.childmods": "Mods filhos: %1$s", "fml.menu.mods.info.updateavailable": "Atualização disponível: %1$s", - "fml.menu.mods.info.changelogheader": "Changelog:", + "fml.menu.mods.info.changelogheader": "Registo de alterações:", "fml.menu.multiplayer.compatible": "Servidor com mods FML compatível\nPossui {0,choice,1#1 mod|1<%1$s mods}", "fml.menu.multiplayer.incompatible": "Servidor com mods FML incompatível", "fml.menu.multiplayer.incompatible.extra": "Incompatible FML modded server\n%1$s", - "fml.menu.multiplayer.truncated": "Dados podem estar imprecisos devido ao limites de tamanho do protocolo.", + "fml.menu.multiplayer.truncated": "Dados podem estar imprecisos devido a limites de tamanho do protocolo.", "fml.menu.multiplayer.vanilla": "Servidor Vanilla", "fml.menu.multiplayer.vanilla.incompatible": "Servidor Vanilla incompatível", "fml.menu.multiplayer.unknown": "Servidor desconhecido %1$s", - "fml.menu.multiplayer.serveroutdated": "Versão do NeoForge server network desatualizado", + "fml.menu.multiplayer.serveroutdated": "Rede de servidores NeoForge esta desatualizada", "fml.menu.multiplayer.clientoutdated": "Versão do NeoForge client network desatualizado", - "fml.menu.multiplayer.extraservermods": "Servidor tem mods que podem ser necessários no client", - "fml.menu.multiplayer.modsincompatible": "List de mods do servidor incompatível", - "fml.menu.multiplayer.networkincompatible": "Lista de network message do servidor incompatível", - "fml.menu.multiplayer.missingdatapackregistries": "Falta registros de datapacks obrigatórios: %1$s", + "fml.menu.multiplayer.extraservermods": "Servidor tem mods adicionais que podem ser necessários no client", + "fml.menu.multiplayer.modsincompatible": "Lista de mods do servidor não e compatível", + "fml.menu.multiplayer.networkincompatible": "Rede de lista de mensagens do servidor não é compatível", + "fml.menu.multiplayer.missingdatapackregistries": "Faltam registros de datapacks obrigatórios: %1$s", "fml.menu.branding": "%s (%s mods)", - "fml.menu.notification.title": "Notificação de Início", - "fml.menu.accessdenied.title": "Accesso ao Servidor Negado", - "fml.menu.accessdenied.message": "Fancy Mod Loader não pôde ser conectado a esse servidor\nO servidor %1$s tem mods com acesso proibido", + "fml.menu.notification.title": "Notificação de Inicialização", + "fml.menu.accessdenied.title": "Acesso ao Servidor Negado", + "fml.menu.accessdenied.message": "Fancy Mod Loader não pôde ser conectado a esse servidor\nO servidor %1$s proibiu acesso com mods", "fml.menu.backupfailed.title": "Backup Falhou", - "fml.menu.backupfailed.message": "Houve um erro ao salvar o arquivo %1$s\nPor favor, corriga o problema e tente novamente", - "fml.button.open.file": "Abra %1$s", + "fml.menu.backupfailed.message": "Houve um erro ao salvar o arquivo %1$s\nPor favor, corrija o problema e tente novamente", + "fml.button.open.file": "Abrir %1$s", "fml.button.open.log": "Abrir arquivo de log", "fml.button.open.crashreport": "Abrir relatório de crash", "fml.button.open.mods.folder": "Abrir Pasta de Mods", "fml.button.continue.launch": "Prosseguir ao menu principal", - "fml.modmismatchscreen.missingmods.client": "Seu client não tem os seguintes mods, instale esses mods para entrar no servidor:", - "fml.modmismatchscreen.missingmods.server": "O servidor não tem os seguintes mods, remova esses mods do seu client para entrar no servidor:", + "fml.modmismatchscreen.missingmods.client": "Seu cliente não possui os seguintes mods, instale esses mods para entrar neste servidor:", + "fml.modmismatchscreen.missingmods.server": "O servidor não tem os seguintes mods, remova esses mods do seu cliente para entrar no servidor:", "fml.modmismatchscreen.mismatchedmods": "Os seguintes mods são incompatíveis, instale a mesma versão desses mods que estão no servidor para poder entrar:", "fml.modmismatchscreen.table.channelname": "Nome do canal", "fml.modmismatchscreen.table.youneed": "Você precisa", "fml.modmismatchscreen.table.youhave": "Você tem", "fml.modmismatchscreen.table.serverhas": "Servidor tem", "fml.modmismatchscreen.additional": "[%1$s adicional, veja latest.log para lista completa]", - "fml.modmismatchscreen.homepage": "Clique para ir ao homepage desse mod", + "fml.modmismatchscreen.homepage": "Clique para ir à página inicial deste mod", "fml.modmismatchscreen.table.reason": "Motivo", "fml.modmismatchscreen.table.visit.mod_page": "Abrir a página do mod que registra o canal: %s", - "fml.modmismatchscreen.simplifiedview": "Tela simplificada", + "fml.modmismatchscreen.simplifiedview": "Visão simplificada", "fml.resources.modresources": "Recursos para %1$s arquivos de mods", "fml.resources.moddata": "Dado para %1$s arquivos de mods", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Esse build do NeoForge foi criado por um membro da comunidade, logo, §c§lNÃO É SUPORTADA§r", "commands.neoforge.arguments.enum.invalid": "Constante enum deve ser um dos %1$s, encontrado %2$s", "commands.neoforge.dimensions.list": "Dimensões atualmente registradas por tipo:", @@ -68,18 +70,18 @@ "commands.neoforge.dump.failure": "Failed to create new file with %s registry's contents at %s", "commands.neoforge.dump.error.unknown_registry": "Registro '%s' desconhecido", "commands.neoforge.entity.list.invalid": "Invalid filter, does not match any entities. Use /neoforge entity list for a proper list", - "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", + "commands.neoforge.entity.list.invalidworld": "Não foi possível carregar o mundo para a dimensão %1$s. Por favor, selecione uma dimensão válida.", "commands.neoforge.entity.list.none": "Nenhuma entidade encontrada.", "commands.neoforge.entity.list.single.header": "Entidade: %1$s Total: %2$s", "commands.neoforge.entity.list.multiple.header": "Total: %1$s", "commands.neoforge.setdim.invalid.entity": "A entidade selecionada (%1$s) não é válida.", - "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", - "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", - "commands.neoforge.setdim.deprecated": "This command is deprecated for removal in 1.17, use %s instead.", + "commands.neoforge.setdim.invalid.dim": "O ID de dimensão especificado (%1$s) não e valido", + "commands.neoforge.setdim.invalid.nochange": "A entidade selecionada (%1$s) já esta na dimensão especificada (%2$s).", + "commands.neoforge.setdim.deprecated": "Este comando esta obsoleto para remoção em 1.17, use %s como substituto.", "commands.neoforge.tps.overall": "Overall: %s TPS (%s ms/tick)", - "commands.neoforge.tps.tooltip": "Mean TPS; higher is better. Target TPS: %s", + "commands.neoforge.tps.tooltip": "TPS médio, maior é melhor. TPS Alvo: %s", "commands.neoforge.tps.dimension": "%s: %s TPS (%s ms/tick)", - "commands.neoforge.tps.dimension.tooltip": "%s (Dimension Type: %s)", + "commands.neoforge.tps.dimension.tooltip": "%s (Tipo de Dimensão: %s)", "commands.neoforge.mods.list": "Mod List: %1$s", "commands.neoforge.tracking.entity.enabled": "Entity tracking enabled for %d seconds.", "commands.neoforge.tracking.entity.reset": "Entity timings data has been cleared!", @@ -107,8 +109,8 @@ "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", "commands.neoforge.chunkgen.success": "Generation Done!", "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", - "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%%)", - "commands.neoforge.chunkgen.status": "Generation status! %1$s out of %2$s chunks generated. (%3$s%%)", + "commands.neoforge.chunkgen.stopped": "Geração interrompida! %1$s de %2$s chunks gerados. (%3$s%%)", + "commands.neoforge.chunkgen.status": "Estado de geração! %1$s de %2$s chunks gerados. (%3$s%%)", "commands.neoforge.chunkgen.not_running": "No pregeneration currently running. Run `/neoforge generate help` to see commands for starting generation.", "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [progressBar] §r§f- Generates a square centered on the given position that is chunkRadius * 2 on each side.\n§2/neoforge generate stop §r§f- Stops the current generation and displays progress that it had completed.\n§2/neoforge generate status §r- Displays the progress completed for the currently running generation.\n§2/neoforge generate help §r- Displays this message.\nGeneral tips: If running from a server console, you can run generate in different dimensions by using /execute in neoforge generate...", "commands.neoforge.timespeed.query": "Time in %s flows at a rate of %sx (%s minutes per day).", @@ -117,28 +119,29 @@ "commands.neoforge.timespeed.set.default": "Set flow of time in %s to default (20 minutes per day).", "commands.neoforge.data_components.list.error.held_stack_empty": "You are not holding any item", "commands.neoforge.data_components.list.title": "Data components on %s:", - "commands.neoforge.data_components.list.entry": "\n - %s", + "commands.neoforge.data_components.list.entry": " - %s", "commands.neoforge.data_components.list.entry.key_value": "%s: %s", - "commands.neoforge.data_components.list.tooltip.default": "Component %s holds its default value", - "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", - "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", - "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.data_components.list.tooltip.default": "Componente %s possui seu valor padrão", + "commands.neoforge.data_components.list.tooltip.deleted": "Componente %s com valor %s foi excluído", + "commands.neoforge.data_components.list.tooltip.modified": "O componente %s foi modificado de %s para %s", + "commands.neoforge.data_components.list.tooltip.added": "Componente %s foi adicionado com valor %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Não é possível pesquisar por receita em comandos do cliente", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", "neoforge.update.beta.2": "Major issues may arise, verify before reporting.", "neoforge.update.newversion": "New NeoForge version available: %s", "neoforge.menu.updatescreen.title": "Mod Update", - "neoforge.configuration.uitext.title": "%s Configuration", - "neoforge.configuration.uitext.type.client": "Client Settings", - "neoforge.configuration.uitext.type.server": "Server Settings", - "neoforge.configuration.uitext.type.common": "Common settings", - "neoforge.configuration.uitext.type.startup": "Startup settings", + "neoforge.configuration.uitext.title": "Configuração do %s", + "neoforge.configuration.uitext.type.client": "Configurações do Cliente", + "neoforge.configuration.uitext.type.server": "Configurações do Servidor", + "neoforge.configuration.uitext.type.common": "Configurações Comuns", + "neoforge.configuration.uitext.type.startup": "Configurações de Inicialização", "neoforge.configuration.uitext.title.client": "%s Client Configuration", "neoforge.configuration.uitext.title.server": "%s Server Configuration", "neoforge.configuration.uitext.title.common": "%s Common Configuration", "neoforge.configuration.uitext.title.startup": "%s Startup Configuration", - "neoforge.configuration.uitext.notonline": "Settings in here are determined by the server and cannot be changed while online.", + "neoforge.configuration.uitext.notonline": "As configurações aqui são determinadas pelo servidor e não podem ser alteradas online.", "neoforge.configuration.uitext.notlan": "Settings in here cannot be edited while your game is open to LAN. Please return to the main menu and load the world again.", "neoforge.configuration.uitext.notloaded": "Settings in here are only available while a world is loaded.", "neoforge.configuration.uitext.unsupportedelement": "This value cannot be edited in the UI. Please contact the mod author about providing a custom UI for it.", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -214,13 +219,13 @@ "neoforge.froge.supportWarning": "WARNING: Froge is not supported by NeoForge", "neoforge.gui.exit": "Exit", "neoforge.experimentalsettings.tooltip": "This world uses experimental settings, which could stop working at any time.", - "neoforge.selectWorld.backupWarning.experimental.additional": "This message will not show again for this world.", + "neoforge.selectWorld.backupWarning.experimental.additional": "Esta mensagem não aparecerá novamente para este mundo.", "neoforge.chatType.system": "%1$s", - "pack.neoforge.description": "NeoForge data/resource pack", - "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", - "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", - "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", + "pack.neoforge.description": "Pacote de recursos/data NeoForge", + "pack.neoforge.source.child": "filho", + "neoforge.network.negotiation.failure.mod": "O canal do mod \"%1$s\" falhou em conectar: %2$s", + "neoforge.network.negotiation.failure.missing.client.server": "Este canal está faltando no lado do servidor, mas é necessário no cliente!", + "neoforge.network.negotiation.failure.missing.server.client": "Este canal está faltando no lado do cliente, mas é necessário no servidor!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", "neoforge.network.negotiation.failure.flow.server.missing": "The server wants the payload to flow: %s, but the client does not support it!", "neoforge.network.negotiation.failure.flow.client.mismatch": "The client wants the payload to flow: %s, but the server wants it to flow: %s!", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Impossível conectar com o servidor que falta registros de data maps obrigatórios presentes no client: %s", "neoforge.network.data_maps.missing_their": "Impossível conectar com o servidor que tem registros de data maps não presentes no client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/pt_pt.json b/src/main/resources/assets/neoforge/lang/pt_pt.json index 0507d99d2a5..c35936cbf26 100644 --- a/src/main/resources/assets/neoforge/lang/pt_pt.json +++ b/src/main/resources/assets/neoforge/lang/pt_pt.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/ro_ro.json b/src/main/resources/assets/neoforge/lang/ro_ro.json index d6c7e822fc2..57fe2c51760 100644 --- a/src/main/resources/assets/neoforge/lang/ro_ro.json +++ b/src/main/resources/assets/neoforge/lang/ro_ro.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/ru_ru.json b/src/main/resources/assets/neoforge/lang/ru_ru.json index 30467a05b02..994c3cbba2e 100644 --- a/src/main/resources/assets/neoforge/lang/ru_ru.json +++ b/src/main/resources/assets/neoforge/lang/ru_ru.json @@ -9,138 +9,141 @@ "fml.menu.mods.openmodsfolder": "Папка с модами", "fml.menu.modoptions": "Настройки мода", "fml.menu.mods.info.version": "Версия: %1$s", - "fml.menu.mods.info.idstate": "Идентификатор мода: %1$s; Состояние: {1,lower}", + "fml.menu.mods.info.idstate": "Идентификатор мода: %1$s\nСостояние: {1,lower}", "fml.menu.mods.info.credits": "Способствовали разработке: {0}", "fml.menu.mods.info.authors": "Авторы: %1$s", - "fml.menu.mods.info.displayurl": "Главная страница: %1$s", + "fml.menu.mods.info.displayurl": "Страница: %1$s", "fml.menu.mods.info.license": "Лицензия: %1$s", - "fml.menu.mods.info.securejardisabled": "Функции безопасности модов отключены, обновите JDK", + "fml.menu.mods.info.securejardisabled": "Функции безопасности модов отключены. Обновите JDK.", "fml.menu.mods.info.signature": "Подпись: %1$s", "fml.menu.mods.info.signature.unsigned": "НЕПОДПИСАН", - "fml.menu.mods.info.trust": "Доверять: %1$s", - "fml.menu.mods.info.trust.noauthority": "Нет", - "fml.menu.mods.info.nochildmods": "Дочерних модов не имеет", + "fml.menu.mods.info.trust": "Доверие: %1$s", + "fml.menu.mods.info.trust.noauthority": "Отсутствует", + "fml.menu.mods.info.nochildmods": "Не имеет дочерних модов", "fml.menu.mods.info.childmods": "Дочерние моды: %1$s", "fml.menu.mods.info.updateavailable": "Вышло обновление: %1$s", "fml.menu.mods.info.changelogheader": "Список изменений:", - "fml.menu.multiplayer.compatible": "Совместимый модифицированный сервер на Forge\nпредставлено {0,choice,1#1 mod|1<%1$s модов}", + "fml.menu.multiplayer.compatible": "Совместимый модифицированный сервер на Forge\n{0,choice,1#установлен 1 мод|1<установлено %1$s модов}", "fml.menu.multiplayer.incompatible": "Несовместимый сервер на Forge", "fml.menu.multiplayer.incompatible.extra": "Несовместимый модифицированный сервер на Forge\n%1$s", - "fml.menu.multiplayer.truncated": "Возможны неточности данных из-за ограничений размера протокола.", + "fml.menu.multiplayer.truncated": "Данные могут быть неточны из-за ограничения размера протокола.", "fml.menu.multiplayer.vanilla": "Ванильный сервер", "fml.menu.multiplayer.vanilla.incompatible": "Несовместимый ванильный сервер", "fml.menu.multiplayer.unknown": "Неизвестный сервер %1$s", - "fml.menu.multiplayer.serveroutdated": "Сетевая версия сервера NeoForge устарела", - "fml.menu.multiplayer.clientoutdated": "Сетевая версия клиента NeoForge устарела", + "fml.menu.multiplayer.serveroutdated": "Версия сети сервера NeoForge устарела", + "fml.menu.multiplayer.clientoutdated": "Версия сети клиента NeoForge устарела", "fml.menu.multiplayer.extraservermods": "На сервере установлены дополнительные моды, которые могут потребоваться на клиенте", "fml.menu.multiplayer.modsincompatible": "Список модов сервера несовместим", "fml.menu.multiplayer.networkincompatible": "Список сетевых сообщений сервера несовместим", - "fml.menu.multiplayer.missingdatapackregistries": "Missing required datapack registries: %1$s", - "fml.menu.branding": "%s (%s модов)", + "fml.menu.multiplayer.missingdatapackregistries": "Отсутствуют необходимые регистры наборов данных: %1$s", + "fml.menu.branding": "%s (%s мод.)", "fml.menu.notification.title": "Уведомление при запуске игры", "fml.menu.accessdenied.title": "Отказано в доступе к серверу", - "fml.menu.accessdenied.message": "Fancy Mod Loader could not connect to this server\nThe server %1$s has forbidden modded access", + "fml.menu.accessdenied.message": "Fancy Mod Loader не смог подключиться к этому серверу \nНа сервер %1$s запрещен доступ с модами", "fml.menu.backupfailed.title": "Резервное копирование не удалось", - "fml.menu.backupfailed.message": "There was an error saving the archive %1$s\nPlease fix the problem and try again", + "fml.menu.backupfailed.message": "Произошла ошибка при сохранении архива %1$s\nПожалуйста, исправьте проблему и попробуйте снова", "fml.button.open.file": "Открыть %1$s", "fml.button.open.log": "Открыть файл журнала", "fml.button.open.crashreport": "Открыть отчёт об ошибке", "fml.button.open.mods.folder": "Папка с модами", "fml.button.continue.launch": "Перейти в главное меню", - "fml.modmismatchscreen.missingmods.client": "Ваш клиент не содержит следующих модов, установите их, чтобы присоединиться к серверу:", - "fml.modmismatchscreen.missingmods.server": "На сервере отсутствуют следующие моды, удалите их из вашего клиента, чтобы присоединиться к серверу:", - "fml.modmismatchscreen.mismatchedmods": "Версии следующих модов не совпадают, установите те же версии, что и на сервере:", + "fml.modmismatchscreen.missingmods.client": "На вашем клиенте нет этих модов. Установите их, чтобы присоединиться к серверу:", + "fml.modmismatchscreen.missingmods.server": "На сервере нет этих модов. Удалите их из клиента, чтобы присоединиться к серверу:", + "fml.modmismatchscreen.mismatchedmods": "Версии этих модов не совпадают. Установите такие же версии, как на сервере, чтобы присоединиться:", "fml.modmismatchscreen.table.channelname": "Название канала", "fml.modmismatchscreen.table.youneed": "Вам нужно", "fml.modmismatchscreen.table.youhave": "У вас", "fml.modmismatchscreen.table.serverhas": "На сервере", - "fml.modmismatchscreen.additional": "[%1$s additional, see latest.log for the full list]", - "fml.modmismatchscreen.homepage": "Нажмите, чтобы перейти на главную страницу этого мода", + "fml.modmismatchscreen.additional": "[%1$s дополнительно, полный список смотрите в latest.log]", + "fml.modmismatchscreen.homepage": "Нажмите, чтобы перейти на страницу мода", "fml.modmismatchscreen.table.reason": "Причина", "fml.modmismatchscreen.table.visit.mod_page": "Откройте страницу мода, который регистрирует канал: %s", "fml.modmismatchscreen.simplifiedview": "Упрощённый вид", "fml.resources.modresources": "Ресурсы %1$s файлов модов", "fml.resources.moddata": "Данные %1$s файлов модов", - "loadwarning.neoforge.prbuild": "Эта версия NeoForge была создана участником сообщества и поэтому §c§lНЕ ПОДДЕРЖИВАЕТСЯ§r", - "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", - "commands.neoforge.dimensions.list": "Зарегистрированные измерения по типу:", - "commands.neoforge.dump.success": "Новый файл с содержимым реестра %s создан в %s", - "commands.neoforge.dump.failure": "Не удалось создать новый файл с содержимым реестра %s в %s", - "commands.neoforge.dump.error.unknown_registry": "Неизвестный реестр '%s'", - "commands.neoforge.entity.list.invalid": "Неверный фильтр, не соответствует ни одной сущности. Используйте /neoforge entity list для корректного списка", - "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", + "fml.modloadingissue.feature_flags.file_not_found": "Файл FeatureFlag {0}, предоставленный модом {100,modinfo,id}, не существует", + "fml.modloadingissue.feature_flags.loading_error": "Не удалось загрузить данные FeatureFlag по адресу {0} в мод {100,modinfo,id}: {102,exc,msg}", + "loadwarning.neoforge.prbuild": "Эта сборка NeoForge была создана участником сообщества и, следовательно, §c§lНЕ ИМЕЕТ ОФИЦИАЛЬНОЙ ПОДДЕРЖКИ§r", + "commands.neoforge.arguments.enum.invalid": "Константа перечисления должна быть одной из %1$s. Найдено: %2$s.", + "commands.neoforge.dimensions.list": "Текущие зарегистрированные измерения по типу:", + "commands.neoforge.dump.success": "Новый файл с содержимым регистра %s создан по пути %s", + "commands.neoforge.dump.failure": "Не удалось создать новый файл с содержимым регистра %s по пути %s", + "commands.neoforge.dump.error.unknown_registry": "Неизвестный регистр «%s»", + "commands.neoforge.entity.list.invalid": "Неправильный фильтр, не соответствует ни единой сущности. Введите «/neoforge entity list», чтобы получить верный список.", + "commands.neoforge.entity.list.invalidworld": "Не удалось загрузить мир для измерения %1$s. Пожалуйста, выберите правильное измерение.", "commands.neoforge.entity.list.none": "Сущности не найдены.", - "commands.neoforge.entity.list.single.header": "Сущность: %1$s; Всего: %2$s", - "commands.neoforge.entity.list.multiple.header": "Всего: %1$s", - "commands.neoforge.setdim.invalid.entity": "The entity selected (%1$s) is not valid.", - "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", - "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", - "commands.neoforge.setdim.deprecated": "Эта команда устарела и помечена для удаления начиная с 1.17, вместо нее используйте %s.", - "commands.neoforge.tps.overall": "Overall: %s TPS (%s ms/tick)", - "commands.neoforge.tps.tooltip": "Mean TPS; higher is better. Target TPS: %s", - "commands.neoforge.tps.dimension": "%s: %s TPS (%s ms/tick)", - "commands.neoforge.tps.dimension.tooltip": "%s (Тип измерения: %s)", + "commands.neoforge.entity.list.single.header": "Сущность: %1$s, всего: %2$s.", + "commands.neoforge.entity.list.multiple.header": "Всего: %1$s.", + "commands.neoforge.setdim.invalid.entity": "Выбранная сущность (%1$s) недопустима.", + "commands.neoforge.setdim.invalid.dim": "Указанный ID измерения (%1$s) недопустим.", + "commands.neoforge.setdim.invalid.nochange": "Выбранная сущность (%1$s) уже находится в указанном измерении (%2$s).", + "commands.neoforge.setdim.deprecated": "Эта команда устарела и будет удалена в 1.17. Используйте %s вместо неё.", + "commands.neoforge.tps.overall": "В общей сложности: %s тактов/сек (%s мс/такт)", + "commands.neoforge.tps.tooltip": "Среднее количество тактов/сек (чем выше, тем лучше). Целевое количество: %s.", + "commands.neoforge.tps.dimension": "%s: %s тактов/сек (%s мс/такт)", + "commands.neoforge.tps.dimension.tooltip": "%s (тип измерения: %s)", "commands.neoforge.mods.list": "Список модов: %1$s", "commands.neoforge.tracking.entity.enabled": "Отслеживание сущностей включено на %d секунд.", "commands.neoforge.tracking.entity.reset": "Данные с таймингами сущностей очищены!", - "commands.neoforge.tracking.invalid": "Неверные данные отслеживания.", + "commands.neoforge.tracking.invalid": "Предоставлены неправильные данные для отслеживания.", "commands.neoforge.tracking.be.enabled": "Отслеживание блочных сущностей включено на %d секунд.", "commands.neoforge.tracking.be.reset": "Данные с таймингами блочных сущностей очищены!", "commands.neoforge.tracking.timing_entry": "%1$s - %2$s [%3$s, %4$s, %5$s]: %6$s", "commands.neoforge.tracking.no_data": "Данные ещё не записаны.", - "commands.neoforge.tags.error.unknown_registry": "Неизвестный реестр '%s'", - "commands.neoforge.tags.error.unknown_tag": "Неизвестный тег '%s' в реестре '%s'", - "commands.neoforge.tags.error.unknown_element": "Неизвестный элемент '%s' в реестре '%s'", + "commands.neoforge.tags.error.unknown_registry": "Неизвестный регистр «%s»", + "commands.neoforge.tags.error.unknown_tag": "Неизвестный тег «%s» в регистре «%s»", + "commands.neoforge.tags.error.unknown_element": "Неизвестный элемент «%s» в регистре «%s»", "commands.neoforge.tags.registry_key": "%s", "commands.neoforge.tags.tag_count": "Теги: %s", "commands.neoforge.tags.copy_tag_names": "Нажмите, чтобы скопировать все имена тегов в буфер обмена", "commands.neoforge.tags.element_count": "Элементы: %s", "commands.neoforge.tags.copy_element_names": "Нажмите, чтобы скопировать все названия элементов в буфер обмена", - "commands.neoforge.tags.tag_key": "%s / %s", + "commands.neoforge.tags.tag_key": "%s/%s", "commands.neoforge.tags.containing_tag_count": "Содержит теги: %s", - "commands.neoforge.tags.element": "%s : %s", - "commands.neoforge.tags.page_info": "%s <стр %s / %s>", + "commands.neoforge.tags.element": "%s: %s", + "commands.neoforge.tags.page_info": "%s <стр. %s/%s>", "commands.neoforge.chunkgen.progress_bar_title": "Генерация чанков...", - "commands.neoforge.chunkgen.progress_bar_progress": "Generating %1$s chunks - ", + "commands.neoforge.chunkgen.progress_bar_progress": "Генерация %1$s чанков: ", "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s ошибок!)", "commands.neoforge.chunkgen.already_running": "Генерация уже запущена. Пожалуйста, сначала выполните команду '/neoforge generate stop', а затем можете начать новую генерацию.", - "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", + "commands.neoforge.chunkgen.started": "Генерация %1$s чанков в области размером %2$sx%3$s чанков (%4$sx%5$s блоков).", "commands.neoforge.chunkgen.success": "Генерация завершена!", - "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", - "commands.neoforge.chunkgen.stopped": "Генерация остановлена! Сгенерировано %1$s из %2$s чанков. (%3$s%%)", - "commands.neoforge.chunkgen.status": "Состояние генерации! Сгенерировано %1$s из %2$s чанков. (%3$s%%)", + "commands.neoforge.chunkgen.error": "Во время генерации произошло %1$s ошибок! Проверьте журнал за подробностями.", + "commands.neoforge.chunkgen.stopped": "Генерация остановлена! Сгенерировано %1$s из %2$s чанков (%3$s%%).", + "commands.neoforge.chunkgen.status": "Состояние генерации: сгенерировано %1$s из %2$s чанков (%3$s%%).", "commands.neoforge.chunkgen.not_running": "Предварительная генерация не запущена. Выполните команду `/neoforge generate help`, чтобы увидеть команды для запуска генерации.", - "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [шкалапрогресса] §r§f- создаёт квадрат, центрированный на указанной точке, с длиной сторон, равной chunkRadius * 2.\n§2/neoforge generate stop §r§f- останавливает текущую генерацию и отображает завершённый прогресс.\n§2/neoforge generate status §r- отображает прогресс текущей генерации.\n§2/neoforge generate help §r- отображает данное сообщение.\nСовет: Если вы запускаете команды из консоли сервера, вы можете выполнять генерацию в разных измерениях с помощью /execute in neoforge generate…", + "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start <радиусчанка> [шкалапрогресса] §r§f- создаёт квадрат, центрированный на указанной точке, с длиной сторон, равной радиусчанка * 2.\n§2/neoforge generate stop §r§f- останавливает текущую генерацию и отображает завершённый прогресс.\n§2/neoforge generate status §r- отображает прогресс текущей генерации.\n§2/neoforge generate help §r- отображает данное сообщение.\nСовет: если вы запускаете команды из консоли сервера, вы можете выполнять генерацию в разных измерениях с помощью /execute in <измерение> neoforge generate...", "commands.neoforge.timespeed.query": "Время в %s проходит со скоростью %sx (%s минут в день).", "commands.neoforge.timespeed.query.default": "Время в %s проходит нормально (20 минут в день).", "commands.neoforge.timespeed.set": "Установить поток времени в %s на %sx (%s минут в день).", "commands.neoforge.timespeed.set.default": "Установить поток времени в %s по умолчанию (20 минут в день).", "commands.neoforge.data_components.list.error.held_stack_empty": "Вы не держите никакого предмета", "commands.neoforge.data_components.list.title": "Компоненты данных на %s:", - "commands.neoforge.data_components.list.entry": "\n - %s", + "commands.neoforge.data_components.list.entry": "\n — %s", "commands.neoforge.data_components.list.entry.key_value": "%s: %s", "commands.neoforge.data_components.list.tooltip.default": "Компонент %s имеет значение по умолчанию", "commands.neoforge.data_components.list.tooltip.deleted": "Компонент %s со значением %s был удалён", "commands.neoforge.data_components.list.tooltip.modified": "Компонент %s был изменен с %s на %s", "commands.neoforge.data_components.list.tooltip.added": "Компонент %s был добавлен со значением %s", - "commands.config.getwithtype": "Конфиг для %s типа %s обнаружен в %s", - "commands.config.noconfig": "Конфиг для %s типа %s не найден", - "neoforge.update.beta.1": "%sВНИМАНИЕ: %sNeoForge Бета", - "neoforge.update.beta.2": "Возможны серьезные проблемы, проверьте их, прежде чем сообщать.", - "neoforge.update.newversion": "Доступна новая версия NeoForge: %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Поиск рецептов невозможен в командах клиента", + "commands.config.getwithtype": "Настройки для %s типа %s обнаружены в %s", + "commands.config.noconfig": "Настройки для %s типа %s не найдены", + "neoforge.update.beta.1": "%sВНИМАНИЕ: %sэто бета-версия NeoForge", + "neoforge.update.beta.2": "Недоработки ожидаемы. Перед тем, как сообщить о проблеме, проверьте, не сообщали ли о ней.", + "neoforge.update.newversion": "Вышла новая версия NeoForge: %s", "neoforge.menu.updatescreen.title": "Обновление мода", - "neoforge.configuration.uitext.title": "%s Конфигурация", + "neoforge.configuration.uitext.title": "Настройки %s", "neoforge.configuration.uitext.type.client": "Настройки клиента", "neoforge.configuration.uitext.type.server": "Настройки сервера", "neoforge.configuration.uitext.type.common": "Общие настройки", "neoforge.configuration.uitext.type.startup": "Настройки запуска", - "neoforge.configuration.uitext.title.client": "%s Конфигурация клиента", - "neoforge.configuration.uitext.title.server": "%s Конфигурация сервера", - "neoforge.configuration.uitext.title.common": "%s Общая конфигурация", - "neoforge.configuration.uitext.title.startup": "%s Конфигурация запуска", + "neoforge.configuration.uitext.title.client": "Клиентские настройки %s", + "neoforge.configuration.uitext.title.server": "Серверные настройки %s", + "neoforge.configuration.uitext.title.common": "Общие настройки %s", + "neoforge.configuration.uitext.title.startup": "Настройки запуска %s", "neoforge.configuration.uitext.notonline": "Настройки здесь определяются сервером и не могут быть изменены в режиме онлайн.", "neoforge.configuration.uitext.notlan": "Настройки в этом разделе нельзя редактировать, пока игра открыта для LAN. Пожалуйста, вернитесь в главное меню и загрузите мир заново.", - "neoforge.configuration.uitext.notloaded": "Настройки здесь доступны только во время загрузки мира.", + "neoforge.configuration.uitext.notloaded": "Эти настройки становятся доступны только после генерации мира.", "neoforge.configuration.uitext.unsupportedelement": "Это значение нельзя редактировать в пользовательском интерфейсе. Пожалуйста, свяжитесь с автором мода для создания своего пользовательского интерфейса.", "neoforge.configuration.uitext.longstring": "Это значение слишком длинное, чтобы его можно было редактировать в пользовательском интерфейсе. Пожалуйста, отредактируйте его в файле конфигурации.", "neoforge.configuration.uitext.section": "%s...", @@ -157,52 +160,54 @@ "neoforge.configuration.uitext.listelementdown": "⏷", "neoforge.configuration.uitext.listelementremove": "❌", "neoforge.configuration.uitext.rangetooltip": "Диапазон: %s", - "neoforge.configuration.uitext.filenametooltip": "Файл: \"%s\"", + "neoforge.configuration.uitext.filenametooltip": "Файл: «%s»", "neoforge.configuration.uitext.common": "Общие настройки", "neoforge.configuration.uitext.client": "Настройки клиента", - "neoforge.configuration.uitext.server": "Server Options", - "neoforge.configuration.uitext.startup": "Startup Options", - "neoforge.configuration.uitext.restart.game.title": "Minecraft needs to be restarted", - "neoforge.configuration.uitext.restart.game.text": "One or more of the configuration option that were changed will only take effect when the game is started.", - "neoforge.configuration.uitext.restart.server.title": "World needs to be reloaded", - "neoforge.configuration.uitext.restart.server.text": "One or more of the configuration option that were changed will only take effect when the world is reloaded.", - "neoforge.configuration.uitext.restart.return": "Ignore", - "neoforge.configuration.uitext.restart.return.tooltip": "Your changes will have no effect until you restart!", - "neoforge.configuration.title": "NeoForge Configuration", - "neoforge.configuration.section.neoforge.client.toml": "Client settings", - "neoforge.configuration.section.neoforge.client.toml.title": "Client settings", - "neoforge.configuration.section.neoforge.common.toml": "Common settings", - "neoforge.configuration.section.neoforge.common.toml.title": "Common settings", - "neoforge.configuration.section.neoforge.server.toml": "Server settings", - "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", - "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", - "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configuration.uitext.server": "Настройки сервера", + "neoforge.configuration.uitext.startup": "Настройки запуска", + "neoforge.configuration.uitext.restart.game.title": "Требуется перезапуск Minecraft", + "neoforge.configuration.uitext.restart.game.text": "Один или несколько измененных параметров конфигурации вступят в силу только после перезапуска игры.", + "neoforge.configuration.uitext.restart.server.title": "Мир должен быть перезагружен", + "neoforge.configuration.uitext.restart.server.text": "Один или несколько измененных параметров конфигурации вступят в силу только после перезагрузки мира.", + "neoforge.configuration.uitext.restart.return": "Потом перезапущу", + "neoforge.configuration.uitext.restart.return.tooltip": "Ваши изменения не вступят в силу до перезапуска!", + "neoforge.configuration.title": "Настройки NeoForge", + "neoforge.configuration.section.neoforge.client.toml": "Настройки клиента", + "neoforge.configuration.section.neoforge.client.toml.title": "Настройки клиента", + "neoforge.configuration.section.neoforge.common.toml": "Общие настройки", + "neoforge.configuration.section.neoforge.common.toml.title": "Общие настройки", + "neoforge.configuration.section.neoforge.server.toml": "Настройки сервера", + "neoforge.configuration.section.neoforge.server.toml.title": "Настройки сервера", + "neoforge.configgui.advertiseDedicatedServerToLan": "Продвигать выделенный сервер в локальную сеть", + "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Установите это значение на true, чтобы включить продвижение выделенного сервера для клиентов локальной сети, чтобы он автоматически отображался на экране многопользовательской игры.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Дополнительный атрибут Расширенные подсказки", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Установите это значение на true, чтобы включить дополнительную информацию об атрибутах на предмете при включении расширенных подсказок.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Активирует конвейер NeoForge для рендеринга блоков - исправляет освещение кастомных моделей.", "neoforge.configgui.fullBoundingBoxLadders": "Полная область коллизии для лестниц", "neoforge.configgui.fullBoundingBoxLadders.tooltip": "Установите значение true, чтобы проверять всю коробку столкновений сущности на соприкосновение с лестницами, а не только блоками, в котором они находятся. Это вызывает заметные изменения в механике, поэтому по умолчанию используется ванильное поведение. По умолчанию: false.", - "neoforge.configgui.logLegacyTagWarnings": "Log Legacy Tags", - "neoforge.configgui.logLegacyTagWarnings.tooltip": "A config option mainly for developers. Logs out modded tags that are using the 'forge' namespace when running on integrated server. Defaults to DEV_SHORT.", - "neoforge.configgui.logUntranslatedConfigurationWarnings": "Log Untranslated Configuration Keys", - "neoforge.configgui.logUntranslatedConfigurationWarnings.tooltip": "A config option mainly for developers. Logs out configuration values that do not have translations when running a client in a development environment.", - "neoforge.configgui.logUntranslatedItemTagWarnings": "Log Untranslated Item Tags", - "neoforge.configgui.logUntranslatedItemTagWarnings.tooltip": "A config option mainly for developers. Logs out modded item tags that do not have translations when running on integrated server. Format desired is tag.item.. for the translation key. Defaults to SILENCED.", - "neoforge.configgui.permissionHandler": "Permission Handler", - "neoforge.configgui.permissionHandler.tooltip": "The permission handler used by the server. Defaults to neoforge:default_handler if no such handler with that name is registered.", + "neoforge.configgui.logLegacyTagWarnings": "Логировать устаревшие теги", + "neoforge.configgui.logLegacyTagWarnings.tooltip": "Опция конфигурации, предназначенная в основном для разработчиков. Выводит в лог теги модов, использующие пространство имен 'forge' при работе на интегрированном сервере. По умолчанию имеет значение DEV_SHORT.", + "neoforge.configgui.logUntranslatedConfigurationWarnings": "Логировать непереведенные ключи настроек", + "neoforge.configgui.logUntranslatedConfigurationWarnings.tooltip": "Опция конфигурации, предназначенная в основном для разработчиков. Выводит в журнал значения конфигурации, не имеющие перевода, при запуске клиента в среде разработки.", + "neoforge.configgui.logUntranslatedItemTagWarnings": "Логировать непереведенные теги предметов", + "neoforge.configgui.logUntranslatedItemTagWarnings.tooltip": "Опция конфигурации, предназначенная в основном для разработчиков. При запуске на интегрированном сервере выводит логи тегов предметов из модов, не имеющих перевода. Желаемый формат: tag.item.. для ключа перевода. По умолчанию установлено значение SILENCED.", + "neoforge.configgui.permissionHandler": "Обработчик разрешений", + "neoforge.configgui.permissionHandler.tooltip": "Обработчик разрешений, используемый сервером. По умолчанию используется neoforge:default_handler, если обработчик с таким именем не зарегистрирован.", "neoforge.configgui.removeErroringBlockEntities": "Удалять блочные сущности, вызывающие ошибки", - "neoforge.configgui.removeErroringBlockEntities.tooltip": "Set this to true to remove any BlockEntity that throws an error in its update method instead of closing the server and reporting a crash log.", - "neoforge.configgui.removeErroringBlockEntities.tooltip.warning": "BE WARNED THIS COULD SCREW UP EVERYTHING.\nUSE SPARINGLY.\nWE ARE NOT RESPONSIBLE FOR DAMAGES.", + "neoforge.configgui.removeErroringBlockEntities.tooltip": "Установите это значение в true, чтобы удалить любой BlockEntity, который выдает ошибку в своем методе обновления, вместо того чтобы закрыть сервер и сообщить о сбое в журнале.", + "neoforge.configgui.removeErroringBlockEntities.tooltip.warning": "БУДЬТЕ ВНИМАТЕЛЬНЫ, ЭТО МОЖЕТ ВСЕ ИСПОРТИТЬ.\nПОЛЬЗУЙТЕСЬ ОСТОРОЖНО.\nМЫ НЕ НЕСЕМ ОТВЕТСТВЕННОСТИ ЗА ПОВРЕЖДЕНИЯ.", "neoforge.configgui.removeErroringEntities": "Удалять сущности, вызывающие ошибки", - "neoforge.configgui.removeErroringEntities.tooltip": "Set this to true to remove any Entity that throws an error in its update method instead of closing the server and reporting a crash log.", - "neoforge.configgui.removeErroringEntities.tooltip.warning": "BE WARNED THIS COULD SCREW UP EVERYTHING.\nUSE SPARINGLY.\nWE ARE NOT RESPONSIBLE FOR DAMAGES.", + "neoforge.configgui.removeErroringEntities.tooltip": "Установите это значение на true, чтобы удалить любую сущность, которая выдает ошибку в своем методе обновления вместо того, чтобы закрыть сервер и сообщить о сбое в журнале.", + "neoforge.configgui.removeErroringEntities.tooltip.warning": "БУДЬТЕ ВНИМАТЕЛЬНЫ, ЭТО МОЖЕТ ВСЕ ИСПОРТИТЬ.\nПОЛЬЗУЙТЕСЬ ОСТОРОЖНО.\nМЫ НЕ НЕСЕМ ОТВЕТСТВЕННОСТИ ЗА ПОВРЕЖДЕНИЯ.", "neoforge.configgui.showLoadWarnings": "Показывать предупреждения при загрузке", "neoforge.configgui.showLoadWarnings.tooltip": "Если эта функция включена, NeoForge покажет все предупреждения, возникшие во время загрузки.", - "neoforge.configgui.useCombinedDepthStencilAttachment": "Use combined DEPTH_STENCIL Attachment", - "neoforge.configgui.useCombinedDepthStencilAttachment.tooltip": "Set to true to use a combined DEPTH_STENCIL attachment instead of two separate ones.", - "neoforge.controlsgui.shift": "SHIFT + %s", - "neoforge.controlsgui.control": "CTRL + %s", + "neoforge.configgui.useCombinedDepthStencilAttachment": "Используйте комбинированный DEPTH_STENCIL Attachment", + "neoforge.configgui.useCombinedDepthStencilAttachment.tooltip": "Установите значение true, чтобы использовать й DEPTH_STENCIL Attachment вместо двух отдельных.", + "neoforge.controlsgui.shift": "Shift + %s", + "neoforge.controlsgui.control": "Ctrl + %s", "neoforge.controlsgui.control.mac": "CMD + %s", - "neoforge.controlsgui.alt": "ALT + %s", + "neoforge.controlsgui.alt": "Alt + %s", "neoforge.container.enchant.limitedEnchantability": "Ограниченная чаруемость", "neoforge.swim_speed": "Скорость плавания", "neoforge.name_tag_distance": "Дальность отрисовки имён", @@ -218,7 +223,7 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Набор ресурсов/данных NeoForge", "pack.neoforge.source.child": "дочерний", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", + "neoforge.network.negotiation.failure.mod": "Канал мода \"%1$s\" не удалось подключить: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Этот канал отсутствует на стороне сервера, но необходим на клиенте!", "neoforge.network.negotiation.failure.missing.server.client": "Этот канал отсутствует на стороне клиента, но необходим на сервере!", "neoforge.network.negotiation.failure.flow.client.missing": "Клиент хочет, чтобы полезная нагрузка передавалась в: %s, но сервер ее не поддерживает!", @@ -241,17 +246,18 @@ "neoforge.network.data_maps.failed": "Не удалось обработать синхронизацию данных реестра %s: %s", "neoforge.network.data_maps.missing_our": "Не удается подключиться к серверу, так как там отсутствуют обязательные данные реестра, имеющиеся на клиенте: %s", "neoforge.network.data_maps.missing_their": "Не удается подключиться к серверу, так как присутствуют обязательные данные реестра, отсутствующие на клиенте: %s", - "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", - "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", - "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", + "neoforge.network.extensible_enums.no_vanilla_server": "Этот клиент не поддерживает ванильные серверы, поскольку имеет расширенные перечисления, используемые в серверных сетях", + "neoforge.network.extensible_enums.enum_entry_mismatch": "Набор значений, добавляемых в расширяемые перечисления на клиенте и сервере, не совпадает. Убедитесь, что вы используете те же версии мода и NeoForge, что и сервер. Посмотрите в журнал для получения более подробной информации", + "neoforge.network.feature_flags.entry_mismatch": "Сервер и клиент имеют разные наборы пользовательских FeatureFlags. Убедитесь, что вы используете те же версии мода и NeoForge, что и сервер. Посмотрите в журнал для получения более подробной информации", + "neoforge.network.feature_flags.no_vanilla_server": "Этот клиент не поддерживает ванильные серверы, так как имеет собственные FeatureFlags", + "neoforge.attribute.debug.base": "[Сущность: %s | Предмет: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", - "neoforge.value.boolean.enabled": "Enabled", - "neoforge.value.boolean.disabled": "Disabled", - "neoforge.value.boolean.enable": "Enables", - "neoforge.value.boolean.disable": "Disables", - "neoforge.value.boolean.invalid": "Invalid", + "neoforge.value.boolean.enabled": "Вкл.", + "neoforge.value.boolean.disabled": "Выкл.", + "neoforge.value.boolean.enable": "Включает", + "neoforge.value.boolean.disable": "Выключает", + "neoforge.value.boolean.invalid": "Недействительный", "neoforge.modifier.plus": "+%s %s", "neoforge.modifier.take": "%s %s", "neoforge.modifier.bool": "%s %s" diff --git a/src/main/resources/assets/neoforge/lang/sk_sk.json b/src/main/resources/assets/neoforge/lang/sk_sk.json index a6972ea2d5c..cadd40a53a4 100644 --- a/src/main/resources/assets/neoforge/lang/sk_sk.json +++ b/src/main/resources/assets/neoforge/lang/sk_sk.json @@ -7,7 +7,7 @@ "fml.menu.mods.z_to_a": "Z-A", "fml.menu.mods.config": "Nastavenia", "fml.menu.mods.openmodsfolder": "Otvoriť priečinok pre módy", - "fml.menu.modoptions": "Nastavenia módu... ", + "fml.menu.modoptions": "Nastavenia módu...", "fml.menu.mods.info.version": "Verzia: %1$s", "fml.menu.mods.info.idstate": "ID Módu: %1$s Status: {1,lower}", "fml.menu.mods.info.credits": "Kredity: %1$s", @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Zjednodušené zobrazenie", "fml.resources.modresources": "Zdroje pre %1$s súbory módov", "fml.resources.moddata": "Dáta pre %1$s súborov módov", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Táto verzia NeoForgu bola vytvorená členom komunity, a preto je §c§lNEPODPOROVANÁ§r", "commands.neoforge.arguments.enum.invalid": "Konštanta Enum musí byť jedna z %1$s, nájdené %2$s", "commands.neoforge.dimensions.list": "Aktuálne registrované dimenzie podľa typu:", @@ -76,10 +78,10 @@ "commands.neoforge.setdim.invalid.dim": "Dimenzia s vybraným ID (%1$s) nie je validná.", "commands.neoforge.setdim.invalid.nochange": "Vybraná entita (%1$s) už existuje v špecifikovanej dimenzii (%2$s).", "commands.neoforge.setdim.deprecated": "Tento príkaz je zastaralý a bude vymazaný v 1.17, použite %s namiesto neho.", - "commands.neoforge.tps.overall": "Overall: %s TPS (%s ms/tick)", - "commands.neoforge.tps.tooltip": "Mean TPS; higher is better. Target TPS: %s", + "commands.neoforge.tps.overall": "Celkovo: %s TPS (%s ms/tick)", + "commands.neoforge.tps.tooltip": "Priemerné TPS: vyššia hodnota je lepšia. Cieľové TPS: %s", "commands.neoforge.tps.dimension": "%s: %s TPS (%s ms/tick)", - "commands.neoforge.tps.dimension.tooltip": "%s (Dimension Type: %s)", + "commands.neoforge.tps.dimension.tooltip": "%s (Typ rozmeru: %s)", "commands.neoforge.mods.list": "List módov: %1$s", "commands.neoforge.tracking.entity.enabled": "Sledovanie entít povolené na %d sekúnd.", "commands.neoforge.tracking.entity.reset": "Údaje o časovaní entít boli vymazané!", @@ -115,14 +117,15 @@ "commands.neoforge.timespeed.query.default": "Čas v %s plynie normálne (20 minút na deň).", "commands.neoforge.timespeed.set": "Nastaviť plynutie času v %s na %sx (%s minúty za deň).", "commands.neoforge.timespeed.set.default": "Nastaviť plynutie času v %s na predvolené (20 minút za deň).", - "commands.neoforge.data_components.list.error.held_stack_empty": "You are not holding any item", - "commands.neoforge.data_components.list.title": "Data components on %s:", + "commands.neoforge.data_components.list.error.held_stack_empty": "Nedržíte žiadny predmet", + "commands.neoforge.data_components.list.title": "Dátové komponenty v %s:", "commands.neoforge.data_components.list.entry": "\n - %s", "commands.neoforge.data_components.list.entry.key_value": "%s: %s", - "commands.neoforge.data_components.list.tooltip.default": "Component %s holds its default value", - "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", - "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", - "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.data_components.list.tooltip.default": "Komponent %s má jeho základnú hodnotu", + "commands.neoforge.data_components.list.tooltip.deleted": "Komponent %s s hodnotou %s bol vymazaný", + "commands.neoforge.data_components.list.tooltip.modified": "Komponent %s bol upravený z %s na %s", + "commands.neoforge.data_components.list.tooltip.added": "Komponent %s bol pridaný s hodnotou %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "V príkazoch klienta nie je možné vyhľadávať recepty", "commands.config.getwithtype": "Konfigurácia pre %s typu %s nájdená v %s", "commands.config.noconfig": "Konfigurácia pre %s typu %s nenájdená", "neoforge.update.beta.1": "%sVAROVANIE: %sNeoForge Beta", @@ -138,11 +141,11 @@ "neoforge.configuration.uitext.title.server": "%s Konfigurácia Serveru", "neoforge.configuration.uitext.title.common": "%s Bežná Konfigurácia", "neoforge.configuration.uitext.title.startup": "%s Konfigurácia Spustenia", - "neoforge.configuration.uitext.notonline": "Nastavenie tu sú určené serverom a nemôžu byť zmenené pokým je online.", + "neoforge.configuration.uitext.notonline": "Nastavenia tu sú určené serverom a nemôžu byť zmenené pokým je online.", "neoforge.configuration.uitext.notlan": "Nastavenia tu nemôžu byť upravené pokým je vaša hra otvorená do LAN. Prosím vráťte sa do hlavného menu a načítajte svet znova.", - "neoforge.configuration.uitext.notloaded": "Nastavenia tu sú k dispozícii len keď je svet načítaný.", + "neoforge.configuration.uitext.notloaded": "Tieto nastavenia sú k dispozícii len keď je svet načítaný.", "neoforge.configuration.uitext.unsupportedelement": "Táto hodnota nemôže byť upravená v UI. Prosím kontaktujte autora módu o poskytnutý vlastného UI preň.", - "neoforge.configuration.uitext.longstring": "Táto hodnota je pridlhá nato aby mohla byť upravená v UI. Prosím upravte ju v konfiguračnom súbore.", + "neoforge.configuration.uitext.longstring": "Táto hodnota je pridlhá nato, aby mohla byť upravená v UI. Prosím upravte ju v konfiguračnom súbore.", "neoforge.configuration.uitext.section": "%s...", "neoforge.configuration.uitext.sectiontext": "Upraviť", "neoforge.configuration.uitext.breadcrumb.order": "%1$s %2$s %3$s", @@ -156,8 +159,8 @@ "neoforge.configuration.uitext.listelementup": "⏶", "neoforge.configuration.uitext.listelementdown": "⏷", "neoforge.configuration.uitext.listelementremove": "❌", - "neoforge.configuration.uitext.rangetooltip": "Range: %s", - "neoforge.configuration.uitext.filenametooltip": "File: \"%s\"", + "neoforge.configuration.uitext.rangetooltip": "Rozsah: %s", + "neoforge.configuration.uitext.filenametooltip": "Súbor: \"%s\"", "neoforge.configuration.uitext.common": "Bežné Nastavenia", "neoforge.configuration.uitext.client": "Nastavenia Klienta", "neoforge.configuration.uitext.server": "Nastavenia Serveru", @@ -167,7 +170,7 @@ "neoforge.configuration.uitext.restart.server.title": "Svet treba znova načítať", "neoforge.configuration.uitext.restart.server.text": "Jedno alebo viac z konfiguračných nastavení ktoré boli zmenené budú mať efekt až keď bude hra znova načítaná.", "neoforge.configuration.uitext.restart.return": "Ignorovať", - "neoforge.configuration.uitext.restart.return.tooltip": "Vaše zmeny nebudú mať žiadny efekt pokým nereštartujete!", + "neoforge.configuration.uitext.restart.return.tooltip": "Vaše zmeny nebudú mať žiadny efekt pokým nereštartujete hru!", "neoforge.configuration.title": "NeoForge Konfigurácia", "neoforge.configuration.section.neoforge.client.toml": "Nastavenia klienta", "neoforge.configuration.section.neoforge.client.toml.title": "Nastavenia klienta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Nastavenia serveru", "neoforge.configgui.advertiseDedicatedServerToLan": "Inzerujte vyhradený server do siete LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Nastavte toto na true, aby ste povolili reklamu dedikovaného servera lokálnym klientom LAN, aby sa automaticky zobrazoval na obrazovke pre viacerých hráčov.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Povoliť kanál vykresľovania blokov NeoForge – opravuje osvetlenie vlastných modelov.", "neoforge.configgui.fullBoundingBoxLadders": "Úplné vymedzovanie boxov rebríkov", @@ -190,10 +195,10 @@ "neoforge.configgui.permissionHandler": "Manipulátor Povolení", "neoforge.configgui.permissionHandler.tooltip": "Manipulátor povolení používaný serverom. Predvolená hodnota do neoforge:default_handler ak nie je žiadny manipulátor s takým menom registrovaný.", "neoforge.configgui.removeErroringBlockEntities": "Odstrániť blokové entity spôsobujúce error", - "neoforge.configgui.removeErroringBlockEntities.tooltip": "Set this to true to remove any BlockEntity that throws an error in its update method instead of closing the server and reporting a crash log.", + "neoforge.configgui.removeErroringBlockEntities.tooltip": "Nastavte toto na hodnotu TRUE na odstránenie akejkoľvek Blokovej Entity, ktorá vyhodí chybu pri jej aktualizačnej metóde namiesto uzavretia serveru a nahlásenia zápisu spadnutia.", "neoforge.configgui.removeErroringBlockEntities.tooltip.warning": "BUDŤE VAROVANÝ, TOTO BY MOHLO VŠETKO ROZBIŤ.\nPOUŽÍVAJTE OPATRNE.\nNIE SME ZODPOVEDNÝ ZA ŠKODY.", "neoforge.configgui.removeErroringEntities": "Odstrániť entity spôsobujúce error", - "neoforge.configgui.removeErroringEntities.tooltip": "Set this to true to remove any Entity that throws an error in its update method instead of closing the server and reporting a crash log.", + "neoforge.configgui.removeErroringEntities.tooltip": "Nastavte toto na hodnotu TRUE na odstránenie akejkoľvek Entity, ktorá vyhodí chybu v jej aktualizačnej metóde namiesto uzavretia serveru a nahlásenia zápisu spadnutia.", "neoforge.configgui.removeErroringEntities.tooltip.warning": "BUDŤE VAROVANÝ, TOTO BY MOHLO VŠETKO ROZBIŤ.\nPOUŽÍVAJTE OPATRNE.\nNIE SME ZODPOVEDNÝ ZA ŠKODY.", "neoforge.configgui.showLoadWarnings": "Zobraziť Varovania Načítavania", "neoforge.configgui.showLoadWarnings.tooltip": "Keď je toto povolené, NeoForge zobrazí všetky varovania, ktoré nastali počas načítavania.", @@ -241,17 +246,18 @@ "neoforge.network.data_maps.failed": "Zlyhalo spracovanie synchronizácie mapy údajov databázy Registry pre databázy Registry %s: %s", "neoforge.network.data_maps.missing_our": "Nemožno pripojiť sa na server, nakoľko chýbajú povinné registratúrne dátové mapy prítomné na klientovi: %s", "neoforge.network.data_maps.missing_their": "Nemožno pripojiť sa na server, nakoľko obsahuje povinné registratúrne dátové mapy neprítomné na klientovi: %s", - "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", - "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", - "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", + "neoforge.network.extensible_enums.no_vanilla_server": "Tento klient nepodporuje vanilla servery keďže má rozšírené enumy použité v sieťovaní serveru", + "neoforge.network.extensible_enums.enum_entry_mismatch": "Dané hodnoty pridané do rozširujúcich enumov na strane klienta a serveru sa nezhodujú. Prosím overte si použitie rovnakého módu a NeoForge verzie ako na serveri. Zobrazte si zápis pre viac informácií", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", + "neoforge.attribute.debug.base": "[Entita: %s | Predmet: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", - "neoforge.value.boolean.enabled": "Enabled", - "neoforge.value.boolean.disabled": "Disabled", - "neoforge.value.boolean.enable": "Enables", - "neoforge.value.boolean.disable": "Disables", - "neoforge.value.boolean.invalid": "Invalid", + "neoforge.value.boolean.enabled": "Povolené", + "neoforge.value.boolean.disabled": "Zakázané", + "neoforge.value.boolean.enable": "Povolí", + "neoforge.value.boolean.disable": "Zakáže", + "neoforge.value.boolean.invalid": "Nesprávna", "neoforge.modifier.plus": "+%s %s", "neoforge.modifier.take": "%s %s", "neoforge.modifier.bool": "%s %s" diff --git a/src/main/resources/assets/neoforge/lang/tr_tr.json b/src/main/resources/assets/neoforge/lang/tr_tr.json index cc0f520cc40..eb477996700 100644 --- a/src/main/resources/assets/neoforge/lang/tr_tr.json +++ b/src/main/resources/assets/neoforge/lang/tr_tr.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/tt_ru.json b/src/main/resources/assets/neoforge/lang/tt_ru.json index d531fc0209f..dab11b21b78 100644 --- a/src/main/resources/assets/neoforge/lang/tt_ru.json +++ b/src/main/resources/assets/neoforge/lang/tt_ru.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/uk_ua.json b/src/main/resources/assets/neoforge/lang/uk_ua.json index 8c834f72eec..2de707dba45 100644 --- a/src/main/resources/assets/neoforge/lang/uk_ua.json +++ b/src/main/resources/assets/neoforge/lang/uk_ua.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Спрощений вигляд", "fml.resources.modresources": "Ресурси для %1$s файлів модів", "fml.resources.moddata": "Дані для %1$s файлів модів", + "fml.modloadingissue.feature_flags.file_not_found": "Файл FeatureFlag {0}, наданий модом {100,modinfo,id}, не існує", + "fml.modloadingissue.feature_flags.loading_error": "Не вдалося завантажити данні FeatureFlag в {0} в моді {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "Ця збірка NeoForge була створена членом спільноти й тому §c§lНЕ ПІДТРИМУЄТЬСЯ§r", "commands.neoforge.arguments.enum.invalid": "Константа Enum має бути однією з %1$s, знайдено %2$s", "commands.neoforge.dimensions.list": "Наразі зареєстровані виміри за типом:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Компонент %s зі значенням %s було видалено", "commands.neoforge.data_components.list.tooltip.modified": "Компонент %s був змінений з %s в %s", "commands.neoforge.data_components.list.tooltip.added": "Компонент %s був доданий зі значенням %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Пошук рецептів неможливий у командах клієнта", "commands.config.getwithtype": "Конфіг для %s типу %s знайдена в %s", "commands.config.noconfig": "Конфіг для %s типу %s не знайдено", "neoforge.update.beta.1": "%sПОПЕРЕДЖЕННЯ: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Серверні налаштування", "neoforge.configgui.advertiseDedicatedServerToLan": "Показати виділений сервер для локальної мережі", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Встановіть значення \"true\", для показування виділених серверів місцевим клієнтам локальної мережі, щоб це автоматично з'являлося на екрані багатокористувацького режиму.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "Конвеєр світла NeoForge", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Активує конвеєр NeoForge для рендерингу блоків — виправляє освітлення користувацьких моделей.", "neoforge.configgui.fullBoundingBoxLadders": "Повні області колізії з драбиною", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Не вдається приєднатися до сервера, оскільки на клієнті відсутні обов'язкові мапи даних реєстру: %s", "neoforge.network.data_maps.missing_their": "Не вдається приєднатися до сервера, оскільки присутні обов'язкові мапи даних реєстру, що відсутні на клієнті: %s", "neoforge.network.extensible_enums.no_vanilla_server": "Цей клієнт не підтримує ванільні сервери, тому що він має розширені значення enum, що використовуються у роботі з серверами", - "neoforge.network.extensible_enums.enum_set_mismatch": "Набір значень розширюваних enum, на клієнті й сервері не збігаються. Переконайтеся, що ви використовуєте однакові версії NeoForge", "neoforge.network.extensible_enums.enum_entry_mismatch": "Набір значень, що додаються до розширюваних enum, на клієнті й сервері не збігаються. Переконайтеся, що ви використовуєте однакові версії моду і NeoForge. Дивіться журнал для додаткової інформації", + "neoforge.network.feature_flags.entry_mismatch": "Сервер і клієнт мають різні набори користувацьких FeatureFlags. Переконайтеся, що ви використовуєте однакові версії моду і NeoForge. Дивіться журнал для отримання додаткової інформації", + "neoforge.network.feature_flags.no_vanilla_server": "Цей клієнт не підтримує ванільні сервери, тому що він має користувацькі FeatureFlags", "neoforge.attribute.debug.base": "[Істота: %s | Предмет: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/vi_vn.json b/src/main/resources/assets/neoforge/lang/vi_vn.json index 0507d99d2a5..c35936cbf26 100644 --- a/src/main/resources/assets/neoforge/lang/vi_vn.json +++ b/src/main/resources/assets/neoforge/lang/vi_vn.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Currently registered dimensions by type:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "Component %s with value %s was deleted", "commands.neoforge.data_components.list.tooltip.modified": "Component %s was modified from %s to %s", "commands.neoforge.data_components.list.tooltip.added": "Component %s was added with value %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "Config for %s of type %s found at %s", "commands.config.noconfig": "Config for %s of type %s not found", "neoforge.update.beta.1": "%sWARNING: %sNeoForge Beta", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "Server settings", "neoforge.configgui.advertiseDedicatedServerToLan": "Advertise Dedicated Server To LAN", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "Set this to true to enable advertising the dedicated server to local LAN clients so that it shows up in the Multiplayer screen automatically.", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge Light Pipeline", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Enable the NeoForge block rendering pipeline - fixes the lighting of custom models.", "neoforge.configgui.fullBoundingBoxLadders": "Full Bounding Box Ladders", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "Cannot connect to server as it is missing mandatory registry data maps present on the client: %s", "neoforge.network.data_maps.missing_their": "Cannot connect to server as it has mandatory registry data maps not present on the client: %s", "neoforge.network.extensible_enums.no_vanilla_server": "This client does not support vanilla servers as it has extended enums used in serverbound networking", - "neoforge.network.extensible_enums.enum_set_mismatch": "The set of extensible enums on the client and server do not match. Make sure you are using the same NeoForge version as the server", "neoforge.network.extensible_enums.enum_entry_mismatch": "The set of values added to extensible enums on the client and server do not match. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/zh_cn.json b/src/main/resources/assets/neoforge/lang/zh_cn.json index d54ee5b872d..8607023f0fd 100644 --- a/src/main/resources/assets/neoforge/lang/zh_cn.json +++ b/src/main/resources/assets/neoforge/lang/zh_cn.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "简化视图", "fml.resources.modresources": "%1$s 模组文件的资源", "fml.resources.moddata": "%1$s 模组文件数据", + "fml.modloadingissue.feature_flags.file_not_found": "由模组{100,modinfo,id}提供的扩展文件{0}不存在", + "fml.modloadingissue.feature_flags.loading_error": "无法加载模组{100,modinfo,id}中位于{0}的枚举扩展数据:{102,exc,msg}", "loadwarning.neoforge.prbuild": "这个 NeoForge 构建由社区成员创建,是 §c§l不受支持§r 的", "commands.neoforge.arguments.enum.invalid": "枚举常量必须是 %1$s 之一,但发现了 %2$s", "commands.neoforge.dimensions.list": "当前已注册的维度,按维度类型展示:", @@ -76,10 +78,10 @@ "commands.neoforge.setdim.invalid.dim": "指定的维度 ID(%1$s)无效。", "commands.neoforge.setdim.invalid.nochange": "选定的实体(%1$s)已经在指定的维度(%2$s)中。", "commands.neoforge.setdim.deprecated": "此命令将在 1.17 中被废弃去除,请使用 %s 代替。", - "commands.neoforge.tps.overall": "总体:%sTPS(%s毫秒/刻)", + "commands.neoforge.tps.overall": "总体:%sTPS (%s毫秒/刻)", "commands.neoforge.tps.tooltip": "平均TPS;越高越好。目标TPS:%s", - "commands.neoforge.tps.dimension": "%s:%sTPS(%s毫秒/刻)", - "commands.neoforge.tps.dimension.tooltip": "%s(维度类型:%s)", + "commands.neoforge.tps.dimension": "%s:%sTPS (%s毫秒/刻)", + "commands.neoforge.tps.dimension.tooltip": "%s (维度类型:%s)", "commands.neoforge.mods.list": "模组列表:%1$s", "commands.neoforge.tracking.entity.enabled": "实体跟踪已启用,时长 %d 秒。", "commands.neoforge.tracking.entity.reset": "实体计时数据已被清理!", @@ -107,14 +109,14 @@ "commands.neoforge.chunkgen.started": "正在于 %2$sx%3$s 区块范围(%4$sx%5$s 个方块)中生成 %1$s 个区块。", "commands.neoforge.chunkgen.success": "生成完毕!", "commands.neoforge.chunkgen.error": "生成中发生了 %1$s 个错误!请检查日志以获取更多信息。", - "commands.neoforge.chunkgen.stopped": "生成已停止!预定生成%2$s个区块,已生成%1$s个。(%3$s%%)", - "commands.neoforge.chunkgen.status": "生成状态!预定生成%2$s个区块,已生成%1$s个。(%3$s%%)", + "commands.neoforge.chunkgen.stopped": "生成已停止!预定生成%2$s个区块,已生成%1$s个。(%3$s%%)", + "commands.neoforge.chunkgen.status": "生成状态!预定生成%2$s个区块,已生成%1$s个。(%3$s%%)", "commands.neoforge.chunkgen.not_running": "无进行中的预生成。运行 `/neoforge generate help` 以查看开始生成的命令。", "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [progressBar] §r§f- 生成一个以给定坐标为中心的、边长为 chunkRadius * 2 的正方形。\n§2/neoforge generate stop §r§f- 停止当前生成,显示完成进度。\n§2/neoforge generate status §r- 显示当前生成的完成进度。\n§2/neoforge generate help §r- 显示此消息\n通用提示:如果从服务器控制台执行,可以通过 '/execute in neoforge generate...' 在特定维度执行。", - "commands.neoforge.timespeed.query": "%s的时间以%sx的速度流逝(%s分钟每天)。", - "commands.neoforge.timespeed.query.default": "%s的时间以正常速度流逝(20分钟每天)。", - "commands.neoforge.timespeed.set": "已将%s的时间流速设为%sx(%s分钟每天)。", - "commands.neoforge.timespeed.set.default": "已将%s的时间流速设为默认值(20分钟每天)。", + "commands.neoforge.timespeed.query": "%s的时间以%sx的速度流逝 (%s分钟每天)。", + "commands.neoforge.timespeed.query.default": "%s的时间以正常速度流逝 (20分钟每天)。", + "commands.neoforge.timespeed.set": "已将%s的时间流速设为%sx (%s分钟每天)。", + "commands.neoforge.timespeed.set.default": "已将%s的时间流速设为默认值 (20 分钟每天)。", "commands.neoforge.data_components.list.error.held_stack_empty": "你没有拿任何东西", "commands.neoforge.data_components.list.title": "%s 上的数据组件:", "commands.neoforge.data_components.list.entry": "\n - %s", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "组件 %s 的值 %s 已被删除", "commands.neoforge.data_components.list.tooltip.modified": "组件 %s 已从 %s 修改为 %s", "commands.neoforge.data_components.list.tooltip.added": "组件 %s 添加了值 %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "配方无法通过客户端命令查找", "commands.config.getwithtype": "%s 类型 %s 的配置在 %s 发现", "commands.config.noconfig": "未发现 %s(类型为 %s)的配置", "neoforge.update.beta.1": "%s警告:%s NeoForge 为测试版", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "服务端设置", "neoforge.configgui.advertiseDedicatedServerToLan": "向局域网开放服务器", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "将此设置为true以启用向本地局域网客户端开放服务器,以便它自动显示在多人游戏屏幕中。", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "附加属性高级提示框", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "启用此项后,在“高级提示框”开启时,物品会显示关于属性的附加信息。", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge 光照管线", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "启用 NeoForge 方块渲染管线 - 修复自定义模型的光照问题。", "neoforge.configgui.fullBoundingBoxLadders": "梯子使用完整实体碰撞箱", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "无法连接至服务器,因为客户端缺少必要的注册表数据映射:%s", "neoforge.network.data_maps.missing_their": "无法连接至服务器,因为客户端上不存在必要的注册表数据映射:%s", "neoforge.network.extensible_enums.no_vanilla_server": "该客户端不支持原版服务器,因为它在服务器端网络中使用了不同连接方式。", - "neoforge.network.extensible_enums.enum_set_mismatch": "客户端和服务器上的模组不匹配。请确保您使用的 NeoForge 版本与服务器上的版本相同。", "neoforge.network.extensible_enums.enum_entry_mismatch": "客户端和服务器上所需要的模组不匹配。请确保您使用的模组和 NeoForge 版本与服务器上的版本相同。请查看日志以获取更多详细信息。", + "neoforge.network.feature_flags.entry_mismatch": "客户端和服务端的自定义功能开关(Feature Flag)不一致。请确保你使用的模组及NeoForge版本与服务端上的相同。查看日志以获取更多详细信息。", + "neoforge.network.feature_flags.no_vanilla_server": "此客户端有自定义功能开关(Feature Flag),因此不支持原版服务端。", "neoforge.attribute.debug.base": "[实体:%s | 物品:%s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/src/main/resources/assets/neoforge/lang/zh_tw.json b/src/main/resources/assets/neoforge/lang/zh_tw.json index ffd0271eb99..bbb7098d70e 100644 --- a/src/main/resources/assets/neoforge/lang/zh_tw.json +++ b/src/main/resources/assets/neoforge/lang/zh_tw.json @@ -61,6 +61,8 @@ "fml.modmismatchscreen.simplifiedview": "簡化檢視", "fml.resources.modresources": "用於 %1$s 模組檔案的資源", "fml.resources.moddata": "%1$s 模組檔案資料", + "fml.modloadingissue.feature_flags.file_not_found": "FeatureFlag file {0}, provided by mod {100,modinfo,id}, does not exist", + "fml.modloadingissue.feature_flags.loading_error": "Failed to load FeatureFlag data at {0} in mod {100,modinfo,id}: {102,exc,msg}", "loadwarning.neoforge.prbuild": "這個 NeoForge 由社群成員建立,是 §c§l不受支援§r 的", "commands.neoforge.arguments.enum.invalid": "枚舉常數必須是 %1$s 之一,找到 %2$s", "commands.neoforge.dimensions.list": "目前依照類型註冊的維度:", @@ -123,6 +125,7 @@ "commands.neoforge.data_components.list.tooltip.deleted": "元件 %s 已移除(原值:%s)", "commands.neoforge.data_components.list.tooltip.modified": "元件 %s 的值已從 %s 修改為 %s", "commands.neoforge.data_components.list.tooltip.added": "元件 %s 已新增,其值為 %s", + "commands.neoforge.vanilla.resource_key.no_recipes_on_client": "Recipe lookup is not possible in client commands", "commands.config.getwithtype": "%s 類型 %s 的配置在 %s 發現", "commands.config.noconfig": "%s 類型 %s 的配置未發現", "neoforge.update.beta.1": "%s警告:%s NeoForge 測試版", @@ -177,6 +180,8 @@ "neoforge.configuration.section.neoforge.server.toml.title": "伺服器端設定", "neoforge.configgui.advertiseDedicatedServerToLan": "將專用伺服器公開至區域網路", "neoforge.configgui.advertiseDedicatedServerToLan.tooltip": "開啟該選項後,即可讓專用伺服器公開至區域網路,使其自動顯示在多人遊戲畫面中。", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo": "Additional Attribute Advanced Tooltips", + "neoforge.configgui.attributeAdvancedTooltipDebugInfo.tooltip": "Set this to true to enable additional information about attributes on an item when advanced tooltips is on.", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge 光照繪製管線", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "啟用 NeoForge 方塊繪製管線 - 修正自訂模型的光照問題。", "neoforge.configgui.fullBoundingBoxLadders": "全邊界框梯子", @@ -242,8 +247,9 @@ "neoforge.network.data_maps.missing_our": "無法連接服務器,因為缺少用戶端上存在的強制註冊表數據映射: %s", "neoforge.network.data_maps.missing_their": "無法連接服務器,因為服務器上有用戶端不存在的強制註冊表數據映射: %s", "neoforge.network.extensible_enums.no_vanilla_server": "這個客戶端不支持原版服務器,因爲它在服務器綁定網絡中使用了擴展的枚舉", - "neoforge.network.extensible_enums.enum_set_mismatch": "用戶端和伺服器上的可擴充列舉值集合不相符。請確保您使用的 NeoForge 版本與伺服器相同。", "neoforge.network.extensible_enums.enum_entry_mismatch": "用戶端和伺服器上新增至可擴充列舉值的值集合不相符。請確保您使用的模組和 NeoForge 版本與伺服器相同。查看記錄檔以取得詳細資訊", + "neoforge.network.feature_flags.entry_mismatch": "The server and client have different sets of custom FeatureFlags. Make sure you are using the same mod and NeoForge versions as the server. See the log for more details", + "neoforge.network.feature_flags.no_vanilla_server": "This client does not support vanilla servers as it has custom FeatureFlags", "neoforge.attribute.debug.base": "[Entity: %s | Item: %s]", "neoforge.value.flat": "%s", "neoforge.value.percent": "%s%%", diff --git a/testframework/build.gradle b/testframework/build.gradle index d5d98b4059a..5b5a74316f7 100644 --- a/testframework/build.gradle +++ b/testframework/build.gradle @@ -1,7 +1,6 @@ plugins { id 'java' id 'maven-publish' - id 'com.diffplug.spotless' id 'net.neoforged.licenser' id 'neoforge.formatting-conventions' } diff --git a/tests/build.gradle b/tests/build.gradle index 62433714186..d432eaa198e 100644 --- a/tests/build.gradle +++ b/tests/build.gradle @@ -1,6 +1,5 @@ plugins { id 'java' - id 'com.diffplug.spotless' id 'net.neoforged.licenser' id 'neoforge.formatting-conventions' } diff --git a/tests/src/generated/resources/assets/new_model_loader_test/blockstates/obj_block_same_part_names.json b/tests/src/generated/resources/assets/new_model_loader_test/blockstates/obj_block_same_part_names.json new file mode 100644 index 00000000000..b367658bc25 --- /dev/null +++ b/tests/src/generated/resources/assets/new_model_loader_test/blockstates/obj_block_same_part_names.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "new_model_loader_test:block/obj_block_same_part_names", + "y": 90 + }, + "facing=north": { + "model": "new_model_loader_test:block/obj_block_same_part_names" + }, + "facing=south": { + "model": "new_model_loader_test:block/obj_block_same_part_names", + "y": 180 + }, + "facing=west": { + "model": "new_model_loader_test:block/obj_block_same_part_names", + "y": 270 + } + } +} \ No newline at end of file diff --git a/tests/src/generated/resources/assets/new_model_loader_test/models/block/obj_block_same_part_names.json b/tests/src/generated/resources/assets/new_model_loader_test/models/block/obj_block_same_part_names.json new file mode 100644 index 00000000000..2b2fac8b206 --- /dev/null +++ b/tests/src/generated/resources/assets/new_model_loader_test/models/block/obj_block_same_part_names.json @@ -0,0 +1,9 @@ +{ + "flip_v": true, + "loader": "neoforge:obj", + "model": "new_model_loader_test:models/item/sugar_glider_same_part_names.obj", + "textures": { + "particle": "#qr", + "qr": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json index bd1dc49321d..e898f5f296e 100644 --- a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json +++ b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json @@ -11,11 +11,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json index 46393dcedd7..f7eafd37f47 100644 --- a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json +++ b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json @@ -13,11 +13,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json b/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json index ca3003e4dbf..eef01fd11ad 100644 --- a/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json +++ b/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json @@ -11,11 +11,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json b/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json index a50fcb08dce..7a07d04ebb2 100644 --- a/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json +++ b/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json @@ -13,11 +13,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json index f898cd2a2b1..8dff30b1303 100644 --- a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json +++ b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "effects": "burning", diff --git a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json index 560b347cecb..a58d2290db3 100644 --- a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json +++ b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "effects": "burning", diff --git a/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json b/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json index e13d7504ae4..37ada19d900 100644 --- a/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json +++ b/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "parent": "minecraft:recipes/root", diff --git a/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json b/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json index 404842c8133..cd22632a3b1 100644 --- a/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json +++ b/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "type": "minecraft:crafting_shapeless", diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java b/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java index fde67adaf81..44d0c64cfdd 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java @@ -13,7 +13,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; -import net.neoforged.neoforge.common.conditions.FalseCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; @@ -38,7 +38,7 @@ protected void buildRecipes() { .requires(Items.STONE) .unlockedBy("has_stone", has(Items.STONE)) // false condition to have this recipe always disabled - .save(output.withConditions(FalseCondition.INSTANCE), recipeName); + .save(output.withConditions(NeoForgeConditions.never()), recipeName); } }; } diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/client/ClientEventTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/client/ClientEventTests.java index 3eed63a3e8d..adf92ebcf4e 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/client/ClientEventTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/client/ClientEventTests.java @@ -15,12 +15,14 @@ import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.entity.state.HoglinRenderState; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.SectionPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.context.ContextKey; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.monster.hoglin.HoglinBase; @@ -150,7 +152,8 @@ static void updateRenderState(final DynamicTest test) { renderState.setRenderData(numRenderAttachmentKey, entity.getData(testAttachment)); }); // Test other type parameters for safety - event.registerEntityModifier(new TypeToken>() {}, (entity, renderState) -> {}); + // This call requires explicit typing to satisfy ECJ. Without it, the wildcard on AbstractHoglinRenderer is invalid. + event.registerEntityModifier(new TypeToken>() {}, (entity, renderState) -> {}); event.registerEntityModifier(new TypeToken>() {}, (entity, renderState) -> {}); try { class TestBrokenHoglinRendererTypeToken extends TypeToken> {} diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java index 090309ffca7..e226e739b11 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java @@ -23,7 +23,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.common.conditions.IConditionBuilder; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.event.AddPackFindersEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.neoforge.registries.DeferredItem; @@ -113,21 +113,16 @@ static void testFlagCondition(DynamicTest test, RegistrationHelper reg) { reg.addClientProvider(event -> new RecipeProvider.Runner(event.getGenerator().getPackOutput(), event.getLookupProvider()) { @Override protected RecipeProvider createRecipeProvider(HolderLookup.Provider registries, RecipeOutput output) { - class Provider extends RecipeProvider implements IConditionBuilder { - protected Provider(HolderLookup.Provider p_360573_, RecipeOutput p_360872_) { - super(p_360573_, p_360872_); - } - + return new RecipeProvider(registries, output) { @Override protected void buildRecipes() { // recipe available when above flag is enabled shapeless(RecipeCategory.MISC, Items.DIAMOND) .requires(ItemTags.DIRT) .unlockedBy("has_dirt", has(ItemTags.DIRT)) - .save(output.withConditions(featureFlagsEnabled(flag)), enabledRecipeName); + .save(output.withConditions(NeoForgeConditions.featureFlagsEnabled(flag)), enabledRecipeName); } - } - return new Provider(registries, output); + }; } @Override diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java index 3d117368723..97474787aca 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java @@ -13,8 +13,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageEffects; import net.minecraft.world.damagesource.DamageType; -import net.neoforged.neoforge.common.conditions.FalseCondition; -import net.neoforged.neoforge.common.conditions.TrueCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; @@ -46,8 +45,8 @@ static void conditionalDatapackEntries(final DynamicTest test, final Registratio event.getLookupProvider(), builder, conditions -> { - conditions.accept(CONDITIONAL_FALSE_DAMAGE_TYPE, FalseCondition.INSTANCE); - conditions.accept(CONDITIONAL_TRUE_DAMAGE_TYPE, TrueCondition.INSTANCE); + conditions.accept(CONDITIONAL_FALSE_DAMAGE_TYPE, NeoForgeConditions.never()); + conditions.accept(CONDITIONAL_TRUE_DAMAGE_TYPE, NeoForgeConditions.always()); }, Set.of(reg.modId()))); diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java index 43723c7ca55..04c67f57a69 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java @@ -116,8 +116,7 @@ import net.neoforged.neoforge.client.model.generators.ModelFile.UncheckedModelFile; import net.neoforged.neoforge.client.model.generators.MultiPartBlockStateBuilder; import net.neoforged.neoforge.client.model.generators.VariantBlockStateBuilder; -import net.neoforged.neoforge.common.conditions.IConditionBuilder; -import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.conditions.WithConditions; import net.neoforged.neoforge.common.crafting.CompoundIngredient; import net.neoforged.neoforge.common.crafting.DifferenceIngredient; @@ -132,6 +131,7 @@ import net.neoforged.neoforge.common.data.SoundDefinition; import net.neoforged.neoforge.common.data.SoundDefinitionsProvider; import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.neoforge.internal.versions.neoforge.NeoForgeVersion; import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -168,8 +168,8 @@ public static void gatherData(GatherDataEvent.Client event) { new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "neoforge_overlays_test"))))) .add(GeneratingOverlayMetadataSection.TYPE, new GeneratingOverlayMetadataSection(List.of( new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "pack_overlays_test")), - new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), new ModLoadedCondition("neoforge")), - new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), new ModLoadedCondition("does_not_exist"))))) + new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), NeoForgeConditions.modLoaded(NeoForgeVersion.MOD_ID)), + new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), NeoForgeConditions.modLoaded("does_not_exist"))))) .add(PackMetadataSection.TYPE, new PackMetadataSection( Component.literal("NeoForge tests resource pack"), DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES), @@ -198,7 +198,7 @@ public static void levelStem(BootstrapContext context) { context.register(TEST_LEVEL_STEM, levelStem); } - public static class Recipes extends RecipeProvider implements IConditionBuilder { + public static class Recipes extends RecipeProvider { public Recipes(HolderLookup.Provider registries, RecipeOutput output) { super(registries, output); } @@ -219,10 +219,10 @@ protected void buildRecipes() { .unlockedBy("has_dirt", has(Blocks.DIRT)) .save( output.withConditions( - and( - not(modLoaded("minecraft")), - itemExists("minecraft", "dirt"), - FALSE())), + NeoForgeConditions.and( + NeoForgeConditions.not(NeoForgeConditions.modLoaded("minecraft")), + NeoForgeConditions.itemRegistered("minecraft", "dirt"), + NeoForgeConditions.never())), recipeKey("conditional")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DIAMOND_BLOCK, 64) @@ -234,11 +234,11 @@ protected void buildRecipes() { .unlockedBy("has_dirt", has(Blocks.DIRT)) .save( output.withConditions( - not( - and( - not(modLoaded("minecraft")), - itemExists("minecraft", "dirt"), - FALSE()))), + NeoForgeConditions.not( + NeoForgeConditions.and( + NeoForgeConditions.not(NeoForgeConditions.modLoaded("minecraft")), + NeoForgeConditions.itemRegistered("minecraft", "dirt"), + NeoForgeConditions.never()))), recipeKey("conditional2")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHERITE_BLOCK, 1) @@ -249,7 +249,7 @@ protected void buildRecipes() { .unlockedBy("has_diamond_block", has(Blocks.DIAMOND_BLOCK)) .save( output.withConditions( - tagEmpty(ItemTags.PLANKS)), + NeoForgeConditions.tagEmpty(ItemTags.PLANKS)), recipeKey("conditional3")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHERITE_BLOCK, 9) @@ -260,7 +260,7 @@ protected void buildRecipes() { .unlockedBy("has_diamond_block", has(Blocks.DIAMOND_BLOCK)) .save( output.withConditions( - not(tagEmpty(ItemTags.PLANKS))), + NeoForgeConditions.not(NeoForgeConditions.tagEmpty(ItemTags.PLANKS))), recipeKey("conditional4")); // intersection - should match all non-flammable planks diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java index 199266704f0..eb7079da05e 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java @@ -68,24 +68,11 @@ public class NewModelLoaderTest { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(MODID); public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MODID); - public static DeferredBlock obj_block = BLOCKS.registerBlock("obj_block", props -> new Block(props) { - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(BlockStateProperties.HORIZONTAL_FACING); - } + public static DeferredBlock obj_block = BLOCKS.registerBlock("obj_block", TestBlock::new, Block.Properties.of().mapColor(MapColor.WOOD).strength(10)); - @Nullable - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return defaultBlockState().setValue( - BlockStateProperties.HORIZONTAL_FACING, context.getHorizontalDirection()); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return Block.box(2, 2, 2, 14, 14, 14); - } - }, Block.Properties.of().mapColor(MapColor.WOOD).strength(10)); + // Same at obj_block except all the parts in the obj model have the same name, + // this is a test for neoforged/NeoForge#1755 that was fixed by neoforged/NeoForge#1759 + public static DeferredBlock obj_block_same_part_names = BLOCKS.registerBlock("obj_block_same_part_names", TestBlock::new, Block.Properties.of().mapColor(MapColor.WOOD).strength(10)); public static DeferredItem obj_item = ITEMS.registerItem("obj_block", props -> new BlockItem(obj_block.get(), props.useBlockDescriptionPrefix()) { @Override @@ -94,6 +81,8 @@ public boolean canEquip(ItemStack stack, EquipmentSlot armorType, LivingEntity e } }); + public static DeferredItem obj_item_same_part_names = ITEMS.registerItem("obj_block_same_part_names", props -> new BlockItem(obj_block_same_part_names.get(), props)); + public static DeferredItem custom_transforms = ITEMS.registerSimpleItem("custom_transforms"); public static DeferredItem custom_vanilla_loader = ITEMS.registerSimpleItem("custom_vanilla_loader"); @@ -117,6 +106,7 @@ private void addCreative(BuildCreativeModeTabContentsEvent event) { if (event.getTabKey() == CreativeModeTabs.INGREDIENTS) { Arrays.asList( obj_item, + obj_item_same_part_names, custom_transforms, custom_vanilla_loader, custom_loader, @@ -129,6 +119,29 @@ public void modelRegistry(ModelEvent.RegisterLoaders event) { event.register(ResourceLocation.fromNamespaceAndPath(MODID, "custom_loader"), new TestLoader()); } + static class TestBlock extends Block { + public TestBlock(Properties properties) { + super(properties); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(BlockStateProperties.HORIZONTAL_FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue( + BlockStateProperties.HORIZONTAL_FACING, context.getHorizontalDirection()); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + return Block.box(2, 2, 2, 14, 14, 14); + } + } + static class TestLoader implements UnbakedModelLoader { @Override public TestModel read(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { @@ -203,15 +216,20 @@ public BlockStates(PackOutput output, ExistingFileHelper exFileHelper) { @Override protected void registerStatesAndModels() { + createModelAndBlockState(obj_block, "sugar_glider"); + createModelAndBlockState(obj_block_same_part_names, "sugar_glider_same_part_names"); + } + + private void createModelAndBlockState(DeferredBlock block, String objModel) { BlockModelBuilder model = models() - .getBuilder(NewModelLoaderTest.obj_block.getId().getPath()) + .getBuilder(block.getId().getPath()) .customLoader(ObjModelBuilder::begin) - .modelLocation(ResourceLocation.fromNamespaceAndPath("new_model_loader_test", "models/item/sugar_glider.obj")) + .modelLocation(ResourceLocation.fromNamespaceAndPath("new_model_loader_test", "models/item/" + objModel + ".obj")) .flipV(true) .end() .texture("qr", "minecraft:block/oak_planks") .texture("particle", "#qr"); - getVariantBuilder(NewModelLoaderTest.obj_block.get()) + getVariantBuilder(block.get()) .partialState() .with(BlockStateProperties.HORIZONTAL_FACING, Direction.EAST) .addModels(new ConfiguredModel(model, 0, 90, false)) diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java index e08b925d204..bfc23f2f40c 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java @@ -20,7 +20,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.conditions.ConditionalOps; -import net.neoforged.neoforge.common.conditions.TrueCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.conditions.WithConditions; import org.slf4j.Logger; @@ -77,7 +77,7 @@ public static void testReadMatchingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "i": 1, "s": "test" @@ -91,7 +91,7 @@ public static void testReadFailingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:false" } + { "type": "neoforge:never" } ], "i": 1, "s": "test" @@ -109,7 +109,7 @@ public static void testReadNested() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "neoforge:value": { "i": 1, @@ -136,12 +136,12 @@ public static void testWriteWithConditions() { { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "i": 1, "s": "test" - }""", write(SimpleRecord.CONDITIONS_CODEC, Optional.of(WithConditions.builder(record).addCondition(TrueCondition.INSTANCE).build()))); + }""", write(SimpleRecord.CONDITIONS_CODEC, Optional.of(WithConditions.builder(record).addCondition(NeoForgeConditions.always()).build()))); } private record SimpleRecord(int i, String s) { @@ -184,7 +184,7 @@ public static void testReadMatchingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "neoforge:value": 1 } @@ -197,7 +197,7 @@ public static void testReadFailingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:false" } + { "type": "neoforge:never" } ], "i": 1, "s": "test" @@ -219,11 +219,11 @@ public static void testWriteWithConditions() { { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "neoforge:value": 1 - }""", write(CONDITIONS_INT, Optional.of(WithConditions.builder(1).addCondition(TrueCondition.INSTANCE).build()))); + }""", write(CONDITIONS_INT, Optional.of(WithConditions.builder(1).addCondition(NeoForgeConditions.always()).build()))); } } diff --git a/tests/src/main/resources/assets/new_model_loader_test/models/item/sugar_glider_same_part_names.obj b/tests/src/main/resources/assets/new_model_loader_test/models/item/sugar_glider_same_part_names.obj new file mode 100644 index 00000000000..a75139541ad --- /dev/null +++ b/tests/src/main/resources/assets/new_model_loader_test/models/item/sugar_glider_same_part_names.obj @@ -0,0 +1,579 @@ +# Rhino + +mtllib sugar_glider.mtl +o object +usemtl New material 001 (1) +v 0.7132 0.6084 0.6162 +v 0.7132 0.3283 0.4863 +v 0.8296 0.5819 0.6734 +v 0.8296 0.3018 0.5435 +v 0.8605 0.7225 0.3699 +v 0.8605 0.4425 0.24 +v 0.9769 0.6963 0.4272 +v 0.9769 0.4159 0.2973 +vt 0.7132 0.6084 +vt 0.6162 0.6084 +vt 0.7132 0.3838 +vt 0.7132 0.3283 +vt 0.4863 0.3283 +vt 0.2868 0.5137 +vt 0.8296 0.5819 +vt 0.3266 0.5819 +vt 0.8296 0.3266 +vt 0.8296 0.3018 +vt 0.4565 0.3018 +vt 0.1704 0.4565 +vt 0.1395 0.7225 +vt 0.3699 0.7225 +vt 0.8605 0.6301 +vt 0.1395 0.4425 +vt 0.24 0.4425 +vt 0.1395 0.76 +vt 0.5728 0.6963 +vt 0.0231 0.6963 +vt 0.9769 0.5728 +vt 0.7027 0.4159 +vt 0.0231 0.4159 +vt 0.0231 0.7027 +vn -0.4768 -0.3698 0.7974 +vn -0.879 0.2006 -0.4325 +vn 0 0.9072 0.4207 +vn -0.4768 -0.3698 0.7974 +vn -0.879 0.2006 -0.4325 +vn 0 -0.9072 -0.4207 +vn -0.4768 -0.3698 0.7974 +vn 0.879 -0.2006 0.4325 +vn 0 0.9072 0.4207 +vn -0.4768 -0.3698 0.7974 +vn 0.879 -0.2006 0.4325 +vn 0 -0.9072 -0.4207 +vn 0.4768 0.3698 -0.7974 +vn -0.879 0.2006 -0.4325 +vn 0 0.9072 0.4207 +vn 0.4768 0.3698 -0.7974 +vn -0.879 0.2006 -0.4325 +vn 0 -0.9072 -0.4207 +vn 0.879 -0.2006 0.4325 +vn 0.4768 0.3698 -0.7974 +vn 0 0.9072 0.4207 +vn 0.879 -0.2006 0.4325 +vn 0.4768 0.3698 -0.7974 +vn 0 -0.9072 -0.4207 +f 2/4/4 4/10/10 3/7/7 1/1/1 +f 4/11/11 8/22/22 7/19/19 3/8/8 +f 8/23/23 6/16/16 5/13/13 7/20/20 +f 6/17/17 2/5/5 1/2/2 5/14/14 +f 6/18/18 8/24/24 4/12/12 2/6/6 +f 3/9/9 7/21/21 5/15/15 1/3/3 +o object +usemtl New material 001 +v 0.2059 0 0.7941 +v 0.2059 0.5883 0.7941 +v 0.2059 0 0.2059 +v 0.2059 0.5883 0.2059 +v 0.7941 0 0.7941 +v 0.7941 0.5883 0.7941 +v 0.7941 0 0.2059 +v 0.7941 0.5883 0.2059 +vt 0.2059 0 +vt 0.7941 0 +vt 0.7941 0.2059 +vt 0.2059 0.5883 +vt 0.7941 0.5883 +vt 0.2059 0.2059 +vt 0.7941 0 +vt 0.2059 0 +vt 0.7941 0.7941 +vt 0.7941 0.5883 +vt 0.2059 0.5883 +vt 0.2059 0.7941 +vt 0.7941 0 +vt 0.2059 0 +vt 0.2059 0.2059 +vt 0.7941 0.5883 +vt 0.2059 0.5883 +vt 0.7941 0.2059 +vt 0.7941 0 +vt 0.2059 0 +vt 0.2059 0.7941 +vt 0.7941 0.5883 +vt 0.2059 0.5883 +vt 0.7941 0.7941 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 1 0 +f 9/25/25 13/37/37 14/40/40 10/28/28 +f 13/38/38 15/43/43 16/46/46 14/41/41 +f 15/44/44 11/31/31 12/34/34 16/47/47 +f 11/32/32 9/26/26 10/29/29 12/35/35 +f 11/33/33 15/45/45 13/39/39 9/27/27 +f 14/42/42 16/48/48 12/36/36 10/30/30 +o object +usemtl Default +v 0.5294 0.2353 0.8235 +v 0.5294 0.4706 0.8235 +v 0.5294 0.2353 0.7941 +v 0.5294 0.4706 0.7941 +v 0.7647 0.2353 0.8235 +v 0.7647 0.4706 0.8235 +v 0.7647 0.2353 0.7941 +v 0.7647 0.4706 0.7941 +vt 0.4706 0.1765 +vt 0.8235 0.2353 +vt 0.5294 0.2353 +vt 0.5294 0.1765 +vt 0.8235 0.4706 +vt 0.5294 0.4706 +vt 0.4706 0.2059 +vt 0.7941 0.2353 +vt 0.4706 0.2353 +vt 0.5294 0.2059 +vt 0.7941 0.4706 +vt 0.4706 0.4706 +vt 0.2353 0.1765 +vt 0.1765 0.2353 +vt 0.7647 0.2353 +vt 0.1765 0.4706 +vt 0.7647 0.1765 +vt 0.7647 0.4706 +vt 0.2353 0.2059 +vt 0.2059 0.2353 +vt 0.2353 0.2353 +vt 0.2059 0.4706 +vt 0.7647 0.2059 +vt 0.2353 0.4706 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +f 19/55/55 23/67/67 21/61/61 17/49/49 +f 23/68/68 24/70/70 22/64/64 21/62/62 +f 24/71/71 20/58/58 18/52/52 22/65/65 +f 20/59/59 19/56/56 17/50/50 18/53/53 +f 20/60/60 24/72/72 23/69/69 19/57/57 +f 21/63/63 22/66/66 18/54/54 17/51/51 +o object +usemtl Default +v 0.2353 0.2353 0.8235 +v 0.2353 0.4706 0.8235 +v 0.2353 0.2353 0.7941 +v 0.2353 0.4706 0.7941 +v 0.4706 0.2353 0.8235 +v 0.4706 0.4706 0.8235 +v 0.4706 0.2353 0.7941 +v 0.4706 0.4706 0.7941 +vt 0.7647 0.1765 +vt 0.8235 0.2353 +vt 0.2353 0.2353 +vt 0.2353 0.1765 +vt 0.8235 0.4706 +vt 0.2353 0.4706 +vt 0.7647 0.2059 +vt 0.7941 0.2353 +vt 0.7647 0.2353 +vt 0.2353 0.2059 +vt 0.7941 0.4706 +vt 0.7647 0.4706 +vt 0.5294 0.1765 +vt 0.1765 0.2353 +vt 0.4706 0.2353 +vt 0.1765 0.4706 +vt 0.4706 0.1765 +vt 0.4706 0.4706 +vt 0.5294 0.2059 +vt 0.2059 0.2353 +vt 0.5294 0.2353 +vt 0.2059 0.4706 +vt 0.4706 0.2059 +vt 0.5294 0.4706 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +f 27/79/79 31/91/91 29/85/85 25/73/73 +f 31/92/92 32/94/94 30/88/88 29/86/86 +f 32/95/95 28/82/82 26/76/76 30/89/89 +f 28/83/83 27/80/80 25/74/74 26/77/77 +f 28/84/84 32/96/96 31/93/93 27/81/81 +f 29/87/87 30/90/90 26/78/78 25/75/75 +o object +usemtl New material 001 +v 0.4118 0 0.8824 +v 0.4118 0.1765 0.8824 +v 0.4118 0 0.7353 +v 0.4118 0.1765 0.7353 +v 0.5882 0 0.8824 +v 0.5882 0.1765 0.8824 +v 0.5882 0 0.7353 +v 0.5882 0.1765 0.7353 +vt 0.4118 0 +vt 0.8824 0 +vt 0.5882 0.1176 +vt 0.4118 0.1765 +vt 0.8824 0.1765 +vt 0.4118 0.1176 +vt 0.5882 0 +vt 0.7353 0 +vt 0.5882 0.2647 +vt 0.5882 0.1765 +vt 0.7353 0.1765 +vt 0.4118 0.2647 +vt 0.5882 0 +vt 0.1176 0 +vt 0.4118 0.1176 +vt 0.5882 0.1765 +vt 0.1176 0.1765 +vt 0.5882 0.1176 +vt 0.2647 0 +vt 0.4118 0 +vt 0.4118 0.2647 +vt 0.2647 0.1765 +vt 0.4118 0.1765 +vt 0.5882 0.2647 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 1 0 +f 33/97/97 37/109/109 38/112/112 34/100/100 +f 37/110/110 39/115/115 40/118/118 38/113/113 +f 39/116/116 35/103/103 36/106/106 40/119/119 +f 35/104/104 33/98/98 34/101/101 36/107/107 +f 35/105/105 39/117/117 37/111/111 33/99/99 +f 38/114/114 40/120/120 36/108/108 34/102/102 +o object +usemtl New material 002 +v 0.4706 0.1176 0.9118 +v 0.4706 0.1765 0.9118 +v 0.4706 0.1176 0.8824 +v 0.4706 0.1765 0.8824 +v 0.5294 0.1176 0.9118 +v 0.5294 0.1765 0.9118 +v 0.5294 0.1176 0.8824 +v 0.5294 0.1765 0.8824 +vt 0.5294 0.0882 +vt 0.9118 0.1176 +vt 0.4706 0.1176 +vt 0.4706 0.0882 +vt 0.9118 0.1765 +vt 0.4706 0.1765 +vt 0.5294 0.1176 +vt 0.8824 0.1176 +vt 0.5294 0.1176 +vt 0.4706 0.1176 +vt 0.8824 0.1765 +vt 0.5294 0.1765 +vt 0.4706 0.0882 +vt 0.0882 0.1176 +vt 0.5294 0.1176 +vt 0.0882 0.1765 +vt 0.5294 0.0882 +vt 0.5294 0.1765 +vt 0.4706 0.1176 +vt 0.1176 0.1176 +vt 0.4706 0.1176 +vt 0.1176 0.1765 +vt 0.5294 0.1176 +vt 0.4706 0.1765 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +f 43/127/127 47/139/139 45/133/133 41/121/121 +f 47/140/140 48/142/142 46/136/136 45/134/134 +f 48/143/143 44/130/130 42/124/124 46/137/137 +f 44/131/131 43/128/128 41/122/122 42/125/125 +f 44/132/132 48/144/144 47/141/141 43/129/129 +f 45/135/135 46/138/138 42/126/126 41/123/123 +o object +usemtl New material 003 +v 0.5882 0.2736 0.8347 +v 0.5882 0.3912 0.8347 +v 0.5882 0.2736 0.8053 +v 0.5882 0.3912 0.8053 +v 0.7059 0.2736 0.8347 +v 0.7059 0.3912 0.8347 +v 0.7059 0.2736 0.8053 +v 0.7059 0.3912 0.8053 +vt 0.4118 0.1653 +vt 0.8347 0.2736 +vt 0.5882 0.2736 +vt 0.5882 0.1653 +vt 0.8347 0.3912 +vt 0.5882 0.3912 +vt 0.4118 0.1947 +vt 0.8053 0.2736 +vt 0.4118 0.2736 +vt 0.5882 0.1947 +vt 0.8053 0.3912 +vt 0.4118 0.3912 +vt 0.2941 0.1653 +vt 0.1653 0.2736 +vt 0.7059 0.2736 +vt 0.1653 0.3912 +vt 0.7059 0.1653 +vt 0.7059 0.3912 +vt 0.2941 0.1947 +vt 0.1947 0.2736 +vt 0.2941 0.2736 +vt 0.1947 0.3912 +vt 0.7059 0.1947 +vt 0.2941 0.3912 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +f 51/151/151 55/163/163 53/157/157 49/145/145 +f 55/164/164 56/166/166 54/160/160 53/158/158 +f 56/167/167 52/154/154 50/148/148 54/161/161 +f 52/155/155 51/152/152 49/146/146 50/149/149 +f 52/156/156 56/168/168 55/165/165 51/153/153 +f 53/159/159 54/162/162 50/150/150 49/147/147 +o object +usemtl New material 003 +v 0.2941 0.2736 0.8347 +v 0.2941 0.3912 0.8347 +v 0.2941 0.2736 0.8053 +v 0.2941 0.3912 0.8053 +v 0.4118 0.2736 0.8347 +v 0.4118 0.3912 0.8347 +v 0.4118 0.2736 0.8053 +v 0.4118 0.3912 0.8053 +vt 0.7059 0.1653 +vt 0.8347 0.2736 +vt 0.2941 0.2736 +vt 0.2941 0.1653 +vt 0.8347 0.3912 +vt 0.2941 0.3912 +vt 0.7059 0.1947 +vt 0.8053 0.2736 +vt 0.7059 0.2736 +vt 0.2941 0.1947 +vt 0.8053 0.3912 +vt 0.7059 0.3912 +vt 0.5882 0.1653 +vt 0.1653 0.2736 +vt 0.4118 0.2736 +vt 0.1653 0.3912 +vt 0.4118 0.1653 +vt 0.4118 0.3912 +vt 0.5882 0.1947 +vt 0.1947 0.2736 +vt 0.5882 0.2736 +vt 0.1947 0.3912 +vt 0.4118 0.1947 +vt 0.5882 0.3912 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +f 59/175/175 63/187/187 61/181/181 57/169/169 +f 63/188/188 64/190/190 62/184/184 61/182/182 +f 64/191/191 60/178/178 58/172/172 62/185/185 +f 60/179/179 59/176/176 57/170/170 58/173/173 +f 60/180/180 64/192/192 63/189/189 59/177/177 +f 61/183/183 62/186/186 58/174/174 57/171/171 +o object +usemtl New material 001 (1) +v 0.02313 0.6963 0.4272 +v 0.02313 0.4159 0.2973 +v 0.1395 0.7225 0.3699 +v 0.1395 0.4425 0.24 +v 0.1704 0.5819 0.6734 +v 0.1704 0.3018 0.5435 +v 0.2868 0.6084 0.6162 +v 0.2868 0.3283 0.4863 +vt 0.9769 0.6963 +vt 0.4272 0.6963 +vt 0.02313 0.5728 +vt 0.9769 0.4159 +vt 0.2973 0.4159 +vt 0.9769 0.7027 +vt 0.6301 0.7225 +vt 0.8605 0.7225 +vt 0.1395 0.6301 +vt 0.76 0.4425 +vt 0.8605 0.4425 +vt 0.8605 0.76 +vt 0.6734 0.5819 +vt 0.1704 0.5819 +vt 0.1704 0.3266 +vt 0.5435 0.3018 +vt 0.1704 0.3018 +vt 0.8296 0.4565 +vt 0.3838 0.6084 +vt 0.2868 0.6084 +vt 0.2868 0.3838 +vt 0.5137 0.3283 +vt 0.2868 0.3283 +vt 0.7132 0.5137 +vn -0.4768 0.3698 -0.7974 +vn -0.879 -0.2006 0.4325 +vn 0 0.9072 0.4207 +vn -0.4768 0.3698 -0.7974 +vn -0.879 -0.2006 0.4325 +vn 0 -0.9072 -0.4207 +vn 0.879 0.2006 -0.4325 +vn -0.4768 0.3698 -0.7974 +vn 0 0.9072 0.4207 +vn 0.879 0.2006 -0.4325 +vn -0.4768 0.3698 -0.7974 +vn 0 -0.9072 -0.4207 +vn -0.879 -0.2006 0.4325 +vn 0.4768 -0.3698 0.7974 +vn 0 0.9072 0.4207 +vn -0.879 -0.2006 0.4325 +vn 0.4768 -0.3698 0.7974 +vn 0 -0.9072 -0.4207 +vn 0.879 0.2006 -0.4325 +vn 0.4768 -0.3698 0.7974 +vn 0 0.9072 0.4207 +vn 0.879 0.2006 -0.4325 +vn 0.4768 -0.3698 0.7974 +vn 0 -0.9072 -0.4207 +f 72/214/214 68/202/202 67/199/199 71/211/211 +f 68/203/203 66/196/196 65/193/193 67/200/200 +f 66/197/197 70/208/208 69/205/205 65/194/194 +f 70/209/209 72/215/215 71/212/212 69/206/206 +f 66/198/198 68/204/204 72/216/216 70/210/210 +f 71/213/213 67/201/201 65/195/195 69/207/207