Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.39 KB | None | 0 0
  1. package com.ubempire.map;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Random;
  8.  
  9. import org.bukkit.generator.BlockPopulator;
  10. import org.bukkit.generator.ChunkGenerator;
  11. import org.bukkit.Material;
  12. import org.bukkit.World;
  13.  
  14. public class FlatMapGenerator extends ChunkGenerator {
  15.     protected byte[] result;
  16.    
  17.    
  18.     @SuppressWarnings("unused")
  19.     private static final int ORE_DIAMOND = 0;
  20.     @SuppressWarnings("unused")
  21.     private static final int ORE_COAL = 1;
  22.     @SuppressWarnings("unused")
  23.     private static final int ORE_IRON = 2;
  24.     @SuppressWarnings("unused")
  25.     private static final int ORE_GOLD = 3;
  26.     @SuppressWarnings("unused")
  27.     private static final int ORE_REDSTONE = 4;
  28.     @SuppressWarnings("unused")
  29.     private static final int ORE_LAPISLAZULI = 5;
  30.  
  31.     private static final Material[] ORE_LIST = { Material.DIAMOND_ORE, Material.COAL_ORE, Material.IRON_ORE, Material.GOLD_ORE, Material.REDSTONE_ORE, Material.LAPIS_ORE };
  32.     private static final int[] maxDistFromOrigin = { 2, 4, 3, 2, 2, 2 };
  33.     private static final int[] minBlocksPerNode = { 2, 4, 3, 2, 2, 2 };
  34.     private static final int[] maxBlocksPerNode = { 4, 8, 5, 4, 3, 3 };
  35.     private static final int[] minNodesPerChunk = { 1, 10, 7, 4, 5, 5 };
  36.     private static final int[] maxNodesPerChunk = { 5, 15, 10, 8, 8, 8 };
  37.  
  38.     private static final int[][] chancePer16Levels = { { 30, 65, 95, 100, 0, 0, 0, 0 }, { 12, 25, 37, 50, 62, 75, 87, 100 }, { 20, 45, 70, 80, 90, 95, 100, 0 }, { 20, 60, 80, 100, 0, 0, 0, 0 },
  39.             { 20, 50, 80, 100, 0, 0, 0, 0 }, { 20, 50, 80, 100, 0, 0, 0, 0 } };
  40.    
  41.     public List<BlockPopulator> getDefaultPopulators(World world) {
  42.         return Arrays.asList((BlockPopulator) new FlatMapPopulator());
  43.     }
  44.    
  45.     public void genOreAtLayer(int layer, int currOre, Random random, int chunkx, int chunkz) {
  46.         Material currMaterial = ORE_LIST[currOre];
  47.  
  48.         int y = random.nextInt(16) + layer;
  49.         int x = random.nextInt(15);
  50.         int z = random.nextInt(15);
  51.  
  52.         if (result[(x * 16 + z) * 128 + y] == (byte)Material.STONE.getId()) {
  53.             List<int[]> candidates = new ArrayList<int[]>();
  54.             int[] coreBlock = new int[3];
  55.             coreBlock[0]=x;
  56.             coreBlock[1]=y;
  57.             coreBlock[2]=z;
  58.             result[(x * 16 + z) * 128 + y] = (byte)currMaterial.getId();
  59.             //coreBlock.setType(currMaterial);
  60.  
  61.             for (int xMod = -maxDistFromOrigin[currOre]; xMod <= maxDistFromOrigin[currOre]; xMod++) {
  62.                 for (int yMod = -maxDistFromOrigin[currOre]; yMod <= maxDistFromOrigin[currOre]; yMod++) {
  63.                     for (int zMod = -maxDistFromOrigin[currOre]; zMod <= maxDistFromOrigin[currOre]; zMod++) {
  64.                         if (x + xMod < 0 || x + xMod > 15 || y + yMod < 0 || y + yMod > 127 || z + zMod < 0 || z + zMod > 15) {
  65.                             continue;
  66.                         } else if (result[(x+xMod * 16 + z+zMod) * 128 + y+yMod] == (byte)Material.STONE.getId()) {
  67.                             coreBlock[0]=x+xMod;
  68.                             coreBlock[0]=y+yMod;
  69.                             coreBlock[0]=z+zMod;
  70.                             candidates.add(coreBlock);
  71.                         }
  72.                     }
  73.                 }
  74.             }
  75.  
  76.             if (candidates.size() > 0) {
  77.                 Collections.shuffle(candidates);
  78.  
  79.                 int blocksAtNode = random.nextInt(maxBlocksPerNode[currOre] - minBlocksPerNode[currOre] + 1) + minBlocksPerNode[currOre];
  80.  
  81.                 while (blocksAtNode > 0 && candidates.size() > 0) {
  82.                    
  83.                 result[(candidates.get(0)[0] * 16 + candidates.get(0)[2] * 128 + candidates.get(0)[1])] = (byte)currMaterial.getId();
  84.                    
  85.                 candidates.remove(0);
  86.                     //.setType(currMaterial);
  87.                     --blocksAtNode;
  88.                 }
  89.             }
  90.         }
  91.     }
  92.    
  93.    
  94.     public boolean canSpawn(World world, int x, int z) {
  95.         return true;
  96.     }
  97.  
  98.     @Override
  99.     public byte[] generate(World world, Random rand, int chunkx, int chunkz) {
  100.         result = new byte[32768];
  101.         int xbound = HeightMap.xbound;
  102.         int zbound = HeightMap.zbound;
  103.        
  104.         for(int x=0; x<16; x++)
  105.         {
  106.             for(int z=0; z<16; z++)
  107.             {
  108.        
  109.                 for(int yy=55; yy>=0; yy--)
  110.                 {
  111.                     if(yy<=50) result[(x * 16 + z) * 128 + yy] = (byte)Material.STONE.getId();
  112.                     else if(yy<2) result[(x * 16 + z) * 128 + yy] = (byte)Material.BEDROCK.getId();
  113.                     else result[(x * 16 + z) * 128 + yy] = (byte)Material.WATER.getId();
  114.                 }
  115.     }
  116.     }
  117.        
  118.        
  119.        
  120.         if(chunkx>=0-xbound && chunkz>=0-zbound && chunkx<=xbound && chunkz<=zbound)
  121.         {
  122.        
  123.         int startx = (chunkx+xbound)*16;
  124.         int startz = (chunkz+zbound)*16;
  125.         //System.out.print(startx+","+startz);
  126.         int zero = 0;
  127.         if(startx<HeightMap.width-16 && startz<HeightMap.height-16){
  128.             for(int x=0; x<+16; x++)
  129.             {
  130.                 for(int z=0; z<16; z++)
  131.                 {
  132.                 if(zero<HeightMap.height*HeightMap.width)
  133.                 {
  134.                 int y=50+HeightMap.pixels[(startx+x)+(startz+z)*HeightMap.width];
  135.                 if(y<55) result[(x * 16 + z) * 128 + y] = (byte)Material.DIRT.getId();
  136.                 else result[(x * 16 + z) * 128 + y] = (byte)Material.GRASS.getId();
  137.                 zero++;
  138.                 int count =0;
  139.                 for(y=y-1; y>=0;y--)
  140.                 {
  141.                 if(count<2)
  142.                 {
  143.                 result[(x * 16 + z) * 128 + y] = (byte)Material.DIRT.getId();
  144.                 count++;
  145.                 }
  146.                 else result[(x * 16 + z) * 128 + y] = (byte)Material.STONE.getId();
  147.                 }
  148.                 }
  149.                 result[(x * 16 + z) * 128 + 1] = (byte)Material.BEDROCK.getId();
  150.                 }
  151.             }
  152.            
  153.  
  154.  
  155.             int layer;
  156.             int nodeAmount;
  157.  
  158.             for (int currOre = 0; currOre < ORE_LIST.length; currOre++) {
  159.                 nodeAmount = rand.nextInt(maxNodesPerChunk[currOre] - minNodesPerChunk[currOre] + 1) + minNodesPerChunk[currOre];
  160.  
  161.                 for (int currNode = 0; currNode < nodeAmount; currNode++) {
  162.                     layer = rand.nextInt(100) + 1;
  163.  
  164.                     for (int currLayer = 0; currLayer < chancePer16Levels[currOre].length; currLayer++) {
  165.                         if (layer <= chancePer16Levels[currOre][currLayer]) {
  166.                             layer = 16 * currLayer;
  167.                             break;
  168.                         }
  169.                     }
  170.  
  171.                     genOreAtLayer(layer, currOre, rand, chunkx,chunkz);
  172.                 }
  173.             }
  174.            
  175.         }
  176.         }
  177.         return result;
  178.     }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement