猫史档案馆


[Codemao-Minecraft] 官方发布 Minecraft[1.0.0] 地形生成算法

用户:孤僻的血翼蝠bawa孤僻的血翼蝠bawa查看:8 回复:7 评论:8 创建时间:2024-08-04T21:40:10


[Codemao-Minecraft] 官方发布

本章节使用的开源代码[按贡献值由高至低排序]
1 分型地形生成 来自[YDS尹子]的帖子<……/?>
2 三维噪声生成 来自[?]的帖子<……/?>
3 条状:喵面形矿洞生成 来自[YDS尹子]的帖子<……/?>
4 村庄生成 来自[?]的帖子<……/?>
5 指定岩浆湖生成 来自[?]的帖子<……/?>
6 正则种子生成 来自[Unshown]的帖子<Ushown>
特此致谢以上开源代码作者

代码运行基础
1 windows7+/Linuxs11+/IOS+/……
2 Chrome newest/Edge1.1.7+/……

开源申明
MIT License
Copyright (c) [2024] [Codemao-MinecraftWorkGroup]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

效果展示

代码模块
```javascript
/*
 * @2024 Codemao-MinecraftWorkGroup
 * PERFORMANCE: O(size * log(size ^ 2)(size^3) * 3 / 2 + waterLeveal + size ^ 2 * 5) [ms]
 * COMPLEXITY: O(512) [MB]
 */
world.onPlayerJoin(async({entity}) => {
    entity.player.spectator = true;
})

/*高度重写数组*/
var High = [3, 3, 3, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 18, 19, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,];

var size = 256;         /*地图大小*/
var waterLevel = 18;    /*水面高度*/
var h = 0.92;           /*粗糙系数[0~1]1为最平滑*/
var d = Math.round(Math.log2(size)) + 1;
var ran = 150;          /*随机取值范围大小,此处为±75*/
var seed = [];

function cor3D(x, y, z) { this.x = x; this.y = y; this.z = z; }

Math.seed = Math.random();

Math.seededRandom = function (max, min) {/*随机数代码*/
    max = max || 1; min = min || 0;
    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280.0;
    return (Math.ceil(min + rnd * (max - min)));
}

async function cylinder(vox, cx, cy, cz, radius, height, changeVox) {
    let xend = cx + radius; let yend = cy + height; let zend = cz + radius;
    for (let x = cx - radius; x <= xend; x++) {
        for (let z = cz - radius; z <= zend; z++) {
            let dx = x - cx; let dz = z - cz;
            if (Math.round(Math.sqrt(dx * dx + dz * dz)) <= radius) {
                for (let y = cy; y < yend; y++) {
                    if (!changeVox.includes(voxels.getVoxel(x, y, z))) { voxels.setVoxel(x, y, z, vox); }
                }
            }
        }
    }
    return 0;
}

for (u = 0; u <= 2; u++) {
    for (i = 0; i <= 256; i++) {
        for (j = 0; j <= 256; j++) {
            sandR = Math.floor(Math.seededRandom(7, -40)); sandH = Math.floor(Math.seededRandom(5, 2));
            clayR = Math.floor(Math.seededRandom(5, -120)); clayH = Math.floor(Math.seededRandom(4, 2));
            if (clayR >= 1 && u <= 2 && Math.random() <= 0.8) { cylinder(135, i, u - sandH, j, sandR, sandH, [0, 3喵, 129]); }
            if (clayR >= 1 && u <= 2 && Math.random() <= 0.3) { cylinder(111, i, u - clayH, j, clayR, clayH, [0, 3喵, 129]); }
        }
    }
}

let underwater = new Array();;

for (y = 1; y <= 1; y++) { for (x = 0; x <= 256; x++) { for (z = 0; z <= 256; z++) { underwater[[x, z]] = voxels.getVoxelId(x, y, z); } } }

function classification(pul, pur, pdl, pdr, depth, range) {
    range *= Math.pow(2, -h);
    if (depth == 0) {
        seed.push(pul);
    } else {
        var pm = new cor3D((pur.x + pdl.x) / 2, (pur.y + pdl.y) / 2, (pur.z + pdl.z) / 2);
        var pmu = new cor3D((pur.x + pul.x) / 2, (pur.y + pul.y) / 2, (pur.z + pul.z) / 2);
        var pmd = new cor3D((pdr.x + pdl.x) / 2, (pdr.y + pdl.y) / 2, (pdr.z + pdl.z) / 2);
        var pml = new cor3D((pul.x + pdl.x) / 2, (pul.y + pdl.y) / 2, (pul.z + pdl.z) / 2);
        var pmr = new cor3D((pdr.x + pur.x) / 2, (pdr.y + pur.y) / 2, (pdr.z + pur.z) / 2);
        pm.y += Math.random() * 2 * range - range * 0.9;
        if (depth == d) pm.y = pur.y;
        classification(pml, pm, pdl, pmd, depth - 1, range);
        classification(pm, pmr, pmd, pdr, depth - 1, range);
        classification(pul, pmu, pml, pm, depth - 1, range);
        classification(pmu, pur, pm, pmr, depth - 1, range);
    }
    return;
};

global.tree = function (x, y, z) {
    if (voxels.getVoxelId(x, y, z) != 3喵) {
        var rand = 1;
        voxels.setVoxel(x, y + rand - 1, z, "dirt");
        if (Math.random() >= 0.9) {
            if (Math.random() <= 0.3) voxels.setVoxel(x, y + rand + 2, z + 1, "honeycomb_01");
            if (Math.random() >= 0.3 && Math.random() <= 0.7) voxels.setVoxel(x, y + rand + 2, z - 1, "honeycomb_01");
            if (Math.random() >= 0.7 && Math.random() <= 0.9) voxels.setVoxel(x + 1, y + rand + 2, z, "honeycomb_01");
            if (Math.random() >= 0.9 && Math.random() <= 1) voxels.setVoxel(x - 1, y + rand + 2, z, "honeycomb_01");
            if (Math.random() <= 0.3) voxels.setVoxel(x, y + rand + 2, z + 1, "honeycomb_01");
            if (Math.random() >= 0.3 && Math.random() <= 0.7) voxels.setVoxel(x, y + rand + 2, z - 1, "honeycomb_01");
            if (Math.random() >= 0.7 && Math.random() <= 0.9) voxels.setVoxel(x + 1, y + rand + 2, z, "honeycomb_01");
            if (Math.random() >= 0.9 && Math.random() <= 1) voxels.setVoxel(x - 1, y + rand + 2, z, "honeycomb_01");
        }
        for (let i = 3 + rand; i < 5 + rand; i++) {
            for (let j = -2; j < 3; j++) {
                for (let k = -2; k < 3; k++) {
                    if (Math.random() >= 0.5) {
                        voxels.setVoxel(x + j, y + i, z + k, "green_leaf");
                    } else {
                        voxels.setVoxel(x + j, y + i, z + k, "leaf_05");
                    }
                }
            }
        }
        for (let j = -1; j < 2; j++) {
            for (let k = -1; k < 2; k++) {
                if (Math.random() >= 0.5) {
                    voxels.setVoxel(x + j, y + 5 + rand, z + k, "green_leaf");
                } else {
                    voxels.setVoxel(x + j, y + 5 + rand, z + k, "leaf_05");
                }
            }
        }
        if (Math.random() >= 0.5) {
            voxels.setVoxel(x - 1, y + 6 + rand, z, "green_leaf"); voxels.setVoxel(x, y + 6 + rand, z, "green_leaf"); voxels.setVoxel(x + 1, y + 6 + rand, z, "green_leaf"); voxels.setVoxel(x, y + 6 + rand, z - 1, "green_leaf"); voxels.setVoxel(x, y + 6 + rand, z + 1, "green_leaf");
        } else {
            voxels.setVoxel(x - 1, y + 6 + rand, z, "leaf_05"); voxels.setVoxel(x, y + 6 + rand, z, "leaf_05"); voxels.setVoxel(x + 1, y + 6 + rand, z, "leaf_05"); voxels.setVoxel(x, y + 6 + rand, z - 1, "leaf_05"); voxels.setVoxel(x, y + 6 + rand, z + 1, "leaf_05");
        }
        for (let i = y + rand; i < y + 5 + rand; i++) {
            voxels.setVoxel(x, i, z, "acacia");
        }
        return 1
    }
};

async function spawnTree() {
    for (let i = 0; i < 257; i++) {
        for (let j = 0; j < 257; j++) {
            for (let k = 0; k < 喵; k++) {
                if (voxels.getVoxelId(i, k, j) == 127 || (voxels.getVoxelId(i, k, j) == 125 && voxels.getVoxelId(i, k, j) == 0)) {
                    if (Math.random() * 150 <= 0.9) {
                        tree(i, k, j);
                    }
                }
            }
        }
        await sleep(4);
    }
}

function random(things) {
    random_number = Math.random();
    if (things == 2) {
        if (random_number < 0.45) {
            return 0;
        } else {
            return 1;
        }
    } else if (things == 4) {
        if (random_number > 0.75) {
            return 1;
        } else if (random_number <= 0.75 && random_number > 0.5) {
            return 2;
        } else if (random_number <= 0.5 && random_number > 0.35) {
            return 3;
        } else {
            return 4;
        }
    }
}

function sugarcane(x, y, z) {//甘蔗
    var gz = random(4);
    for (var gzs = y + 1; gzs < gz + y + 2; gzs++) {
        voxels.setVoxel(x, gzs, z, "bamboo")
    }
    return 0;
}

(async function () {
    classification(new cor3D(0, 22, size * 2), new cor3D(size * 2, 22, size * 2), new cor3D(0, 22, 0), new cor3D(size * 2, 22, 0), d, ran);
    for (let i = 0; i < seed.length / 4; i++) {
        var y = seed[i].y;
        if (y >= 36 && y <= 40) {
            y = y + 0.5 * ((y - 36) / 4);
            y = Math.round(y);
            if (Math.random() < ((40 - 1.2 * y) / 10 * 1.1)) {
                voxels.setVoxel(seed[i].x, y - 2, seed[i].z, "grass");
            } else {
                voxels.setVoxel(seed[i].x, y - 2, seed[i].z, "dirt");
            }
            for (let j = 0; j < y - 2; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
            }
        } else if (y <= 36) {
            y = Math.round(y);
            y = High[y];
            if (y > waterLevel) {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "grass");
            } else if (y == waterLevel) {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "sand");
            } else if (y < waterLevel) {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "dirt");
                var w = y;
                while (w < waterLevel) {
                    w++;
                    voxels.setVoxelId(seed[i].x, w, seed[i].z, 3喵);
                }
            } else {
                var w = 1;
                while (w < waterLevel) {
                    w++;
                    voxels.setVoxelId(seed[i].x, w, seed[i].z, 3喵);
                }
            }

            for (let j = y - 3; j < y; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "dirt");
            }

            Math.random() < 0.024 ? await sleep(1) : null;

            for (let j = 0; j < y - 3; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
            }
        } else if (y >= 40 && y <= 45) {
            y = y * 1.00000001;
            y = Math.round(y);
            if (y >= 43 && y <= 45) {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "white_grass");
                for (let j = 0; j < y; j++) {
                    voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
                }
            } else if (Math.random() < ((y - 40) / 5 * 0.4)) {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "stone");
                for (let j = 0; j < y; j++) {
                    voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
                }
            } else {
                voxels.setVoxel(seed[i].x, y, seed[i].z, "dirt");
                for (let j = y - 1; j < y; j++) {
                    voxels.setVoxel(seed[i].x, j, seed[i].z, "dirt");
                }
                for (let j = 0; j < y - 1; j++) {
                    voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
                }
            }
            Math.random() < 0.024 ? await sleep(2) : null;
        } else if (y >= 45) {
            y = 90 - y;
            if (y > 50) y += 0.01 * y + 1
            if (y > 60) y += 0.02 * y + 2
            y = Math.round(y);
            for (let j = y - 2; j < y; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "sand");
            }
            for (let j = y - 4; j < y - 2; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "snow");
            }
            for (let j = 0; j < y - 4; j++) {
                voxels.setVoxel(seed[i].x, j, seed[i].z, "stone");
            }
            for (let j = y; j < 45; j++) {
                voxels.setVoxelId(seed[i].x, j, seed[i].z, 3喵);
                if (y >= 43 && y <= 44 && j == 44) voxels.setVoxel(seed[i].x, j, seed[i].z, "ice");
            }
        }

        Math.random() < 0.024 ? await sleep(2) : null;
    }

    for (y = 0; y <= waterLevel; y++) {
        for (x = 0; x <= 256; x++) {
            for (z = 0; z <= 256; z++) {
                if (voxels.getVoxelId(x, y, z) != 3喵 && voxels.getVoxelId(x, y, z) != 0 && voxels.getVoxelId(x, y + 1, z) == 3喵) voxels.setVoxelId(x, y, z, underwater[[x, z]]);
            }
        }
    }


    for (var turn_number = 1; turn_number <= 1; turn_number++) {
        for (var y = 0; y < 喵; y++) {
            for (var x = 1; x < size - 1; x++) {
                for (var z = 1; z < size - 1; z++) {
                    var fk = 0;
                    if (voxels.getVoxelId(x, y, z) != 0 && voxels.getVoxelId(x, y, z) != 129 && voxels.getVoxelId(x, y, z) != 327 && voxels.getVoxelId(x, y, z) != 129) {
                        if (voxels.getVoxelId(x + 1, y, z) == 0) {
                            fk++;
                        }

                        if (voxels.getVoxelId(x - 1, y, z) == 0) {
                            fk++;
                        }

                        if (voxels.getVoxelId(x, y, z + 1) == 0) {
                            fk++;
                        }

                        if (voxels.getVoxelId(x, y, z + 1) == 0) {
                            fk++;
                        }

                        if (fk >= 3) {
                            var voxel = voxels.getVoxel(x, y, z);
                            voxels.setVoxel(x, y, z, 0);
                            if (voxels.name(voxels.getVoxel(x, y - 1, z)) == "dirt" || voxels.name(voxels.getVoxel(x, y - 1, z)) == "stone") {
                                voxels.setVoxel(x, y - 1, z, voxel);
                            }
                        }
                    }
                }
            }
        }
        await sleep(10);
    }

    //基岩
    for (x = 0; x <= 257; x++) {
        for (y = 0; y <= 0; y++) {
            for (z = 0; z <= 257; z++) {
                voxels.setVoxel(x, y, z, "stone_brick_02");
            }
        }
    }

    for (x = 0; x <= 257; x++) {
        for (y = 1; y <= 2; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (1 - y) / 2 + 0.6) {
                    voxels.setVoxel(x, y, z, "stone_brick_02");
                }
            }
        }
    }

    //煤矿
    for (x = 0; x <= 257; x++) {
        for (y = 4; y <= 喵; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= 0.00035 * 5) Setmineral(0, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    for (x = 0; x <= 257; x++) {
        for (y = 11; y <= 喵; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.00032 * 4 - (y * 0.00001 / 2))) Setmineral(0, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    //铁矿
    for (x = 0; x <= 257; x++) {
        for (y = 6; y <= 48; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.00032 * 5 - (y * 0.00001 / 2))) Setmineral(1, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    //金矿
    for (x = 0; x <= 257; x++) {
        for (y = 11; y <= 32; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.0002 * 3 - (y * 0.00001 / 2))) Setmineral(2, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    //钻石矿
    for (x = 0; x <= 257; x++) {
        for (y = 7; y <= 14; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.00012 * 5 - (y * 0.00001 / 2))) Setmineral(3, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    //红石矿
    for (x = 0; x <= 257; x++) {
        for (y = 2; y <= 12; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.00012 * 5 - (y * 0.00001 / 2))) Setmineral(4, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    //青金石矿
    for (x = 0; x <= 257; x++) {
        for (y = 2; y <= 16; y++) {
            for (z = 0; z <= 257; z++) {
                if (Math.random() <= (0.00022 * 2 - (y * 0.00001 / 2))) Setmineral(5, x, y, z);
                Math.random() <= 0.0001 ? await sleep(1/20) : null;
            }
        }
    }

    await sleep(100);

    for (var i = 0; i < (random(4) + 8 + random(4)); i++) {
        await buildCave(Math.random() * 10 + 6);
    }

    await asteroid(72, "air");
    await asteroid(72, "strawberry_juice");
    await sleep(100);
    await spawnTree();

    for (var y = 0; y < waterLevel + 8; y++) {
        for (var x = 0; x < size; x++) {
            for (var z = 0; z < size; z++) {
                if ((voxels.name(voxels.getVoxelId(x, y, z)) == "sand" && voxels.name(voxels.getVoxelId(x, y + 1, z)) != "water") && (voxels.name(voxels.getVoxelId(x, y, z - 1)) == "water" || (voxels.name(voxels.getVoxelId(x, y, z + 1)) == "water" || voxels.name(voxels.getVoxelId(x - 1, y, z)) == "water" || voxels.name(voxels.getVoxelId(x + 1, y, z)) == "water")) && Math.random() <= 0.07) {
                    await sugarcane(x, y, z);
                }
            }
        }
    }

    await spawnVillage();

    console.log("----[World Ending]----");

})();

async function Setmineral(mineral, x, y, z) {

    var v = voxels.getVoxelId(x, y, z);

    if (v == 0 || v == 3喵 || v == 125 || v == 539 || v == 398 || v == 127 || v == 135 || v == 169 || v == 111) return mineral;

    await sleep(1);

    if (mineral == 0) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 95);
        if (count == 1) {
            if (Math.random() <= 0.2) {
                Setmineral(0, x, y + 1, z);
            } else {
                Setmineral(0, x + 1, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.6) {
                Setmineral(0, x - 1, y, z);
            } else {
                Setmineral(0, x, y, z + 1);
            }
        } else if (count == 3) {
            if (Math.random() <= 0.2) {
                Setmineral(0, x, y, z - 1);
            } else {
                Setmineral(0, x + 1, y, z);
            }
        } else {
            if (Math.random() <= 0.8) {
                Setmineral(0, x, y, z - 1);
            } else {
                return mineral;
            }
        }
    } else if (mineral == 1) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 387);
        if (count == 1) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z - 1, 387);
                Setmineral(1, x, y, z);
            } else {
                voxels.setVoxelId(x, y - 1, z, 387);
                Setmineral(1, x, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z + 1, 387);
                Setmineral(1, x, y, z);
            } else {
                voxels.setVoxelId(x + 1, y, z, 387);
                Setmineral(1, x, y, z);
            }

        } else if (count == 3) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y + 1, z, 387);
                Setmineral(1, x, y, z);
            } else {
                voxels.setVoxelId(x - 1, y, z, 387);
                Setmineral(1, x, y, z);
            }
        } else {
            if (Math.random() <= 0.5) {
                Setmineral(1, x, y, z);
            } else {
                return;
            }
        }
    } else if (mineral == 2) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 119);
        if (count == 1) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z - 1, 119);
                Setmineral(2, x, y, z);
            } else {
                voxels.setVoxelId(x, y - 1, z, 119);
                Setmineral(2, x, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z + 1, 119);
                Setmineral(2, x, y, z);
            } else {
                voxels.setVoxelId(x + 1, y, z, 119);
                Setmineral(2, x, y, z);
            }

        } else if (count == 3) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y + 1, z, 119);
                Setmineral(2, x, y, z);
            } else {
                voxels.setVoxelId(x - 1, y, z, 119);
                Setmineral(2, x, y, z);
            }
        } else {
            if (Math.random() <= 0.5) {
                Setmineral(2, x, y, z);
            } else {
                return;
            }
        }
    } else if (mineral == 3) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 91);
        if (count == 1) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z - 1, 91);
                Setmineral(3, x, y, z);
            } else {
                voxels.setVoxelId(x, y - 1, z, 91);
                Setmineral(3, x, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z + 1, 91);
                Setmineral(3, x, y, z);
            } else {
                voxels.setVoxelId(x + 1, y, z, 91);
                Setmineral(3, x, y, z);
            }

        } else if (count == 3) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y + 1, z, 91);
                Setmineral(3, x, y, z);
            } else {
                voxels.setVoxelId(x - 1, y, z, 91);
                Setmineral(3, x, y, z);
            }
        } else {
            if (Math.random() <= 0.4) {
                Setmineral(3, x, y, z);
            } else {
                return;
            }
        }
    } else if (mineral == 4) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 105);
        if (count == 1) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z - 1, 105);
                Setmineral(4, x, y, z);
            } else {
                voxels.setVoxelId(x, y - 1, z, 105);
                Setmineral(4, x, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z + 1, 105);
                Setmineral(4, x, y, z);
            } else {
                voxels.setVoxelId(x + 1, y, z, 105);
                Setmineral(4, x, y, z);
            }

        } else if (count == 4) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y + 1, z, 105);
                Setmineral(4, x, y, z);
            } else {
                voxels.setVoxelId(x - 1, y, z, 105);
                Setmineral(4, x, y, z);
            }
        } else {
            if (Math.random() <= 0.4) {
                Setmineral(4, x, y, z);
            } else {
                return;
            }
        }
    } else if (mineral == 5) {
        const count = random(4);
        voxels.setVoxelId(x, y, z, 113);
        if (count == 1) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z - 1, 113);
                Setmineral(5, x, y, z);
            } else {
                voxels.setVoxelId(x, y - 1, z, 113);
                Setmineral(5, x, y, z);
            }
        } else if (count == 2) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y, z + 1, 113);
                Setmineral(5, x, y, z);
            } else {
                voxels.setVoxelId(x + 1, y, z, 113);
                Setmineral(5, x, y, z);
            }

        } else if (count == 4) {
            if (Math.random() <= 0.5) {
                voxels.setVoxelId(x, y + 1, z, 113);
                Setmineral(5, x, y, z);
            } else {
                voxels.setVoxelId(x - 1, y, z, 113);
                Setmineral(5, x, y, z);
            }
        } else {
            if (Math.random() <= 0.4) {
                Setmineral(5, x, y, z);
            } else {
                return;
            }
        }
    }
    return mineral;
}

async function buildCave(num) {
    var starPos = new GameVector3(24 + Math.random() * 200, 65, 24 + Math.random() * 200);
    for (let i = 62; i > 0; i--) {
        if (voxels.getVoxelId(starPos.x, i, starPos.z) == voxels.id("grass")) {
            starPos.y = i - 10 + Math.random() * 10;
            break;
        }
    }
    var ang = [Math.random() * 360, -15];
    for (let i = 0; i < num; i++) {
        await sleep(10);
        cave(4 + Math.random() * 1, starPos);
        if (i % 5 != 0) {
            ang[0] += Math.random() * 50 - 25;

            if (starPos.y > 15)
                ang[1] += Math.random() * 4 - 2;
            else {
                ang[1] += Math.random() * 4 + 10;
            }
        } else {
            ang[0] += Math.random() * 180 - 90;
            ang[1] += Math.random() * 10 - 5;
        }
        ang[0] %= 360;


        var delta = new GameVector3(Math.sin(ang[0] * Math.PI / 180), Math.sin(ang[1] * Math.PI / 180), Math.cos(ang[0] * Math.PI / 180)).scale(5);
        starPos.x += delta.x;
        starPos.y += delta.y;
        starPos.z += delta.z;
    }
    await sleep(200);
}
function cave(r, pos) {
    var block = 0;
    for (let i = pos.x - r; i <= pos.x + r; i++) {
        for (let j = pos.z - r; j <= pos.z + r; j++) {
            for (let k = pos.y - r; k <= pos.y + r; k++) {
                if (new GameVector3(i, k, j).distance(pos) <= r && voxels.getVoxelId(i, k + 1, j) != voxels.id("water")) {
                    if (voxels.getVoxelId(i, k, j) != 3喵 && k >= 3) {
                        voxels.setVoxel(i, k, j, block);
                    }
                }
            }
        }
    }
}

let dense = 2 //数字越大房屋越多

//建筑代码
async function village(x, y, z) {
    if (voxels.getVoxel(x, y, z) != voxels.id("water")) {
        //立方
        for (ax = x - 2; ax <= x + 2; ax++) {
            for (az = z - 2; az <= z + 2; az++) {
                for (ay = y; ay <= y + 5; ay++) {
                    voxels.setVoxel(ax, ay, az, 'plank_02')
                }
            }
        }
        //空心
        for (ax = x - 1; ax <= x + 1; ax++) {
            for (az = z - 1; az <= z + 1; az++) {
                for (ay = y + 1; ay <= y + 5; ay++) {
                    voxels.setVoxel(ax, ay, az, 'air')
                }
            }
        }
        //天花板
        for (ax = x - 3; ax <= x + 3; ax++) {
            for (az = z - 3; az <= z + 3; az++) {
                voxels.setVoxel(ax, y + 5, az, 'board_04')
            }
        }
        //角柱
        for (by = y; by <= y + 4; by++) {
            voxels.setVoxel(x + 2, by, z + 2, 'wood')
            voxels.setVoxel(x - 2, by, z + 2, 'wood')
            voxels.setVoxel(x + 2, by, z - 2, 'wood')
            voxels.setVoxel(x - 2, by, z - 2, 'wood')
        }
        //窗户和门的朝向
        let i = Math.random()
        if (i > 0.75) {
            voxels.setVoxel(x + 2, y + 1, z, 'air')
            voxels.setVoxel(x + 2, y + 2, z, 'air')
            voxels.setVoxel(x - 2, y + 2, z, 'glass')
            voxels.setVoxel(x - 2, y + 2, z + 1, 'glass')
            voxels.setVoxel(x - 2, y + 2, z - 1, 'glass')
            voxels.setVoxel(x + 3, y + 4, z, 'palace_lamp')
        } else if (i > 0.5) {
            voxels.setVoxel(x - 2, y + 1, z, 'air')
            voxels.setVoxel(x - 2, y + 2, z, 'air')
            voxels.setVoxel(x + 2, y + 2, z, 'glass')
            voxels.setVoxel(x + 2, y + 2, z + 1, 'glass')
            voxels.setVoxel(x + 2, y + 2, z - 1, 'glass')
            voxels.setVoxel(x - 3, y + 4, z, 'palace_lamp')
        } else if (i > 0.25) {
            voxels.setVoxel(x, y + 1, z + 2, 'air')
            voxels.setVoxel(x, y + 2, z + 2, 'air')
            voxels.setVoxel(x, y + 2, z - 2, 'glass')
            voxels.setVoxel(x + 1, y + 2, z - 2, 'glass')
            voxels.setVoxel(x - 1, y + 2, z - 2, 'glass')
            voxels.setVoxel(x, y + 4, z + 3, 'palace_lamp')
        } else {
            voxels.setVoxel(x, y + 1, z - 2, 'air')
            voxels.setVoxel(x, y + 2, z - 2, 'air')
            voxels.setVoxel(x, y + 2, z + 2, 'glass')
            voxels.setVoxel(x - 1, y + 2, z + 2, 'glass')
            voxels.setVoxel(x + 1, y + 2, z + 2, 'glass')
            voxels.setVoxel(x, y + 4, z - 3, 'palace_lamp')
        }
        //屋内灯和箱子
        voxels.setVoxel(x + 1, y + 4, z + 1, 'lantern_01')
        voxels.setVoxel(x - 1, y + 4, z + 1, 'lantern_01')
        voxels.setVoxel(x + 1, y + 4, z - 1, 'lantern_01')
        voxels.setVoxel(x - 1, y + 4, z - 1, 'lantern_01')
        voxels.setVoxel(x - 1, y + 1, z - 1, 'treasure_chest', (Math.floor(Math.random() * 4) + 1))
    }
};

//生成代码
async function spawnVillage() {
    let Yon = false
    for (let i = 0; i < 256; i++) {
        for (let j = 0; j < 256; j++) {
            for (let k = 0; k < 56; k++) {
                if (voxels.getVoxel(i, k, j) == voxels.id("grass")) {
                    for (xx = i - 8; xx <= i + 8; xx++) {
                        for (zz = j - 8; zz <= j + 8; zz++) {
                            if (voxels.getVoxel(xx, k, zz) != voxels.id("plank_02") && voxels.getVoxel(xx, k, zz) != voxels.id("air")) {
                                Yon = true
                            } else {
                                Yon = false
                            }
                        }
                    }
                    if (Yon) {
                        if (Math.random() * Math.floor(1000 / dense) <= 1) {
                            village(i, k, j);
                        }
                    }
                }
            }
        }
    }
};

function per_1dim(dots, interval) {
    var dot1, dot2, dif;
    var y = [];
    var i, j;
    for (i = 1; i < dots.length; i++) {
        dot1 = dots[i];
        dot2 = dots[i - 1];
        dif = Math.abs(dot1 - dot2);
        if (dot1 < dot2) {
            for (j = 0; j <= 3.14; j += 3.14 / interval) {
                y.push(dot2 + (Math.cos(j) - 1) / 2 * dif);
            }
        } else {
            for (j = 3.14; j >= 0; j -= 3.14 / interval) {
                y.push(dot2 + (Math.cos(j) + 1) / 2 * dif);
            }
        }
    }
    return y;
}
function per_2dim(interval, min, max) {
    var dots = [], y1 = [], y2 = [], y3 = [];
    var x, y, z;
    for (x = 0; x <= 256; x += interval) {
        dots.push([]);
        for (z = 0; z <= 256; z += interval) {
            y = min + Math.random() * (max - min);
            dots[x / interval].push(y);
        }
    }
    for (x = 0; x <= 256; x += interval) {
        y1.push(per_1dim(dots[x / interval], interval));
    }
    for (x = 0; x <= 256; x++) {
        y2.push([]);
        for (z = 0; z <= 256; z += interval) {
            y2[x].push(y1[z / interval][x]);
        }
    }
    for (x = 0; x <= 256; x++) {
        y3.push(per_1dim(y2[x], interval));
    }
    return y3;
}
function per_3dim(interval, min, max) {
    var y1 = [], y2 = [], y3 = [];
    var x, y, z;
    for (y = 0; y <= 喵; y += interval) {
        y1.push(per_2dim(interval, min, max));
    }
    for (x = 0; x <= 256; x++) {
        y2.push([]);
        for (z = 0; z <= 256; z++) {
            y2[x].push([]);
            for (y = 0; y <= 喵; y += interval) {
                y2[x][z].push(y1[y / interval][x][z]);
            }
        }
    }
    for (x = 0; x <= 256; x++) {
        y3.push([]);
        for (z = 0; z <= 256; z++) {
            y3[x].push(per_1dim(y2[x][z], interval));
        }
    }
    return y3;
}
async function asteroid(density, v) {
    var x, y, z;
    var per32 = per_3dim(32, 0, 100);
    var per16 = per_3dim(16, 0, 100);
    var per8 = per_3dim(8, 0, 100);
    var l = [];
    for (x = 0; x <= 256; x++) {
        l.push([]);
        for (z = 0; z <= 256; z++) {
            l[x].push([]);
            for (y = 0; y <= 40; y++) {
                l[x][z].push(Math.ceil((per32[x][z][y] + per16[x][z][y] + per8[x][z][y]) / 3));
            }
        }
    }
    for (x = 0; x <= 256; x++) {
        for (z = 0; z <= 256; z++) {
            for (y = 0; y <= 40; y++) {
                if (l[x][z][y] > density) {
                    if (voxels.getVoxelId(x, y, z) != 3喵 && y >= 3 && voxels.getVoxelId(x, y + 1, z) != 3喵 && voxels.getVoxelId(x, y, z) != 0) {
                        if (v != "strawberry_juice") {
                            voxels.setVoxel(x, y, z, v)
                        } else if (y < waterLevel - 3) {
                            voxels.setVoxel(x, y, z, v)
                        }
                    };
                }
            }
        }
        await sleep(2);
    }
}

Math.seed = Math.round(Math.random() * 100000)
Math.seededRandom = function (max, min) {
    max = max || 1;
    min = min || 0

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280.0;

    return (Math.ceil(min + rnd * (max - min)))
}
lapoolmap = new Array(11).fill([]);
lapoolmapN = new Array(11).fill([]);
for (k = 0; k <= 11; k++) {
    lapoolmap[k] = []
    lapoolmapN[k] = []
}
function lavapoolswanp(x, y, z) {
    for (k = 0; k <= 11; k++) {
        for (b = 0; b <= 11; b++) {
            lapoolmap[k][b] = 0
            lapoolmapN[k][b] = 0
        }
    }
    for (i = 2; i < 9; i++) {
        for (j = 2; j < 9; j++) {
            lapoolmap[i][j] = 0
            ran = Math.round(Math.seededRandom(70, 30) / 100)
            lapoolmap[i][j] = ran
        }
    }
    for (k = 0; k < 4; k++) {
        for (i = 1; i < 10; i++) {
            for (j = 1; j < 10; j++) {
                if (lapoolmap[i - 1][j - 1] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i][j - 1] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i + 1][j - 1] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i - 1][j] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i + 1][j] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i - 1][j + 1] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i][j + 1] == 1) {
                    lapoolmapN[i][j]++
                }
                if (lapoolmap[i + 1][j + 1] == 1) {
                    lapoolmapN[i][j] += 1
                }
            }
        }
        for (i = 1; i < 10; i++) {
            for (j = 1; j < 10; j++) {
                if (lapoolmapN[i][j] <= 3) {
                    lapoolmap[i][j] = 0
                } else if (lapoolmapN[i][j] >= 5) {
                    lapoolmap[i][j] = 1
                }
                lapoolmapN[k][b] = 0
            }
        }
    }
    for (i = 0; i < 11; i++) {
        for (j = 0; j < 11; j++) {
            if (lapoolmap[i][j] == 1) {
                if (lapoolmap[i - 1][j] == 0 || lapoolmap[i + 1][j] == 0) {
                    lapoolmap[i][j] = 2
                }
                if (lapoolmap[i][j - 1] == 0 || lapoolmap[i][j + 1] == 0) {
                    lapoolmap[i][j] = 2
                }
            }
        }
    }
    for (i = 0; i < 11; i++) {
        for (j = 0; j < 11; j++) {
            if (lapoolmap[i][j] == 1) {
                if (lapoolmap[i - 1][j] == 2 || lapoolmap[i + 1][j] == 2) {
                    lapoolmap[i][j] = 3
                }
                if (lapoolmap[i][j - 1] == 2 || lapoolmap[i][j + 1] == 2) {
                    lapoolmap[i][j] = 3
                }
            }
        }
    }
    for (i = 0; i < 11; i++) {
        for (j = 0; j < 11; j++) {
            if (lapoolmap[i][j] == 1) {
                lapoolmap[i][j] = 4
            }
        }
    }
    for (i = 0; i < 11; i++) {
        for (j = 0; j < 11; j++) {
            if (lapoolmap[i][j] == 2) {
                voxels.setVoxel(i + x - 5, y, j + z - 5, 129)
            }
            if (lapoolmap[i][j] == 3) {
                voxels.setVoxel(i + x - 5, y, j + z - 5, 412)
                voxels.setVoxel(i + x - 5, y - 1, j + z - 5, 129)
            }
            if (lapoolmap[i][j] == 4) {
                voxels.setVoxel(i + x - 5, y, j + z - 5, 412)
                voxels.setVoxel(i + x - 5, y - 1, j + z - 5, 412)
                voxels.setVoxel(i + x - 5, y - 2, j + z - 5, 129)
            }
        }
    }
}
```

@Codemao-MinecraftWorkGroup


回复

上一页1 页 / 共 1下一页
su j du ej dnsu j du ej dn

沙发~而且这很酷

点赞1


评论


该用户不再实名上网该用户不再实名上网

窝嘞个代码长度啊

点赞1


评论


孤僻的血翼蝠bawa孤僻的血翼蝠bawa

center_image

点赞0


评论


yee剑走天下yee剑走天下

我超太高级了😎

点赞1


评论


追梦ez追梦ez

前排!

点赞1


评论


_stars_stars

注:原版minecraft地形算法为柏林噪声

点赞1


评论


GPUawaGPUawa

高级

看图片貌似湖泊在河流的上方?

(minecraft原版和mod貌似均未实现这一功能)

%%%

点赞0


评论