- 60
- 1
- 2
Как создать свое дерево которое будет расти из саженца? Покажите пожалуйста все классы которые нужны для этого, что за что отвечает. (Ссылки на видео не нужны, я всех их пересмотрел и нифига не понял..)
У саженцев же другой тип? :/ Sapling... чёта-там.cube_all
Про саженцы я не знаю, но, вполне вероятно, проблема тоже в модели.Раз текстура отображается частично, и в инвентаре, то скорее всего проблема в моделе кубического блока
Там вроде используется block_orientable, но это не точно.Я про блок дерева в первую очередь:
{
"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" }
}
}
{
"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" }
}
}
{
"parent": "block/cube_column",
"textures": {
"end": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_top",
"side": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_side"
}
}
{
"parent": "block/cube_all",
"textures": {
"all": "galaxyspace:blocks/proximasystem/proxima_b/tree_2_side"
}
}
То есть я должен зделать так?:Blockstate
{
"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"
}
}
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;
}
}
Я тожеЯ делал через BlockLog
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");
}
}
}
Да, кстате, но тут еще вышла проблемка я вот создал BlockOres (у меня два enumType это linden и silver) и так вышло что в блоках оно еще регистрирует log_silver, plank_silver, sapling_silver и т.д. а там наоборот, ore_linden. Кто знает как это исправить?Посмотри код блока печки