用户:yee剑走天下查看:40 回复:49 评论:40 创建时间:2023-07-18T14:21:34
大屑yee剑在经过不断优化代码和修报错后,这次应该不会导致地图崩溃之类的了(按照七式喵莓的说法)
终于研究出来了新版数据库模板以及其配套的排行榜
在此,感谢小宏Xela、145a、七式喵莓、可乐OωO对屑剑研究过程中提供的想法,思路与代码简化(尤其感谢七式喵莓和小宏Xela,感谢小宏Xela对代码的优化,还有七式喵莓的帮助,若没有七式喵莓的帮忙,你们用我之前的SQL模板的话地图早就崩溃烂了
)(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一个关注吧(![]()
马云编程猫为啥复制黏贴了您的代码,出了这个报错 syntaxError:Invalid shorthand property initializer(无效的简写属性初始化器),用try将复制的代码括起来输出报错,也没有任何输出,这请问怎么解决啊
点赞0
评论
以上代码有两处小问题,有可能会导致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
评论