the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 174 lines 4.7 kB view raw
1#include "stdafx.h" 2#include "LakeFeature.h" 3#include "net.minecraft.world.level.h" 4#include "net.minecraft.world.level.tile.h" 5#include "net.minecraft.world.level.biome.h" 6 7LakeFeature::LakeFeature(int tile) 8{ 9 this->tile = tile; 10} 11 12bool LakeFeature::place(Level *level, Random *random, int x, int y, int z) 13{ 14 x -= 8; 15 z -= 8; 16 while (y > 5 && level->isEmptyTile(x, y, z)) 17 y--; 18 if (y <= 4) 19 { 20 return false; 21 } 22 23 y -= 4; 24 25 bool grid[16*16*8] = {0}; 26 27 LevelGenerationOptions *levelGenOptions = NULL; 28 if( app.getLevelGenerationOptions() != NULL ) 29 { 30 levelGenOptions = app.getLevelGenerationOptions(); 31 32 int minX = x; 33 int minY = y; 34 int minZ = z; 35 36 int maxX = x + 16; 37 int maxY = y + 8; 38 int maxZ = z + 16; 39 40 bool intersects = levelGenOptions->checkIntersects(minX, minY, minZ, maxX, maxY, maxZ); 41 if(intersects) 42 { 43 //app.DebugPrintf("Skipping reeds feature generation as it overlaps a game rule structure\n"); 44 return false; 45 } 46 } 47 48 int spots = random->nextInt(4) + 4; 49 for (int i = 0; i < spots; i++) 50 { 51 double xr = random->nextDouble() * 6 + 3; 52 double yr = random->nextDouble() * 4 + 2; 53 double zr = random->nextDouble() * 6 + 3; 54 55 double xp = random->nextDouble() * (16 - xr - 2) + 1 + xr / 2; 56 double yp = random->nextDouble() * (8 - yr - 4) + 2 + yr / 2; 57 double zp = random->nextDouble() * (16 - zr - 2) + 1 + zr / 2; 58 59 for (int xx = 1; xx < 15; xx++) 60 { 61 for (int zz = 1; zz < 15; zz++) 62 { 63 for (int yy = 1; yy < 7; yy++) 64 { 65 double xd = ((xx - xp) / (xr / 2)); 66 double yd = ((yy - yp) / (yr / 2)); 67 double zd = ((zz - zp) / (zr / 2)); 68 double d = xd * xd + yd * yd + zd * zd; 69 if (d < 1) grid[((xx) * 16 + (zz)) * 8 + (yy)] = true; 70 } 71 } 72 } 73 } 74 75 for (int xx = 0; xx < 16; xx++) 76 { 77 for (int zz = 0; zz < 16; zz++) 78 { 79 for (int yy = 0; yy < 8; yy++) 80 { 81 bool check = !grid[((xx) * 16 + (zz)) * 8 + (yy)] && ((xx < 15 && grid[((xx + 1) * 16 + (zz)) * 8 + (yy)])// 82 || (xx > 0 && grid[((xx - 1) * 16 + (zz)) * 8 + (yy)]) 83 || (zz < 15 && grid[((xx) * 16 + (zz + 1)) * 8 + (yy)]) 84 || (zz > 0 && grid[((xx) * 16 + (zz - 1)) * 8 + (yy)]) 85 || (yy < 7 && grid[((xx) * 16 + (zz)) * 8 + (yy + 1)]) 86 || (yy > 0 && grid[((xx) * 16 + (zz)) * 8 + (yy - 1)])); 87 88 if (check) 89 { 90 Material *m = level->getMaterial(x + xx, y + yy, z + zz); 91 if (yy >= 4 && m->isLiquid()) return false; 92 if (yy < 4 && (!m->isSolid() && level->getTile(x + xx, y + yy, z + zz) != tile)) return false; 93 94 } 95 } 96 } 97 } 98 99 for (int xx = 0; xx < 16; xx++) 100 { 101 for (int zz = 0; zz < 16; zz++) 102 { 103 for (int yy = 0; yy < 8; yy++) 104 { 105 if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) 106 { 107 level->setTileAndData(x + xx, y + yy, z + zz, yy >= 4 ? 0 : tile, 0, Tile::UPDATE_CLIENTS); 108 } 109 } 110 } 111 } 112 113 for (int xx = 0; xx < 16; xx++) 114 { 115 for (int zz = 0; zz < 16; zz++) 116 { 117 for (int yy = 4; yy < 8; yy++) 118 { 119 if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) 120 { 121 if (level->getTile(x + xx, y + yy - 1, z + zz) == Tile::dirt_Id && level->getBrightness(LightLayer::Sky, x + xx, y + yy, z + zz) > 0) 122 { 123 Biome *b = level->getBiome(x + xx, z + zz); 124 if (b->topMaterial == Tile::mycel_Id) level->setTileAndData(x + xx, y + yy - 1, z + zz, Tile::mycel_Id, 0, Tile::UPDATE_CLIENTS); 125 else level->setTileAndData(x + xx, y + yy - 1, z + zz, Tile::grass_Id, 0, Tile::UPDATE_CLIENTS); 126 } 127 } 128 } 129 } 130 } 131 132 if (Tile::tiles[tile]->material == Material::lava) 133 { 134 for (int xx = 0; xx < 16; xx++) 135 { 136 for (int zz = 0; zz < 16; zz++) 137 { 138 for (int yy = 0; yy < 8; yy++) 139 { 140 bool check = !grid[((xx) * 16 + (zz)) * 8 + (yy)] && ( 141 (xx < 15 && grid[(((xx + 1) * 16 + (zz)) * 8 + (yy))]) 142 || (xx > 0 && grid[(((xx - 1) * 16 + (zz)) * 8 + (yy))]) 143 || (zz < 15 && grid[(((xx) * 16 + (zz + 1)) * 8 + (yy))]) 144 || (zz > 0 && grid[(((xx) * 16 + (zz - 1)) * 8 + (yy))]) 145 || (yy < 7 && grid[(((xx) * 16 + (zz)) * 8 + (yy + 1))]) 146 || (yy > 0 && grid[(((xx) * 16 + (zz)) * 8 + (yy - 1))])); 147 148 if (check) 149 { 150 if ((yy<4 || random->nextInt(2)!=0) && level->getMaterial(x + xx, y + yy, z + zz)->isSolid()) 151 { 152 level->setTileAndData(x + xx, y + yy, z + zz, Tile::stone_Id, 0, Tile::UPDATE_CLIENTS); 153 } 154 } 155 } 156 } 157 } 158 } 159 160 // 4J - brought forward from 1.8.2 161 if (Tile::tiles[tile]->material == Material::water) 162 { 163 for (int xx = 0; xx < 16; xx++) 164 { 165 for (int zz = 0; zz < 16; zz++) 166 { 167 int yy = 4; 168 if (level->shouldFreezeIgnoreNeighbors(x + xx, y + yy, z + zz)) level->setTileAndData(x + xx, y + yy, z + zz, Tile::ice_Id, 0, Tile::UPDATE_CLIENTS); 169 } 170 } 171 } 172 173 return true; 174}