1.16的Item Property Overrides

USS.Shenzhou


版本信息
你使用的系统:win10 x64
你是用的JDK: 8u251 x64
你使用的IDE:IntelliJ IDEA
你使用的IDE版本:2020.2
Forge版本: 34.1.0
Minecraft版本: 1.16.3

错误情况简述
添加Item Property Overrides(物品属性覆盖?不知道怎么翻译好),原版1.15的ItemModelsProperties.registerProperty方法是直接写在各个item的构造器里面的,但是1.16被统一移到了ItemModelsProperties.java里面。我一开始以为影响不大,结果发现如果仍然像1.15那样写咋构造器里面的话,开服务端runServer时就会报错。
我去看了看1.16的forge文档(部分摘录在下方),基本看懂了但还是不会用 :sweat:主要问题出在addPropertyOverride方法上,一是原版和以前貌似用的是registerProperty,二是我根本没找到这个方法。。。

报错日志

-- Head --
Thread: main
Stacktrace:
	at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:71) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-launcher.jar:34.1] {}
-- MOD rainbow6 --
Details:
	Caused by 0: java.lang.ExceptionInInitializerError
		at com.ussshenzhou.rainbow6.util.RegistryHandler.onItemReg(RegistryHandler.java:32) ~[classes/:?] {re:classloading}
		at net.minecraftforge.eventbus.ASMEventHandler_9_RegistryHandler_onItemReg_Register.invoke(.dynamic) ~[?:?] {}
		at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-3.0.3-service.jar:?] {}
		at net.minecraftforge.eventbus.EventBus.post(EventBus.java:297) ~[eventbus-3.0.3-service.jar:?] {}
		at net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:120) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:34.1] {re:classloading}
		at net.minecraftforge.fml.ModContainer.lambda$null$4(ModContainer.java:112) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.registries.GameData.lambda$null$13(GameData.java:362) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$5(ModContainer.java:112) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at java.util.concurrent.CompletableFuture$AsyncRun.run$$$capture(CompletableFuture.java:1640) ~[?:1.8.0_251] {}
		at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java) ~[?:1.8.0_251] {}
		at net.minecraftforge.fml.ModWorkManager$SyncExecutor.driveOne(ModWorkManager.java:56) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.ModWorkManager$DrivenExecutor.drive(ModWorkManager.java:40) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.ModLoader.waitForTransition(ModLoader.java:248) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:235) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:201) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraftforge.fml.server.ServerModLoader.load(ServerModLoader.java:44) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at net.minecraft.server.Main.main(Main.java:96) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_251] {}
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_251] {}
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_251] {}
		at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_251] {}
		at net.minecraftforge.userdev.FMLUserdevServerLaunchProvider.lambda$launchService$0(FMLUserdevServerLaunchProvider.java:54) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {}
		at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-7.0.1.jar:?] {}
		at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-7.0.1.jar:?] {}
		at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-7.0.1.jar:?] {}
		at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-7.0.1.jar:?] {}
		at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-7.0.1.jar:?] {}
		at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {}

	Mod File: resources
	Failure message: Rainbow6Minesiege (rainbow6) encountered an error during the load_registries event phase
		java.lang.ExceptionInInitializerError: null
	Mod Version: 0.1.1.dev1
	Mod Issue URL: http://my.issue.tracker/
	Exception message: java.lang.RuntimeException: Attempted to load class net/minecraft/client/world/ClientWorld for invalid dist DEDICATED_SERVER
Stacktrace:
	at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:71) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-launcher.jar:34.1] {}
	at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:85) ~[modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:119) ~[modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.TransformingClassLoader$DelegatedClassLoader.findClass(TransformingClassLoader.java:256) ~[modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:135) ~[modlauncher-7.0.1.jar:?] {re:classloading}
	at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:97) ~[modlauncher-7.0.1.jar:?] {re:classloading}
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_251] {}
此处at com.ussshenzhou.rainbow6.items.FragGrenade.<init>(FragGrenade.java:31) ~[classes/:?] {re:classloading}
	at com.ussshenzhou.rainbow6.items.ModItems.<clinit>(ModItems.java:20) ~[classes/:?] {re:classloading}
	at com.ussshenzhou.rainbow6.util.RegistryHandler.onItemReg(RegistryHandler.java:32) ~[classes/:?] {re:classloading}
	at net.minecraftforge.eventbus.ASMEventHandler_9_RegistryHandler_onItemReg_Register.invoke(.dynamic) ~[?:?] {}
	at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-3.0.3-service.jar:?] {}
	at net.minecraftforge.eventbus.EventBus.post(EventBus.java:297) ~[eventbus-3.0.3-service.jar:?] {}
	at net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:120) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:34.1] {re:classloading}
	at net.minecraftforge.fml.ModContainer.lambda$null$4(ModContainer.java:112) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.registries.GameData.lambda$null$13(GameData.java:362) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$5(ModContainer.java:112) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at java.util.concurrent.CompletableFuture$AsyncRun.run$$$capture(CompletableFuture.java:1640) ~[?:1.8.0_251] {}
	at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java) ~[?:1.8.0_251] {}
	at net.minecraftforge.fml.ModWorkManager$SyncExecutor.driveOne(ModWorkManager.java:56) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.ModWorkManager$DrivenExecutor.drive(ModWorkManager.java:40) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.ModLoader.waitForTransition(ModLoader.java:248) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:235) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:201) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.server.ServerModLoader.load(ServerModLoader.java:44) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at net.minecraft.server.Main.main(Main.java:96) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {re:classloading}
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_251] {}
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_251] {}
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_251] {}
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_251] {}
	at net.minecraftforge.userdev.FMLUserdevServerLaunchProvider.lambda$launchService$0(FMLUserdevServerLaunchProvider.java:54) ~[forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-7.0.1.jar:?] {}
	at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-7.0.1.jar:?] {}
	at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.3-34.1.0_mapped_snapshot_20200916-1.16.2-recomp.jar:?] {}

相关代码
FragGrenade.java构造器部分(1.15正常而1.16报错)

public class FragGrenade extends Item {
    public FragGrenade() {
        super(new Properties()
                .group(ModItemGroups.Group1)
        );
        this.setRegistryName("fraggrenade");
        ItemModelsProperties.registerProperty(ModItems.fragGrenade,new ResourceLocation("pulling"),(p_210309_0_, p_210309_1_, p_210309_2_) -> {
            return p_210309_2_ != null && p_210309_2_.isHandActive() && p_210309_2_.getActiveItemStack() == p_210309_0_ ? 1.0F : 0.0F;
        });
    }

查到的资料
1.16.x Forge文档

Adding Properties to Items

Item::addPropertyOverride is used to add a property to an item. The ResourceLocation parameter is the name given to the property (e.g. new ResourceLocation("pull") ). The IItemPropertyGetter is a function that takes the ItemStack , the World it’s in, and the EntityLivingBase that holds it, returning the float value for the property. Some examples are the "pulling" and “ pull ” properties in ItemBow , and the several static final ones in Item . For modded item properties, it is recommended that the modid of the mod is used as the namespace (e.g. examplemod:property and not just property , as that really means minecraft:property ).

这部分也不太明白

And here’s a hypothetical snippet from the supporting code. (This does not have to be client-only; it will work on a server too. In vanilla, properties are registered in the item’s constructor.)

item.addPropertyOverride(new IItemPropertyGetter() {
  @SideOnly(Side.CLIENT)
  @Override
  public float apply(ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entity) {
    return (float)getPowerLevel(stack) / (float)getMaxPower(stack); // Some external methods
  }
}

USS.Shenzhou


补充:原本的目的是借用拉弓的动作来渲染一个丢手雷的动作 :rofl:


FledgeXu


我觉得ItemModelsProperties.registerProperty这个方法不应该放在Item类的构造函数里,你应该放到类似于FMLClientSetupEvent这种事件里。

public static void registerProperty(Item, ResourceLocation, IItemPropertyGetter)

这里三个变量的意思估计是:第一个参数是你要添加Item Property Overrides的物品,第二个参数是这个Property的名字,第三个参数我们先看一下它的类型签名。

 float call(ItemStack, @Nullable ClientWorld, @Nullable LivingEntity)

根据这个类型签名可以看到,这个是通过传入的三个元素然后返回一个float的值,这个返回的float值就是你在模型文件中predicate做比较的值。


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。