有没有什么方法可以在代码中修改方块部分颜色(类似替换)


有没有什么方法可以在代码中修改方块部分颜色(类似替换)


FledgeXu


最简单的BlockState,然后是IBakeModel 最后是TESR
我出过1.14 BlockState视频



@OnlyIn(Dist.CLIENT)
public class CustomBlockColor implements IBlockColor {
    @Override
    public int getColor(BlockState state, @Nullable ILightReader light, @Nullable BlockPos pos, int tintIndex) {
        if(state.getBlock() instanceof ColorBlock) {
            return ((ColorBlock)(state.getBlock())).getColorValue();
        } else {
            return 0x000000;
        }
    }
}
public class ColorBlock extends Block {
    protected DyeColor color;
    public ColorBlock(Properties properties, DyeColor color) {
        super(properties);
        this.color = color;
    }
    public int getColorValue() {
        return color.getColorValue();
    }
    // default function from source code
    public static Direction getFacingFromEntity(BlockPos clickedBlock, LivingEntity entity) {
        Vec3d vec = entity.getPositionVec();
        return Direction.getFacingFromVector(
                (float) (vec.x - clickedBlock.getX()),
                (float) (vec.y - clickedBlock.getY()),
                (float) (vec.z - clickedBlock.getZ())
        );
    }
}
@SubscribeEvent
    public static void onBlockColor(ColorHandlerEvent.Block event) {
        LOGGER.info("Hello from onBlockColor RegistryClient");
        event.getBlockColors().register(new CustomBlockColor(),
                ModBlocks.OBSIDIAN_BLOCK,
                ModBlocks.OBSIDIAN_BLOCK_RED
        );
    }


这个相当于覆盖颜色,可能不完全符合要求,但是是不是可能叠加两层贴图


FledgeXu


没看懂你的意思。
你的代码什么意思。



这个方法就是forge官方文档中提到,IBlockColor与IItemColor方法,ColorBlock类仿照其他可以染色的方块,比如树叶什么的写的,最后需要在客户端注册这个IBlockColor类,并告诉mc,有什么方块类需要用自定义的染色方法来进行渲染,同时模型文件定义时,需要定义一个tintindex的参数。


FledgeXu


IBlcokColor 是只能全换颜色的,如果你要部分的改变颜色要用 IBlockModelTER