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 "net.minecraft.h"
3#include "net.minecraft.world.level.h"
4#include "BlockGenMethods.h"
5
6void BlockGenMethods::generateBox(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, BYTE edge, BYTE filling)
7{
8
9 sx = Mth::clamp(sx, 0, 15);
10 sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
11 sz = Mth::clamp(sz, 0, 15);
12 ex = Mth::clamp(ex, 0, 15);
13 ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
14 ez = Mth::clamp(ez, 0, 15);
15
16 for (int x = sx; x <= ex; x++)
17 {
18 for (int y = sy; y <= ey; y++)
19 {
20 for (int z = sz; z <= ez; z++)
21 {
22 int p = (x * 16 + z) * Level::genDepth + y;
23
24 if (x == sx || x == ex || y == sy || y == ey || z == sz || z == ez)
25 {
26 blocks[p] = edge;
27 }
28 else
29 {
30 blocks[p] = filling;
31 }
32 }
33 }
34 }
35}
36
37void BlockGenMethods::generateFrame(Level *level, byteArray blocks, int sx, int sy, int ex, int ey, int flatZ, int direction, BYTE edge, BYTE filling)
38{
39
40 sx = Mth::clamp(sx, 0, 15);
41 sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
42 ex = Mth::clamp(ex, 0, 15);
43 ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
44 int sz = Mth::clamp(flatZ, 0, 15);
45 int ez = sz;
46
47 bool alongX = true;
48
49 switch (direction)
50 {
51 case Direction::WEST:
52 {
53 // rotate counter-clockwise
54 int temp = sz;
55 sz = 15 - ex;
56 ez = 15 - sx;
57 sx = ex = temp;
58 alongX = false;
59 }
60 break;
61 case Direction::EAST:
62 {
63 // rotate clockwise
64 int temp = sz;
65 sz = sx;
66 ez = ex;
67 sx = ex = 15 - temp;
68 alongX = false;
69 }
70 break;
71 case Direction::SOUTH:
72 {
73 // rotate 180
74 sz = ez = 15 - sz;
75 int temp = sx;
76 sx = 15 - ex;
77 ex = 15 - temp;
78 }
79 break;
80 }
81
82 for (int x = sx; x <= ex; x++)
83 {
84 for (int y = sy; y <= ey; y++)
85 {
86 for (int z = sz; z <= ez; z++)
87 {
88 int p = (x * 16 + z) * Level::genDepth + y;
89
90 if (y == sy || y == ey || (alongX && (x == sx || x == ex)) || (!alongX && (z == sz || z == ez)))
91 {
92 blocks[p] = edge;
93 }
94 else
95 {
96 blocks[p] = filling;
97 }
98 }
99 }
100 }
101}
102
103void BlockGenMethods::generateDirectionLine(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, int startDirection, int endDirection, BYTE block)
104{
105
106 sx = Mth::clamp(sx, 0, 15);
107 sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
108 sz = Mth::clamp(sz, 0, 15);
109 ex = Mth::clamp(ex, 0, 15);
110 ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
111 ez = Mth::clamp(ez, 0, 15);
112
113 switch (startDirection)
114 {
115 case Direction::WEST:
116 {
117 // rotate counter-clockwise
118 int temp = sz;
119 sz = 15 - sx;
120 sx = temp;
121 }
122 break;
123 case Direction::EAST:
124 {
125 // rotate clockwise
126 int temp = sz;
127 sz = sx;
128 sx = 15 - temp;
129 }
130 break;
131 case Direction::SOUTH:
132 {
133 // rotate 180
134 sz = 15 - sz;
135 sx = 15 - sx;
136 }
137 break;
138 }
139
140 switch (endDirection)
141 {
142 case Direction::WEST:
143 {
144 // rotate counter-clockwise
145 int temp = ez;
146 ez = 15 - ex;
147 ex = temp;
148 }
149 break;
150 case Direction::EAST:
151 {
152 // rotate clockwise
153 int temp = ez;
154 ez = ex;
155 ex = 15 - temp;
156 }
157 break;
158 case Direction::SOUTH:
159 {
160 // rotate 180
161 ez = 15 - ez;
162 ex = 15 - ex;
163 }
164 break;
165 }
166
167 int dx = Mth::abs(ex - sx);
168 int dz = Mth::abs(ez - sz);
169 int dy = Mth::abs(ey - sy);
170
171 int slopeX = sx < ex ? 1 : -1;
172 int slopeZ = sz < ez ? 1 : -1;
173 int slopeY = sy < ey ? 1 : -1;
174
175 int err = dx - dz;
176 int yOppositeDelta = (dz > dx) ? dz : dx;
177 int yErr = dy - yOppositeDelta;
178 bool doYMovement = true;
179
180 while (true)
181 {
182 blocks[(sx * 16 + sz) * Level::genDepth + sy] = block;
183
184 if (sx == ex && sz == ez)
185 {
186 break;
187 }
188 if (sy == ey)
189 {
190 doYMovement = false;
191 }
192 int e2 = 2 * err;
193 if (e2 > -dz)
194 {
195 err = err - dz;
196 sx = sx + slopeX;
197 }
198 if (e2 < dx)
199 {
200 err = err + dx;
201 sz = sz + slopeZ;
202 }
203
204 if (doYMovement)
205 {
206 e2 = 2 * yErr;
207 if (e2 > -yOppositeDelta)
208 {
209 yErr = yErr - yOppositeDelta;
210 sy = sy + slopeY;
211 }
212 if (e2 < dy)
213 {
214 yErr = yErr + dy;
215 // don't modify sz here, let the plane decide
216 }
217 }
218 }
219}
220
221void BlockGenMethods::generateLine(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, BYTE block)
222{
223 generateDirectionLine(level, blocks, sx, sy, sz, ex, ey, ez, 0, 0, block);
224}