猫史档案馆


【教程】基于YeeSQL研发的适用于ARENA(PRO版地图)的云存档跑酷模板

用户:星辰_零柒星辰_零柒查看:16 回复:12 评论:16 创建时间:2023-07-25T13:16:12


本代码基于https://shequ.codemao.cn/community/5510喵编写

接下来是浓缩干货:

var Storage = storage.getDataStorage('storage')

const SpawnPoint = new GameVector3(3, 10, 126)//出生点坐标.你需要做的是将它改为你的跑酷地图的起点坐标

const points = world.querySelectorAll('.存档点')//存档点标签

const savedData = { // 玩家初始需要保存的数据,可增添或删除
    enableDamage: true,//允许玩家被伤害
    x: SpawnPoint.x,//玩家坐标X
    y: SpawnPoint.y,//玩家坐标Y
    z: SpawnPoint.z,//玩家坐标Z
    qx: SpawnPoint.x,//玩家出生点坐标X
    qy: SpawnPoint.y,//玩家出生点坐标Y
    qz: SpawnPoint.z//玩家出生点坐标Z
}

function initPlayer(entity) { // 初始化玩家数据
    Object.assign(entity, savedData)
    if (entity.hasTag('vip')) {
        entity.jumpcounttime += 6
    }
}

function getPlayerData(entity) { // 获取玩家数据
    var data = { 'name': entity.player.name }
    for (let i in savedData) { // 遍历savedData,获取玩家当前数据
        data[i] = entity[i]
    }
    return data
}

async function savePlayer(entity) { // 存档
    await Storage.update(entity.player.userId, () => {  // 更新玩家数据存档
        return getPlayerData(entity)
    })
}

async function deletePlayer(entity) { // 删档
    entity.save = false
    await Storage.remove(entity.player.userId) // 删除玩家数据存档
    Object.assign(entity, savedData)
}

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.position.set(entity.x,entity.y,entity.z)
        entity.player.spawnPoint.set(entity.qx,entity.qy,entity.qz)
        entity.player.directMessage('已读取您的数据!')
    } else { // 如果数据不存在
        initPlayer(entity)
        await Storage.set(entity.player.userId, getPlayerData(entity))
        world.say(`${entity.player.name}第一次进入游戏!`)
        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) {}
}

world.onPlayerJoin(async({ entity }) => {
    await loadPlayer(entity)//当玩家进入地图,读档
    world.onTick(async() => {
        entity.x = entity.position.x
        entity.y = entity.position.y
        entity.z = entity.position.z
        entity.qx = entity.player.spawnPoint.x
        entity.qy = entity.player.spawnPoint.y
        entity.qz = entity.player.spawnPoint.z//挨个赋最新值
        await savePlayer(entity)//然后存档
    })
})

//存档代码
points.forEach(async(e)=>{
    e.level = Number(e.tags()[0])
    e.onEntityContact(async({ other })=>{
        const spawnPoint = e.position.add({x: 0,y: 2.5,z: 0})//y之所以是2.5是为了避免复活后卡飞
        if(spawnPoint.equals(other.player.spawnPoint))return
        other.player.spawnPoint = spawnPoint//本地存档
        other.player.directMessage('存档成功!')
        await savePlayer(other)//云存档
        //world.say('done')//测试内容
    })  
})

大贴士:

一定要在“场景”中把出生点改为实际跑酷起点的坐标

一定要给所有存档点模型加上标签“存档点”

PRO服务器不稳定,一定要加上建议控制台,方便调试

再送一个控制台代码:

world.onChat(({ entity, message }) => {
    if (entity && entity.isPlayer) {
        if (entity && '你的用户名'.split(' ').indexOf(entity.player.name) != -1 && message.charAt(0) == '$') {
            try {
                world.say('<~ ' + eval(message.split('$')[1]))
            } catch (err) {
                world.say('Error:' + err)
            }
        };
    }
})

用法:聊天区$+执行代码

SQL函数调用格式:

await 要调用的函数名字(参数,无或entity)


回复

上一页1 页 / 共 1下一页
星辰_零柒星辰_零柒

代码比较臃肿,有能力了可以对其进行优化!

点赞0


评论


yee剑走天下yee剑走天下

太逊了吧()写了那么多冗余的代码emotion_doge

点赞0


评论


Star_Ink_sansStar_Ink_sans

省流:疑似和一剑和好了()

点赞0


评论


屑怪盗屑怪盗

收藏

点赞0


评论


raearaea

ddd

点赞0


评论


虚伪_der_面具虚伪_der_面具

ddd

点赞0


评论


GPUawaGPUawa

onTick细不细太卡了呀  然后直接搞出请求过多emotion_doge

 

world.onPlayerJoin(async({ entity }) => {
    await loadPlayer(entity)
    setInterval(async()=>{
        await savePlayer(entity)
    },1145)
})

点赞0


评论


SCS_user_teLeIed6GGSCS_user_teLeIed6GG

好多报错:(

点赞0


评论


音乐茶小号音乐茶小号

到时候试试

点赞0


评论


音乐茶小号音乐茶小号

虽然很多报错,但是运行正常

点赞0


评论


音乐茶小号音乐茶小号

有新的版本发给我,(链接

点赞0


评论


夜影行者夜影行者

收藏

点赞0


评论