Advertisement
Ineentho

Chunkprovider

Mar 19th, 2014
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.77 KB | None | 0 0
  1. package northrend.world;
  2.  
  3. import net.minecraft.block.Block;
  4. import net.minecraft.entity.EnumCreatureType;
  5. import net.minecraft.init.Blocks;
  6. import net.minecraft.util.IProgressUpdate;
  7. import net.minecraft.world.ChunkPosition;
  8. import net.minecraft.world.World;
  9. import net.minecraft.world.chunk.Chunk;
  10. import net.minecraft.world.chunk.IChunkProvider;
  11. import northrend.biome.NBiomeGen;
  12.  
  13. import javax.vecmath.Vector2d;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. import java.util.Random;
  17.  
  18. public class ChunkProviderNorthrend implements IChunkProvider
  19. {
  20.     World world;
  21.     private List spawnList;
  22.     Random dnc = new Random();
  23.  
  24.     public ChunkProviderNorthrend(World world) {
  25.         this.world = world;
  26.     }
  27.  
  28.     @Override
  29.     public boolean chunkExists(int var1, int var2) {
  30.         return true;
  31.     }
  32.  
  33.     private byte[] getHillPeak(int chunkX, int chunkZ) {
  34.         Random r = new Random(world.getSeed() + chunkX * 154 - chunkZ * 162);
  35.         Random hillRandom = new Random(world.getSeed() *(chunkX / 7) * (chunkZ / 6));
  36.  
  37.         float extraHills = hillRandom.nextFloat();
  38.         //boolean extraHills = f > .5f;
  39.  
  40.         byte x = (byte)r.nextInt(16);
  41.         byte z = (byte)r.nextInt(16);
  42.         byte height = (byte)((48 + 192 * extraHills) + r.nextInt((int)(5 + extraHills * 11)));
  43.         byte hilly = (byte)((5 + 5 * extraHills) + r.nextInt((int)(5 + 5 * extraHills)));
  44.  
  45.  
  46.         return new byte[] {x, z, height, hilly};
  47.     }
  48.  
  49.     private double getDistance(byte[] a, byte[] b) {
  50.         return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));
  51.     }
  52.  
  53.     private byte[] getClosestPeak(byte[][] peaks, int peakId) {
  54.         double closestDistance = 50000;
  55.         int closestPeak = -1;
  56.         for(int j = 0; j < peaks.length; j++) {
  57.             if(peakId != j) {
  58.                 int heightDiff = Math.abs(peaks[peakId][2] - peaks[j][2]);
  59.                 double distance = getDistance(peaks[peakId], peaks[j]);
  60.                 if(distance < closestDistance && distance > 10 && heightDiff < 3){
  61.                     closestDistance = distance;
  62.                     closestPeak = j;
  63.                 }
  64.             }
  65.         }
  66.         if(closestPeak == -1)
  67.             return null;
  68.         return peaks[closestPeak];
  69.     }
  70.  
  71.     private List<byte[]> generateCrests(byte[][] peaks) {
  72.         List<byte[]> crestPeaks = new ArrayList<byte[]>();
  73.  
  74.         for(int i = 0; i < peaks.length; i++) {
  75.             byte[] closestPeak = getClosestPeak(peaks, i);
  76.             if(closestPeak == null)
  77.                 continue;
  78.             int deltaX = peaks[i][0] - closestPeak[0];
  79.             int deltaZ = peaks[i][1] - closestPeak[1];
  80.             int deltaHeight = peaks[i][2] - closestPeak[2];
  81.  
  82.             int steps = Math.abs(deltaX);
  83.             double stepSizeX = (double)deltaX / steps;
  84.             double stepSizeZ = (double)deltaZ / steps;
  85.             double stepSizeHeight = (double)deltaHeight / steps;
  86.             for(int step = 0; step < steps; step++) {
  87.                 byte x = (byte)(peaks[i][0] + stepSizeX * step);
  88.                 byte y = (byte)(peaks[i][1] + stepSizeZ * step);
  89.                 byte height = (byte)(peaks[i][2] + stepSizeHeight * step);
  90.                 byte hillyness = peaks[i][3];
  91.  
  92.                 byte[] arr = {x, y, height, hillyness};
  93.  
  94.                 crestPeaks.add(arr);
  95.             }
  96.         }
  97.  
  98.         return crestPeaks;
  99.     }
  100.  
  101.     private byte[][] getPeaks(int chunkX, int chunkZ) {
  102.         int area = 7;
  103.         byte[][] peaks = new byte[(int)Math.pow(area*2 + 1, 2)][];
  104.         int i = 0;
  105.         for(int x = - area; x <= area; x++){
  106.             for(int z = - area; z <= area; z++){
  107.                 byte[] peak = getHillPeak(chunkX + x, chunkZ +  z);
  108.                 peak[0] += 16 * x;
  109.                 peak[1] += 16 * z;
  110.                 peaks[i] = peak;
  111.                 i++;
  112.             }
  113.         }
  114.  
  115.        List<byte[]> crests = generateCrests(peaks);
  116.  
  117.         byte[][] allPeaks = new byte[peaks.length + crests.size()][];
  118.  
  119.         for(int a = 0; a < peaks.length; a++){
  120.             allPeaks[a] = peaks[a];
  121.         }
  122.         for(int b = 0; b < crests.size(); b++) {
  123.             allPeaks[peaks.length +b] = crests.get(b);
  124.         }
  125.  
  126.         return allPeaks;
  127.     }
  128.  
  129.     @Override
  130.     public Chunk provideChunk(int chunkX, int chunkZ) {
  131.         Block[] blocks = new Block[16 * 16 * 256];
  132.  
  133.         byte[][] peaks = getPeaks(chunkX, chunkZ);
  134.  
  135.         for(int x = 0; x < 16; x ++) {
  136.             for(int z = 0; z < 16; z ++) {
  137.                 byte[] here = new byte[] {(byte)x, (byte)z};
  138.  
  139.                 int maxHeight = 0;
  140.  
  141.                 for(int i = 0; i < peaks.length; i++){
  142.                     double distance = getDistance(peaks[i], here);
  143.                     double hillyness = (int)peaks[i][3] & 0xFF;
  144.                     int hillHeight =  (int)peaks[i][2] &0xFF;
  145.                     //int height = hillHeight - (int)(distance*distance * hillyness / 1000);
  146.                     int height = hillHeight - (int)( distance *hillyness / 10);
  147.                     if(height > maxHeight)
  148.                         maxHeight = height;
  149.  
  150.                 }
  151.  
  152.                 for(int y = 0; y < 256; y++){
  153.                     int block = x * 256 * 16 + z * 256 + y;
  154.                     if(y < maxHeight)
  155.                         blocks[block] = Blocks.stone;
  156.                 }
  157.             }
  158.         }
  159.  
  160.         byte[] metaData = new byte[65536];
  161.  
  162.         Chunk chunk = new Chunk(world, blocks, metaData, chunkX, chunkZ);
  163.         chunk.generateSkylightMap();
  164.         return chunk;
  165.     }
  166.  
  167.     @Override
  168.     public Chunk loadChunk(int x, int z) {
  169.         return provideChunk(x, z);
  170.     }
  171.  
  172.     @Override
  173.     public void populate(IChunkProvider var1, int var2, int var3) {
  174.  
  175.     }
  176.  
  177.     @Override
  178.     public boolean saveChunks(boolean var1, IProgressUpdate var2) {
  179.         return true;
  180.     }
  181.  
  182.     @Override
  183.     public boolean unloadQueuedChunks() {
  184.         return false;
  185.     }
  186.  
  187.     @Override
  188.     public boolean canSave() {
  189.         return false;
  190.     }
  191.  
  192.     @Override
  193.     public String makeString() {
  194.         return "NorthendWorld";
  195.     }
  196.  
  197.     @Override
  198.     public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4) {
  199.         if (var1 == EnumCreatureType.creature){
  200.             spawnList = NBiomeGen.biomeGenNorth.getSpawnableList(var1);
  201.             return spawnList;
  202.         }
  203.         return null;
  204.     }
  205.     @Override
  206.     public ChunkPosition func_147416_a(World var1, String var2, int var3, int var4, int var5) {
  207.         return null;
  208.     }
  209.  
  210.     @Override
  211.     public int getLoadedChunkCount() {
  212.         return 0;
  213.     }
  214.  
  215.     @Override
  216.     public void recreateStructures(int x, int z) {
  217.  
  218.     }
  219.  
  220.     @Override
  221.     public void saveExtraData() {
  222.  
  223.     }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement