# 自定义出生点/复活点

本章节将分享自定义出生点/复活点的使用,并结合实际的场景教大家如何在跑酷等类型的作品中使用相关的代码,可以注意代码的变化和使用哦~

(点击->高清B站视频) (opens new window)

# 01 在某个坐标出生的4种写法

world.onPlayerJoin(({entity})=>{
    entity.player.spawnPoint.set(4, 11, 4)
    entity.player.forceRespawn()
})
world.onPlayerJoin(({entity})=>{
    entity.player.spawnPoint.set(4, 11, 4)
    entity.position.copy(entity.player.spawnPoint)
})
world.onPlayerJoin(({entity})=>{
    entity.player.spawnPoint = new Box3Vector3(4, 11, 4)
    entity.player.forceRespawn()
})
world.onPlayerJoin(({entity})=>{
    entity.player.spawnPoint = new Box3Vector3(4, 11, 4)
    entity.position.copy(entity.player.spawnPoint)
})

# 02 在某个模型的位置出生

world.onPlayerJoin(({entity})=>{
    entity.player.spawnPoint = world.querySelector('#出生点').position   //地图中需放置一个名为“出生点”的模型
    entity.position.copy(entity.player.spawnPoint)
    entity.position.y += 10
})

# 03 存档复活点

(点击->高清B站视频) (opens new window)

for (const e of world.querySelectorAll('*')) {//遍历所有实体
    if (e.id.startsWith('存档点')) {//如果当前实体名左边部分刚好是"存档点", 比如 存档点-1 存档点-2...
        e.collides = true //开启碰撞
        e.fixed = true //固定实体不被推移
        e.meshScale = e.meshScale.scale(2) //放大2倍
        e.onEntityContact(({ other }) => { //每当存档点碰到另一个实体
            if (other.isPlayer) { //另一个实体是玩家
                if (e.position !== other.player.spawnPoint) { // 检测当前存档点是否玩家重生点, 避免反复在同一个存档点做多余的保存
                    other.player.directMessage('到达新的重生点') // 给玩家发消息
                    other.player.spawnPoint = e.position // 喵家重生点坐标设置成存档点的坐标
                }
            }
        })
    }
}

world.onPlayerJoin(({ entity }) => {
    entity.onFluidEnter(() => {//当玩家掉到水里
        entity.position.copy(entity.player.spawnPoint)
        entity.position.y += 4
    })
})

# 04 进阶:三种进阶版复活点写法

(点击->高清B站视频) (opens new window)

视频代码如下:

// 获取场景里的复活点模型,命名为respawnPoint
// 具体模型可以用任意你喜欢的模型替换,名称也可以替换成你想要的命名
const respawnPoint = world.querySelector(`#复活点`)

// 监听方块与实体的碰撞
world.onVoxelContact(({entity, voxel})=> {
    // 将方块id转换名称
    const voxelName = voxels.name(voxel);
    // 如果方块名称是熔岩
    if (voxelName === 'lava02'){
        // 使实体受到100点伤害
        // 目的是为了直接触发实体的'onDie'事件
        // 这里为了方便演示,将伤害值直接调到生命值(hp)的上限100点
        // 具体调到多少点可以自行设置,只要玩家累计受到100点伤害就会触发entity的'onDie'事件
        entity.hurt(100)
    }
})

// 当玩家进入地图时
world.onPlayerJoin(({ entity }) => {
    // 首先要开启enableDamage(允许伤害),如果不设置为true的话,玩家是不会受到伤害的!
    entity.enableDamage = true
    // 给玩家的'onDie'事件添加处理的逻辑
    // 'onDie'事件会在玩家的生命值(hp)减少到0及以下时触发
    entity.onDie(() => {
        // 设置复活点的主要API: entity.player.spawnPoint

        // 1.在指定位置复活。
        // 复活点设置为世界里的'复活点模型'的坐标(position)
        // 当角色复活的时候就会出现在'复活点模型'的位置上
        // ---下面一行为类型1的内容,打开后需同时给类型2和3的代码注释掉-----
        entity.player.spawnPoint = respawnPoint.position.clone();
        // ---上面一行为类型1的内容,测试类型2或3时可注释掉上一行再打开对应的内容----

        // 2.在指定区域复活
        // const xPos = 72 + Math.random() * 5
        // const zPos = 63 + Math.random() * 5
        // entity.player.spawnPoint = new Box3Vector3(xPos, 15, zPos);


        // 3.在随机区域复活
        // const xPos = 0 + Math.random() * 126
        // const zPos = 0 + Math.random() * 126
        // entity.player.spawnPoint = new Box3Vector3(xPos, 15, zPos);

        // 设置好复活点之后,记得调用forceRespawn() API
        // 这样就可以强制玩家复活到上面设置好的位置了
        entity.player.forceRespawn()
    })
})

注意 :本代码不可直接复制使用,运行任意一种复活点的方式时,记得把其他两种方式的代码段落通过“//”进行注释,使其不能运行,不然会报错哦