aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/BlockGenMethods.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/BlockGenMethods.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/BlockGenMethods.cpp')
-rw-r--r--Minecraft.World/BlockGenMethods.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/Minecraft.World/BlockGenMethods.cpp b/Minecraft.World/BlockGenMethods.cpp
new file mode 100644
index 00000000..d6c6730e
--- /dev/null
+++ b/Minecraft.World/BlockGenMethods.cpp
@@ -0,0 +1,224 @@
+#include "stdafx.h"
+#include "net.minecraft.h"
+#include "net.minecraft.world.level.h"
+#include "BlockGenMethods.h"
+
+void BlockGenMethods::generateBox(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, BYTE edge, BYTE filling)
+{
+
+ sx = Mth::clamp(sx, 0, 15);
+ sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
+ sz = Mth::clamp(sz, 0, 15);
+ ex = Mth::clamp(ex, 0, 15);
+ ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
+ ez = Mth::clamp(ez, 0, 15);
+
+ for (int x = sx; x <= ex; x++)
+ {
+ for (int y = sy; y <= ey; y++)
+ {
+ for (int z = sz; z <= ez; z++)
+ {
+ int p = (x * 16 + z) * Level::genDepth + y;
+
+ if (x == sx || x == ex || y == sy || y == ey || z == sz || z == ez)
+ {
+ blocks[p] = edge;
+ }
+ else
+ {
+ blocks[p] = filling;
+ }
+ }
+ }
+ }
+}
+
+void BlockGenMethods::generateFrame(Level *level, byteArray blocks, int sx, int sy, int ex, int ey, int flatZ, int direction, BYTE edge, BYTE filling)
+{
+
+ sx = Mth::clamp(sx, 0, 15);
+ sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
+ ex = Mth::clamp(ex, 0, 15);
+ ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
+ int sz = Mth::clamp(flatZ, 0, 15);
+ int ez = sz;
+
+ bool alongX = true;
+
+ switch (direction)
+ {
+ case Direction::WEST:
+ {
+ // rotate counter-clockwise
+ int temp = sz;
+ sz = 15 - ex;
+ ez = 15 - sx;
+ sx = ex = temp;
+ alongX = false;
+ }
+ break;
+ case Direction::EAST:
+ {
+ // rotate clockwise
+ int temp = sz;
+ sz = sx;
+ ez = ex;
+ sx = ex = 15 - temp;
+ alongX = false;
+ }
+ break;
+ case Direction::SOUTH:
+ {
+ // rotate 180
+ sz = ez = 15 - sz;
+ int temp = sx;
+ sx = 15 - ex;
+ ex = 15 - temp;
+ }
+ break;
+ }
+
+ for (int x = sx; x <= ex; x++)
+ {
+ for (int y = sy; y <= ey; y++)
+ {
+ for (int z = sz; z <= ez; z++)
+ {
+ int p = (x * 16 + z) * Level::genDepth + y;
+
+ if (y == sy || y == ey || (alongX && (x == sx || x == ex)) || (!alongX && (z == sz || z == ez)))
+ {
+ blocks[p] = edge;
+ }
+ else
+ {
+ blocks[p] = filling;
+ }
+ }
+ }
+ }
+}
+
+void BlockGenMethods::generateDirectionLine(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, int startDirection, int endDirection, BYTE block)
+{
+
+ sx = Mth::clamp(sx, 0, 15);
+ sy = Mth::clamp(sy, 0, Level::genDepthMinusOne);
+ sz = Mth::clamp(sz, 0, 15);
+ ex = Mth::clamp(ex, 0, 15);
+ ey = Mth::clamp(ey, 0, Level::genDepthMinusOne);
+ ez = Mth::clamp(ez, 0, 15);
+
+ switch (startDirection)
+ {
+ case Direction::WEST:
+ {
+ // rotate counter-clockwise
+ int temp = sz;
+ sz = 15 - sx;
+ sx = temp;
+ }
+ break;
+ case Direction::EAST:
+ {
+ // rotate clockwise
+ int temp = sz;
+ sz = sx;
+ sx = 15 - temp;
+ }
+ break;
+ case Direction::SOUTH:
+ {
+ // rotate 180
+ sz = 15 - sz;
+ sx = 15 - sx;
+ }
+ break;
+ }
+
+ switch (endDirection)
+ {
+ case Direction::WEST:
+ {
+ // rotate counter-clockwise
+ int temp = ez;
+ ez = 15 - ex;
+ ex = temp;
+ }
+ break;
+ case Direction::EAST:
+ {
+ // rotate clockwise
+ int temp = ez;
+ ez = ex;
+ ex = 15 - temp;
+ }
+ break;
+ case Direction::SOUTH:
+ {
+ // rotate 180
+ ez = 15 - ez;
+ ex = 15 - ex;
+ }
+ break;
+ }
+
+ int dx = Mth::abs(ex - sx);
+ int dz = Mth::abs(ez - sz);
+ int dy = Mth::abs(ey - sy);
+
+ int slopeX = sx < ex ? 1 : -1;
+ int slopeZ = sz < ez ? 1 : -1;
+ int slopeY = sy < ey ? 1 : -1;
+
+ int err = dx - dz;
+ int yOppositeDelta = (dz > dx) ? dz : dx;
+ int yErr = dy - yOppositeDelta;
+ bool doYMovement = true;
+
+ while (true)
+ {
+ blocks[(sx * 16 + sz) * Level::genDepth + sy] = block;
+
+ if (sx == ex && sz == ez)
+ {
+ break;
+ }
+ if (sy == ey)
+ {
+ doYMovement = false;
+ }
+ int e2 = 2 * err;
+ if (e2 > -dz)
+ {
+ err = err - dz;
+ sx = sx + slopeX;
+ }
+ if (e2 < dx)
+ {
+ err = err + dx;
+ sz = sz + slopeZ;
+ }
+
+ if (doYMovement)
+ {
+ e2 = 2 * yErr;
+ if (e2 > -yOppositeDelta)
+ {
+ yErr = yErr - yOppositeDelta;
+ sy = sy + slopeY;
+ }
+ if (e2 < dy)
+ {
+ yErr = yErr + dy;
+ // don't modify sz here, let the plane decide
+ }
+ }
+ }
+}
+
+void BlockGenMethods::generateLine(Level *level, byteArray blocks, int sx, int sy, int sz, int ex, int ey, int ez, BYTE block)
+{
+ generateDirectionLine(level, blocks, sx, sy, sz, ex, ey, ez, 0, 0, block);
+} \ No newline at end of file