How to add ShapedRecipe with my DataManipulator in result?

Im trying add my custom recipe, with my DataManipulator in result ItemStack.
My code:

    public static void loadRecipes() {
        ItemStack stack = ItemStack.of(ItemTypes.DIAMOND, 1);
        StandardHelmet standard_helmet_artifact = new StandardHelmet(Collections.emptyMap());
        stack.offer(new ArtifactDataManipulator(standard_helmet_artifact, NevendaarKeys.ARTIFACT)); ///line 456
        Sponge.getRegistry().getCraftingRecipeRegistry().
                register(ShapedCraftingRecipe.builder().
                        aisle("   ", "aaa", "a a").
                        where('a', Ingredient.of(ItemTypes.LEATHER)).
                        result(stack).
                        build("standard_helmet", MCDaar.getInstance()));
    }

If I call loadRecipes in GameInitializationEvent:

[16:08:03 ERROR] [Sponge]: Could not pass GameInitializationEvent$Impl to Plugin{id=mcdaar, name=MCDaar, version=1.0alpha, authors=[GWM], source=mods/MCDaar.jar}
java.lang.NullPointerException: null
	at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:257) ~[minecraft_server.1.12.2.jar:?]
	at org.spongepowered.common.data.SpongeManipulatorRegistry.getDelegate(SpongeManipulatorRegistry.java:266) ~[SpongeManipulatorRegistry.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.common.data.util.DataUtil.getWildDataProcessor(DataUtil.java:334) ~[DataUtil.class:1.12.2-7.0.0-BETA-352]
	at net.minecraft.item.ItemStack.offer(SourceFile:1187) ~[aip.class:?]
	at net.minecraft.item.ItemStack.offer(SourceFile:1065) ~[aip.class:?]
	at org.spongepowered.api.data.value.mutable.CompositeValueStore.offer(CompositeValueStore.java:270) ~[CompositeValueStore.class:1.12.2-7.0.0-BETA-352]
	at ua.gwm.sponge_plugin.mcdaar.utils.NevendaarUtils.loadRecipes(NevendaarUtils.java:456) ~[NevendaarUtils.class:?]
	at ua.gwm.sponge_plugin.mcdaar.MCDaar.initialization(MCDaar.java:254) ~[MCDaar.class:?]
	at org.spongepowered.common.event.listener.GameInitializationEventListener_MCDaar_initialization6.handle(Unknown Source) ~[?:?]
	at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95) ~[RegisteredListener.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:371) [SpongeEventManager.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:388) [SpongeEventManager.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:392) [SpongeEventManager.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:204) [SpongeImpl.class:1.12.2-7.0.0-BETA-352]
	at org.spongepowered.server.SpongeVanilla.initialize(SpongeVanilla.java:150) [SpongeVanilla.class:1.12.2-7.0.0-BETA-352]
	at net.minecraft.server.dedicated.DedicatedServer.handler$onServerInitialize$zoo000(SourceFile:1243) [nz.class:?]
	at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:191) [nz.class:?]
	at net.minecraft.server.MinecraftServer.run(SourceFile:434) [MinecraftServer.class:?]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]

If I call loadRecipes in GamePostInitializationEvent:

java.lang.IllegalStateException: Cannot register additional Recipes at this time! Recipes can only be registered before Initialization!
1 Like

Recipes should be registered during GamePreInitializationEvent.

I tried, it throws the same error, as in case if I call it in GameInitializationEvent.

Which SpongeVanilla version are you using ? There was an issue when trying to use data manipulators in recipes but it should be fixed since few months.

Latest API7 - 1.12.2-7.0.0-BETA-352

I writed this method:

    private void tryAddArtifactDataManipulator() {
        try {
            ItemStack item = ItemStack.of(ItemTypes.DIAMOND, 1);
            item.offer(new ArtifactDataManipulator(new StandardHelmet(Collections.emptyMap()), NevendaarKeys.ARTIFACT));
            System.out.println("SUCCESS!");
        } catch (Exception e) {
            System.out.println("FAIL!");
        }
    }

And runned it from PreInitialization, Initialization, PostInitialization, Started,
Results:

[21:35:04 INFO] [mcdaar]: "GamePreInitialization" complete!
[21:35:04 INFO] [STDOUT]: FAIL!
[21:35:05 INFO] [mcdaar]: "GameInitialization" complete!
[21:35:05 INFO] [STDOUT]: FAIL!
[21:35:06 INFO] [mcdaar]: "GamePostInitialization" complete!
[21:35:06 INFO] [STDOUT]: SUCCESS!
[21:35:12 INFO] [mcdaar]: "GameStartedServer" complete!
[21:35:12 INFO] [STDOUT]: SUCCESS!

So, I able add my DataManipulator only in PostInitialization and later…
But I registering my DataManipulator in Preinitialization

Does your recipe work is you replace your custom manipulator with a vanilla one ? For example, a custom name or an enchantment.

Yeah, it dont works only with my custom Data Manipulator

It seems to be an issue with the temporary registry of the PreInit phase. I suggest you to report this issue here