Как создать свое дерево?

Версия Minecraft
1.12.2
Как создать свое дерево которое будет расти из саженца? Покажите пожалуйста все классы которые нужны для этого, что за что отвечает. (Ссылки на видео не нужны, я всех их пересмотрел и нифига не понял..)
 
917
22
332
Раз текстура отображается частично, и в инвентаре, то скорее всего проблема в моделе кубического блока... Проверь модель которая наследует cube_all. Точнее сказать не смогу.
-----------------------------------------------------------------------------------------------
Для меня модели нечто слишком сложное. Вроде бы знаешь как это работает и всё сделано правильно, но оно не работает. А потом вдруг начинает работать, а ты сиди и ломай голову, что ты такое волшебное сделал...
Короче, перепроверь много раз... Совет, которому я никогда не изменяю.
 
917
22
332
Я про блок дерева в первую очередь:
Раз текстура отображается частично, и в инвентаре, то скорее всего проблема в моделе кубического блока
Про саженцы я не знаю, но, вполне вероятно, проблема тоже в модели.
 
Оказалось что я просто забыл стереть запятую :whistle:
Код:
{
    "variants":
    {
        "stage=0,variant=linden": { "model": "tsgw:sapling_linden" },
        "stage=1,variant=linden": { "model": "tsgw:sapling_linden" }
    }
}

НО у бревна отображается только его верхняя и нижняя части а боковые - нет, тут-то я уже точно не знаю как это исправить
Код:
{
    "variants": {
        "axis=y,variant=linden": { "model": "tsgw:log_linden" },
        "axis=z,variant=linden": { "model": "tsgw:log_linden", "x": 90 },
        "axis=x,variant=linden": { "model": "tsgw:log_linden", "x": 90, "y": 90 },
        "axis=none,variant=linden": { "model": "tsgw:log_linden" }
    }
}

2018-10-31_08.18.25 — копия.png
 
Последнее редактирование:
1,057
50
234
Blockstate
Код:
{

    "variants": {
        "axis=y": { "model": "galaxyspace:proxima/proxima_b_log_2_model" },
        "axis=z": { "model": "galaxyspace:proxima/proxima_b_log_2_model", "x": 90 },
        "axis=x": { "model": "galaxyspace:proxima/proxima_b_log_2_model", "x": 90, "y": 90 },
        "axis=none": { "model": "galaxyspace:proxima/proxima_b_log_2_bark_model" }
    }
}

proxima_b_log_2_model
Код:
{
    "parent": "block/cube_column",
    "textures": {
        "end": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_top",
        "side": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_side"
    }
}

proxima_b_log_2_bark_model
Код:
{
    "parent": "block/cube_all",
    "textures": {
        "all": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_side"
    }
}
 
То есть я должен зделать так?:
Код:
{

    "variants": {
        "axis=y": { "model": "tsgw:blocks/log_linden" },
        "axis=z": { "model": "tsgw:blocks/log_linden", "x": 90 },
        "axis=x": { "model": "tsgw:blocks/log_linden", "x": 90, "y": 90 },
        "axis=none": { "model": "tsgw:blocks/log_linden_top" }
    }
}

Код:
{
    "parent": "block/cube_column",
    "textures": {
        "end": "tsgw:blocks/blocks/log_linden_top",
        "side": "tsgw:blocks/blocks/log_linden"
    }
}


Код:
{
    "parent": "block/cube_all",
    "textures": {
        "all": "tsgw:blocks/log_linden_top"
    }
}
 
1,057
50
234
Java:
public class Proxima_B_Logs extends BlockRotatedPillar {

    public Proxima_B_Logs(String name) {
        super(Material.WOOD);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(GSCreativeTabs.GSBlocksTab);
        setHardness(2.0F);
        setSoundType(SoundType.WOOD);
    }
    
    @Override
    public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
        int i = 4;
        int j = 5;

        if (worldIn.isAreaLoaded(pos.add(-5, -5, -5), pos.add(5, 5, 5))) {
            for (BlockPos blockpos : BlockPos.getAllInBox(pos.add(-4, -4, -4), pos.add(4, 4, 4))) {
                IBlockState iblockstate = worldIn.getBlockState(blockpos);

                if (iblockstate.getBlock().isLeaves(iblockstate, worldIn, blockpos)) {
                    iblockstate.getBlock().beginLeavesDecay(iblockstate, worldIn, blockpos);
                }
            }
        }
    }
    
    @Override
    public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
        return this.getStateFromMeta(meta).withProperty(AXIS, facing.getAxis());
    }
    
    @Override
    public IBlockState withRotation(IBlockState state, Rotation rot) {
        switch (rot) {
        case COUNTERCLOCKWISE_90:
        case CLOCKWISE_90:

            switch ((EnumFacing.Axis) state.getValue(AXIS)) {
            case X:
                return state.withProperty(AXIS, EnumFacing.Axis.Z);
            case Z:
                return state.withProperty(AXIS, EnumFacing.Axis.X);
            default:
                return state;
            }

        default:
            return state;
        }
    }
    
    @Override
    public boolean canSustainLeaves(IBlockState state, IBlockAccess world, BlockPos pos) {
        return true;
    }

    @Override
    public boolean isWood(IBlockAccess world, BlockPos pos) {
        return true;
    }
}
 
Код:
public class BlockLogs extends BlockLog implements IMetaName, IHasModel
{
    public static final PropertyEnum<EnumHandler.EnumType> VARIANT = PropertyEnum.<EnumHandler.EnumType>create("variant", EnumHandler.EnumType.class, new Predicate<EnumHandler.EnumType>()
    {
        public boolean apply(@Nullable EnumHandler.EnumType apply)
        {
            return apply.getMeta() < 2;
        }
    });
    
    //private String name;
    
    public BlockLogs(String name)
    {
        setUnlocalizedName(name);
        setRegistryName(name);
        setSoundType(SoundType.WOOD);
        setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, EnumHandler.EnumType.LINDEN).withProperty(LOG_AXIS, EnumAxis.Y));
        setCreativeTab(TheScraGullWorld.BLOCKS);
        
        //this.name = name;
        
        BlockInit.BLOCKS.add(this);
        ItemInit.ITEMS.add(new ItemBlockVariants(this).setRegistryName(this.getRegistryName()));
    }
    
    @Override
    public void getSubBlocks(CreativeTabs itemIn, NonNullList<ItemStack> items)
    {
        for(EnumHandler.EnumType customblockplanks$enumtype : EnumHandler.EnumType.values())
        {
            items.add(new ItemStack(this, 1, customblockplanks$enumtype.getMeta()));
        }
    }
    
    @Override
    public IBlockState getStateFromMeta(int meta)
    {
        IBlockState state = this.getDefaultState().withProperty(VARIANT, EnumHandler.EnumType.byMetadata((meta & 1) % 2));
        
        switch(meta & 6)
        {
        case 0:
            state = state.withProperty(LOG_AXIS, EnumAxis.Y);
            break;
            
        case 2:
            state = state.withProperty(LOG_AXIS, EnumAxis.X);
            break;
            
        case 4:
            state = state.withProperty(LOG_AXIS, EnumAxis.Z);
            break;
            
        default:
            state = state.withProperty(LOG_AXIS, EnumAxis.NONE);
        }
        
        return state;
    }
    
    @SuppressWarnings("incomplete-switch")
    @Override
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        i = i | ((EnumHandler.EnumType)state.getValue(VARIANT)).getMeta();
        
        switch((BlockLog.EnumAxis)state.getValue(LOG_AXIS))
        {
        case X:
            i |= 2;
            break;
            
        case Y:
            i |= 4;
            break;
            
        case Z:
            i |= 6;
        }
        
        return i;
    }
    
    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {VARIANT,LOG_AXIS});
    }
    
    @Override
    protected ItemStack getSilkTouchDrop(IBlockState state)
    {
        return new ItemStack(Item.getItemFromBlock(this), 1, ((EnumHandler.EnumType)state.getValue(VARIANT)).getMeta());
    }
    
    @Override
    public int damageDropped(IBlockState state)
    {
        return ((EnumHandler.EnumType)state.getValue(VARIANT)).getMeta();
    }
    
    @Override
    public String getSpecialName(ItemStack stack)
    {
        return EnumHandler.EnumType.values()[stack.getItemDamage()].getName();
    }
    
    @Override
    public void registerModels()
    {
        for(int i = 0; i < EnumHandler.EnumType.values().length; i++)
        {
            TheScraGullWorld.proxy.registerVariantRenderer(Item.getItemFromBlock(this), i, "log_" + EnumHandler.EnumType.values()[i].getName(), "inventory");
        }
    }   
}
 
1,031
19
87
Посмотри код блока печки, там есть метод, отвечающий за то, какой стороной поставится блок в зависимости от взгляда игрока, а модельку скопипасти с ванильной древесины.
 
Посмотри код блока печки
Да, кстате, но тут еще вышла проблемка я вот создал BlockOres (у меня два enumType это linden и silver) и так вышло что в блоках оно еще регистрирует log_silver, plank_silver, sapling_silver и т.д. а там наоборот, ore_linden. Кто знает как это исправить?
 
Сверху