diff --git a/build_forge.gradle b/build_forge.gradle index b2b773ee3c..aa7096a6e9 100644 --- a/build_forge.gradle +++ b/build_forge.gradle @@ -231,7 +231,6 @@ patcher { args '--launchTarget', 'forge_dev_client_data', '--mod', 'forge', '--all', - '--validate', '--output', rootProject.file('src/main/generated/'), '--existing', sourceSets.main.resources.srcDirs[0], '--assetsDir', downloadAssets.output, diff --git a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch index f66092ddbf..9cf64b4266 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch @@ -33,25 +33,17 @@ .tooltip(tooltip) .build() ) -@@ -289,6 +_,7 @@ - if ((i & -67108864) != 0) { - super.render(p_282860_, p_281753_, p_283539_, p_282628_); - this.logoRenderer.renderLogo(p_282860_, this.width, f); -+ net.minecraftforge.client.ForgeHooksClient.renderMainMenu(this, p_282860_, this.font, this.width, this.height, i); - if (this.splash != null && !this.minecraft.options.hideSplashTexts().get()) { - this.splash.render(p_282860_, this.width, this.font, i); - } @@ -304,10 +_,18 @@ s = s + I18n.get("menu.modded"); } - p_282860_.drawString(this.font, s, 2, this.height - 10, 16777215 | i); + net.minecraftforge.internal.BrandingControl.forEachLine(true, true, (brd, brdline) -> -+ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), 16777215 | i) ++ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), 16777215 | i) + ); + + net.minecraftforge.internal.BrandingControl.forEachAboveCopyrightLine((brd, brdline) -> -+ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), 16777215 | i) ++ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), 16777215 | i) + ); + if (this.realmsNotificationsEnabled() && f >= 1.0F) { diff --git a/patches/minecraft/net/minecraft/core/RegistrySetBuilder.java.patch b/patches/minecraft/net/minecraft/core/RegistrySetBuilder.java.patch index a6a93e6d29..5f1b3c9ca1 100644 --- a/patches/minecraft/net/minecraft/core/RegistrySetBuilder.java.patch +++ b/patches/minecraft/net/minecraft/core/RegistrySetBuilder.java.patch @@ -1,6 +1,50 @@ --- a/net/minecraft/core/RegistrySetBuilder.java +++ b/net/minecraft/core/RegistrySetBuilder.java -@@ -74,6 +_,10 @@ +@@ -22,7 +_,8 @@ + import net.minecraft.tags.TagKey; + import org.apache.commons.lang3.mutable.MutableObject; + +-public class RegistrySetBuilder { ++public class RegistrySetBuilder implements net.minecraftforge.common.extensions.IForgeRegistrySetBuilder { ++ private final it.unimi.dsi.fastutil.objects.Object2IntMap>> indexes = new it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap<>(); + private final List> entries = new ArrayList<>(); + + static HolderGetter wrapContextLookup(final HolderLookup.RegistryLookup p_255625_) { +@@ -66,14 +_,43 @@ + public RegistrySetBuilder add( + ResourceKey> p_256446_, Lifecycle p_256394_, RegistrySetBuilder.RegistryBootstrap p_256638_ + ) { +- this.entries.add(new RegistrySetBuilder.RegistryStub<>(p_256446_, p_256394_, p_256638_)); ++ add(new RegistrySetBuilder.RegistryStub<>(p_256446_, p_256394_, p_256638_)); + return this; + } + ++ // Forge: This merges two entries in this builder together, so that we can reuse vanilla boostrap methods, or potentially other modder's methods. ++ private RegistrySetBuilder.RegistryStub add(RegistrySetBuilder.RegistryStub entry) { ++ int idx = indexes.getOrDefault(entry.key(), -1); ++ if (idx != -1) { ++ var _oldB = ((RegistrySetBuilder.RegistryStub)this.entries.get(idx)).bootstrap(); ++ var _newB = entry.bootstrap(); ++ var _new = new RegistrySetBuilder.RegistryStub<>(entry.key(), entry.lifecycle(), ctx -> { ++ _oldB.run(ctx); ++ _newB.run(ctx); ++ }); ++ this.entries.set(idx, _new); ++ return _new; ++ } else { ++ this.indexes.put(entry.key(), this.entries.size()); ++ this.entries.add(entry); ++ return entry; ++ } ++ } ++ ++ public RegistrySetBuilder copy() { ++ var ret = new RegistrySetBuilder(); ++ this.entries.forEach(ret::add); ++ return ret; ++ } ++ + public RegistrySetBuilder add(ResourceKey> p_256261_, RegistrySetBuilder.RegistryBootstrap p_256010_) { return this.add(p_256261_, Lifecycle.stable(), p_256010_); } diff --git a/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch b/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch index 3272c9aff3..029d03475d 100644 --- a/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch +++ b/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch @@ -36,7 +36,18 @@ PackOutput.PathProvider packoutput$pathprovider = this.output.createRegistryElementsPathProvider(resourcekey); return CompletableFuture.allOf( p_358460_.listElements() -+ .filter(holder -> this.namespacePredicate.test(holder.key().location().getNamespace())) ++ .filter(holder -> shouldDump(holder.key())) .map( p_256105_ -> dumpValue( packoutput$pathprovider.json(p_256105_.key().location()), +@@ -65,6 +_,10 @@ + ); + } + ); ++ } ++ ++ protected boolean shouldDump(ResourceKey key) { ++ return this.namespacePredicate.test(key.location().getNamespace()); + } + + private static CompletableFuture dumpValue( diff --git a/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch b/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch index 7a441193a0..c1525a14e0 100644 --- a/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch +++ b/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch @@ -8,3 +8,13 @@ private static void validateThatAllBiomeFeaturesHaveBiomeFilter(HolderLookup.Provider p_256242_) { validateThatAllBiomeFeaturesHaveBiomeFilter(p_256242_.lookupOrThrow(Registries.PLACED_FEATURE), p_256242_.lookupOrThrow(Registries.BIOME)); +@@ -119,5 +_,9 @@ + HolderLookup.Provider holderlookup$provider = BUILDER.build(registryaccess$frozen); + validateThatAllBiomeFeaturesHaveBiomeFilter(holderlookup$provider); + return holderlookup$provider; ++ } ++ ++ public static RegistrySetBuilder builder() { ++ return BUILDER.copy(); + } + } diff --git a/settings.gradle b/settings.gradle index 553af024a2..0e8389b1e3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -124,7 +124,7 @@ include ':forge' project(":forge").projectDir = file("projects/forge") project(':forge').buildFileName = '../../build_forge.gradle' -if (!System.env.TEAMCITY_VERSION) { +if (false && !System.env.TEAMCITY_VERSION) { include ':clean' project(':clean').projectDir = file('projects/clean') project(':clean').buildFileName = '../../build_clean.gradle' diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index aea6e8bccd..a01eb48892 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -27,7 +27,6 @@ import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.client.gui.components.LerpingBossEvent; import net.minecraft.client.gui.screens.ConfirmScreen; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; @@ -50,7 +49,6 @@ import net.minecraft.client.renderer.entity.state.HumanoidRenderState; import net.minecraft.client.renderer.texture.SpriteContents; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.metadata.animation.FrameSize; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelBakery; @@ -132,7 +130,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoader; -import net.minecraftforge.fml.VersionChecker; import net.minecraftforge.network.NetworkContext; import net.minecraftforge.network.NetworkInitialization; import net.minecraftforge.network.NetworkRegistry; @@ -293,50 +290,6 @@ public class ForgeHooksClient { } } - /** - * Initialization of Forge Renderers. - */ - static { - //FluidRegistry.renderIdFluid = RenderingRegistry.getNextAvailableRenderId(); - //RenderingRegistry.registerBlockHandler(RenderBlockFluid.instance); - } - - private static VersionChecker.Status getForgeVersionStatus() { - final class LazyInit { - private static final VersionChecker.Status INSTANCE = ForgeVersion.getStatus(); - - static { - forgeStatusLine = switch (INSTANCE) { - // case FAILED -> " Version check failed"; - // case UP_TO_DATE -> "Forge up to date"; - // case AHEAD -> "Using non-recommended Forge build, issues may arise."; - case OUTDATED, BETA_OUTDATED -> I18n.get("forge.update.newversion", ForgeVersion.getTarget()); - default -> null; - }; - } - - private LazyInit() {} - } - - return LazyInit.INSTANCE; - } - - // NO-OP method, kept for bin-compat. Used in TitleScreen.java - @Deprecated(forRemoval = true, since = "1.21.4") - public static void renderMainMenu(TitleScreen gui, GuiGraphics graphics, Font font, int width, int height, int alpha) { - /* - VersionChecker.Status status = getForgeVersionStatus(); - - if (status == VersionChecker.Status.BETA || status == VersionChecker.Status.BETA_OUTDATED) { - // Render a warning at the top of the screen - Component line = Component.translatable("forge.update.beta.1", ChatFormatting.RED, ChatFormatting.RESET).withStyle(ChatFormatting.RED); - graphics.drawCenteredString(font, line, width / 2, 4, 0xFFFFFF | alpha); - line = Component.translatable("forge.update.beta.2"); - graphics.drawCenteredString(font, line, width / 2, 4 + (font.lineHeight + 1), 0xFFFFFF | alpha); - } - */ - } - public static String forgeStatusLine; @Nullable diff --git a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java index 561bcb10ef..d3145c826f 100644 --- a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java +++ b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java @@ -412,7 +412,8 @@ public enum ForgeRenderTypes { /** * Use {@link #TEXT_INTENSITY_SEE_THROUGH} instead. */ - @Deprecated + @SuppressWarnings("unused") + @Deprecated(forRemoval = true, since = "1.21.5") public static Function TEXT_INTENSITY_SEETHROUGH = TEXT_INTENSITY_SEE_THROUGH; private static RenderType getTextIntensitySeeThrough(ResourceLocation locationIn) { return create( diff --git a/src/main/java/net/minecraftforge/client/gui/ModMismatchDisconnectedScreen.java b/src/main/java/net/minecraftforge/client/gui/ModMismatchDisconnectedScreen.java index 1e8905ffd3..6601211880 100644 --- a/src/main/java/net/minecraftforge/client/gui/ModMismatchDisconnectedScreen.java +++ b/src/main/java/net/minecraftforge/client/gui/ModMismatchDisconnectedScreen.java @@ -18,8 +18,6 @@ import java.util.stream.Collectors; import net.minecraftforge.client.gui.widget.ScrollPanel; import org.apache.commons.lang3.tuple.Pair; -import com.mojang.blaze3d.vertex.Tesselator; - import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; diff --git a/src/main/java/net/minecraftforge/common/data/DatapackBuiltinEntriesProvider.java b/src/main/java/net/minecraftforge/common/data/DatapackBuiltinEntriesProvider.java index b79243cc9e..8afbbd3427 100644 --- a/src/main/java/net/minecraftforge/common/data/DatapackBuiltinEntriesProvider.java +++ b/src/main/java/net/minecraftforge/common/data/DatapackBuiltinEntriesProvider.java @@ -22,6 +22,18 @@ public class DatapackBuiltinEntriesProvider extends RegistriesDatapackGenerator private final CompletableFuture fullRegistries; + /** + * Constructs a new datapack provider which generates all registry objects + * from the provided mods using the holder. + * + * @param output the target directory of the data generator + * @param registries a future of patched registries + * @param modId The mod id to generate the dynamic registry objects of + */ + public DatapackBuiltinEntriesProvider(PackOutput output, CompletableFuture registries, String modId) { + this(output, registries, Set.of(modId)); + } + /** * Constructs a new datapack provider which generates all registry objects * from the provided mods using the holder. @@ -35,6 +47,20 @@ public class DatapackBuiltinEntriesProvider extends RegistriesDatapackGenerator this.fullRegistries = registries.thenApply(RegistrySetBuilder.PatchedRegistries::full); } + /** + * Constructs a new datapack provider which generates all registry objects + * from the provided mods using the holder. All entries that need to be + * bootstrapped are provided within the {@link RegistrySetBuilder}. + * + * @param output the target directory of the data generator + * @param registries a future of a lookup for registries and their objects + * @param registryBuilder a builder containing the dynamic registry objects added by this provider + * @param modId The mod id to generate the dynamic registry objects of + */ + public DatapackBuiltinEntriesProvider(PackOutput output, CompletableFuture registries, RegistrySetBuilder registryBuilder, String modId) { + this(output, registries, registryBuilder, Set.of(modId)); + } + /** * Constructs a new datapack provider which generates all registry objects * from the provided mods using the holder. All entries that need to be diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java index ced2afc0d8..65904e5495 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java @@ -87,7 +87,7 @@ public interface IForgeBlockEntity extends ICapabilityProvider { bb = AABB.encapsulatingFullBlocks(pos.offset(-1, 0, -1), pos.offset(1, 0, 1)); } else if (block == Blocks.STRUCTURE_BLOCK) { bb = INFINITE_EXTENT_AABB; - } else if (block != null && block != Blocks.BEACON) { + } else if (block != null && block != Blocks.BEACON && block != Blocks.TEST_INSTANCE_BLOCK) { AABB cbb = null; try { VoxelShape collisionShape = state.getCollisionShape(self().getLevel(), pos); diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeRegistrySetBuilder.java b/src/main/java/net/minecraftforge/common/extensions/IForgeRegistrySetBuilder.java new file mode 100644 index 0000000000..22e4b21bae --- /dev/null +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeRegistrySetBuilder.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common.extensions; + +import com.mojang.serialization.Lifecycle; + +import net.minecraft.core.RegistrySetBuilder; +import net.minecraftforge.registries.DeferredRegisterData; + +public interface IForgeRegistrySetBuilder { + private RegistrySetBuilder self() { + return (RegistrySetBuilder)this; + } + + default RegistrySetBuilder add(DeferredRegisterData dr) { + return self().add(dr.getRegistryKey(), dr); + } + + default RegistrySetBuilder add(DeferredRegisterData dr, Lifecycle lifecycle) { + return self().add(dr.getRegistryKey(), lifecycle, dr); + } +} diff --git a/src/main/java/net/minecraftforge/gametest/ForgeGameTestHooks.java b/src/main/java/net/minecraftforge/gametest/ForgeGameTestHooks.java index 48d8f5ffd1..d31acf94d4 100644 --- a/src/main/java/net/minecraftforge/gametest/ForgeGameTestHooks.java +++ b/src/main/java/net/minecraftforge/gametest/ForgeGameTestHooks.java @@ -6,46 +6,31 @@ package net.minecraftforge.gametest; import net.minecraft.SharedConstants; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestEnvironments; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.gametest.framework.GameTestInstance; import net.minecraft.gametest.framework.TestData; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import net.minecraftforge.forgespi.language.ModFileScanData; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import org.objectweb.asm.Type; - +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Locale; import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.function.Consumer; /** * Internal class used to glue mods into the game test framework. * Modders should use the supplied annotations and DeferredRegister */ -@SuppressWarnings("unused") @ApiStatus.Internal public class ForgeGameTestHooks { - private static boolean registeredGametests = false; - private static final Logger LOGGER = LogManager.getLogger(); - private static final Type GAME_TEST_HOLDER = Type.getType(GameTestHolder.class); + private static MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); public static boolean isGametestEnabled() { return !FMLLoader.isProduction() && (SharedConstants.IS_RUNNING_IN_IDE || isGametestServer() || Boolean.getBoolean("forge.enableGameTest")); @@ -55,78 +40,45 @@ public class ForgeGameTestHooks { return !FMLLoader.isProduction() && Boolean.getBoolean("forge.gameTestServer"); } -/* - @SuppressWarnings("deprecation") - public static void registerGametests() { - if (!registeredGametests && isGametestEnabled() && ModLoader.isLoadingStateValid()) { - Set enabledNamespaces = getEnabledNamespaces(); - LOGGER.info("Enabled Gametest Namespaces: {}", enabledNamespaces); - - Set gameTestMethods = new HashSet<>(); - RegisterGameTestsEvent event = new RegisterGameTestsEvent(gameTestMethods); - - ModLoader.get().postEvent(event); - - ModList.get().getAllScanData().stream() - .map(ModFileScanData::getAnnotations) - .flatMap(Collection::stream) - .filter(a -> GAME_TEST_HOLDER.equals(a.annotationType())) - .forEach(a -> addGameTestMethods(a, gameTestMethods)); - - for (Method gameTestMethod : gameTestMethods) { - GameTestRegistry.register(gameTestMethod, enabledNamespaces); - } - - registeredGametests = true; - } - } - - private static Set getEnabledNamespaces() { - String enabledNamespacesStr = System.getProperty("forge.enabledGameTestNamespaces"); - if (enabledNamespacesStr == null) - return Set.of(); - - return Arrays.stream(enabledNamespacesStr.split(",")).filter(s -> !s.isBlank()).collect(Collectors.toUnmodifiableSet()); - } - - private static void addGameTestMethods(AnnotationData annotationData, Set gameTestMethods) { - try { - Class clazz = Class.forName(annotationData.clazz().getClassName(), true, ForgeGameTestHooks.class.getClassLoader()); - - gameTestMethods.addAll(Arrays.asList(clazz.getDeclaredMethods())); - } catch (ClassNotFoundException e) { - // Should not be possible - throw new RuntimeException(e); - } - } - - public static String getTestName(Method method, GameTest meta) { - var name = method.getName().toLowerCase(Locale.ENGLISH); - return getPrefixed(method, name); - } - - private static String getPrefixed(Method method, String name) { - var prefix = getPrefix(method); - return prefix == null ? name : prefix + '.' + name; - } @Nullable - private static String getPrefix(Method method) { + private static boolean shouldPrefix(Method method) { var cls = method.getDeclaringClass(); - var shouldPrefix = !method.isAnnotationPresent(GameTestDontPrefix.class) && - !cls.isAnnotationPresent(GameTestDontPrefix.class); - if (!shouldPrefix) - return null; + return !method.isAnnotationPresent(GameTestDontPrefix.class) && + !cls.isAnnotationPresent(GameTestDontPrefix.class); + } - return getPrefix(cls); + private static String snake(String input) { + var result = new StringBuilder(); + for (char c : input.toCharArray()) { + if (Character.isUpperCase(c)) { + if (!result.isEmpty()) + result.append('_'); + result.append(Character.toLowerCase(c)); + } else + result.append(c); + } + return result.toString(); } private static String getPrefix(Class cls) { var prefix = cls.getAnnotation(GameTestPrefix.class); if (prefix != null) - return prefix.value(); + return prefix.value() + '/'; - var holder = cls.getAnnotation(GameTestHolder.class); + var mod = cls.getAnnotation(Mod.class); + if (mod != null) { + var holder = cls.getAnnotation(GameTestNamespace.class); + if (holder != null && !holder.value().isEmpty()) + return mod.value() + '/'; + } + + + return cls.getSimpleName().toLowerCase(Locale.ENGLISH); + } + + private static String getNamespace(Class cls) { + var holder = cls.getAnnotation(GameTestNamespace.class); if (holder != null && !holder.value().isEmpty()) return holder.value(); @@ -134,21 +86,32 @@ public class ForgeGameTestHooks { if (mod != null) return mod.value(); - return cls.getSimpleName().toLowerCase(Locale.ENGLISH); + throw new IllegalArgumentException("Could not find modid for " + cls.getName()); } - private static ResourceLocation key(String namespace, String path) { - return path.indexOf(':') == -1 ? ResourceLocation.parse(path) : ResourceLocation.fromNamespaceAndPath(namespace, path); + private static ResourceLocation key(String namespace, String prefix, String path) { + if (path.indexOf(':') != -1) { + var rl = ResourceLocation.parse(path); + if (!prefix.isEmpty()) + return rl.withPrefix(prefix); + return rl; + } + + return ResourceLocation.fromNamespaceAndPath(namespace, prefix + path); } - public static Map gatherTests(Class root) { - String prefix = getPrefix(root); - var seen = new HashSet(); + public record TestReference(Consumer consumer, TestData data) {} + public static Map gatherTests(Class root, Object instance) { + var ret = new HashMap(); + var seen = new HashSet(); + String class_prefix = getPrefix(root); + String namespace = getNamespace(root); Class cls = root; + while (cls != Object.class) { for (var method : cls.getDeclaredMethods()) { - if (cls != root && Modifier.isStatic(method.getModifiers())) + if (!Modifier.isPublic(method.getModifiers()) || (cls != root && Modifier.isStatic(method.getModifiers()))) continue; var gametest = method.getAnnotation(GameTest.class); @@ -160,40 +123,73 @@ public class ForgeGameTestHooks { if (method.getParameterCount() != 1 || method.getParameterTypes()[0] != GameTestHelper.class) throw new IllegalStateException("Invalid @GameTest function " + owner + " incorrect arguments"); - var testName = key(prefix, gametest.name().isEmpty() ? method.getName() : gametest.name()); - if (!seen.add(testName)) { - if (!Modifier.isStatic(method.getModifiers())) - continue; - throw new IllegalStateException("Failed to register test, already seen " + testName + ", for " + owner); - } + // We don't want parent methods + if (!seen.add(method.getName())) + continue; - if (gametest.type() == GameTest.Type.FUNCTION) { - var funcName = key(prefix, gametest.function()); - var func = BuiltInRegistries.TEST_FUNCTION.get(funcName).orElse(null); + var prefix = shouldPrefix(method) ? class_prefix : ""; + var name = key(namespace, prefix, gametest.name().isEmpty() ? snake(method.getName()) : gametest.name()); - if (func == null) - throw new IllegalStateException("Could not find referenced function `" + funcName + "` for " + owner); + var structure = GameTest.DEFAULT_STRUCTURE.equals(gametest.structure()) + ? ResourceLocation.parse(gametest.structure()) + : key(namespace, "", gametest.structure()); - var data = getTestData(prefix, owner, gametest.data()); + var env = GameTestEnvironments.DEFAULT.equals(gametest.environment()) + ? ResourceLocation.withDefaultNamespace(gametest.environment()) + : key(namespace, "", gametest.environment()); + var data = new TestData( + env, + structure, + gametest.maxTicks(), + gametest.setupTicks(), + gametest.required(), + gametest.rotation(), + gametest.manualOnly(), + gametest.maxAttempts(), + gametest.requiredSuccesses(), + gametest.skyAccess() + ); - } else if (gametest.type() == GameTest.Type.BLOCK) { + MethodHandle handle = unreflect(method, owner); + Consumer func; + if (Modifier.isStatic(method.getModifiers())) { + func = ctx -> { + try { + handle.invoke(ctx); + } catch (Throwable e) { + sneakyThrow(e); + } + }; } else { - throw new IllegalStateException("Could not determine GameTest type for " + root.getName() + " -> " + gametest.type()); + func = ctx -> { + try { + handle.invoke(instance, ctx); + } catch (Throwable e) { + sneakyThrow(e); + } + }; } - - - + ret.put(name, new TestReference(func, data)); } + cls = cls.getSuperclass(); } + return ret; + } + + private static MethodHandle unreflect(Method method, String owner) { + try { + return LOOKUP.unreflect(method); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException("Failed to unreflect " + owner, e); + } } - private static TestData getTestData(String prefix, String owner, GameTest.Data data) { - var envName = key(prefix, data.environment()); - var env = BuiltInRegistries.TEST_ENVIRONMENT + @SuppressWarnings("unchecked") + private static void sneakyThrow(Throwable e) throws E { + throw (E)e; } -*/ } diff --git a/src/main/java/net/minecraftforge/gametest/GameTest.java b/src/main/java/net/minecraftforge/gametest/GameTest.java index f357e41896..d2494cc592 100644 --- a/src/main/java/net/minecraftforge/gametest/GameTest.java +++ b/src/main/java/net/minecraftforge/gametest/GameTest.java @@ -6,39 +6,23 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; +import net.minecraft.gametest.framework.GameTestEnvironments; import net.minecraft.world.level.block.Rotation; @Retention(RUNTIME) @Target(METHOD) public @interface GameTest { String name() default ""; - String function() default ""; - Type type() default Type.BLOCK; - Data data() default @Data; - - - int rotationSteps() default 0; - - - public enum Type { - BLOCK, - FUNCTION; - } - - /** - * Annotation definitions for {@link net.minecraft.gametest.framework.TestData} - */ - public @interface Data { - String environment() default ""; - String structure() default "forge:empty3x3"; - int maxTicks() default Integer.MAX_VALUE; - int setupTicks() default 0; - boolean required() default false; - Rotation rotation() default Rotation.NONE; - boolean manualOnly() default false; - int maxAttempts() default 1; - int requiredSuccesses() default 1; - boolean skyAccess() default false; - } + static final String DEFAULT_STRUCTURE = "forge:empty3x3x3"; + String environment() default GameTestEnvironments.DEFAULT; + String structure() default DEFAULT_STRUCTURE; + int maxTicks() default 100; + int setupTicks() default 0; + boolean required() default true; + Rotation rotation() default Rotation.NONE; + boolean manualOnly() default false; + int maxAttempts() default 1; + int requiredSuccesses() default 1; + boolean skyAccess() default false; } diff --git a/src/main/java/net/minecraftforge/gametest/GameTestHolder.java b/src/main/java/net/minecraftforge/gametest/GameTestHolder.java deleted file mode 100644 index 728165ad1c..0000000000 --- a/src/main/java/net/minecraftforge/gametest/GameTestHolder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.minecraftforge.gametest; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Marks a class as containing game tests that should be registered automatically. - * All methods annotated with {@link GameTest} or {@link GameTestGenerator} will be registered. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface GameTestHolder { - /** - * The default batch for all tests in this class that do not manually specify one. - * It it recommended that this includes your mod id. - *
- * This is also used when filtering out which batches to run during automation. - * the filters will be tested against the prefix of the batch name. So it is - * recommended to be structured in a logical fashion. - *
-     * Examples:
-     * forge.tags.items
-     * forge.tags.blocks
-     * forge.global_loot_modifiers.block_drops
-     * forge.global_loot_modifiers.tool_filter
-     * 
- * - * The filter 'forge.global_loot_modifiers' would execute both the block_drops and tool_filter batches. - *

- * This will default to your modid if it is on the same class that is annotated with {@link net.minecraftforge.fml.common.Mod @Mod} - */ - String value() default ""; - - /** - * Used as the default namespace to use for {@link GameTest#template() templates} for any game tests in the class. - * Defaults to the modid if in a class with @Mod or else defaults to "minecraft" - */ - String namespace() default ""; -} diff --git a/src/main/java/net/minecraftforge/gametest/GameTestNamespace.java b/src/main/java/net/minecraftforge/gametest/GameTestNamespace.java new file mode 100644 index 0000000000..b3f04848d3 --- /dev/null +++ b/src/main/java/net/minecraftforge/gametest/GameTestNamespace.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.gametest; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marks a class as containing game tests that should be registered automatically. + * All methods annotated with {@link GameTest} or {@link GameTestGenerator} will be registered. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface GameTestNamespace { + /** + * The default namespace for all tests in this class that do not manually specify one. + * It it recommended that this is your modid, but if you have multiple test mods that + * you want to group together you can use this to do so. + *

+ * This will default to your modid if it is on the same class that is annotated with {@link net.minecraftforge.fml.common.Mod @Mod} + */ + String value() default ""; +} diff --git a/src/main/java/net/minecraftforge/registries/DeferredRegisterData.java b/src/main/java/net/minecraftforge/registries/DeferredRegisterData.java new file mode 100644 index 0000000000..77cc7c513a --- /dev/null +++ b/src/main/java/net/minecraftforge/registries/DeferredRegisterData.java @@ -0,0 +1,309 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.registries; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistrySetBuilder.RegistryBootstrap; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraftforge.common.extensions.IForgeRegistrySetBuilder; +import org.jetbrains.annotations.NotNull; + +import com.mojang.serialization.Lifecycle; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Utility class to help with managing registry entries. + * Maintains a list of all suppliers for entries and registers them during the proper Register event. + * Suppliers should return NEW instances every time. + * + *Example Usage: + *

{@code
+ *    public static final DeferredRegisterData> CONFIGURED_FEATURES = DeferredRegisterData.create(Registries.CONFIGURED_FEATURE, MOD_ID);
+ *    private static final RegistryObject> CONFIGURED = CONFIGURED_FEATURES.register("configured", () ->
+ *        new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE)
+ *    );
+ *
+ *    public static final DeferredRegisterData PLACED_FEATURES = DeferredRegisterData.create(Registries.PLACED_FEATURE, MOD_ID);
+ *    private static final RegistryObject PLACED = PLACED_FEATURES.register("placed", () ->
+ *        new PlacedFeature(CONFIGURED.getHolder().orElseThrow(), List.of())
+ *    );
+ *
+ *    public static final DeferredRegisterData BIOME_MODIFIERS = DeferredRegisterData.create(ForgeRegistries.Keys.BIOME_MODIFIERS, MOD_ID);
+ *    @SuppressWarnings("unused")
+ *    private static final RegistryObject MODIFIER = BIOME_MODIFIERS.register("modifier", ctx -> {
+ *        return new ForgeBiomeModifiers.AddFeaturesBiomeModifier(
+ *            ctx.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD),
+ *            HolderSet.direct(PLACED.getHolder().orElseThrow()),
+ *            GenerationStep.Decoration.UNDERGROUND_ORES
+ *        );
+ *    });
+ *
+ *    protected void generateDataRegistries(GatherDataEvent event) {
+ *        var registrySet = VanillaRegistries.builder()
+ *            .add(CONFIGURED_FEATURES)
+ *            .add(PLACED_FEATURES)
+ *            .add(BIOME_MODIFIERS);
+ *
+ *        event.getGenerator().addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(
+ *        	gen.getPackOutput(), event.getLookupProvider(), registrySet, modid)
+ *        );
+ *    }
+ *
+ *}
+ * + * @param The base registry type + */ +public class DeferredRegisterData implements RegistryBootstrap { + + /** + * DeferredRegister factory for data driven registries. This will not create objects during the normal registry events. + * This is meant to be used as helper for creating a {@link RegistrySetBuilder}, and thus should NOT + * be registered to and {@link EventBus}. But instead used with {@link IForgeRegistrySetBuilder#add(DeferredRegister)}. + * + * @param registryKey the key of the registry to reference. + * @param modid the namespace for all objects registered to this DeferredRegister + */ + public static DeferredRegisterData.Builder builder(ResourceKey> registryKey, String modid) { + requireNonNull("registryKey", registryKey); + requireNonNull("modid", modid); + return new Builder<>(registryKey, modid); + } + + /** + * DeferredRegister factory for data driven registries. This will not create objects during the normal registry events. + * This is meant to be used as helper for creating a {@link RegistrySetBuilder}, and thus should NOT + * be registered to and {@link EventBus}. But instead used with {@link IForgeRegistrySetBuilder#add(DeferredRegister)}. + * + * @param registryKey the key of the registry to reference. + * @param modid the namespace for all objects registered to this DeferredRegister + * + * @return A built instance using the default values for the builder. Equivalent to {@code builder(registryKey, modid).build()} + */ + public static DeferredRegisterData create(ResourceKey> registryKey, String modid) { + return new Builder<>(registryKey, modid).build(); + } + + public static class Builder { + private final ResourceKey> registryKey; + private final String modid; + + private Lifecycle lifecycle = Lifecycle.stable(); + + private Builder(ResourceKey> registryKey, String modid) { + this.registryKey = registryKey; + this.modid = modid; + } + + /** + * By default will register objects as {@link Lifecycle#stable()} + */ + public Builder lifecycle(Lifecycle value) { + this.lifecycle = value; + return this; + } + + public DeferredRegisterData build() { + return new DeferredRegisterData<>(this); + } + } + + private final ResourceKey> registryKey; + private final String modid; + private final Lifecycle lifecycle; + private final Map, Function, ? extends T>> entries = new LinkedHashMap<>(); + private final Set> entriesView = Collections.unmodifiableSet(entries.keySet()); + + private boolean beenBuilt = false; + + private DeferredRegisterData(Builder builder) { + this.registryKey = builder.registryKey; + this.modid = builder.modid; + this.lifecycle = builder.lifecycle; + } + + /** + * Creates a RegistryObject for the specified name, which will be filled when the {@link RegistrySetBuilder} is built. + * This is useful is you need references to entries added not using the {@link DeferredRegisterData} system. + * + * @param name The entry's name, it will automatically have the modid prefixed. + */ + public RegistryObject register(final String name) { + return registerInternal(name, null); + } + + /** + * Adds a new supplier to the list of entries to be registered, and returns a RegistryObject that will be populated with the created entry automatically. + * If you need context from other data registries, use {@link DeferredRegisterData#register(String, Function)} + * + * @param name The new entry's name, it will automatically have the modid prefixed. + * @param factory A factory for the new entry, it should return a new instance every time it is called. + * @return A RegistryObject that will be updated with when the entries in the registry change. + * @see #register(String, Supplier) + */ + public RegistryObject register(final String name, final Supplier factory) { + return register(name, ctx -> factory.get()); + } + + /** + * Adds a new entry to be registered, the Function will be invoked with the {@link BootstrapContext} which allows lookup of other registry entries. + * Returns a RegistryObject that will be populated with the created entry automatically. + * + * @param name The new entry's name, it will automatically have the modid prefixed. + * @param factory A factory for the new entry, it should return a new instance every time it is called. + * @return A RegistryObject that will be updated with when the entries in the registry change. + */ + public RegistryObject register(final String name, final Function, ? extends I> factory) { + requireNonNull("factory", factory); + return registerInternal(name, factory); + } + + @SuppressWarnings("unchecked") + private RegistryObject registerInternal(final String name, final Function, ? extends I> factory) { + if (beenBuilt) + throw new IllegalStateException("Cannot register new entries to DeferredRegister after it has been used. You should use this in a static context"); + + requireNonNull("name", name); + var key = ResourceLocation.fromNamespaceAndPath(modid, name); + + RegistryObject ret = new RegistryObject<>(key, this.registryKey, this.modid); + + if (entries.containsKey((RegistryObject)ret)) + throw new IllegalArgumentException("Duplicate registration " + name); + + entries.put((RegistryObject)ret, factory); + return ret; + } + + /** + * Creates a ResourceKey based on the current modid and provided path as the location and the registry name linked to this DeferredRegister. + * To control the namespace, use {@link #key(ResourceLocation)}. + * + * @see #key(ResourceLocation) + */ + @NotNull + public ResourceKey key(@NotNull String path) { + requireNonNull("path", path); + return key(ResourceLocation.fromNamespaceAndPath(this.modid, path)); + } + + /** + * Creates a tag key based on the provided resource location and the registry name linked to this DeferredRegister. + * To use the current modid as the namespace, use {@link #createTagKey(String)}. + * + * @see #key(String) + */ + @NotNull + public ResourceKey key(@NotNull ResourceLocation location) { + requireNonNull("location", location); + return ResourceKey.create(getRegistryKey(), location); + } + + /** + * Creates a tag key based on the current modid and provided path as the location and the registry name linked to this DeferredRegister. + * To control the namespace, use {@link #createTagKey(ResourceLocation)}. + * + * @see #createTagKey(ResourceLocation) + * @see #createOptionalTagKey(String, Set) + */ + @NotNull + public TagKey createTagKey(@NotNull String path) { + requireNonNull("path", path); + return createTagKey(ResourceLocation.fromNamespaceAndPath(this.modid, path)); + } + + /** + * Creates a tag key based on the provided resource location and the registry name linked to this DeferredRegister. + * To use the current modid as the namespace, use {@link #createTagKey(String)}. + * + * @see #createTagKey(String) + * @see #createOptionalTagKey(ResourceLocation, Set) + */ + @NotNull + public TagKey createTagKey(@NotNull ResourceLocation location) { + requireNonNull("location", location); + return TagKey.create(this.registryKey, location); + } + + /** + * @return The {@link Lifecycle} that objects are registered as. + */ + public Lifecycle getLifecycle() { + return this.lifecycle; + } + + /** + * @return The unmodifiable view of registered entries. Useful for bulk operations on all values. + */ + public Collection> getEntries() { + return this.entriesView; + } + + /** + * @return The registry key stored in this deferred register. Useful for creating new deferred registers based on an existing one. + */ + public ResourceKey> getRegistryKey() { + return this.registryKey; + } + + /** + * @return The registry name stored in this deferred register. Useful for creating new deferred registers based on an existing one. + */ + @NotNull + public ResourceLocation getRegistryName() { + return this.registryKey.location(); + } + + private static T requireNonNull(String name, T value) { + if (value == null) + throw new IllegalArgumentException(name + " can not be null"); + return value; + } + + /** + * Returns true if the key is registered to a valid object factory, useful for data generation knowing if this actually declares data. + */ + public boolean isDeclared(ResourceKey key) { + for (var entry : this.entries.entrySet()) { + if (entry.getKey().getKey() == key) + return true; + } + return false; + } + + /** + * Build this DeferredRegister using the supplied {@link BoostrapContext}. This is meant to be called by {@link RegistrySetBuilder} by adding this + * function to the builder using {@link RegistrySetBuilder#add(ResourceKey, RegistryBootstrap)} or {@link IForgeRegistrySetBuilder#add(DeferredRegisterData)} + */ + @Override + public void run(BootstrapContext context) { + beenBuilt = true; + + var lookup = context.lookup(this.registryKey); + + for (var e : entries.entrySet()) { + var ro = e.getKey(); + T value; + if (e.getValue() != null) { + value = e.getValue().apply(context); + context.register(ro.getKey(), value, this.lifecycle); + } else + value = lookup.get(ro.getKey()).map(Holder::get).orElse(null); + + ro.updateReference(value, () -> lookup.getOrThrow(ro.getKey())); + } + } +} diff --git a/src/main/java/net/minecraftforge/registries/RegistryObject.java b/src/main/java/net/minecraftforge/registries/RegistryObject.java index 7889696c13..a2af037b85 100644 --- a/src/main/java/net/minecraftforge/registries/RegistryObject.java +++ b/src/main/java/net/minecraftforge/registries/RegistryObject.java @@ -175,6 +175,15 @@ public final class RegistryObject implements Supplier { this.updateReference(registryName); } + /** Internal constructor used for {@link DeferredRegisterData} */ + RegistryObject(final ResourceLocation name, final ResourceKey> registry, final String modid) { + this.name = name; + @SuppressWarnings("unchecked") + var typed = (ResourceKey>)registry; + this.key = ResourceKey.create(typed, name); + this.optionalRegistry = true; + } + /** * Retrieves the wrapped object in the registry. * This value will automatically be updated when the backing registry is updated. @@ -265,6 +274,11 @@ public final class RegistryObject implements Supplier { this.value = null; } + void updateReference(T value, Supplier> holder) { + this.value = value; + this.holder = holder; + } + private static boolean registryExists(ResourceLocation registryName) { return RegistryManager.ACTIVE.getRegistry(registryName) != null || BuiltInRegistries.REGISTRY.containsKey(registryName); diff --git a/src/test/generated/automatic_module/data/forge/test_instance/automatic_module/correct_name.json b/src/test/generated/automatic_module/data/forge/test_instance/automatic_module/correct_name.json new file mode 100644 index 0000000000..e9171e7527 --- /dev/null +++ b/src/test/generated/automatic_module/data/forge/test_instance/automatic_module/correct_name.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:automatic_module/correct_name", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/biome_test_mod/data/biome_test_mod/forge/biome_modifier/add_overworld_netherite_block_ore.json b/src/test/generated/biome_test/data/biome_test/forge/biome_modifier/modifier.json similarity index 59% rename from src/test/generated/biome_test_mod/data/biome_test_mod/forge/biome_modifier/add_overworld_netherite_block_ore.json rename to src/test/generated/biome_test/data/biome_test/forge/biome_modifier/modifier.json index 101a52c47c..76cb2d3ced 100644 --- a/src/test/generated/biome_test_mod/data/biome_test_mod/forge/biome_modifier/add_overworld_netherite_block_ore.json +++ b/src/test/generated/biome_test/data/biome_test/forge/biome_modifier/modifier.json @@ -1,6 +1,6 @@ { "type": "forge:add_features", "biomes": "#minecraft:is_overworld", - "features": "biome_test_mod:overworld_netherite_block_ore_placed", + "features": "biome_test:placed", "step": "underground_ores" } \ No newline at end of file diff --git a/src/test/generated/biome_test/data/biome_test/worldgen/configured_feature/configured.json b/src/test/generated/biome_test/data/biome_test/worldgen/configured_feature/configured.json new file mode 100644 index 0000000000..b3f605f04e --- /dev/null +++ b/src/test/generated/biome_test/data/biome_test/worldgen/configured_feature/configured.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:no_op", + "config": {} +} \ No newline at end of file diff --git a/src/test/generated/biome_test/data/biome_test/worldgen/placed_feature/placed.json b/src/test/generated/biome_test/data/biome_test/worldgen/placed_feature/placed.json new file mode 100644 index 0000000000..ecb4453a47 --- /dev/null +++ b/src/test/generated/biome_test/data/biome_test/worldgen/placed_feature/placed.json @@ -0,0 +1,4 @@ +{ + "feature": "biome_test:configured", + "placement": [] +} \ No newline at end of file diff --git a/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/configured_feature/overworld_netherite_block_ore.json b/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/configured_feature/overworld_netherite_block_ore.json deleted file mode 100644 index 4005c23ffc..0000000000 --- a/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/configured_feature/overworld_netherite_block_ore.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "minecraft:replace_single_block", - "config": { - "targets": [ - { - "state": { - "Name": "minecraft:netherite_block" - }, - "target": { - "block_state": { - "Name": "minecraft:air" - }, - "predicate_type": "minecraft:blockstate_match" - } - } - ] - } -} \ No newline at end of file diff --git a/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/placed_feature/overworld_netherite_block_ore_placed.json b/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/placed_feature/overworld_netherite_block_ore_placed.json deleted file mode 100644 index 98a7c311b0..0000000000 --- a/src/test/generated/biome_test_mod/data/biome_test_mod/worldgen/placed_feature/overworld_netherite_block_ore_placed.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "feature": "biome_test_mod:overworld_netherite_block_ore", - "placement": [ - { - "type": "minecraft:count", - "count": 1 - }, - { - "type": "minecraft:height_range", - "height": { - "absolute": 100 - } - } - ] -} \ No newline at end of file diff --git a/src/test/generated/chorus_block_placement/data/forge/test_instance/chorus_block_placement/custom_placeable_block.json b/src/test/generated/chorus_block_placement/data/forge/test_instance/chorus_block_placement/custom_placeable_block.json new file mode 100644 index 0000000000..fe449577e1 --- /dev/null +++ b/src/test/generated/chorus_block_placement/data/forge/test_instance/chorus_block_placement/custom_placeable_block.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:chorus_block_placement/custom_placeable_block", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_exported.json b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_exported.json new file mode 100644 index 0000000000..8f1929edff --- /dev/null +++ b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_exported.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:closed_module_test/can_reflect_exported", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_opened_internal.json b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_opened_internal.json new file mode 100644 index 0000000000..0f1216a708 --- /dev/null +++ b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/can_reflect_opened_internal.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:closed_module_test/can_reflect_opened_internal", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/cant_reflect_internal.json b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/cant_reflect_internal.json new file mode 100644 index 0000000000..fbcca79ff4 --- /dev/null +++ b/src/test/generated/closed_module_test/data/forge/test_instance/closed_module_test/cant_reflect_internal.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:closed_module_test/cant_reflect_internal", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_loot_test/data/forge/test_instance/conditional_loot_test/test_true_false.json b/src/test/generated/conditional_loot_test/data/forge/test_instance/conditional_loot_test/test_true_false.json new file mode 100644 index 0000000000..33f2886d99 --- /dev/null +++ b/src/test/generated/conditional_loot_test/data/forge/test_instance/conditional_loot_test/test_true_false.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_loot_test/test_true_false", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/conditional_recipe_choice.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/conditional_recipe_choice.json new file mode 100644 index 0000000000..b718d737ab --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/conditional_recipe_choice.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/conditional_recipe_choice", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_false_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_false_conditions.json new file mode 100644 index 0000000000..652805ecde --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_false_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/cooking_false_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_true_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_true_conditions.json new file mode 100644 index 0000000000..8e55c7cae8 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/cooking_true_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/cooking_true_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_false_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_false_conditions.json new file mode 100644 index 0000000000..79d4f485f3 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_false_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/shaped_false_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_true_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_true_conditions.json new file mode 100644 index 0000000000..005cfec380 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shaped_true_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/shaped_true_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_false_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_false_conditions.json new file mode 100644 index 0000000000..d997c22a93 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_false_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/shapeless_false_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_true_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_true_conditions.json new file mode 100644 index 0000000000..b7700eee16 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/shapeless_true_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/shapeless_true_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_false_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_false_conditions.json new file mode 100644 index 0000000000..22f1ff7745 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_false_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/single_item_false_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_true_conditions.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_true_conditions.json new file mode 100644 index 0000000000..7c0af3a29b --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/single_item_true_conditions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/single_item_true_conditions", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_empty_tag.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_empty_tag.json new file mode 100644 index 0000000000..f3b6a99814 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_empty_tag.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/tag_empty_condition_with_empty_tag", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_populated_tag.json b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_populated_tag.json new file mode 100644 index 0000000000..ef1c74aca8 --- /dev/null +++ b/src/test/generated/conditional_recipe/data/forge/test_instance/conditional_recipe/tag_empty_condition_with_populated_tag.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:conditional_recipe/tag_empty_condition_with_populated_tag", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/criterion_test/data/forge/test_instance/criterion_test/test_custom_criterion.json b/src/test/generated/criterion_test/data/forge/test_instance/criterion_test/test_custom_criterion.json new file mode 100644 index 0000000000..f28743b31e --- /dev/null +++ b/src/test/generated/criterion_test/data/forge/test_instance/criterion_test/test_custom_criterion.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:criterion_test/test_custom_criterion", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/compound.json b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/compound.json new file mode 100644 index 0000000000..06d1fe294e --- /dev/null +++ b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/compound.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:custom_ingredients/compound", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/difference.json b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/difference.json new file mode 100644 index 0000000000..a3bdf65d58 --- /dev/null +++ b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/difference.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:custom_ingredients/difference", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/intersection.json b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/intersection.json new file mode 100644 index 0000000000..83c9d28d53 --- /dev/null +++ b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/intersection.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:custom_ingredients/intersection", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/partial_nbt.json b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/partial_nbt.json new file mode 100644 index 0000000000..6d7d012b86 --- /dev/null +++ b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/partial_nbt.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:custom_ingredients/partial_nbt", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/strict.json b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/strict.json new file mode 100644 index 0000000000..9065ef8331 --- /dev/null +++ b/src/test/generated/custom_ingredients/data/forge/test_instance/custom_ingredients/strict.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:custom_ingredients/strict", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/forced_chunk_loading/data/forge/test_instance/forced_chunk_loading/force_far_away_chunk.json b/src/test/generated/forced_chunk_loading/data/forge/test_instance/forced_chunk_loading/force_far_away_chunk.json new file mode 100644 index 0000000000..cfc2ac9821 --- /dev/null +++ b/src/test/generated/forced_chunk_loading/data/forge/test_instance/forced_chunk_loading/force_far_away_chunk.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:forced_chunk_loading/force_far_away_chunk", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/gather_components_test_event/data/forge/test_instance/gather_components_test_event/is_food.json b/src/test/generated/gather_components_test_event/data/forge/test_instance/gather_components_test_event/is_food.json new file mode 100644 index 0000000000..e45708a6c8 --- /dev/null +++ b/src/test/generated/gather_components_test_event/data/forge/test_instance/gather_components_test_event/is_food.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:gather_components_test_event/is_food", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/condition_table_name.json b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/condition_table_name.json new file mode 100644 index 0000000000..4fb35fae52 --- /dev/null +++ b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/condition_table_name.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:global_loot_test/condition_table_name", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/silk_reentrant.json b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/silk_reentrant.json new file mode 100644 index 0000000000..921b85f9d2 --- /dev/null +++ b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/silk_reentrant.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:global_loot_test/silk_reentrant", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/smellting.json b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/smellting.json new file mode 100644 index 0000000000..3cb7e0558c --- /dev/null +++ b/src/test/generated/global_loot_test/data/forge/test_instance/global_loot_test/smellting.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:global_loot_test/smellting", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/item_caps/data/forge/test_instance/item_caps/item_capability.json b/src/test/generated/item_caps/data/forge/test_instance/item_caps/item_capability.json new file mode 100644 index 0000000000..5b852bdd21 --- /dev/null +++ b/src/test/generated/item_caps/data/forge/test_instance/item_caps/item_capability.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:item_caps/item_capability", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/late_bound_id_mapper/data/forge/test_instance/late_bound_id_mapper/compound.json b/src/test/generated/late_bound_id_mapper/data/forge/test_instance/late_bound_id_mapper/compound.json new file mode 100644 index 0000000000..39ef74bda1 --- /dev/null +++ b/src/test/generated/late_bound_id_mapper/data/forge/test_instance/late_bound_id_mapper/compound.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:late_bound_id_mapper/compound", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_after_parent.json b/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_after_parent.json new file mode 100644 index 0000000000..812d3864fb --- /dev/null +++ b/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_after_parent.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:load_sort_test/ran_after_parent", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_before_child.json b/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_before_child.json new file mode 100644 index 0000000000..199526a034 --- /dev/null +++ b/src/test/generated/load_sort_test/data/forge/test_instance/load_sort_test/ran_before_child.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:load_sort_test/ran_before_child", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/loot_events/data/forge/test_instance/loot_events/test_load_table.json b/src/test/generated/loot_events/data/forge/test_instance/loot_events/test_load_table.json new file mode 100644 index 0000000000..6ea56d9e49 --- /dev/null +++ b/src/test/generated/loot_events/data/forge/test_instance/loot_events/test_load_table.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:loot_events/test_load_table", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/old_leaves_render_type.json b/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/old_leaves_render_type.json new file mode 100644 index 0000000000..c12568f614 --- /dev/null +++ b/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/old_leaves_render_type.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:model_render_type/old_leaves_render_type", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/type_from_model.json b/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/type_from_model.json new file mode 100644 index 0000000000..4db9045097 --- /dev/null +++ b/src/test/generated/model_render_type/data/forge/test_instance/model_render_type/type_from_model.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:model_render_type/type_from_model", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/network_data_registry/data/forge/test_instance/network_data_registry/client_has_registry.json b/src/test/generated/network_data_registry/data/forge/test_instance/network_data_registry/client_has_registry.json new file mode 100644 index 0000000000..8730913710 --- /dev/null +++ b/src/test/generated/network_data_registry/data/forge/test_instance/network_data_registry/client_has_registry.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:network_data_registry/client_has_registry", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/network_data_registry/data/network_data_registry/network_data_registry/registry/test_entry.json b/src/test/generated/network_data_registry/data/network_data_registry/network_data_registry/registry/test_entry.json index 006e7e0c19..e526377c1b 100644 --- a/src/test/generated/network_data_registry/data/network_data_registry/network_data_registry/registry/test_entry.json +++ b/src/test/generated/network_data_registry/data/network_data_registry/network_data_registry/registry/test_entry.json @@ -1,3 +1,3 @@ { - "value": "network_data_registry:test_value" + "value": "network_data_registry:test_value_new" } \ No newline at end of file diff --git a/src/test/generated/packet/data/forge/test_instance/packet/send_to_all.json b/src/test/generated/packet/data/forge/test_instance/packet/send_to_all.json new file mode 100644 index 0000000000..0af0acf271 --- /dev/null +++ b/src/test/generated/packet/data/forge/test_instance/packet/send_to_all.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:packet/send_to_all", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/packet/data/forge/test_instance/packet/send_to_nearby.json b/src/test/generated/packet/data/forge/test_instance/packet/send_to_nearby.json new file mode 100644 index 0000000000..22dbe44f2b --- /dev/null +++ b/src/test/generated/packet/data/forge/test_instance/packet/send_to_nearby.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:packet/send_to_nearby", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/packet/data/forge/test_instance/packet/send_to_player.json b/src/test/generated/packet/data/forge/test_instance/packet/send_to_player.json new file mode 100644 index 0000000000..aa713dcaac --- /dev/null +++ b/src/test/generated/packet/data/forge/test_instance/packet/send_to_player.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:packet/send_to_player", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/fake_shield_damage_item_impl.json b/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/fake_shield_damage_item_impl.json new file mode 100644 index 0000000000..dd329b1c84 --- /dev/null +++ b/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/fake_shield_damage_item_impl.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:prevent_item_damage/fake_shield_damage_item_impl", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/player_fake_shield_took_modified_damage.json b/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/player_fake_shield_took_modified_damage.json new file mode 100644 index 0000000000..13f84f3176 --- /dev/null +++ b/src/test/generated/prevent_item_damage/data/forge/test_instance/prevent_item_damage/player_fake_shield_took_modified_damage.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:prevent_item_damage/player_fake_shield_took_modified_damage", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/shears_loot/data/forge/test_instance/shears_loot/test_shears_drop_blocks.json b/src/test/generated/shears_loot/data/forge/test_instance/shears_loot/test_shears_drop_blocks.json new file mode 100644 index 0000000000..7678267e96 --- /dev/null +++ b/src/test/generated/shears_loot/data/forge/test_instance/shears_loot/test_shears_drop_blocks.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:shears_loot/test_shears_drop_blocks", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_axe.json b/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_axe.json new file mode 100644 index 0000000000..93b7b7e413 --- /dev/null +++ b/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_axe.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:shield_disabling/player_shield_disabled_by_axe", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_warden.json b/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_warden.json new file mode 100644 index 0000000000..a2aad3cf1f --- /dev/null +++ b/src/test/generated/shield_disabling/data/forge/test_instance/shield_disabling/player_shield_disabled_by_warden.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:shield_disabling/player_shield_disabled_by_warden", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/tags_test/data/forge/test_instance/tags_test/cobble_in_legacy.json b/src/test/generated/tags_test/data/forge/test_instance/tags_test/cobble_in_legacy.json new file mode 100644 index 0000000000..3014996381 --- /dev/null +++ b/src/test/generated/tags_test/data/forge/test_instance/tags_test/cobble_in_legacy.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:tags_test/cobble_in_legacy", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/update_order/data/forge/test_instance/update_order/east.json b/src/test/generated/update_order/data/forge/test_instance/update_order/east.json new file mode 100644 index 0000000000..05020d7653 --- /dev/null +++ b/src/test/generated/update_order/data/forge/test_instance/update_order/east.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:update_order/east", + "max_ticks": 100, + "rotation": "counterclockwise_90", + "structure": "update_order:update_order" +} \ No newline at end of file diff --git a/src/test/generated/update_order/data/forge/test_instance/update_order/north.json b/src/test/generated/update_order/data/forge/test_instance/update_order/north.json new file mode 100644 index 0000000000..4546142bbc --- /dev/null +++ b/src/test/generated/update_order/data/forge/test_instance/update_order/north.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:update_order/north", + "max_ticks": 100, + "rotation": "180", + "structure": "update_order:update_order" +} \ No newline at end of file diff --git a/src/test/generated/update_order/data/forge/test_instance/update_order/south.json b/src/test/generated/update_order/data/forge/test_instance/update_order/south.json new file mode 100644 index 0000000000..4bc240b03d --- /dev/null +++ b/src/test/generated/update_order/data/forge/test_instance/update_order/south.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:update_order/south", + "max_ticks": 100, + "structure": "update_order:update_order" +} \ No newline at end of file diff --git a/src/test/generated/update_order/data/forge/test_instance/update_order/up.json b/src/test/generated/update_order/data/forge/test_instance/update_order/up.json new file mode 100644 index 0000000000..574a0da967 --- /dev/null +++ b/src/test/generated/update_order/data/forge/test_instance/update_order/up.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:update_order/up", + "max_ticks": 100, + "structure": "update_order:upward_update" +} \ No newline at end of file diff --git a/src/test/generated/update_order/data/forge/test_instance/update_order/west.json b/src/test/generated/update_order/data/forge/test_instance/update_order/west.json new file mode 100644 index 0000000000..511d1be1f9 --- /dev/null +++ b/src/test/generated/update_order/data/forge/test_instance/update_order/west.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:update_order/west", + "max_ticks": 100, + "rotation": "clockwise_90", + "structure": "update_order:update_order" +} \ No newline at end of file diff --git a/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/biome_type.json b/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/biome_type.json new file mode 100644 index 0000000000..8144f79f44 --- /dev/null +++ b/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/biome_type.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:villager_type_test/biome_type", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/emeralds_for_villager_type.json b/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/emeralds_for_villager_type.json new file mode 100644 index 0000000000..0a2a7af615 --- /dev/null +++ b/src/test/generated/villager_type_test/data/forge/test_instance/villager_type_test/emeralds_for_villager_type.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:villager_type_test/emeralds_for_villager_type", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java index b68adf920d..9dba286a22 100644 --- a/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java +++ b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java @@ -29,7 +29,6 @@ import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.animal.Pig; @@ -51,7 +50,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @@ -66,8 +65,8 @@ import java.util.stream.Stream; import com.google.gson.JsonElement; import com.mojang.blaze3d.vertex.PoseStack; +@GameTestNamespace("forge") @Mod(AdditionalModelTest.MODID) -@GameTestHolder("forge." + AdditionalModelTest.MODID) public class AdditionalModelTest extends BaseTestMod { public static final String MODID = "additional_model"; @@ -79,10 +78,6 @@ public class AdditionalModelTest extends BaseTestMod { private static final DeferredRegister ITEMS = DeferredRegister.create(Registries.ITEM, MODID); private static final RegistryObject PIG_HEAD_ITEM = ITEMS.register("pig_head", () -> new Item(new Item.Properties().setId(ITEMS.key("pig_head")))); - private static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(MODID, path); - } - public AdditionalModelTest(FMLJavaModLoadingContext context) { super(context, false); diff --git a/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java index 6757c0bf6e..693c04a577 100644 --- a/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java +++ b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java @@ -9,13 +9,12 @@ import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.color.item.ItemTintSources; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; import javax.annotation.Nullable; @@ -26,16 +25,13 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @Mod(LateBoundIdMapperTest.MODID) -@GameTestHolder("forge." + LateBoundIdMapperTest.MODID) +@GameTestNamespace("forge") public class LateBoundIdMapperTest extends BaseTestMod { public LateBoundIdMapperTest(FMLJavaModLoadingContext context) { super(context); } public static final String MODID = "late_bound_id_mapper"; - private static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(MODID, path); - } @GameTest public static void compound(GameTestHelper helper) { diff --git a/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java b/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java index 430fb74922..48487e2940 100644 --- a/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java +++ b/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java @@ -37,7 +37,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @@ -52,7 +52,7 @@ import java.util.stream.Stream; import com.google.gson.JsonElement; @Mod(ModelRenderLayerTest.MODID) -@GameTestHolder("forge." + ModelRenderLayerTest.MODID) +@GameTestNamespace("forge") public class ModelRenderLayerTest extends BaseTestMod { public static final String MODID = "model_render_type"; private static final String BLOCK_NAME = "cutout_block"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java b/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java index 638fcc64d7..6180f33769 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java @@ -5,77 +5,49 @@ package net.minecraftforge.debug.gameplay.biome; -import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderSet; -import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; -import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BiomeTags; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.ReplaceBlockConfiguration; -import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight; -import net.minecraft.world.level.levelgen.placement.CountPlacement; -import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.common.world.BiomeModifier; import net.minecraftforge.common.world.ForgeBiomeModifiers; -import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegisterData; import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; import java.util.List; -import java.util.Set; -import java.util.concurrent.CompletableFuture; @Mod(BiomeTestMod.MOD_ID) public class BiomeTestMod extends BaseTestMod { - public static final String MOD_ID = "biome_test_mod"; + public static final String MOD_ID = "biome_test"; - private static final ResourceKey OVERWORLD_NETHERITE_BLOCK_ORE_PLACED_KEY = ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(BiomeTestMod.MOD_ID, "overworld_netherite_block_ore_placed")); - private static final ResourceKey ADD_OVERWORLD_NETHERITE_BLOCK_ORE = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(BiomeTestMod.MOD_ID, "add_overworld_netherite_block_ore")); - private static final ResourceKey> OVERWORLD_NETHERITE_BLOCK_ORE = ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(BiomeTestMod.MOD_ID, "overworld_netherite_block_ore")); + public static final DeferredRegisterData> CONFIGURED_FEATURES = DeferredRegisterData.create(Registries.CONFIGURED_FEATURE, MOD_ID); + private static final RegistryObject> CONFIGURED = CONFIGURED_FEATURES.register("configured", () -> + new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE) + ); + + public static final DeferredRegisterData PLACED_FEATURES = DeferredRegisterData.create(Registries.PLACED_FEATURE, MOD_ID); + private static final RegistryObject PLACED = PLACED_FEATURES.register("placed", () -> + new PlacedFeature(CONFIGURED.getHolder().orElseThrow(), List.of()) + ); + + public static final DeferredRegisterData BIOME_MODIFIERS = DeferredRegisterData.create(ForgeRegistries.Keys.BIOME_MODIFIERS, MOD_ID); + @SuppressWarnings("unused") + private static final RegistryObject MODIFIER = BIOME_MODIFIERS.register("modifier", ctx -> { + return new ForgeBiomeModifiers.AddFeaturesBiomeModifier( + ctx.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD), + HolderSet.direct(PLACED.getHolder().orElseThrow()), + GenerationStep.Decoration.UNDERGROUND_ORES + ); + }); public BiomeTestMod(FMLJavaModLoadingContext context) { super(context); - modBus.addListener(BiomeTestMod::onDataGen); - } - - private static void onDataGen(GatherDataEvent event) { - event.getGenerator().addProvider(event.includeServer(), new ModWorldGenProvider(event.getGenerator().getPackOutput(), event.getLookupProvider())); - } - - private static class ModWorldGenProvider extends DatapackBuiltinEntriesProvider { - public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() - .add(Registries.CONFIGURED_FEATURE, context -> { - context.register(OVERWORLD_NETHERITE_BLOCK_ORE, new ConfiguredFeature<>( - Feature.REPLACE_SINGLE_BLOCK, - new ReplaceBlockConfiguration(Blocks.AIR.defaultBlockState(), Blocks.NETHERITE_BLOCK.defaultBlockState()) - )); - }) - .add(Registries.PLACED_FEATURE, context -> { - context.register(OVERWORLD_NETHERITE_BLOCK_ORE_PLACED_KEY, new PlacedFeature( - context.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(OVERWORLD_NETHERITE_BLOCK_ORE), - List.of(CountPlacement.of(1), HeightRangePlacement.of(ConstantHeight.of(VerticalAnchor.absolute(100)))) - )); - }) - .add(ForgeRegistries.Keys.BIOME_MODIFIERS, context -> { - context.register(ADD_OVERWORLD_NETHERITE_BLOCK_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( - context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD), - HolderSet.direct(context.lookup(Registries.PLACED_FEATURE).getOrThrow(OVERWORLD_NETHERITE_BLOCK_ORE_PLACED_KEY)), - GenerationStep.Decoration.UNDERGROUND_ORES - )); - }); - - public ModWorldGenProvider(PackOutput output, CompletableFuture registries) { - super(output, registries, BUILDER, Set.of(BiomeTestMod.MOD_ID)); - } } } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java b/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java index 80f35eed5f..d99c210f01 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java @@ -17,13 +17,13 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + ChorusBlockPlacementTest.MOD_ID) +@GameTestNamespace("forge") @Mod(ChorusBlockPlacementTest.MOD_ID) public class ChorusBlockPlacementTest extends BaseTestMod { static final String MOD_ID = "chorus_block_placement"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java index bab7d4e81e..a5bee3f129 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java @@ -18,7 +18,6 @@ import net.minecraft.data.recipes.SimpleCookingRecipeBuilder; import net.minecraft.data.recipes.SingleItemRecipeBuilder; import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; @@ -41,10 +40,10 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + ConditionalRecipeTest.MODID) +@GameTestNamespace("forge") @Mod(ConditionalRecipeTest.MODID) public class ConditionalRecipeTest extends BaseTestMod { static final String MODID = "conditional_recipe"; @@ -62,10 +61,6 @@ public class ConditionalRecipeTest extends BaseTestMod { gen.addProvider(event.includeServer(), new TestItemTags(gen.getPackOutput(), event.getLookupProvider(), testBlockTags.contentsGetter(), event.getExistingFileHelper())); } - private static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(MODID, path); - } - private static > void assertFalse(GameTestHelper helper, RecipeType type, C container) { var recipe = helper.getLevel().recipeAccess().getRecipeFor(type, container, helper.getLevel()); helper.assertTrue(recipe.isEmpty(), () -> "Found crafting recipe when unexpected: " + recipe.get().id()); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java index 2e3351d393..547219ca14 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java @@ -24,7 +24,6 @@ import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -46,10 +45,10 @@ import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + CustomIngredientsTest.MODID) +@GameTestNamespace("forge") @Mod(CustomIngredientsTest.MODID) public class CustomIngredientsTest extends BaseTestMod implements INBTBuilder { static final String MODID = "custom_ingredients"; @@ -77,10 +76,6 @@ public class CustomIngredientsTest extends BaseTestMod implements INBTBuilder { gen.addProvider(event.includeServer(), new Recipes.Runner(out, event.getLookupProvider())); } - private static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(MODID, path); - } - private static TagKey tag(String name) { return ItemTags.create(rl(name)); } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java index 78853592a3..c52f9dcd03 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java @@ -13,11 +13,11 @@ import net.minecraft.world.item.Items; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; @Mod(TagsTest.MODID) -@GameTestHolder("forge.crafting.tags") +@GameTestNamespace("forge") public class TagsTest extends BaseTestMod { public static final String MODID = "tags_test"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java b/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java index 8c4d234288..71a19e832a 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java @@ -37,7 +37,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -47,7 +47,7 @@ import java.util.List; import java.util.Objects; @Mod(CriterionTest.MOD_ID) -@GameTestHolder("forge.custom_criterions") +@GameTestNamespace("forge") public final class CriterionTest extends BaseTestMod { public static final String MOD_ID = "criterion_test"; private static final DeferredRegister> TRIGGERS = DeferredRegister.create(BuiltInRegistries.TRIGGER_TYPES.key(), MOD_ID); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java index c0641a8554..01783f8b76 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java @@ -15,10 +15,10 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + GatherComponentsEventTest.MOD_ID) +@GameTestNamespace("forge") @Mod(GatherComponentsEventTest.MOD_ID) public class GatherComponentsEventTest extends BaseTestMod { public static final String MOD_ID = "gather_components_test_event"; @@ -36,7 +36,7 @@ public class GatherComponentsEventTest extends BaseTestMod { } @GameTest - public static void onTestForFood(GameTestHelper helper) { + public static void is_food(GameTestHelper helper) { helper.assertTrue(Items.IRON_NUGGET.components().has(DataComponents.FOOD), "Iron Nugget is not edible, failed to apply DataComponents.FOOD to it."); helper.assertFalse(Items.IRON_INGOT.components().has(DataComponents.FOOD), "Iron Ingot is edible, should not have DataComponents.FOOD"); helper.succeed(); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java index 724c273501..9ca3f4d31a 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java @@ -29,7 +29,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @@ -38,7 +38,7 @@ import org.jetbrains.annotations.Nullable; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; -@GameTestHolder("forge." + ItemCapabilityTest.MOD_ID) +@GameTestNamespace("forge") @Mod(ItemCapabilityTest.MOD_ID) public class ItemCapabilityTest extends BaseTestMod { public static final String MOD_ID = "item_caps"; @@ -66,7 +66,7 @@ public class ItemCapabilityTest extends BaseTestMod { } @GameTest - public static void testItemCap(GameTestHelper helper) { + public static void item_capability(GameTestHelper helper) { helper.registerEventListener(ItemCapabilityTest.class); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java index db87007fb2..654bd88b3b 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java @@ -7,34 +7,41 @@ package net.minecraftforge.debug.gameplay.item; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; +import net.minecraft.world.item.component.BlocksAttacks; import net.minecraft.world.level.GameType; import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.Optional; import java.util.function.Consumer; +@GameTestNamespace("forge") @Mod(PreventItemDamageTest.MOD_ID) -@GameTestHolder("forge." + PreventItemDamageTest.MOD_ID) public class PreventItemDamageTest extends BaseTestMod { static final String MOD_ID = "prevent_item_damage"; @@ -133,7 +140,23 @@ public class PreventItemDamageTest extends BaseTestMod { private static final class FakeShieldItem extends ShieldItem { public FakeShieldItem() { - super(new Item.Properties().setId(ITEMS.key("fake_shield")).durability(10)); + super(new Item.Properties() + .setId(ITEMS.key("fake_shield")) + .durability(10) + .equippableUnswappable(EquipmentSlot.OFFHAND) + .component( + DataComponents.BLOCKS_ATTACKS, + new BlocksAttacks( + 0F, + 0F, + List.of(new BlocksAttacks.DamageReduction(360.0F, Optional.empty(), 0.0F, 1.0F)), + new BlocksAttacks.ItemDamageFunction(3.0F, 1.0F, 1.0F), + Optional.of(DamageTypeTags.BYPASSES_SHIELD), + Optional.of(SoundEvents.SHIELD_BLOCK), + Optional.of(SoundEvents.SHIELD_BREAK) + ) + ) + ); } @Override diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java index ad04772d3a..ad1c96ff1e 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java @@ -22,13 +22,13 @@ import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; import java.util.function.Function; +@GameTestNamespace("forge") @Mod(ShieldDisablingTest.MOD_ID) -@GameTestHolder("forge." + ShieldDisablingTest.MOD_ID) public final class ShieldDisablingTest extends BaseTestMod { public static final String MOD_ID = "shield_disabling"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java b/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java index b0f829e017..9a7b0de3ad 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java @@ -14,10 +14,10 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + ForcedChunkLoadingTest.MOD_ID) +@GameTestNamespace("forge") @Mod(ForcedChunkLoadingTest.MOD_ID) public class ForcedChunkLoadingTest extends BaseTestMod { static final String MOD_ID = "forced_chunk_loading"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java index 10a251b9d5..1d71dce4f4 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java @@ -28,7 +28,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.common.crafting.conditions.IConditionBuilder; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -37,8 +37,8 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; +@GameTestNamespace("forge") @Mod(ConditionalLootPools.MODID) -@GameTestHolder("forge." + ConditionalLootPools.MODID) public class ConditionalLootPools extends BaseTestMod { public static final String MODID = "conditional_loot_test"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java index 184e8dd73f..dce8acae1d 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java @@ -68,7 +68,7 @@ import net.minecraftforge.test.BaseTestMod; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; @@ -79,7 +79,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -@GameTestHolder("forge.global_loot_modifiers") +@GameTestNamespace("forge") @Mod(GlobalLootModifiersTest.MODID) public class GlobalLootModifiersTest extends BaseTestMod { public static final String MODID = "global_loot_test"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java index e834036c74..da3b35874d 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java @@ -36,14 +36,14 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @Mod(LootEventsTest.MODID) -@GameTestHolder("forge." + LootEventsTest.MODID) +@GameTestNamespace("forge") public class LootEventsTest extends BaseTestMod { public static final String MODID = "loot_events"; @SuppressWarnings("unused") diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java index 07d4054ef2..96b3708f77 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java @@ -24,14 +24,14 @@ import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @Mod(ShearsLootTests.MODID) -@GameTestHolder("forge." + ShearsLootTests.MODID) +@GameTestNamespace("forge") public class ShearsLootTests extends BaseTestMod { public static final String MODID = "shears_loot"; diff --git a/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java b/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java index c467f56b38..f4815a0567 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java @@ -10,12 +10,14 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BarrelBlockEntity; import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.test.BaseTestMod; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; /** * Redstone update orders are important in many contraptions as there are pistons and other things that could conflict with each other. @@ -24,7 +26,7 @@ import net.minecraftforge.gametest.GameTestHolder; * Partial verification/fix for https://github.com/MinecraftForge/MinecraftForge/issues/9973 */ @Mod(UpdateOrder.MODID) -@GameTestHolder("forge." + UpdateOrder.MODID) +@GameTestNamespace("forge") public class UpdateOrder extends BaseTestMod { public static final String MODID = "update_order"; private static final int PISTON_DELAY = 4; @@ -33,7 +35,7 @@ public class UpdateOrder extends BaseTestMod { super(context); } - @GameTest(data = @GameTest.Data( structure = "update_order:update_order" ), rotationSteps = 0) + @GameTest(structure = "update_order:update_order") public static void south(GameTestHelper helper) { var chestPos = new BlockPos(0, 1, 0); helper.assertBlockPresent(Blocks.CHEST, chestPos); @@ -47,7 +49,7 @@ public class UpdateOrder extends BaseTestMod { }); } - @GameTest(data = @GameTest.Data( structure = "update_order:update_order" ), rotationSteps = 1) + @GameTest(structure = "update_order:update_order", rotation = Rotation.CLOCKWISE_90) public static void west(GameTestHelper helper) { var chestPos = new BlockPos(0, 1, 0); helper.assertBlockPresent(Blocks.CHEST, chestPos); @@ -61,7 +63,7 @@ public class UpdateOrder extends BaseTestMod { }); } - @GameTest(data = @GameTest.Data( structure = "update_order:update_order" ), rotationSteps = 2) + @GameTest(structure = "update_order:update_order", rotation = Rotation.CLOCKWISE_180) public static void north(GameTestHelper helper) { var chestPos = new BlockPos(0, 1, 0); helper.assertBlockPresent(Blocks.CHEST, chestPos); @@ -75,7 +77,7 @@ public class UpdateOrder extends BaseTestMod { }); } - @GameTest(data = @GameTest.Data( structure = "update_order:update_order" ), rotationSteps = 3) + @GameTest(structure = "update_order:update_order", rotation = Rotation.COUNTERCLOCKWISE_90) public static void east(GameTestHelper helper) { var chestPos = new BlockPos(0, 1, 0); helper.assertBlockPresent(Blocks.CHEST, chestPos); @@ -89,16 +91,16 @@ public class UpdateOrder extends BaseTestMod { }); } - @GameTest(data = @GameTest.Data( structure = "update_order:upward_update")) + @GameTest(structure = "update_order:upward_update") public static void up(GameTestHelper helper) { - var chestPos = new BlockPos(0, 1, 2); + var barrelPos = new BlockPos(0, 1, 2); var expectedPos = new BlockPos(2, 1, 0); var unexpectedPos = new BlockPos(0, 4, 0); - helper.assertBlockPresent(Blocks.BARREL, chestPos); + helper.assertBlockPresent(Blocks.BARREL, barrelPos); helper.assertBlockPresent(Blocks.AIR, expectedPos); helper.assertBlockPresent(Blocks.AIR, unexpectedPos); - var chest = helper.getBlockEntity(chestPos, ChestBlockEntity.class); - chest.setItem(0, new ItemStack(Items.DIRT)); + var barrel = helper.getBlockEntity(barrelPos, BarrelBlockEntity.class); + barrel.setItem(0, new ItemStack(Items.DIRT)); helper.runAfterDelay(10, () -> { // There are a lot of things happening, give it a few ticks helper.assertBlockNotPresent(Blocks.WHITE_WOOL, unexpectedPos); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java b/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java index 6b3233f700..507aaa5c6f 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java @@ -21,14 +21,14 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; import java.util.Map; -@GameTestHolder("forge." + VillagerTypeTestMod.MOD_ID) +@GameTestNamespace("forge") @Mod(VillagerTypeTestMod.MOD_ID) public class VillagerTypeTestMod extends BaseTestMod { public static final String MOD_ID = "villager_type_test"; @@ -55,7 +55,7 @@ public class VillagerTypeTestMod extends BaseTestMod { helper.assertValueEqual(type, TEST_VILLAGER_TYPE.get(), Component.literal("Loaded entry does not contain expected value")); Holder biome = access.lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS); - helper.assertValueEqual(VillagerType.byBiome(biome), TEST_VILLAGER_TYPE.get(), Component.literal("VillagerType.byBiome did not return the expected value")); + helper.assertValueEqual(VillagerType.byBiome(biome), TEST_VILLAGER_TYPE.getKey(), Component.literal("VillagerType.byBiome did not return the expected value")); helper.succeed(); } diff --git a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java index 52b350ff5e..f925bcceda 100644 --- a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java +++ b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java @@ -13,10 +13,10 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + ModLoadSortingTest.MODID) +@GameTestNamespace("forge") @Mod(ModLoadSortingTest.MODID) public class ModLoadSortingTest extends BaseTestMod { static final String MODID = "load_sort_test"; diff --git a/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java b/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java index ca8c50a5fb..222e7e3b54 100644 --- a/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java +++ b/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java @@ -9,11 +9,11 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; +@GameTestNamespace("forge") @Mod(AutomaticModuleMod.MODID) -@GameTestHolder("forge.module.automatic") public class AutomaticModuleMod extends BaseTestMod { public static final String MODID = "automatic_module"; diff --git a/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java b/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java index 3bf492522d..a0f1146706 100644 --- a/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java +++ b/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java @@ -14,14 +14,14 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.test.BaseTestMod; import net.minecraftforge.test.ManifestProvider; import net.minecraftforge.test.ModuleProvider; import net.minecraft.gametest.framework.GameTestHelper; @Mod(ClosedTestsMod.MODID) -@GameTestHolder("forge.module.closed") +@GameTestNamespace("forge") public class ClosedTestsMod extends BaseTestMod { public static final String MODID = "closed_module_test"; diff --git a/src/test/java/net/minecraftforge/debug/network/PacketTest.java b/src/test/java/net/minecraftforge/debug/network/PacketTest.java index a3d34b2436..d714b8b389 100644 --- a/src/test/java/net/minecraftforge/debug/network/PacketTest.java +++ b/src/test/java/net/minecraftforge/debug/network/PacketTest.java @@ -25,7 +25,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.network.Channel.VersionTest; import net.minecraftforge.network.ChannelBuilder; import net.minecraftforge.network.ForgePayload; @@ -33,8 +33,8 @@ import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.SimpleChannel; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge." + PacketTest.MODID) @Mod(PacketTest.MODID) +@GameTestNamespace("forge") public class PacketTest extends BaseTestMod { static final String MODID = "packet"; diff --git a/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java b/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java index e21d28eac3..36398973a3 100644 --- a/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java +++ b/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java @@ -5,8 +5,6 @@ package net.minecraftforge.debug.registries; -import java.util.Set; - import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; @@ -16,29 +14,31 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.client.Minecraft; import net.minecraft.core.Registry; -import net.minecraft.core.RegistrySetBuilder; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; -import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.gametest.GameTest; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DataPackRegistryEvent; +import net.minecraftforge.registries.DeferredRegisterData; +import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; -@GameTestHolder("forge.network_data_registry") +@GameTestNamespace("forge") @Mod(NetworkDatapackRegistryTest.MODID) public class NetworkDatapackRegistryTest extends BaseTestMod { private static final Logger LOGGER = LogUtils.getLogger(); public static final String MODID = "network_data_registry"; - private static final ResourceKey> REGISTRY_KEY = ResourceKey.createRegistryKey(rl(MODID, "registry")); - private static final ResourceKey TEST_ENTRY = ResourceKey.create(REGISTRY_KEY, rl(MODID, "test_entry")); - private static final ResourceLocation TEST_VALUE = rl(MODID, "test_value"); + private static final ResourceKey> REGISTRY_KEY = ResourceKey.createRegistryKey(rl("registry")); + + private static final ResourceLocation TEST_VALUE = rl("test_value_new"); + + private static final DeferredRegisterData REGISTRY = DeferredRegisterData.create(REGISTRY_KEY, smodid()); + private static final RegistryObject REGISTRY_ENTRY = REGISTRY.register("test_entry", () -> new DataObject(TEST_VALUE)); public NetworkDatapackRegistryTest(FMLJavaModLoadingContext context) { super(context); @@ -49,21 +49,6 @@ public class NetworkDatapackRegistryTest extends BaseTestMod { event.dataPackRegistry(REGISTRY_KEY, DataObject.DIRECT_CODEC, DataObject.DIRECT_CODEC); } - @SubscribeEvent - public void onDataGen(GatherDataEvent event) { - var gen = event.getGenerator(); - var packOutput = gen.getPackOutput(); - gen.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(packOutput, event.getLookupProvider(), - new RegistrySetBuilder() - .add(REGISTRY_KEY, - ctx -> { - ctx.register(TEST_ENTRY, new DataObject(TEST_VALUE)); - } - ), - Set.of(MODID)) - ); - } - @GameTest public static void client_has_registry(GameTestHelper helper) { if (FMLLoader.getDist().isDedicatedServer()) @@ -79,9 +64,9 @@ public class NetworkDatapackRegistryTest extends BaseTestMod { var level = mc.level; var reg = level.registryAccess().lookup(REGISTRY_KEY); helper.assertTrue(reg.isPresent(), "Failed to find " + REGISTRY_KEY.location()); - var entry = reg.get().getValue(TEST_ENTRY); + var entry = reg.get().getValue(REGISTRY_ENTRY.getKey()); if (entry == null) - helper.fail("Failed to find " + TEST_ENTRY); + helper.fail("Failed to find " + REGISTRY_ENTRY.getKey()); helper.assertValueEqual(entry.value, TEST_VALUE, Component.literal("Loaded entry does not contain expected value")); } diff --git a/src/test/java/net/minecraftforge/test/BaseTestMod.java b/src/test/java/net/minecraftforge/test/BaseTestMod.java index 455cc9e5b6..d6f71a546c 100644 --- a/src/test/java/net/minecraftforge/test/BaseTestMod.java +++ b/src/test/java/net/minecraftforge/test/BaseTestMod.java @@ -8,22 +8,36 @@ package net.minecraftforge.test; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; import java.util.function.Function; +import com.mojang.serialization.Lifecycle; +import com.mojang.serialization.MapCodec; + import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.registries.VanillaRegistries; +import net.minecraft.gametest.framework.FunctionGameTestInstance; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.gametest.framework.GameTestInstance; +import net.minecraft.gametest.framework.TestData; +import net.minecraft.gametest.framework.TestEnvironmentDefinition; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.CreativeModeTab.TabVisibility; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; @@ -31,14 +45,18 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.ForgeGameTestHooks; -import net.minecraftforge.gametest.GameTest; import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.DeferredRegisterData; import net.minecraftforge.registries.RegisterEvent; public abstract class BaseTestMod { private List> testItems = new ArrayList<>(); protected final IEventBus modBus; - private final Map>, DeferredRegister> dataRegistries = new HashMap<>(); + + private final List>, DeferredRegisterData>> dataRegistries = new ArrayList<>(); + protected final Set> myDataRegistries = new HashSet<>(); + + protected final Map tests; public BaseTestMod(FMLJavaModLoadingContext context) { this(context, true); @@ -47,41 +65,46 @@ public abstract class BaseTestMod { public BaseTestMod(FMLJavaModLoadingContext context, boolean register) { this.modBus = context.getModEventBus(); - if (!register) + if (!register) { + this.tests = Collections.emptyMap(); return; + } modBus.register(this); - boolean hasGameTest = false; + tests = ForgeGameTestHooks.gatherTests(getClass(), this); Class cls = getClass(); while (cls != BaseTestMod.class) { + var data = new LinkedHashMap>, DeferredRegisterData>(); for (var field : cls.getDeclaredFields()) { - if (Modifier.isStatic(field.getModifiers()) && field.getType() == DeferredRegister.class) { - field.setAccessible(true); + if (!Modifier.isStatic(field.getModifiers())) + continue; + + if (field.getType() == DeferredRegister.class) { DeferredRegister dr = getField(field, null); dr.register(modBus); - - var key = dr.getRegistryKey(); - if (VanillaRegistries.DATAPACK_REGISTRY_KEYS.contains(key)) - dataRegistries.put(key, dr); + } else if (field.getType() == DeferredRegisterData.class) { + DeferredRegisterData dr = getField(field, null); + data.put(dr.getRegistryKey(), dr); + if (cls == getClass()) + myDataRegistries.add(dr); } } - if (!hasGameTest) { - for (var method : cls.getDeclaredMethods()) { - if (method.getAnnotation(GameTest.class) != null) { - hasGameTest = true; - break; - } - } - } + if (!data.isEmpty()) + dataRegistries.addFirst(data); cls = cls.getSuperclass(); } - //if (!dataRegistries.isEmpty()) - // modBus.addListener(this::generateDataPacks); + if (!myDataRegistries.isEmpty()) + modBus.addListener(this::generateDataRegistries); + + if (!tests.isEmpty()) { + modBus.addListener(this::registerTestFunctions); + modBus.addListener(this::generateGameTests); + } } @@ -100,6 +123,11 @@ public abstract class BaseTestMod { return mod.value(); } + protected static ResourceLocation rl(String path) { + var modid = modid(StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass()); + return ResourceLocation.fromNamespaceAndPath(modid, path); + } + protected static ResourceLocation rl(String namespace, String path) { return ResourceLocation.fromNamespaceAndPath(namespace, path); } @@ -126,25 +154,108 @@ public abstract class BaseTestMod { } } - /* - @SubscribeEvent - protected void onRegister(RegisterEvent event) { - if (event.getRegistryKey() != Registries.TEST_INSTANCE && event.getRegistryKey() != Registries.TEST_FUNCTION) + protected void generateDataRegistries(GatherDataEvent event) { + if (!event.includeServer()) return; - var tests = ForgeGameTestHooks.gatherTests(getClass()); + var gen = event.getGenerator(); + var packOutput = gen.getPackOutput(); + var registrySet = VanillaRegistries.builder(); + for (var level : this.dataRegistries) { + for (var reg : level.values()) + registrySet.add(reg); + } + var toDump = new HashSet>(); + for (var reg : myDataRegistries) { + for (var entry : reg.getEntries()) + toDump.add(entry.getKey()); + } + + var modid = modid(); + gen.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(packOutput, event.getLookupProvider(), registrySet, modid) { + @Override + public String getName() { + return "Data Registries: " + modid; + } + + @Override + protected boolean shouldDump(ResourceKey key) { + return toDump.contains(key); + } + }); } - private void generateDataPacks(GatherDataEvent event) { + private void registerTestFunctions(RegisterEvent event) { + if (event.getRegistryKey() != Registries.TEST_FUNCTION) + return; + for (var entry : this.tests.entrySet()) + event.register(Registries.TEST_FUNCTION, entry.getKey(), entry.getValue()::consumer); + } + + protected void generateGameTests(GatherDataEvent event) { + if (!event.includeServer()) + return; + + var gen = event.getGenerator(); + var packOutput = gen.getPackOutput(); + var registrySet = VanillaRegistries.builder(); + + for (var level : this.dataRegistries) { + for (var reg : level.values()) + registrySet.add(reg); + } + + registrySet + .add(Registries.TEST_INSTANCE, Lifecycle.stable(), ctx -> { + var envs = ctx.lookup(Registries.TEST_ENVIRONMENT); + for (var entry : tests.entrySet()) { + var rdata = entry.getValue().data(); + var env = envs.getOrThrow(ResourceKey.create(Registries.TEST_ENVIRONMENT, rdata.environment())); + + var edata = new TestData>( + env, + rdata.structure(), + rdata.maxTicks(), + rdata.setupTicks(), + rdata.required(), + rdata.rotation(), + rdata.manualOnly(), + rdata.maxAttempts(), + rdata.requiredSuccesses(), + rdata.skyAccess() + ); + + var funcKey = ResourceKey.create(Registries.TEST_FUNCTION, entry.getKey()); + var func = BuiltInRegistries.TEST_FUNCTION.get(funcKey).orElse(null); + if (func == null) + throw new IllegalStateException("Could not find referenced function `" + entry.getKey()); + + var testKey = ResourceKey.create(Registries.TEST_INSTANCE, entry.getKey()); + ctx.register(testKey, new FunctionGameTestInstance(funcKey, edata)); + } + }); + + var modid = modid(); + gen.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(packOutput, event.getLookupProvider(), registrySet, modid) { + @Override + public String getName() { + return "Game Tests: " + modid; + } + + @Override + protected boolean shouldDump(ResourceKey key) { + return tests.containsKey(key.location()); + } + }); } - */ @SuppressWarnings("unchecked") protected static R getField(Field field, Object instance) { try { + field.setAccessible(true); return (R)field.get(instance); } catch (IllegalArgumentException | IllegalAccessException e) { return sneak(e);