猫史档案馆


【岛三】自动存档教程

用户:DebugDynamoDebugDynamo查看:3 回复:6 评论:3 创建时间:2022-01-15T14:11:27


async function initTable() {//创建玩家数据表
    return await db.sql`
        CREATE TABLE IF NOT EXISTS "players" (
            "posts" INT NOT NULL,
            "item" TEXT NOT NULL,--物品列表
            "jujin" INT NOT NULL,
            "juqlb" TEXT NOT NULL,
            "money" INT NOT NULL,
            "chufa" TEXT NOT NULL,
            "userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL --用户识别码
        )
    `;
}
async function saveUser(user) {//玩家存档
    await db.sql`
        INSERT INTO "players" (-- player虽然是小写, 建议统一用""包住
            "posts",
            "item",-- 道具
            "jujin",
            "juqlb",-- 道具
            "money",
            "chufa",-- 道具
            "userKey"-- 用户识别码
        ) VALUES (
            ${JSON.stringify(user.posts)},
            ${JSON.stringify(user.item)}, --尝试新建道具值
            ${user.jujin},
            ${JSON.stringify(user.juqlb)},
            ${user.money},
            ${JSON.stringify(user.chufa)},
            ${user.player.userKey} --尝试新建当前玩家识别码
        )
        ON CONFLICT("userKey") -- 如果已经存在同样的用户识别码
        DO UPDATE SET
            "posts"=excluded."posts",-- 虽然是小写, 建议统一用""包住
            "item"=excluded."item",-- 虽然是小写, 建议统一用""包住
            "jujin"=excluded."jujin",-- 虽然是小写, 建议统一用""包住
            "juqlb"=excluded."juqlb",-- 虽然是小写, 建议统一用""包住
            "money"=excluded."money",-- 虽然是小写, 建议统一用""包住
            "chufa"=excluded."chufa" -- 虽然是小写, 建议统一用""包住
    `
}
async function loadUser(user) {//玩家读档
    const [data] = await db.sql`SELECT * FROM "players" WHERE "userKey"=${user.player.userKey} LIMIT 1`
    if (data) {//如果这个玩家已经有存档
        user.posts = JSON.parse(data.posts)
        user.item = JSON.parse(data.item)
        user.jujin = data.jujin
        user.juqlb = JSON.parse(data.juqlb)
        user.money = data.money
        user.chufa = JSON.parse(data.chufa)
    }
    else {//玩家无存档
        saveUser(user)
    }
}

async function poll(fn) {//无限轮询执行sql语句直到成功
    while (true) {
        try {
            return await fn()//一旦成功执行, 停止无限轮询, 并返回查询结果
        } catch (e) {
            const m = e.message//需要简略显示的异常消息
            //sql偶尔会执行超时, 但如果反复显示timeout 15秒以上一直不停, 大概是数据库出了故障只能等官方修复
            if (m.includes('timeout')) {
                world.say(m)
            }
            else {
                world.say(e.stack)//如果sql执行出错, 广播错误消息, 用来排查错误原因
            }
        }
        await sleep(2000) //每2秒重试一次
    }
}

poll(initTable)

async function cundang(entity){
    while(true){
        saveUser(entity)
        await sleep(1000)
    }
}

world.onPlayerJoin(async({entity})=>{
    cundang(entity)
})

 

排版不要没


回复

上一页1 页 / 共 1下一页
DebugDynamoDebugDynamo

点赞0


评论


KaNSFKaNSF

az

点赞0


评论


聋猪up聋猪up

赞赞

点赞0


评论


聋猪up聋猪up

解决了萌新不会SQL的问题

点赞0


评论


赵天宇azzz赵天宇azzz

你这存档有问题啊

 

点赞0


评论


喵喵咪awa喵喵咪awa

收藏

点赞0


评论