用户:yee剑走天下查看:538 回复: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
});助力创作节()()顺便看看有没有哪个好心人愿意带我()![]()
再放一段可用来测试的代码(
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
评论
帮助毁图
GZ006弱弱的问一句)新版编辑器上db.sql是不是没用了)
点赞0
评论
准确来说,是sqlite和pgsql)
用不了了))我问过阿喆)
谢谢)虽然我很恼怒)
啊?()真的啊(?
真的))我骗你干嘛)(不信去问阿喆
弱弱的问一句
unsaveddata有啥用qaq
不是有了savedata了吗
点赞0
评论
因为如果有些数据不需要保存()就比如像恒光学院一样玩家当前状态()它需要被赋值()但是不需要被保存()
Nomen数据维度低,读写代价大,时间消耗高,字段寄全家寄(
作为一个萌新小白超级新的新人以及代码入门的我来说这种方案还是不适合(
点赞0
评论
字段寄全家寄是啥意思()()?
大概就是一个玩家的数据出现缺失或损坏 一读取 就会报错 然后玩家数据就全没了) 如果玩家一个键一个的话) 一个玩家错了 就是一个玩家的事情 不会影响到其他玩家的数据)
七式草莓警告!
请不要使用帖子中的模板!
有重大BUG!
请参照下面的文档,将键设置成玩家的user id,而不是用一个键存储所有的数据!
不听我警告者,数据库的读取速度会变慢!玩家一多服务器就会崩溃!
附storage使用文档:https://shequ.codemao.cn/community/550947
点赞1
评论
你大概的意思是玩家进来就给数据库新增一个键?)(
没事)最简单的解决方案是在线玩家超过3人就kick(bushi)
@yee剑 其实这样好像还简单一些
你只要把saveplayer改成await SQL.set(entity.player.userKey, await getPlayerData(entity));
deleteplayer改成await SQL.remove(entity.player.userKey);
把getplayer改成let data={};for(let i in savedData){data[i]=entity[i];}return data
戳啦,超过或等于1个人就kick,根本不需要担心任何sql问题
对欸()我现在就改()()当时概念想错了()以为一个数据库只能创建一个表()
可能也不能叫表()我也不知道那个叫什么(
星辰_零柒有一个恐怖的问题![]()
这个模板不能存储值为0的变量(除非这个变量初始为0)
点赞0
评论
有没有可能这个模板有问题(
https://shequ.codemao.cn/community/552212