猫史档案馆


【PRO编辑器】新版数据库模板

用户:yee剑走天下yee剑走天下查看:20 回复:11 评论:20 创建时间:2023-07-16T08:12:45


代码无误,但代码的注释可能解释并不十分准确,敬请谅解

用法:在savedPlayer中放入玩家要保存的数据,unsavedPlayer中放入玩家无需保存的数据

如需增添玩家新的需要保存的数据,直接在savePlayer中加即可

代码如下:

console.clear();

const unsavedData = {
    nowDoing: '闲逛中'
};// 玩家初始无需保存的数据,可增添或删除

const savedData = {
    money: 100,
    lv: 0,
    exp: 0,
    itemList: ['铁剑']
};// 玩家初始需要保存的数据,可增添或删除

var SQL = storage.getDataStorage('player'); // 获取数据库,名称为 player
(async () => {
    var sqlData = await SQL.get('player'); // 获取数据库当前内容
    if (!sqlData) { // 如果数据库无初始值
        await SQL.set('player', {}) // 设置初始值,为一个空的对象
    }
})();


function initPlayer(entity) {
    for (let i in savedData) {
        entity[i] = savedData[i];
    };
    for (let e in unsavedData) {
        entity[e] = unsavedData[e];
    }
}; // 初始化玩家数据

async function getPlayerData(entity) {
    var data = { "name": entity.player.name };
    for (let i in savedData) {
        data[i] = entity[i]
    }; // 遍历savedData,获取玩家数据,放入data对象中
    var sqlData = await SQL.get('player'); // 获取数据库 player
    sqlData = sqlData.value; // 将sqlData设置成数据库当前的数据
    sqlData[entity.player.userKey] = data; // 新增玩家数据,以玩家userKey为键
    return sqlData;
};

async function savePlayer(entity) {
    await SQL.set('player', await getPlayerData(entity))
}; // 存储玩家数据

async function deletePlayer(entity) {
    var sqlData = await SQL.get('player'); // 获取数据库
    var data = sqlData.value; // 设置data为数据库当前数据 player
    delete data[entity.player.userKey]; // 删除玩家在data中的键
    await SQL.set('player', data); // 将data存入数据库 player
}

async function loadPlayer(entity) {
    var sqlData = await SQL.get('player'); // 获取数据库 player
    var data = sqlData.value[entity.player.userKey]; // 获取玩家在数据库中的数据
    if (data) { // 如果数据存在
        for (let i in savedData) {
            data[i] ? entity[i] = data[i] : entity[i] = savedData[i]
            // 遍历要保存的初始数据对象savedPlayer,若数据中不存在该新增元素,则将玩家的属性设置为新增元素初始值,若存在则读取玩家的数据
        };
        for (let i in unsavedData) {
            entity[i] = unsavedData[i] // 初始玩家无需保存的数据
        }
    } else {
        initPlayer(entity); // 初始化玩家数据
        await SQL.set('player', await getPlayerData(entity)) // 存入数据库 player
        entity.player.directMessage('已为您创建数据!')
    }
};

world.onPlayerJoin(async ({ entity }) => {
    await loadPlayer(entity); // 调用loadPlayer
});

world.onPlayerLeave(async ({ entity }) => {
    await savePlayer(entity); // 调用savePlayer
});


回复

上一页1 页 / 共 1下一页
yee剑走天下yee剑走天下

助力创作节()()顺便看看有没有哪个好心人愿意带我()emotion_doge

再放一段可用来测试的代码(

world.onPress(async ({ entity, button }) => {
    if (button == GameButtonType.ACTION1) {
        const ask = await entity.player.dialog({
            type: 'select',
            title: '测试',
            content: `你目前[${entity.lv}]级\n[${entity.exp}]点经验\n[${entity.money}]枚金币\n背包:[${entity.itemList}]\n当前状态:${entity.nowDoing}`,
            options: ['点我加等级', '点我加经验', '点我加金币']
        });
        if (!ask) return;
        if (ask) {
            entity[['lv', 'exp', 'money'][ask.index]]++;
        }
    }
});

点赞0


评论


GZ006GZ006

弱弱的问一句)新版编辑器上db.sql是不是没用了)

点赞0


评论


囧仙_official囧仙_official

center_image

点赞0


评论


Star_Ink_sansStar_Ink_sans

顶)

点赞0


评论


145a145a

顶)

点赞0


评论


伴只狗头伴只狗头

弱弱的问一句

unsaveddata有啥用qaq

不是有了savedata了吗

点赞0


评论


NomenNomen

数据维度低,读写代价大,时间消耗高,字段寄全家寄(

作为一个萌新小白超级新的新人以及代码入门的我来说这种方案还是不适合(

点赞0


评论


七式草莓七式草莓

警告!

请不要使用帖子中的模板!

有重大BUG!

请参照下面的文档,将键设置成玩家的user id,而不是用一个键存储所有的数据!

不听我警告者,数据库的读取速度会变慢!玩家一多服务器就会崩溃!

附storage使用文档:https://shequ.codemao.cn/community/550947

点赞1


评论


盗码师盗码师

((((

点赞0


评论


yee剑走天下yee剑走天下

以此为准:shequ.codemao.cn/community/551194

点赞0


评论


星辰_零柒星辰_零柒

有一个恐怖的问题emotion_doge

这个模板不能存储值为0的变量(除非这个变量初始为0)

点赞0


评论