Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.4] 2 Block Tall Crops


ChonkoTheGreat
 Share

Recommended Posts

The code:
 

public class AncientFruitBlock extends CropsBlock {
	   
	public static final IntegerProperty AGE = BlockStateProperties.AGE_0_5;
	public static final EnumProperty<DoubleBlockHalf> HALF = BlockStateProperties.DOUBLE_BLOCK_HALF;
    private static final VoxelShape[] SHAPE_BY_AGE = new VoxelShape[]{
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 10.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 14.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D)};

    public AncientFruitBlock(Properties builder) {
        super(builder);
        this.setDefaultState(this.stateContainer.getBaseState().with(HALF, DoubleBlockHalf.LOWER));
    }
    
    public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
        DoubleBlockHalf doubleblockhalf = stateIn.get(HALF);
        if (facing.getAxis() != Direction.Axis.Y || doubleblockhalf == DoubleBlockHalf.LOWER != (facing == Direction.UP) || facingState.isIn(this) && facingState.get(HALF) != doubleblockhalf) {
           return doubleblockhalf == DoubleBlockHalf.LOWER && facing == Direction.DOWN && !stateIn.isValidPosition(worldIn, currentPos) ? Blocks.AIR.getDefaultState() : super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos);
        } else {
           return Blocks.AIR.getDefaultState();
        }
     }
    
    @Nullable
    public BlockState getStateForPlacement(BlockItemUseContext context) {
       BlockPos blockpos = context.getPos();
       return blockpos.getY() < 255 && context.getWorld().getBlockState(blockpos.up()).isReplaceable(context) ? super.getStateForPlacement(context) : null;
    }
    
    public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
        worldIn.setBlockState(pos.up(), this.getDefaultState().with(HALF, DoubleBlockHalf.UPPER), 3);
     }

     public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
        if (state.get(HALF) != DoubleBlockHalf.UPPER) {
           return super.isValidPosition(state, worldIn, pos);
        } else {
           BlockState blockstate = worldIn.getBlockState(pos.down());
           if (state.getBlock() != this) return super.isValidPosition(state, worldIn, pos);
           return blockstate.isIn(this) && blockstate.get(HALF) == DoubleBlockHalf.LOWER;
        }
     }

     public void placeAt(IWorld worldIn, BlockPos pos, int flags) {
        worldIn.setBlockState(pos, this.getDefaultState().with(HALF, DoubleBlockHalf.LOWER), flags);
        worldIn.setBlockState(pos.up(), this.getDefaultState().with(HALF, DoubleBlockHalf.UPPER), flags);
     }

     public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
        if (!worldIn.isRemote) {
           if (player.isCreative()) {
              removeBottomHalf(worldIn, pos, state, player);
           } else {
              spawnDrops(state, worldIn, pos, (TileEntity)null, player, player.getHeldItemMainhand());
           }
        }

        super.onBlockHarvested(worldIn, pos, state, player);
     }

     public void harvestBlock(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack) {
        super.harvestBlock(worldIn, player, pos, Blocks.AIR.getDefaultState(), te, stack);
     }

     protected static void removeBottomHalf(World world, BlockPos pos, BlockState state, PlayerEntity player) {
        DoubleBlockHalf doubleblockhalf = state.get(HALF);
        if (doubleblockhalf == DoubleBlockHalf.UPPER) {
           BlockPos blockpos = pos.down();
           BlockState blockstate = world.getBlockState(blockpos);
           if (blockstate.getBlock() == state.getBlock() && blockstate.get(HALF) == DoubleBlockHalf.LOWER) {
              world.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 35);
              world.playEvent(player, 2001, blockpos, Block.getStateId(blockstate));
           }
        }

     }

     protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
        builder.add(HALF);
     }

    @Override
    protected IItemProvider getSeedsItem() {
        return ItemInit.ANCIENT_SEED.get();
    }
    
    @Override
    public int getMaxAge() {
        return 5;
     }

    @Override
    public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
        return SHAPE_BY_AGE[state.get(this.getAgeProperty())];
    }
}

 

Link to comment
Share on other sites

38 minutes ago, ChonkoTheGreat said:
IntegerProperty AGE

You never actually use this.

 

Quote

Exception message: java.lang.IllegalArgumentException: Cannot set property IntegerProperty{name=age, clazz=class java.lang.Integer, values=[0, 1, 2, 3, 4, 5, 6, 7]} as it does not exist in Block{null}

 

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

The crop is now 2 blocks tall, the only problem is, that the upper block only uses the first model and won't change, no matter the age.

The code:

public class AncientFruitBlock extends CropsBlock {
	   


	public static final IntegerProperty AGE = BlockStateProperties.AGE_0_5;
	public static final EnumProperty<DoubleBlockHalf> HALF = BlockStateProperties.DOUBLE_BLOCK_HALF;
	private static final VoxelShape[] SHAPE_BY_AGE = new VoxelShape[]{
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 3.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 11.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D),
            Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D)};
			
			
    
	public AncientFruitBlock(Properties builder) {
		super(builder);   
        this.setDefaultState(this.stateContainer.getBaseState().with(HALF, DoubleBlockHalf.LOWER));
    }
    
    public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
        DoubleBlockHalf doubleblockhalf = stateIn.get(HALF);
        if (facing.getAxis() != Direction.Axis.Y || doubleblockhalf == DoubleBlockHalf.LOWER != (facing == Direction.UP) || facingState.isIn(this) && facingState.get(HALF) != doubleblockhalf) {
           return doubleblockhalf == DoubleBlockHalf.LOWER && facing == Direction.DOWN && !stateIn.isValidPosition(worldIn, currentPos) ? Blocks.AIR.getDefaultState() : super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos);
        } else {
           return Blocks.AIR.getDefaultState();
        }
     }
    
    @Nullable
    public BlockState getStateForPlacement(BlockItemUseContext context) {
       BlockPos blockpos = context.getPos();
       return blockpos.getY() < 255 && context.getWorld().getBlockState(blockpos.up()).isReplaceable(context) ? super.getStateForPlacement(context) : null;
    }
    
    public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
        worldIn.setBlockState(pos.up(), this.getDefaultState().with(HALF, DoubleBlockHalf.UPPER), 3);
     }

     public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
        if (state.get(HALF) != DoubleBlockHalf.UPPER) {
           return super.isValidPosition(state, worldIn, pos);
        } else {
           BlockState blockstate = worldIn.getBlockState(pos.down());
           if (state.getBlock() != this) return super.isValidPosition(state, worldIn, pos); //Forge: This function is called during world gen and placement, before this block is set, so if we are not 'here' then assume it's the pre-check.
           return blockstate.isIn(this) && blockstate.get(HALF) == DoubleBlockHalf.LOWER;
        }
     }

     public void placeAt(IWorld worldIn, BlockPos pos, int flags) {
        worldIn.setBlockState(pos, this.getDefaultState().with(HALF, DoubleBlockHalf.LOWER), flags);
        worldIn.setBlockState(pos.up(), this.getDefaultState().with(HALF, DoubleBlockHalf.UPPER), flags);
     }

     public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
        if (!worldIn.isRemote) {
           if (player.isCreative()) {
              removeBottomHalf(worldIn, pos, state, player);
           } else {
              spawnDrops(state, worldIn, pos, (TileEntity)null, player, player.getHeldItemMainhand());
           }
        }

        super.onBlockHarvested(worldIn, pos, state, player);
     }

     public void harvestBlock(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack) {
        super.harvestBlock(worldIn, player, pos, Blocks.AIR.getDefaultState(), te, stack);
     }

     protected static void removeBottomHalf(World world, BlockPos pos, BlockState state, PlayerEntity player) {
        DoubleBlockHalf doubleblockhalf = state.get(HALF);
        if (doubleblockhalf == DoubleBlockHalf.UPPER) {
           BlockPos blockpos = pos.down();
           BlockState blockstate = world.getBlockState(blockpos);
           if (blockstate.getBlock() == state.getBlock() && blockstate.get(HALF) == DoubleBlockHalf.LOWER) {
              world.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 35);
              world.playEvent(player, 2001, blockpos, Block.getStateId(blockstate));
           }
        }

     }
     
     @Override
     protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
        builder.add(HALF);
        builder.add(AGE);
     }
     
     public IntegerProperty getAgeProperty() {
         return AGE;
      }

    @Override
    protected IItemProvider getSeedsItem() {
        return ItemInit.ANCIENT_SEED.get();
    }
    
    @Override
    public int getMaxAge() {
        return 5;
     }

    @Override
    public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
        return SHAPE_BY_AGE[state.get(this.getAgeProperty())];
    }
 }

A picture of the crop at stage 0...
Screenshot_673.png

...and stage 5. What do i have to do to make it change the texture?

Screenshot_674.png

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hey guys, I'm trying to register sounds that will be played at a specific location. For example: /playsound minecraft:ambient.cave block YageLyts ~ ~ ~15 This will play the sound ambient.cave at my position Z+15 and it works, the further I move the less I hear the sound. Now in my mod I register all my sounds using the sound event, but whenever I use that command, the sound is played no matter where I am on the map. It's like the sound is played as background. I've been trying to fix this for at least two hours but I can't find anything...   public class SoundRegistrator { public static final DeferredRegister<SoundEvent> REGISTRY = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, LoginMod.MOD_ID); public static final RegistryObject<SoundEvent> HOT_NOTIF = register("hot_notification"); public static final RegistryObject<SoundEvent> KEY_NOTIF = register("key_notifcation"); public static final RegistryObject<SoundEvent> MYST_LOOP = register("mystery_loop"); public static final RegistryObject<SoundEvent> NEWTREAS_NOTIF = register("newtreasure_notification"); public static final RegistryObject<SoundEvent> TREAS_FOUND = register("treasure_found"); public static final RegistryObject<SoundEvent> TREAS_FOUND_ANOTHER = register("treasure_foundby_anotherplayer"); private static RegistryObject<SoundEvent> register(String name) { return REGISTRY.register(name, () -> new SoundEvent(new ResourceLocation(LoginMod.MOD_ID, name))); } } public LoginMod() { FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); FMLJavaModLoadingContext.get().getModEventBus().addListener(this::client); MinecraftForge.EVENT_BUS.register(this); PermissionAPI.registerNode("treasurehunt.setup", DefaultPermissionLevel.OP, "treasurehunt.setup"); SoundRegistrator.REGISTRY.register(FMLJavaModLoadingContext.get().getModEventBus()); } { "hot_notification": { "sounds": ["loginmod:hot_notification"] }, "key_notifcation": { "sounds": ["loginmod:key_notifcation"] }, "mystery_loop": { "sounds": [ { "name": "loginmod:mystery_loop", "stream": true } ] }, "newtreasure_notification": { "sounds": ["loginmod:newtreasure_notification"] }, "treasure_found": { "sounds": ["loginmod:treasure_found"] }, "treasure_foundby_anotherplayer": { "sounds": [ { "name": "loginmod:treasure_foundby_anotherplayer", "stream": true } ] } } Thank
    • You got hacked, didn't you?
    • wrong website 😐
    • https://myfemalefunda.com/الطاقة-الشمسية-في-المغرب/ https://kerbymethodconsulting.com/مشاريع-جديدة-ومبتكرة-2017-82582/ https://starsone.site/تحويل-الدولار-الى-الريال-العماني/ https://advocatesnairobi.com/سعر-عملة-حزم-اليوم/ https://starsone.site/يُعدُّ-البنك-المركزي-مؤسسة/
    • https://angosiam.com/ما-هي-حقوق-المرأة-في-تركيا/ https://myfemalefunda.com/مركز-دبي-للسلع-المتعددة/ https://sanakanwalfashion.com/اسعار-العقود-الاجلة-للداو-جونز/ https://kerbymethodconsulting.com/حساب-فاتورة-الكهرباء-الجزائر-2022-71662/ https://advocatesnairobi.com/كم-باقي-على-2030/
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.