diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/BlockGenMethods.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/BlockGenMethods.cpp')
| -rw-r--r-- | Minecraft.World/BlockGenMethods.cpp | 224 |
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 |
