Tinkers Construct

Tinkers Construct

170M Downloads

Max Energy stat fails to load in datapack modifiers

Closed this issue ยท 6 comments

commented

Minecraft Version

1.20.1

Modloader

Forge

Modloader Version

47.3.0

Mantle Version

1.11.55

Tinkers' Construct Version

3.10.0.67

Describe your issue

Max Energy stat will cause JsonSyntaxException: Unknown stat type tconstruct:max_energy exception when making datapack-loaded modifiers.

Steps to reproduce

1.Write a modifier with StatBoostModule that make changes on Max Energy stat. Code:
{ "level_display": "tconstruct:default", "modules": [ { "type": "tconstruct:stat_boost", "each_level": 0.2, "operation": "percent", "stat": "tconstruct:max_energy" } ], "tooltip_display": "always" }
2.Start the game and join in a world.
3.The modifier can't be found using modifier command. A JsonSyntaxException was found in log, Stack Track:

[slimeknights.tconstruct.library.modifiers.ModifierManager/]: Failed to load modifier kubejs:extra_capacity
com.google.gson.JsonSyntaxException: Unknown stat type tconstruct:max_energy
at slimeknights.tconstruct.library.tools.stat.ToolStats.lambda$static$0(ToolStats.java:27) ~[TConstruct-1.20.1-3.10.0.67.jar%23171!/:1.20.1-3.10.0.67]
at slimeknights.mantle.data.loadable.mapping.MappedLoadable.convert(MappedLoadable.java:46) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.mapping.MappedLoadable.convert(MappedLoadable.java:46) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.Loadable.getIfPresent(Loadable.java:95) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.field.RequiredField.get(RequiredField.java:19) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.field.LoadableField.get(LoadableField.java:32) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.record.RecordLoadable4.deserialize(RecordLoadable4.java:20) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.registry.GenericLoaderRegistry.deserialize(GenericLoaderRegistry.java:73) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.registry.GenericLoaderRegistry.deserialize(GenericLoaderRegistry.java:25) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.field.DirectField.get(DirectField.java:18) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.record.RecordLoadable2.deserialize(RecordLoadable2.java:19) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.record.RecordLoadable.convert(RecordLoadable.java:57) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.mapping.CollectionLoadable.convertArray(CollectionLoadable.java:63) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.mapping.CollectionLoadable.convertArray(CollectionLoadable.java:17) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.array.ArrayLoadable.convert(ArrayLoadable.java:54) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.Loadable.getOrDefault(Loadable.java:123) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.field.DefaultingField.get(DefaultingField.java:32) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.field.LoadableField.get(LoadableField.java:32) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.mantle.data.loadable.record.RecordLoadable5.deserialize(RecordLoadable5.java:24) ~[Mantle-1.20.1-1.11.55.jar%23168!/:1.20.1-1.11.55]
at slimeknights.tconstruct.library.modifiers.ModifierManager.loadModifier(ModifierManager.java:296) ~[TConstruct-1.20.1-3.10.0.67.jar%23171!/:1.20.1-3.10.0.67]
at slimeknights.tconstruct.library.modifiers.ModifierManager.lambda$apply$3(ModifierManager.java:152) ~[TConstruct-1.20.1-3.10.0.67.jar%23171!/:1.20.1-3.10.0.67]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?]
at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1850) ~[?:?]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?]
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[?:?]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[?:?]
at slimeknights.tconstruct.library.modifiers.ModifierManager.apply(ModifierManager.java:154) ~[TConstruct-1.20.1-3.10.0.67.jar%23171!/:1.20.1-3.10.0.67]
at slimeknights.tconstruct.library.modifiers.ModifierManager.m_5787_(ModifierManager.java:68) ~[TConstruct-1.20.1-3.10.0.67.jar%23171!/:1.20.1-3.10.0.67]
at net.minecraft.server.packs.resources.SimplePreparableReloadListener.m_10789_(SimplePreparableReloadListener.java:13) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718) ~[?:?]
at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?]
at net.minecraft.server.packs.resources.SimpleReloadInstance.m_143940_(SimpleReloadInstance.java:69) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_6367_(BlockableEventLoop.java:156) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.m_6367_(ReentrantBlockableEventLoop.java:23) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_7245_(BlockableEventLoop.java:130) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.util.thread.BlockableEventLoop.m_18701_(BlockableEventLoop.java:139) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldOpenFlows.m_246486_(WorldOpenFlows.java:163) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldOpenFlows.m_233122_(WorldOpenFlows.java:113) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldOpenFlows.doLoadLevel(WorldOpenFlows.java:181) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldOpenFlows.m_233145_(WorldOpenFlows.java:169) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldOpenFlows.m_233133_(WorldOpenFlows.java:65) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldSelectionList$WorldListEntry.m_101744_(WorldSelectionList.java:575) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldSelectionList$WorldListEntry.m_101704_(WorldSelectionList.java:474) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.worldselection.WorldSelectionList$WorldListEntry.m_6375_(WorldSelectionList.java:413) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.components.AbstractSelectionList.m_6375_(AbstractSelectionList.java:298) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.components.events.ContainerEventHandler.m_6375_(ContainerEventHandler.java:38) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.MouseHandler.m_168084_(MouseHandler.java:92) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.gui.screens.Screen.m_96579_(Screen.java:437) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.MouseHandler.m_91530_(MouseHandler.java:89) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.MouseHandler.m_168091_(MouseHandler.java:189) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:102) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.MouseHandler.m_91565_(MouseHandler.java:188) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:43) ~[lwjgl-glfw-3.3.1.jar%23141!/:build 7]
at org.lwjgl.system.JNI.invokeV(Native Method) ~[lwjgl-3.3.1.jar%23153!/:build 7]
at org.lwjgl.glfw.GLFW.glfwWaitEventsTimeout(GLFW.java:3474) ~[lwjgl-glfw-3.3.1.jar%23141!/:build 7]
at com.mojang.blaze3d.systems.RenderSystem.limitDisplayFPS(RenderSystem.java:237) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.Minecraft.m_91383_(Minecraft.java:1173) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.Minecraft.m_91374_(Minecraft.java:718) ~[client-1.20.1-20230612.114412-srg.jar%23172!/:?]
at net.minecraft.client.main.Main.main(Main.java:218) ~[1.20.1-Forge47.3.0.jar:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at net.minecraftforge.fml.loading.targets.CommonLaunchHandler.runTarget(CommonLaunchHandler.java:111) ~[fmlloader-1.20.1-47.3.0.jar:?]
at net.minecraftforge.fml.loading.targets.CommonLaunchHandler.clientService(CommonLaunchHandler.java:99) ~[fmlloader-1.20.1-47.3.0.jar:?]
at net.minecraftforge.fml.loading.targets.CommonClientLaunchHandler.lambda$makeService$0(CommonClientLaunchHandler.java:25) ~[fmlloader-1.20.1-47.3.0.jar:?]
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.Launcher.run(Launcher.java:108) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.Launcher.main(Launcher.java:78) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) ~[modlauncher-10.0.9.jar:?]
at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) ~[bootstraplauncher-1.1.2.jar:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at oolloo.jlw.Wrapper.invokeMain(Wrapper.java:112) ~[?:?]
at oolloo.jlw.Wrapper.main(Wrapper.java:105) ~[?:?]

Additional Information:

  1. Kubejs was used to load the data file (Since I'm only familiar with this), only datapack loading function is used.
  2. This issue was first found when I was developping my tcon addon, besides max energy, the tool stats I added in my addon also can't work in datapack (Including ToolDefinitionData file, Max Energy and my additional stats can't be load with same exception), I'm wondering what causes this issue.

Crash Report

No response

Can you reproduce with just Tinkers?

I have not tried

Performance Enchancers

None of the above

Other mods

1.Kubejs, Architectury API and rhino ;
2.JEI and TconJEI .

Searched for known issues?

Searched open issues

commented

There might be a class loading issue. That said, you need the energy handler modifier if you are going to get anything functioning. Use the modifier trait module to add it. See the tank module for an example

commented

There might be a class loading issue. That said, you need the energy handler modifier if you are going to get anything functioning. Use the modifier trait module to add it. See the tank module for an example

I'll try that, thanks!
Btw does that mean I need to implement my own modifier module to get my custom tool stat working in datapack ?

commented

I don't understand the question.

The energy handler modifier trait is used to make the stat perform function; it does nothing without it.

You cannot add custom tool stats purely in datapacks. But its also useless to do so as they won't do anything.

commented

I don't understand the question.

The energy handler modifier trait is used to make the stat perform function; it does nothing without it.

You cannot add custom tool stats purely in datapacks. But its also useless to do so as they won't do anything.

What I want to say is that, I made a new Tool that uses a completely new toolstat defined in my mod and this stat can't be loaded in datapack (Just Behaved like the Max Energy stat) .
(Apologize for my poor English, I'm not a native speaker and might had implied something wrong.)

And I've just noticed that an even has been added to register extra ToolStat, I think this would solve my issue. I will try It when it is available, Thanks again !

commented

You need to ensure your stat is registered before datapacks are loaded. If you registered it statically, it may never be class loaded until after datapack load.

Take a look at the recent commit I pushed for how I fixed max energy being registered too late.

commented

Fixed in 3.10.1.76