Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.81 KB | None | 0 0
  1. package com.formas1.ruispantry.world;
  2.  
  3. import java.util.Random;
  4.  
  5. import com.formas1.ruispantry.init.ModBlocks;
  6.  
  7. import net.minecraft.block.BlockLeaves;
  8. import net.minecraft.block.BlockLog;
  9. import net.minecraft.block.state.IBlockState;
  10. import net.minecraft.init.Blocks;
  11. import net.minecraft.util.EnumFacing;
  12. import net.minecraft.util.math.BlockPos;
  13. import net.minecraft.world.World;
  14. import net.minecraft.world.gen.feature.WorldGenAbstractTree;
  15. import net.minecraftforge.common.IPlantable;
  16. import net.minecraftforge.event.terraingen.DecorateBiomeEvent;
  17.  
  18. public class WorldGenTreesFormas extends WorldGenAbstractTree
  19. {
  20.      private IBlockState blockStateWood = ModBlocks.FORMAS_LOG.getDefaultState();
  21.      private IBlockState blockStateLeaves = ModBlocks.FORMAS_LEAVES.getDefaultState().withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
  22.      private final int minTreeHeight = 5;
  23.      
  24.       public WorldGenTreesFormas(boolean parShouldNotify)
  25.         {
  26.             super(parShouldNotify);
  27.            
  28.         }
  29.      
  30.      
  31.       @Override
  32.         public boolean generate(World parWorld, Random parRandom, BlockPos parBlockPos)
  33.         {
  34.             int minHeight = parRandom.nextInt(3) + minTreeHeight;
  35.             if (parBlockPos.getY() >= 1 && parBlockPos.getY() + minHeight + 1 <= parWorld.getHeight())
  36.             {
  37.                 if (!isSuitableLocation(parWorld, parBlockPos, minHeight))
  38.                 {
  39.                     return false;
  40.                 }
  41.                 else
  42.                 {
  43.                     IBlockState state = parWorld.getBlockState(parBlockPos.down());
  44.  
  45.                     if (state.getBlock().canSustainPlant(state, parWorld, parBlockPos.down(), EnumFacing.UP, (IPlantable) Blocks.SAPLING) && parBlockPos.getY() < parWorld.getHeight() - minHeight - 1)
  46.                     {
  47.                         state.getBlock().onPlantGrow(state, parWorld, parBlockPos.down(), parBlockPos);
  48.                         generateLeaves(parWorld, parBlockPos, minHeight, parRandom);
  49.                         generateTrunk(parWorld, parBlockPos, minHeight);
  50.                         return true;
  51.                     }
  52.                     else
  53.                     {
  54.                         return false;
  55.                     }
  56.                 }
  57.             }
  58.             else
  59.             {
  60.                 return false;
  61.             }
  62.         }
  63.      
  64.       private void generateLeaves(World parWorld, BlockPos parBlockPos, int height, Random parRandom)
  65.         {
  66.             for (int foliageY = parBlockPos.getY() - 3 + height; foliageY <= parBlockPos.getY() + height; ++foliageY)
  67.             {
  68.                 int foliageLayer = foliageY - (parBlockPos.getY() + height);
  69.                 int foliageLayerRadius = 1 - foliageLayer / 2;
  70.  
  71.                 for (int foliageX = parBlockPos.getX() - foliageLayerRadius; foliageX <= parBlockPos.getX() + foliageLayerRadius; ++foliageX)
  72.                 {
  73.                     int foliageRelativeX = foliageX - parBlockPos.getX();
  74.  
  75.                     for (int foliageZ = parBlockPos.getZ() - foliageLayerRadius; foliageZ <= parBlockPos.getZ() + foliageLayerRadius; ++foliageZ)
  76.                     {
  77.                         int foliageRelativeZ = foliageZ - parBlockPos.getZ();
  78.  
  79.                         // Fill in layer with some randomness
  80.                         if (Math.abs(foliageRelativeX) != foliageLayerRadius || Math.abs(foliageRelativeZ) != foliageLayerRadius || parRandom.nextInt(2) != 0 && foliageLayer != 0)
  81.                         {
  82.                             BlockPos blockPos = new BlockPos(foliageX, foliageY, foliageZ);
  83.                             IBlockState state = parWorld.getBlockState(blockPos);
  84.  
  85.                             if (state.getBlock().isAir(state, parWorld, blockPos) || state.getBlock().isLeaves(state, parWorld, blockPos))
  86.                             {
  87.                                 setBlockAndNotifyAdequately(parWorld, blockPos, blockStateLeaves);
  88.                             }
  89.                         }
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.  
  95.      
  96.       private void generateTrunk(World parWorld, BlockPos parBlockPos, int minHeight)
  97.         {
  98.             for (int height = 0; height < minHeight; ++height)
  99.             {
  100.                 BlockPos upN = parBlockPos.up(height);
  101.                 IBlockState state = parWorld.getBlockState(upN);
  102.  
  103.                 if (state.getBlock().isAir(state, parWorld, upN) || state.getBlock().isLeaves(state, parWorld, upN))
  104.                 {
  105.                     setBlockAndNotifyAdequately(parWorld, parBlockPos.up(height), blockStateWood.withProperty(BlockLog.LOG_AXIS, BlockLog.EnumAxis.Y));
  106.                 }
  107.             }
  108.         }
  109.      
  110.       private boolean isSuitableLocation(World parWorld, BlockPos parBlockPos, int minHeight)
  111.         {
  112.             boolean isSuitableLocation = true;
  113.            
  114.             for (int checkY = parBlockPos.getY(); checkY <= parBlockPos.getY() + 1 + minHeight; ++checkY)
  115.             {
  116.                 // Handle increasing space towards top of tree
  117.                 int extraSpaceNeeded = 1;
  118.                 // Handle base location
  119.                 if (checkY == parBlockPos.getY())
  120.                 {
  121.                     extraSpaceNeeded = 0;
  122.                 }            
  123.                 // Handle top location
  124.                 if (checkY >= parBlockPos.getY() + 1 + minHeight - 2)
  125.                 {
  126.                     extraSpaceNeeded = 2;
  127.                 }
  128.  
  129.                 BlockPos.MutableBlockPos blockPos = new BlockPos.MutableBlockPos();
  130.  
  131.                 for (int checkX = parBlockPos.getX() - extraSpaceNeeded; checkX <= parBlockPos.getX() + extraSpaceNeeded && isSuitableLocation; ++checkX)
  132.                 {
  133.                     for (int checkZ = parBlockPos.getZ() - extraSpaceNeeded; checkZ <= parBlockPos.getZ() + extraSpaceNeeded && isSuitableLocation; ++checkZ)
  134.                     {
  135.                         isSuitableLocation = isReplaceable(parWorld,blockPos.setPos(checkX, checkY, checkZ));
  136.                     }
  137.                 }
  138.             }
  139.            
  140.             return isSuitableLocation;
  141.         }
  142.      
  143.  
  144.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement