猫史档案馆


我又做新地图了

用户:兴奋的熔岩龙LEzh兴奋的熔岩龙LEzh查看:1 回复:8 评论:1 创建时间:2022-05-28T22:15:14


console.clear()
var door = world.querySelector('#第1关')   //名称需与模型的名称保持一致
door.enableInteract = true
door.interactRadius = 2

door.onInteract(({ entity }) => {
    entity.position.set(8,10,207)
})

async function run(){
    world.run = 1;
    console.clear();
    world.set_v="dark_gray";
    world.y=8;
    f1 = null;
    f2 = null;
    world.bjd=["X","Z","add","subtract"];
    while(world.run == 1){
        for(let z=0;z<258;z++){
            f1 = null;
            f2 = null;
            for(let x=0;x<258;x++){
                if(voxels.getVoxelId(x,world.y,z) == voxels.id(world.bjd[0])){
                    if(f1 == null){
                        fx = z;
                        f1 = x;
                        console.log("发现标记点-1,x="+f1+",z坐标为"+fx);
                    }else if(f1 != x && fx == z){
                        f2 = x+1;
                        console.log("发现标记点-2,x="+f2+",z坐标为"+fx);
                        console.log("开始铺:起始点x="+f1+",终点x="+f2);
                        for(let k=f1;k<f2;k++){
                            voxels.setVoxel(k,world.y,fx,world.set_v);
                        };
                        f2 = null;
                        f1 = null;
                    };
                };
            };
        };
        for(let x=0;x<258;x++){
            f1 = null;
            f2 = null;
            for(let z=0;z<258;z++){
                if(voxels.getVoxelId(x,world.y,z) == voxels.id(world.bjd[1])){
                    if(f1 == null){
                        fx = x;
                        f1 = z;
                        console.log("发现标记点-1,z="+f1+",x坐标为"+fx);
                    }else if(f1 != z && fx == x){
                        f2 = z+1;
                        console.log("发现标记点-2,z="+f2+",x坐标为"+fx);
                        console.log("开始铺:起始点z="+f1+",终点z="+f2);
                        for(let k=f1;k<f2;k++){
                            voxels.setVoxel(fx,world.y,k,world.set_v);
                        };
                        f2 = null;
                        f1 = null;
                    };
                };
            };
        };
        for(let x=0;x<258;x++){
            f1 = null;
            f2 = null;
            for(let z=0;z<258;z++){
                if(voxels.getVoxelId(x,world.y,z) == voxels.id(world.bjd[2])){
                    if(f1 == null){
                        fx = x;
                        f1 = z;
                        console.log("发现标记点-1,z="+f1+",x坐标为"+fx);
                    }else if(f1 != z && fx == x){
                        f2 = z+1;
                        console.log("发现标记点-2,z="+f2+",x坐标为"+fx);
                        console.log("开始铺:起始点z="+f1+",终点z="+f2);
                        for(let k=f1;k<f2;k++){
                            voxels.setVoxel(fx,0,k,"purple");
                            k+=5;
                        };
                        voxels.setVoxel(fx,world.y,f2-1,"purple");
                        f2 = null;
                        f1 = null;
                    };
                };
            };
        };
        for(let z=0;z<258;z++){
            f1 = null;
            f2 = null;
            for(let x=0;x<258;x++){
                if(voxels.getVoxelId(x,world.y,z) == voxels.id(world.bjd[3])){
                    if(f1 == null){
                        fx = z;
                        f1 = x;
                        console.log("发现标记点-1,x="+f1+",z坐标为"+fx);
                    }else if(f1 != x && fx == z){
                        f2 = x+1;
                        console.log("发现标记点-2,x="+f2+",z坐标为"+fx);
                        console.log("开始铺:起始点x="+f1+",终点x="+f2);
                        for(let k=f1;k<f2;k++){
                            voxels.setVoxel(k,world.y,fx,"purple");
                            k+=5;
                        };
                        voxels.setVoxel(f2-1,world.y,fx,"purple");
                        f2 = null;
                        f1 = null;
                    };
                };
            };
        };
        await sleep(100);
    };
    console.log("off");
};
run();

console.clear()
for (const e of world.querySelectorAll('#灵魂碎片-1')) { //遍历每一个废品实体
    e.enableInteract = true //开启交互
    e.interactRadius = 2.5 //交互范围
    e.interactHint = e.tags() //交互提示文本显示标签名
    e.interactColor.set(0, 1, 0) //交互提示文本设为绿色
    e.onInteract(({ entity }) => {
        entity.junk += 1 //累加废品
        e.destroy() //从地图中删除实体
 
        //跟world.say相似, 但只对指定的玩家显示信息而不是对所有玩家广播
        entity.player.directMessage(`${entity.player.name} 累计收集${entity.junk}个水晶`)
    })
}

//封装成函数是因为它会被多次用到(显示玩家状态, 显示与NPC交互结果)
function textDialog(entity, content, title) {
    return entity.player.dialog({ //弹出对话框
        type: Box3DialogType.TEXT, //对话框类型为纯文本
        content, //文本内容
        title, //对话框左上角标题内容
    })
}

world.onPlayerJoin(({ entity }) => {//每次玩家进入游戏都会运行
    entity.money = 0 //钱
    entity.junk = 0 //废品
    entity.itemList = [] //口袋里的货品

    loadPlayer(entity)

entity.player.onPress(async ({ button }) => { //每当有按钮被按下
        if (button == Box3ButtonType.ACTION1) { //如果按钮是右键
            const selection = await entity.player.dialog({
                type: Box3DialogType.SELECT, //对话框类型为选择框
                content: `你身上有:\n\n${entity.money}元, ${entity.junk}个废品\n道具: [${entity.itemList}]`,
                options: ['保存'],
            })
            if (selection) { //确保对话框不是点击x关闭
                if (selection.value === '保存') { //被点击的是保存按钮
                    await savePlayer(entity) //等待写入结束才运行下一行
                    textDialog(entity, '保存完毕')
                }
            }
        }
        }
    )
})

//NPC是non-player character的简称, 表示游戏里无人控制的虚构人物
for (const npc of world.querySelectorAll('.NPC')) {
    npc.enableInteract = true //允许当前npc实体触发交互
    npc.interactRadius = 4.5 //交互范围
    npc.interactHint = npc.id //交互提示文本显示实体名字
    npc.interactColor.set(0, 1, 0) //交互提示文本颜色为绿色
   
    if (npc.id == '比尔斯') { //如果实体名是'小卖部老板'
        npc.onInteract(async ({ entity }) => { //当玩家对这个npc按E触发交互, npc问你想买哪些商品
            const priceList = [7, 5, 4] //价格列表
            const selection = await entity.player.dialog({
                type: Box3DialogType.SELECT, //对话框类型为选择框
                content: `你有${entity.money}元, 想买点什么呢?`,
                title: npc.id, //对话框左上角显示NPC名字
                options: ['1阶指环', '2阶指环', '3阶指环', '4阶指环', '5阶指环', '6阶指环', '7阶指环', '8阶指环'], //选项
            })
            if (selection) { //如果玩家没有点击'x'关闭对话框
                const goods = goodsList[selection.index] //被选中的货物
                const price = priceList[selection.index] //被选中货物的价格
                if (entity.money >= price) { //如果玩家的钱足够
                    entity.money -= price //扣钱
                    entity.itemList.push(goods) //货物装进玩家口袋列表最右边
                    textDialog(entity, `"${goods}"入手`)
                } else {
                    textDialog(entity, `要买"${goods}"还差${price - entity.money}个灵魂碎片`)
                }
            }
        })
    }
}

async function savePlayer(entity) {//定义保存玩家状态的函数
    if (entity.player.userKey) {//拥有userKey的玩家, 则玩家不是游客, 可以保存
        await db.sql`
            --尝试向player表插入一条记录, 向各个字段写入玩家身上对应的属性值
            INSERT INTO player (
                userName,
                money,
                junk,
                itemList,
                userKey
            )
            VALUES(
                ${entity.player.name},
                ${entity.money},
                ${entity.junk},
                ${JSON.stringify(entity.itemList)},--itemList是数组, 需要用JSON.stringify才能存入类型为TEXT的字段
                ${entity.player.userKey}
            )
            ON CONFLICT(userKey)--如果玩家记录已经存在, 则不需要插入, 而是更新各个字段的值
            DO UPDATE SET

            userName=excluded.userName,
            money=excluded.money,
            junk=excluded.junk,
            itemList=excluded.itemList
        `
    }
}

async function showPlayers() {
    console.clear() // 清空控制台
    const playerList = await db.sql`SELECT * FROM player`
    for (const p of playerList) {
        console.log(JSON.stringify(p))
    }
}

async function createTable() {
    await db.sql`
        CREATE TABLE IF NOT EXISTS player (
            money INTEGER DEFAULT 0,--金钱, INTEGER类型用于存储整数
            junk INTEGER DEFAULT 0,--废品, INTEGER类型用于存储整数
            itemList TEXT DEFAULT '',--道具列表, TEXT类型用于存储字符串
            userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''--玩家的唯一识别码, TEXT类型用于存储字符串
        )
    `
    showPlayers() //每次运行代码都能查看数据库里所有记录
}

async function loadPlayer(entity) {
    const data = (await (db.sql`SELECT * FROM player WHERE userKey=${entity.player.userKey} limit 1`))[0]
    if (data) { //如果存在这个玩家的存档
        entity.money = data.money //恢复金钱
        entity.junk = data.junk //恢复废品
        entity.itemList = JSON.parse(data.itemList) //恢复道具列表, 这里的JSON.parse用于把字符串变回数组
    }
}

async function showPlayers() {
    console.clear() // 清空控制台
    const playerList = await db.sql`SELECT * FROM player`
    for (const p of playerList) {
        console.log(JSON.stringify(p))
    }
}

async function createTable() {
    await db.sql`CREATE TABLE IF NOT EXISTS player (
        userName TEXT DEFAULT '',--玩家名字
        money INTEGER DEFAULT 0,--金钱
        junk INTEGER DEFAULT 0,--废品
        itemList TEXT DEFAULT '',--道具列表
        userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''--玩家的识别码
    )`

    showPlayers()
}

createTable()

目前还没做完,想合作的来https://box3.codemao.on/e/c9b63624fbdbdf35c185


回复

上一页1 页 / 共 1下一页
酷酷的夜魅鼠酷酷的夜魅鼠

你在吗?

点赞0


评论


酷酷的夜魅鼠酷酷的夜魅鼠

我想合作

点赞0


评论


兴奋的熔岩龙LEzh兴奋的熔岩龙LEzh

https://box3.cod喵/e/c9b63624fbdbdf35c185

点赞0


评论


Robot一只屑代码师Robot一只屑代码师

我要

点赞0


评论


兴奋的熔岩龙LEzh兴奋的熔岩龙LEzh

https://box3.cod喵/e/c9b63624fbdbdf35c185网址在这里。

点赞0


评论


lingyi_objlingyi_obj

喵,我交1223455

点赞0


评论


1086爱编程1086爱编程

这都是社区的代码吧()可以尝试着自己写一些()()

点赞0


评论


兴奋的熔岩龙LEzh兴奋的熔岩龙LEzh

谁能吧Vicent轩招来?

点赞0


评论