用户:
星辰_零柒查看: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)
GPUawaonTick细不细太卡了呀 然后直接搞出请求过多![]()
world.onPlayerJoin(async({ entity }) => {
await loadPlayer(entity)
setInterval(async()=>{
await savePlayer(entity)
},1145)
})点赞0
评论