diff --git a/cubyz-client/res/textures/blocks/snow.png b/cubyz-client/res/textures/blocks/snow.png new file mode 100644 index 00000000..604727d3 Binary files /dev/null and b/cubyz-client/res/textures/blocks/snow.png differ diff --git a/cubyz-common/src/io/cubyz/api/base/BaseMod.java b/cubyz-common/src/io/cubyz/api/base/BaseMod.java index 3f07f234..6f727275 100644 --- a/cubyz-common/src/io/cubyz/api/base/BaseMod.java +++ b/cubyz-common/src/io/cubyz/api/base/BaseMod.java @@ -16,6 +16,7 @@ import io.cubyz.blocks.OakLeaves; import io.cubyz.blocks.OakLog; import io.cubyz.blocks.RubyOre; import io.cubyz.blocks.Sand; +import io.cubyz.blocks.SnowGrass; import io.cubyz.blocks.Stone; import io.cubyz.blocks.Water; @@ -33,6 +34,7 @@ public class BaseMod { static OakLeaves oakLeaves; static OakLog oakLog; static Sand sand; + static SnowGrass snow; static Stone stone; // Ores: @@ -61,6 +63,7 @@ public class BaseMod { oakLeaves = new OakLeaves(); oakLog = new OakLog(); sand = new Sand(); + snow = new SnowGrass(); stone = new Stone(); // Ores @@ -76,8 +79,7 @@ public class BaseMod { water = new Water(); // Register - reg.registerAll(bedrock, grass, dirt, oakLeaves, oakLog, sand, stone, coal, diamond, emerald, gold, iron, ruby, water); - System.out.println("Added all"); + reg.registerAll(bedrock, grass, dirt, oakLeaves, oakLog, sand, snow, stone, coal, diamond, emerald, gold, iron, ruby, water); } } diff --git a/cubyz-common/src/io/cubyz/blocks/SnowGrass.java b/cubyz-common/src/io/cubyz/blocks/SnowGrass.java new file mode 100644 index 00000000..c628608c --- /dev/null +++ b/cubyz-common/src/io/cubyz/blocks/SnowGrass.java @@ -0,0 +1,11 @@ +package io.cubyz.blocks; + +public class SnowGrass extends Block { + + public SnowGrass() { + setTexture("snow"); + setID("cubyz:snow"); + texConverted = true; + } + +} \ No newline at end of file diff --git a/cubyz-common/src/io/cubyz/world/Chunk.java b/cubyz-common/src/io/cubyz/world/Chunk.java index a47c6a33..880ee3bf 100644 --- a/cubyz-common/src/io/cubyz/world/Chunk.java +++ b/cubyz-common/src/io/cubyz/world/Chunk.java @@ -24,6 +24,7 @@ public class Chunk { // Normal: private static Block grass = br.getByID("cubyz:grass"); private static Block sand = br.getByID("cubyz:sand"); + private static Block snow = br.getByID("cubyz:snow"); private static Block dirt = br.getByID("cubyz:dirt"); private static Block stone = br.getByID("cubyz:stone"); private static Block bedrock = br.getByID("cubyz:bedrock"); @@ -144,7 +145,7 @@ public class Chunk { //TODO: Ore Clusters //TODO: Finish vegetation //TODO: Clean this method - public void generateFrom(float[][] map, float[][] vegetation, float[][] oreMap) { + public void generateFrom(float[][] map, float[][] vegetation, float[][] oreMap, float[][] heatMap) { if(inst == null) { inst = new BlockInstance[16][World.WORLD_HEIGHT][16]; } @@ -158,14 +159,19 @@ public class Chunk { int y = (int) (value * World.WORLD_HEIGHT); if(y == World.WORLD_HEIGHT) y--; + int temperature = (int)((2-value+SEA_LEVEL/(float)World.WORLD_HEIGHT)*heatMap[px][py]*120) - 100; for (int j = y > SEA_LEVEL ? y : SEA_LEVEL; j >= 0; j--) { BlockInstance bi = null; if(j > y) { bi = new BlockInstance(water); - }else if (y < SEA_LEVEL + 4 && j > y - 3) { + }else if ((y < SEA_LEVEL + 4 || temperature > 40) && j > y - 3) { bi = new BlockInstance(sand); } else if (j == y) { - bi = new BlockInstance(grass); + if(temperature > 0) { + bi = new BlockInstance(grass); + } else { + bi = new BlockInstance(snow); + } } else if (j > y - 3) { bi = new BlockInstance(dirt); } else if (j > 0) { @@ -196,7 +202,8 @@ public class Chunk { float value = vegetation[px][py]; int incx = px == 0 ? 1 : -1; int incy = py == 0 ? 1 : -1; - if (map[px][py] * World.WORLD_HEIGHT >= SEA_LEVEL + 3 && value > 0.5f && ((int)((vegetation[px][py]-vegetation[px+incx][py+incy]) * 10000000) & 127) == 1) { // "&127" is a faster way to do "%128" + int temperature = (int)((2-map[px][py]+SEA_LEVEL/(float)World.WORLD_HEIGHT)*heatMap[px][py]*120) - 100; + if (temperature < 40 && map[px][py] * World.WORLD_HEIGHT >= SEA_LEVEL + 3 && value > 0.5f && ((int)((vegetation[px][py]-vegetation[px+incx][py+incy]) * 100000000) & 63) == 1) { // "&(2^n - 1)" is a faster way to do "%(2^n)" Structures.generateTree(this, wx + px, (int) (map[px][py] * World.WORLD_HEIGHT) + 1, wy + py); } } diff --git a/cubyz-common/src/io/cubyz/world/LocalWorld.java b/cubyz-common/src/io/cubyz/world/LocalWorld.java index c8e7eb6c..3058b65a 100644 --- a/cubyz-common/src/io/cubyz/world/LocalWorld.java +++ b/cubyz-common/src/io/cubyz/world/LocalWorld.java @@ -171,7 +171,8 @@ public class LocalWorld extends World { float[][] heightMap = Noise.generateMapFragment(x, y, 16, 16, 256, seed); float[][] vegetationMap = Noise.generateMapFragment(x, y, 16, 16, 128, seed + 3 * (seed + 1 & Integer.MAX_VALUE)); float[][] oreMap = Noise.generateMapFragment(x, y, 16, 16, 128, seed - 3 * (seed - 1 & Integer.MAX_VALUE)); - ch.generateFrom(heightMap, vegetationMap, oreMap); + float[][] heatMap = Noise.generateMapFragment(x, y, 16, 16, 4096, seed ^ 123456789); + ch.generateFrom(heightMap, vegetationMap, oreMap, heatMap); } @Override @@ -248,10 +249,10 @@ public class LocalWorld extends World { @Override public void seek(int x, int z) { - int renderDistance/*minus 1*/ = 2; + int renderDistance/*minus 1*/ = 3; int blockDistance = renderDistance*16; - for (int x1 = x - blockDistance-48; x1 < x + blockDistance+48; x1++) { - for (int z1 = z - blockDistance-48; z1 < z + blockDistance+48; z1++) { + for (int x1 = x - blockDistance-48; x1 <= x + blockDistance+48; x1 += 16) { + for (int z1 = z - blockDistance-48; z1 <= z + blockDistance+48; z1 += 16) { Chunk ch = getChunk(x1/16,z1/16); if (x1>x-blockDistance&&x1z-blockDistance&&z1