猫史档案馆


【PRO版编辑器】新版数据库模板(附排行榜+清档)

用户:yee剑走天下yee剑走天下查看:40 回复:49 评论:40 创建时间:2023-07-18T14:21:34


大屑yee剑在经过不断优化代码和修报错后,这次应该不会导致地图崩溃之类的了(按照七式喵莓的说法)

终于研究出来了新版数据库模板以及其配套的排行榜

在此,感谢小宏Xela、145a、七式喵莓、可乐OωO对屑剑研究过程中提供的想法,思路与代码简化(尤其感谢七式喵莓和小宏Xela,感谢小宏Xela对代码的优化,还有七式喵莓的帮助,若没有七式喵莓的帮忙,你们用我之前的SQL模板的话地图早就崩溃烂了emotion_doge)(bushi

用法:

在savedData中添加需要保存的数据

在unsavedData中添加无需保存的数据

在CorrespondingName中数据库排行榜中添加数据对应的中文名和中文单位即可

如添加exp,只需要exp: ['点', '经验'],如无需名称如lv类的数据,直接exp: ['点', '无名称']即可

调用排行榜方法:如果需查看玩家等级(lv)的前100排行榜,只需await leaderBoard('lv')即可,以此类推

注:如果未在CorrespondingName中添加排行榜需要排行的数据的对应对应的中文名和中文单位,会发生报错!

console.clear();

var Storage = storage.getDataStorage('storage'); // 获取数据库,名称为 storage

const CorrespondingName = { // 在此添加排行榜对应的单位和名称(无名称 则表示不显示名称)
    'money': ['枚', '金币'],
    'lv': ['级', '无名称']
};

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

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

/**
 * 初始化玩家数据
 * 
 * @param {GameEntity} entity
 */
function initPlayer(entity) { // 初始化玩家数据
    Object.assign(entity, savedData);
    Object.assign(entity, unsavedData);
};

/**
 * 获取玩家数据
 * 
 * @param {GameEntity} entity
 */
function getPlayerData(entity) { // 获取玩家数据
    var data = { 'name': entity.player.name };
    for (let i in savedData) { // 遍历savedData,获取玩家当前数据
        data[i] = entity[i];
    };
    return data;
};

/**
 * 存档
 * 
 * @param {GameEntity} entity
 */
async function savePlayer(entity) { // 存档
    await Storage.update(entity.player.userId, () => {  // 更新玩家数据存档
        return getPlayerData(entity);
    });
};

/**
 * 删档
 * 
 * @param {GameEntity} entity
 */
async function deletePlayer(entity) { // 删档
    entity.save = false
    await Storage.remove(entity.player.userId); // 删除玩家数据存档
};

/**
 * 读档
 * 
 * @param {GameEntity} entity
 */
async function loadPlayer(entity) { // 读档
    var data = await Storage.get(entity.player.userId); // 获取数据
    if (data) { // 如果数据存在
        initPlayer(entity);
        for (let i in savedData) {
            entity[i] = (data.value[i] || savedData[i])
        };
        entity.player.directMessage('已为您读取数据!');
    } else { // 如果数据不存在
        initPlayer(entity);
        await Storage.set(entity.player.userId, getPlayerData(entity));
        entity.player.directMessage('已为您创建数据!');
    };
};

/**
 * 清档
 */
async function deleteAllData() { // 清档
    var sqlDataList = await Storage.list({ // 将数据库内的所有数据分页
        cursor: 0
    });
    world.querySelectorAll('player').forEach(x => x.save = false);
    try {
        while (true) {
            for (let sqlData of sqlDataList.getCurrentPage()) { // 遍历获取数据
                await Storage.remove(sqlData.key)
            }
            if (sqlDataList.isLastPage) break; // 如果已经是最后一页,退出循环
            await sqlDataList.nextPage(); // 下一页
        };
    } catch (e) {}
};

/**
 * 显示排行榜
 * 
 * @param {string} type
 */
async function leaderBoard(type) { // 排行榜
    var list = [];
    var sqlDataList = await Storage.list({ // 将数据库内的所有数据分页
        cursor: 0
    });
    while (true) {
        for (let sqlData of sqlDataList.getCurrentPage()) { // 遍历获取数据
            list.includes([sqlData.value['name'], sqlData.value[type]]) ? null : list.push([sqlData.value['name'], sqlData.value[type]]);
        }
        list = list.sort((a, b) => b[1] - a[1]).slice(0, 100);
        if (sqlDataList.isLastPage) break; // 如果已经是最后一页,退出循环
        await sqlDataList.nextPage(); // 下一页
    };
    return list.map((value, num) => // 将列表里的所有项依次替换成字符串
        `第${num + 1}名 | ${value[0]} | ${value[1]} ${CorrespondingName[type][0]}${CorrespondingName[type][1] != '无名称' ? CorrespondingName[type][1] : ''}`
    ).join("\n"); // 按照 换行 的间隔组合成字符串
};

world.onPlayerJoin(async ({ entity }) => { // 玩家进入地图后
    await loadPlayer(entity); // 读档
});

world.onPlayerLeave(async ({ entity }) => { // 玩家离开地图后
    entity.save != false ? await savePlayer(entity) : null; // 存档
});

附一段用于测试代码:

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) {
            if (ask.index <= 2) {
                entity[['lv', 'exp', 'money'][ask.index]]++;
            } else {
                if (ask.value == '删除存档') {
                    await deletePlayer(entity)
                };
                if (ask.value == '删除所有存档') {
                    await deleteAllData()
                };
                if (ask.value == '查看排行榜') {
                    await entity.player.dialog({
                        type: 'select',
                        title: '排行',
                        content: await leaderBoard('lv'),
                        options: ['确认']
                    });
                }
            };
        };
    };
});

研究不易,若可以的话,就在box3给yee剑走天下和小宏Xela、145a、七式喵莓、可乐OωO一个关注吧(emotion_doge


回复

上一页1 页 / 共 2下一页
145a145a

sofa st

点赞0


评论


请问你作业写完了吗请问你作业写完了吗

一剑,神岛暑期活动第一弹我想合作

点赞0


评论


神岛吉吉喵神岛吉吉喵

emotion_编程猫_点赞

点赞3


评论


ZNS_哪吒ZNS_哪吒

emotion_编程猫_点赞

点赞0


评论


一只双鱼座a一只双鱼座a

太好力(喜

点赞0


评论


yee剑走天下yee剑走天下

ddd

点赞0


评论


小鹿UUyM小鹿UUyM

666

点赞0


评论


伴只狗头伴只狗头

qp

点赞0


评论


greendougreendou

棒呆,两个 `initPlayer` 还能再合并一下。

点赞0


评论


屑怪盗屑怪盗

DDD

点赞0


评论


小宏XeLa小宏XeLa

ddd

点赞0


评论


是流萤喵是流萤喵

az

点赞0


评论


yee剑走天下yee剑走天下

ddd

点赞0


评论


爽快的小电鼠bMMb爽快的小电鼠bMMb

DDD

点赞0


评论


马云编程猫马云编程猫

但如果存的是列表的话,不是还要用的JSON么?那个能教一下么?

点赞0


评论


扫厕所地方军阀111扫厕所地方军阀111

感觉跟SQL难度没法比,虽然代码一样多,重点在好理解

点赞0


评论


SHEL深空无尽SHEL深空无尽

明显比SQL简单,简单太多

点赞0


评论


神秘的蟑螂zl神秘的蟑螂zl

啊,谢谢一键,又能白嫖一篇帖子力((

点赞0


评论


星宇爱吃yeeeee星宇爱吃yeeeee

来,让我看看!(扒开

点赞0


评论


Neural_NetworkNeural_Network

酷酷)

点赞0


评论


马云编程猫马云编程猫

为啥复制黏贴了您的代码,出了这个报错    syntaxError:Invalid shorthand property initializer(无效的简写属性初始化器),用try将复制的代码括起来输出报错,也没有任何输出,这请问怎么解决啊emotion_编程猫_翻白眼

点赞0


评论


AokenAoken

ddd

点赞0


评论


鸽王懒狗鸽王懒狗

人呢qwq

点赞0


评论


yee剑走天下yee剑走天下

以上代码有两处小问题,有可能会导致BUG,影响效果

1.loadPlayer中,如果有数据存储为0,false,undefined等一切不等于true的值,就会不读取数据库中的值,而是savedData中的值,所以应当改为:

async function loadPlayer(entity) { // 读档
    initPlayer(entity);
    var data = await Storage.get(entity.player.userId); // 获取数据
    if (data) { // 如果数据存在
        Object.assign(entity, data.value);
        entity.player.directMessage('已为您读取数据!');
    } else { // 如果数据不存在
        await Storage.set(entity.player.userId, getPlayerData(entity));
        entity.player.directMessage('已为您创建数据!');
    };
};

2.排行榜中若数据较多,那么排行榜显示容易过慢,自行在list中将pageSize设置大一些即可

点赞2


评论


全能代码师全能代码师

好消息:新的数据库更简单了

坏消息:要重写了

点赞1


评论


22why22why

哇牛皮牛皮牛皮牛皮牛皮牛皮,yeeeeeeeeeeeeeeeeeeeeeeee剑太牛皮了!

点赞1


评论


AokenAoken

怎么做自动云存呢?(狗头保命)emotion_编程猫_谢谢老板

点赞0


评论


yee剑走天下yee剑走天下

dddd(

点赞0


评论


JerryM4OJerryM4O

{"status":"REQUEST_THROTTLED","code":429,"msg":"Too Many Requests."}

点赞0


评论


JerryM4OJerryM4O

喵嘎怎么办

点赞0


评论