如何根据物品模型状态修改纹理?已配置谓词但未生效
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
相关产品推荐
相关产品推荐

