1. package bukkit.techguard.christmas.world;
  2. import bukkit.techguard.christmas.Properties;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.Random;
  6. import org.bukkit.Material;
  7. import org.bukkit.World;
  8. import org.bukkit.generator.BlockPopulator;
  9. import org.bukkit.generator.ChunkGenerator;
  10. public class ChristmasGenerator extends ChunkGenerator
  11. {
  12. public byte[] generate(World world, Random rand, int x, int z)
  13. {
  14. byte[] blocks = new byte[32768];
  15. for (int i = 0; i < 16; i++) {
  16. for (int k = 0; k < 16; k++) {
  17. int maxHeight = (int)(get(x * 16 + i, z * 16 + k) * 42.0D) + 42;
  18. for (int j = maxHeight; j > 0; j--) {
  19. if ((j == maxHeight) && (j > 46)) {
  20. blocks[toByte(i, j + 1, k)] = (byte)Material.SNOW.getId();
  21. blocks[toByte(i, j, k)] = (byte)Material.GRASS.getId();
  22. }
  23. else if (j == 1) {
  24. blocks[toByte(i, j, k)] = (byte)Material.BEDROCK.getId();
  25. }
  26. else if ((j < maxHeight) && (j > maxHeight - 4)) {
  27. blocks[toByte(i, j, k)] = (byte)Material.DIRT.getId();
  28. }
  29. else if (j < maxHeight - 21) {
  30. blocks[toByte(i, j, k)] = (byte)Material.ICE.getId();
  31. } else {
  32. blocks[toByte(i, j, k)] = (byte)Material.SNOW_BLOCK.getId();
  33. }
  34. }
  35. if (maxHeight < 48) {
  36. for (int j = 47; j > 42; j--) {
  37. if (blocks[toByte(i, j, k)] == 0) {
  38. blocks[toByte(i, j, k)] = (byte)Material.ICE.getId();
  39. }
  40. }
  41. }
  42. }
  43. }
  44. return blocks;
  45. }
  46. public double normalise(int x) {
  47. int conv = x % 360;
  48. if (conv >= 1)
  49. x %= 360;
  50. return Math.toRadians(x);
  51. }
  52. public double get(int x, int z) {
  53. double calc =
  54. Math.sin(normalise(x / 4)) +
  55. Math.sin(normalise(z / 5)) +
  56. Math.sin(normalise(x - z)) +
  57. Math.sin(normalise(z)) / (Math.sin(normalise(z)) + 2.0D) * 2.0D +
  58. Math.sin(normalise((int)(Math.sin(normalise(x) + Math.sin(normalise(z))) + Math.sin(normalise(z)))) + Math.sin(normalise(z / 2)) +
  59. Math.sin(normalise(x) +
  60. Math.sin(normalise(z))) +
  61. Math.sin(normalise(z)) +
  62. Math.sin(normalise(z)) +
  63. Math.sin(normalise(x))) +
  64. Math.sin(normalise((x + z) / 4)) +
  65. Math.sin(normalise((int)(x + Math.sin(normalise(z) * Math.sin(normalise(x))))));
  66. calc = Math.abs(calc / 6.0D);
  67. if (calc > 1.0D) calc = 1.0D;
  68. return calc;
  69. }
  70. public boolean canSpawn(World world, int x, int z) {
  71. return true;
  72. }
  73. public int toByte(int x, int y, int z) {
  74. return (x * 16 + z) * 128 + y;
  75. }
  76. public List<BlockPopulator> getDefaultPopulators(World world) {
  77. if (Properties.GEN_STRUCTURES) {
  78. return Arrays.asList(new BlockPopulator[] { new XMasTree(), new SnowCastlePopulator(), new TreePopulator() });
  79. }
  80. return Arrays.asList(new BlockPopulator[] { new TreePopulator() });
  81. }
  82. }