猫史档案馆


[pro神岛] 地形复制 代码教程 80行内代码教会你[]qwq

用户:MR_WolfMR_Wolf查看:0 回复:0 评论:0 创建时间:2024-01-12T13:34:26


先点赞后复制

讲解一下原理 获取的坐标是为了更方便复制的位置

范围就是避免将其余东西复制进去

玩家输入后两者相减

再到复制的地图输入新的坐标[]然后复制

亲测有效[]禁止驳回

world.onChat(({ entity: e, message: m }) => {if(e.isPlayer){if (m === '菜单')e.data()}});
world.onPress(({ entity: e, button: b }) => {if (b === 'action1') e.data();});
GameEntity.prototype.data = async function () {
    let e = this, data = [];
    let sel = await e.dlgSel(e.player.name, '尊敬的使用者你好\n请选择功能', ['建筑复制', '建筑制造']);
    if (sel) {
        let v = sel.value;
        if (v === '建筑制造') {
            let d = JSON.parse(await e.dlgInput(v, '请输入建筑复制的数据'));
            let pos = JSON.parse(await e.dlgInput(v, '起始坐标\n实例: {"x":1,"y":1,"z":1}(打括号也需要[]作者用parse方法和GameVector3弄的自己看着办吧)\n注:不符合要求会导致速建出问题'));
            pos = new GameVector3(pos.x, pos.y, pos.z);
            if (d && pos) {
                let len = Object.keys(d).length;
                for (let num = 0; num < len; num++) {
                    let data = d[num];
                    voxels.setVoxel((pos.x - data[0]), (pos.y - data[1]), (pos.z - data[2]), data[3]);
                    if (num % 50 === 0) {
                        await sleep(2);
                        e.player.cancelDialogs();
                        e.dlgMsg(v, `建造进度: ${num}/${len}`);
                    }
                }
                e.player.cancelDialogs();
                await e.dlgMsg(v, '建造成功');
            }
        } else if (v === '建筑复制') {
            let a = await e.dlgInput(v, 'x轴的大小\n用/隔开\n注:坐标由小到大,不符合要求会导致速建出问题');
            let b = await e.dlgInput(v, 'y轴的大小\n用/隔开\n注:坐标由小到大,不符合要求会导致速建出问题');
            let c = await e.dlgInput(v, 'z轴的大小\n用/隔开\n注:坐标由小到大,不符合要求会导致速建出问题');
            let pos = JSON.parse(await e.dlgInput(v, '起始坐标\n实例: {"x":1,"y":1,"z":1}(打括号也需要[]作者用parse方法和GameVector3弄的自己看着办吧)\n注:不符合要求会导致速建出问题'));
            pos = new GameVector3(pos.x, pos.y, pos.z);
            if (!a || !b || !c || !pos) return;
            let posx = a.split('/'), posy = b.split('/'), posz = c.split('/');
            let data = [], len = (posx[1] - posx[0]) * (posy[1] - posy[0]) * (posz[1] * posz[0]);
            for (let x = posx[0]; x <= posx[1]; x++) {
                for (let z = posz[0]; z <= posz[1]; z++) {
                    for (let y = posy[0]; y <= posy[1]; y++) {
                        let vox = voxels.getVoxel(x, y, z);
                        if (vox) data.push(`[${pos.x - x},${pos.y - y},${pos.z - z},${vox}]`);
                    }
                }
                e.player.cancelDialogs();
                e.dlgMsg(v, `复制进度: ${Object.keys(data).length}/${len}`);
                await sleep(10);
            }
            e.player.cancelDialogs();
            e.player.directMessage('复制完成!!!\n请将其复制进建筑制造');
            await e.dlgSel(null, '['+data+']', ['复制好了']);
        }
    }
};

/**定义内容 */
GameEntity.prototype.dlgMsg = async function (title, content, hasArrow) {
    let sel = await this.player.dialog({
        type: 'text',
        title,
        content,
        hasArrow,
    });
    return sel;
};
GameEntity.prototype.dlgInput = async function (title, content) {
    let sel = await this.player.dialog({
        type: 'input',
        title,
        content,
    });
    return sel;
};
GameEntity.prototype.dlgSel = async function (title, content, options) {
    let sel = await this.player.dialog({
        type: 'select',
        title,
        content,
        options,
    });
    return sel || '';
};

点赞!!!收藏!!!转发!!!评论!!!


回复

上一页1 页 / 共 0下一页