You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据物品模型状态修改纹理?已配置谓词但未生效

Minecraft模组开发:物品纹理随模型状态切换问题排查与解决

你的现有配置与代码

1. 物品模型JSON(weather_cycle_device.json)

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "rafaels-weather-cycle-device:item/weather_cycle_device"
  },
  "overrides": [
    {
      "predicate": {
        "rafaels-weather-cycle-device:weather_state": 2.0
      },
      "model": "rafaels-weather-cycle-device:item/weather_cycle_device_rainy"
    },
    {
      "predicate": {
        "rafaels-weather-cycle-device:weather_state": 3.0
      },
      "model": "rafaels-weather-cycle-device:item/weather_cycle_device_thunder"
    }
  ]
}

2. 模型谓词注册代码

package net.rafael.weathercycledevice.util;

import net.minecraft.client.item.ModelPredicateProviderRegistry;
import net.minecraft.util.Identifier;
import net.rafael.weathercycledevice.RafaelsWeatherCycleDevice;
import net.rafael.weathercycledevice.components.ModComponentDataTypes;
import net.rafael.weathercycledevice.item.ModItems;

public class ModModelPredicates {
    public static void registerModelPredicates() {

        ModelPredicateProviderRegistry.register(ModItems.WEATHER_CYCLE_DEVICE, Identifier.of(RafaelsWeatherCycleDevice.MOD_ID, "weather_state"),
                (stack, world, entity, seed) -> {
                    Integer weatherState = stack.get(ModComponentDataTypes.WeatherState);
                    return weatherState != null ? weatherState : 1;
                });
    }
}

问题排查与解决步骤

1. 确保客户端同步物品栈数据

服务器端修改物品栈的Component数据后,必须同步到客户端,否则客户端会一直读取旧状态:

  • 修改状态后调用stack.markDirty()标记数据变更;
  • 在Item.use()等服务器执行的方法中,返回TypedActionResult.success(stack, world.isClient()),确保服务器将更新后的物品栈同步给客户端;
  • 若自定义了数据逻辑,需通过数据包手动同步状态到客户端。

2. 验证谓词注册时机

模型谓词是客户端专属逻辑,必须在客户端初始化阶段注册:

  • 在你的ClientModInitializer实现类的onInitializeClient()方法中调用ModModelPredicates.registerModelPredicates(),确保客户端启动时完成注册。

3. 检查谓词匹配逻辑

Minecraft的模型overrides按顺序匹配,且数值谓词遵循"大于等于"规则。当前配置中状态3.0会匹配第二个override,可显式添加默认状态配置避免歧义:

{
  "predicate": {
    "rafaels-weather-cycle-device:weather_state": 1.0
  },
  "model": "rafaels-weather-cycle-device:item/weather_cycle_device"
}

4. 确认客户端获取的状态值正确

在客户端侧添加日志,验证模型谓词返回的数值是否与服务器同步:

// 在ModelPredicateProvider的lambda中添加客户端日志
Integer weatherState = stack.get(ModComponentDataTypes.WeatherState);
float result = weatherState != null ? weatherState : 1;
if (world != null && world.isClient()) {
    System.out.println("Item weather state: " + result);
}
return result;

如果客户端打印的数值还是1,说明数据未同步,回到第一步排查同步逻辑。

5. 检查标识符一致性

确保JSON中的谓词标识符"rafaels-weather-cycle-device:weather_state"与代码中的Identifier.of(RafaelsWeatherCycleDevice.MOD_ID, "weather_state")完全一致:

  • 检查MOD_ID的拼写、大小写(Minecraft标识符对大小写敏感,通常全小写);
  • 确认代码中MOD_ID常量的值与JSON中的命名空间一致。

内容的提问来源于stack exchange,提问作者Rafael Mehdiyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:01:09