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