--- a/net/minecraft/world/level/block/CaveVinesBlock.java
+++ b/net/minecraft/world/level/block/CaveVinesBlock.java
@@ -17,11 +17,12 @@
 import net.minecraft.world.phys.BlockHitResult;
 
 public class CaveVinesBlock extends GrowingPlantHeadBlock implements BonemealableBlock, CaveVines {
+
     private static final float CHANCE_OF_BERRIES_ON_GROWTH = 0.11F;
 
     public CaveVinesBlock(BlockBehaviour.Properties settings) {
-        super(settings, Direction.DOWN, SHAPE, false, 0.1D);
-        this.registerDefaultState(this.stateDefinition.any().setValue(AGE, Integer.valueOf(0)).setValue(BERRIES, Boolean.valueOf(false)));
+        super(settings, Direction.DOWN, CaveVinesBlock.SHAPE, false, 0.1D);
+        this.registerDefaultState((BlockState) ((BlockState) ((BlockState) this.stateDefinition.any()).setValue(CaveVinesBlock.AGE, 0)).setValue(CaveVinesBlock.BERRIES, false));
     }
 
     @Override
@@ -41,33 +42,41 @@
 
     @Override
     protected BlockState updateBodyAfterConvertedFromHead(BlockState from, BlockState to) {
-        return to.setValue(BERRIES, from.getValue(BERRIES));
+        return (BlockState) to.setValue(CaveVinesBlock.BERRIES, (Boolean) from.getValue(CaveVinesBlock.BERRIES));
     }
 
     @Override
     protected BlockState getGrowIntoState(BlockState state, RandomSource random) {
-        return super.getGrowIntoState(state, random).setValue(BERRIES, Boolean.valueOf(random.nextFloat() < 0.11F));
+        // Paper start
+        return this.getGrowIntoState(state, random, null);
     }
 
     @Override
+    protected BlockState getGrowIntoState(BlockState state, RandomSource random, @javax.annotation.Nullable Level level) {
+        final boolean value = random.nextFloat() < (level != null ? (0.11F * (level.spigotConfig.glowBerryModifier / 100.0F)) : 0.11F);
+        return (BlockState) super.getGrowIntoState(state, random).setValue(CaveVinesBlock.BERRIES, value);
+    }
+    // Paper end
+
+    @Override
     public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) {
         return new ItemStack(Items.GLOW_BERRIES);
     }
 
     @Override
     public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
-        return CaveVines.use(state, world, pos);
+        return CaveVines.use(state, world, pos, player); // CraftBukkit
     }
 
     @Override
     protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
         super.createBlockStateDefinition(builder);
-        builder.add(BERRIES);
+        builder.add(CaveVinesBlock.BERRIES);
     }
 
     @Override
     public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) {
-        return !state.getValue(BERRIES);
+        return !(Boolean) state.getValue(CaveVinesBlock.BERRIES);
     }
 
     @Override
@@ -77,6 +86,6 @@
 
     @Override
     public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) {
-        world.setBlock(pos, state.setValue(BERRIES, Boolean.valueOf(true)), 2);
+        world.setBlock(pos, (BlockState) state.setValue(CaveVinesBlock.BERRIES, true), 2);
     }
 }
