用户:
23332808查看:3 回复:8 评论:3 创建时间:2023-05-27T19:12:47
console.clear()
lj=new URL('https://box3.codemao.cn/e/1ed0358443886a158800?')//地图一填地图2的网址,反之亦然
e=world.createEntity({
mesh:"mesh/附魔台.vb",
position:[喵,13,喵],
enableInteract:true,
interactRadius:50,
})
e.onInteract(async({entity:e})=>{setPlayer(e,"leave")
var url = lj
savePlayer(e)
url.searchParams.append(e.player.userKey,JSON.stringify((await( db.sql`SELECT * FROM player WHERE userKey=${e.player.userKey} limit 1`))[0]))
e.player.link(url)
await e.player.dialog({
type: Box3DialogType.TEXT,
})
e.player.kick()
})
world.onPlayerJoin(async({entity:e})=>{
e.money=0
e.junk=0
e.itemList=[]
e.save=true
url=e.player.url
a=0
loadPlayer(e)
if(url.searchParams!=""){
for(const [key, value] of url.searchParams) {
e.save=false
if(key=="against+rules"&&(await( db.sql`SELECT * FROM player_back WHERE userKey=${e.player.userKey} limit 1`))[0]!=undefined){
if((await( db.sql`SELECT * FROM player_back WHERE userKey=${e.player.userKey} limit 1`))[0].TFalse=="leave"){
await e.player.dialog({
type: Box3DialogType.TEXT,
title: "警告",
content: `您因为不当操作导致了问题,希望您可以回到上一次退出的地图,(此地图选取消,另一地图选确认)`,
});
url = lj
url.searchParams.append("against rules","error")
e.player.link(url)
await e.player.dialog({
type: Box3DialogType.TEXT,
})
if(e && !e.destroyed){
setPlayer(e,"stay")
loadPlayer(e)
e.save=true
}}else{
e.save=true
setPlayer(e,"stay")
x=JSON.parse(value)
world.say(x.itemList)
if(x.money!="null"){
savePlayer(e)
await db.sql`UPDATE player SET money=${x.money} WHERE userKey=${e.player.userKey}`
await db.sql`UPDATE player SET junk=${x.junk} WHERE userKey=${e.player.userKey}`
await db.sql`UPDATE player SET itemList=${JSON.parse(x.itemList)} WHERE userKey=${e.player.userKey}`
loadPlayer(e)
}
}
}else if(key!="against+rules"){
e.save=true
setPlayer(e,"stay")
x=JSON.parse(value)
if(x.money!="null"){
savePlayer(e)
await db.sql`UPDATE player SET money=${x.money} WHERE userKey=${e.player.userKey}`
await db.sql`UPDATE player SET junk=${x.junk} WHERE userKey=${e.player.userKey}`
await db.sql`UPDATE player SET itemList=${JSON.parse(x.itemList)} WHERE userKey=${e.player.userKey}`
loadPlayer(e)
}}else{loadPlayer(e)}
}
}else if((await( db.sql`SELECT * FROM player_back WHERE userKey=${e.player.userKey} limit 1`))[0]!=undefined){
if((await( db.sql`SELECT * FROM player_back WHERE userKey=${e.player.userKey} limit 1`))[0].TFalse=="leave"){
e.save=false
await e.player.dialog({
type: Box3DialogType.TEXT,
content: `请前往如下链接领取存档`,
});
url = lj
url.searchParams.append("against rules","error")
e.player.link(url)
await e.player.dialog({
type: Box3DialogType.TEXT,
})
e.player.kick()
}else{
loadPlayer(e)
}
}else{loadPlayer(e)
}
})
world.onPlayerLeave(({entity:e})=>{
if(e.save==true){savePlayer(e)}
})
async function showPlayers(){
const playerList = await db.sql`SELECT * FROM player`
for (const p of playerList) {
world.say(JSON.stringify(p))
}
}
async function showPt(){
const playerList = await db.sql`SELECT * FROM player_back`
for (const p of playerList) {
world.say(JSON.stringify(p))
}
}
async function createTable() {
await db.sql`
CREATE TABLE IF NOT EXISTS player (
money INTEGER DEFAULT 0,--金钱, INTEGER类型用于存储整数
junk INTEGER DEFAULT 0,--废品, INTEGER类型用于存储整数
itemList TEXT DEFAULT '',--道具列表, TEXT类型用于存储字符串
userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''--玩家的唯一识别码, TEXT类型用于存储字符串
)
`
}
createTable()
async function loadPlayer(entity) {
const data = (await (db.sql`SELECT * FROM player WHERE userKey=${entity.player.userKey} limit 1`))[0]
if (data) { //如果存在这个玩家的存档
entity.money = data.money //恢复金钱
entity.junk = data.junk //恢复废品
entity.itemList = JSON.parse(data.itemList) //恢复道具列表, 这里的JSON.parse用于把字符串变回数组
}
}
async function savePlayer(entity) {//定义保存玩家状态的函数
if (entity.player.userKey) {//拥有userKey的玩家, 则玩家不是游客, 可以保存
await db.sql`
--尝试向player表插入一条记录, 向各个字段写入玩家身上对应的属性值
INSERT INTO player (
money,
junk,
itemList,
userKey
)
VALUES(
${entity.money},
${entity.junk},
${JSON.stringify(entity.itemList)},--itemList是数组, 需要用JSON.stringify才能存入类型为TEXT的字段
${entity.player.userKey}
)
ON CONFLICT(userKey)--如果玩家记录已经存在, 则不需要插入, 而是更新各个字段的值
DO UPDATE SET
money=excluded.money,
junk=excluded.junk,
itemList=excluded.itemList
`
}
}
async function setpb() {
await db.sql`
CREATE TABLE IF NOT EXISTS player_back (
name TEXT DEFAULT '',
TFalse TEXT DEFAULT '',
userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''
)
`
}
createTable()
setpb()
async function setPlayer(entity,tf){
if (entity.player.userKey) {
await db.sql`
INSERT INTO player_back (name,TFalse,userKey)
VALUES(${entity.player.name},${JSON.stringify(tf)},${entity.player.userKey})
ON CONFLICT(userKey)--如果玩家记录已经存在, 则不需要插入, 而是更新各个字段的值
DO UPDATE SET
name=excluded.name,
TFalse=${tf}
`
}
}
一个玩具,看看就行
海默好像也做出来了,不过不知道有没有bug
我可能是第一个吧
当初提出url的人也是我,没想到吧
我走了,有人有共/*\创的网址告诉我,谢谢