用户:yee剑走天下查看:11 回复:31 评论:11 创建时间:2023-03-26T13:18:51
屑剑在广纳大家的想法和意见后(
终于研究出来了sql模板+sql模板配套的排行榜(且远比普通的SQL好用!(确信
在此,感谢XiaoLi、145a、Amc、小宏Xela对屑剑研究过程中提供的想法,思路与代码简化(
目前功能:可以直接新增添保存数据而不用删表、数据可以选择是否保存、排行榜,且SQLite和PostgreSQL都适用!
用法:
PlayerData中的每一个值的第一个数据为初始值,第二个数据为是否需要保存该数据
在PlayerData中直接添加新要保存的数据即可,如要新添为exp的数据,写入exp: [初始值, 是否保存]即可,比如:exp: [0, true],如无需保存直接exp: [0, false]即可。
在CorrespondingName中sql排行榜的数据对应的中文名和中文单位即可
如添加exp,只需要exp: ['点', '经验'],如无需名称如lv类的数据,直接exp: ['经验', '无名称']即可
调用排行榜方法:如果需查看玩家金币(money)的前100排行榜,只需await getTop100('money')即可,以此类推
console.clear();
const PlayerData = {
money: [1, true],
lv: [0, true],
item: [[], true],
test: ['yee', false]
};
const CorrespondingName = {
'money': ['枚', '金币'],
'lv': ['级', '无名称']
};
(async () => {
await poll(createTable)
})();
async function poll(fn, msg) {
while (1) {
try {
return await fn()
} catch (e) {
e.message.includes('timeout') ? world.say(e.message) : world.say(msg || e.stack)
}
await sleep(2000)
}
};
async function createTable() {
await db.sql`
CREATE TABLE IF NOT EXISTS "YJZTX" (
"datas" TEXT NOT NULL,
"userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL
)
`
}
function initPlayer(entity) {
for (let i in PlayerData) {
entity[i] = PlayerData[i][0]
}
};
function getPlayerData(entity) {
var data = { "name": entity.player.name };
for (let i in PlayerData) {
PlayerData[i][1] ? data[i] = entity[i] : null
};
return JSON.stringify(data);
};
async function savePlayer(entity) {
if (!entity.player.userKey) return;
await db.sql`
INSERT INTO "YJZTX" (
"datas",
"userKey"
)
VALUES (
${getPlayerData(entity)},
${entity.player.userKey}
)
ON CONFLICT("userKey")
DO UPDATE SET
"datas" = excluded."datas"
`
};
async function loadPlayer(entity) {
const [data] = await db.sql`SELECT * FROM "YJZTX" WHERE "userKey" = ${entity.player.userKey} LIMIT 1`;
if (data) {
var Data = JSON.parse(data.datas);
for (let i in PlayerData) {
Data[i] ? entity[i] = Data[i] : entity[i] = PlayerData[i][0]
}
} else {
initPlayer(entity)
};
};
async function getTop100(type) {
var list = [];
for await (let row of db.sql`SELECT * FROM "YJZTX"`) {
list.push([JSON.parse(row.datas).name, JSON.parse(row.datas)[type]])
};
return list.sort((a, b) => a[1] - b[1]).map((value, num) => {
return `第${num + 1}名 | ${value[0]} | ${value[1]}${CorrespondingName[type][0]}${CorrespondingName[type][1] != '无名称' ? CorrespondingName[type][1] : ''}`
})
}
async function deletePlayer(entity) {
await db.sql`DELETE FROM YJZTX WHERE "userKey" = ${entity.player.userKey}`;
};
world.onPlayerJoin(async ({ entity }) => {
await loadPlayer(entity);
});
world.onPlayerLeave(async ({ entity }) => {
await savePlayer(entity)
})
以上为最终版(基本上无任何BUG
制作不易()前后发帖五次(多次修改,简化(喜欢的点个关注吧(
附做出贡献的各位创作者主页链接(排名不分先后):
Amc:box3.codemao.cn/u/AmC
Xiaoli:box3.codemao.cn/u/NewGODXiaoLi
145a:box3.codemao.cn/u/54145a
小宏XeLa:box3.codemao.cn/u/codemao2020
Aoken报错了怎么办?

代码:
console.clear();
const PlayerData = {
money: [1, true],
lv: [0, true],
exp:[0,true],
itemList: [['铁剑'], true],
test: ['yee', false]
};
const CorrespondingName = {// 在此添加排行榜对应的单位和名称(无名称 则表示不显示名称)
'money': ['枚', '金币'],
'lv': ['级', '无名称']
};
(async () => {await poll(createTable)})();
async function poll(fn, msg) {
while (1) {
try {
return await fn()
} catch (e) {
e.message.includes('timeout') ? world.say(e.message) : world.say(msg || e.stack)
}
await sleep(2000)
}
};
async function createTable() {
await db.sql`
CREATE TABLE IF NOT EXISTS "YJZTX" (
"datas" TEXT NOT NULL,
"userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL
)
`
}
/**
* 初始化玩家数据
*
* @param {Box3Entity} entity
*/
function initPlayer(entity) {
for (let i in PlayerData) {
entity[i] = PlayerData[i][0]
}
};
/**
* 获取玩家数据
*
* @param {Box3Entity} entity
*/
function getPlayerData(entity) {
var data = { "name": entity.player.name };
for (let i in PlayerData) {
PlayerData[i][1] ? data[i] = entity[i] : null
};
return JSON.stringify(data);
};
/**
* 存档
*
* @param {Box3Entity} entity
*/
async function savePlayer(entity) {
if (!entity.player.userKey) return;
await db.sql`
INSERT INTO "YJZTX" (
"datas",
"userKey"
)
VALUES (
${getPlayerData(entity)},
${entity.player.userKey}
)
ON CONFLICT("userKey")
DO UPDATE SET
"datas" = excluded."datas"
`
};
/**
* 读档
*
* @param {Box3Entity} entity
*/
async function loadPlayer(entity) {
const [data] = await db.sql`SELECT * FROM "YJZTX" WHERE "userKey" = ${entity.player.userKey} LIMIT 1`;
if (data) {
var Data = JSON.parse(data.datas);
for (let i in PlayerData) {
Data[i] ? entity[i] = Data[i] : entity[i] = PlayerData[i][0]
}
} else {
initPlayer(entity)
};
};
/**
* 读取榜单前100
*/
async function getTop100(type) {
var list = [];
for await (let row of db.sql`SELECT * FROM "YJZTX"`) {
list.push([JSON.parse(row.datas).name, JSON.parse(row.datas)[type]])
};
return list.sort((a, b) => a[1] - b[1]).map((value, num) => {
return `第${num + 1}名 | ${value[0]} | ${value[1]}${CorrespondingName[type][0]}${CorrespondingName[type][1] != '无名称' ? CorrespondingName[type][1] : ''}`
})
}
/**
* 删档
*
* @param {Box3Entity} entity
*/
async function deletePlayer(entity) {
await db.sql`DELETE FROM YJZTX WHERE "userKey" = ${entity.player.userKey}`;
};
world.onPlayerJoin(async ({ entity }) => {
await loadPlayer(entity);
});
world.onPlayerLeave(async ({ entity }) => {
await savePlayer(entity)
})
world.onPress(async({ entity, button }) => {
if (button == 'action1') {
const ask = await entity.player.dialog({
type: 'select',
title: '测试',
content: `你目前[${entity.lv}]级\n[${entity.exp}]点经验\n[${entity.money}]枚金币\n背包:[${entity.itemList}]`,
options: ['点我加等级', '点我加经验', '点我加金币','排行榜']
});
if (!ask) return;
if (ask) {
if (ask.index <= 2) {
entity[['lv', 'exp', 'money'][ask.index]]++;
}if(ask.index == 3){
await entity.player.dialog({
type: 'select',
title: '排行',
content: await getTop100('money'),
options: ['确认']
});
}
};
};
});
点赞1
评论