猫史档案馆


第一代跨地图sql成品

用户:2333280823332808查看: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的人也是我,没想到吧

我走了,有人有共/*\创的网址告诉我,谢谢

 


回复

上一页1 页 / 共 1下一页
2333280823332808

顶顶顶,这种东西咋会没人看啊

点赞0


评论


FML饭米粒FML饭米粒

我只想说)

你泄露了地图链接)

点赞2


评论


SCS_user_Avgdttb9eiSCS_user_Avgdttb9ei

666,

点赞0


评论


FML饭米粒FML饭米粒

严格来说,这只是跨地图数据传输)与跨地图sql没有任何关系)

点赞1


评论


2333280823332808

能用就行

 

点赞0


评论


SCS_user_LoeheodVOQSCS_user_LoeheodVOQ

提出url的人怎么可能是你()我记得至少半年之前就有了

点赞0


评论


2333280823332808

号被封了,我花了半年才想起来重开一个号T_T

点赞0


评论


2333280823332808

听说箭头函数可以打开私有变量,但我怕被封号一直没敢做不会被破解的那一个

点赞0


评论