the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}