用户:欲买桂花同载酒,查看:0 回复:6 评论:0 创建时间:2021-09-12T10:25:20
本次测试是为了看看我的新作品有没有bug。现在开启报名。
如果你发现了bug我会在下周开启见图名额,限量十人。
这个是代码:
console.clear()function joinRed(entity) { entity.addTag('red')//加红队标签 entity.player.color.set(1, 0, 0)//变红 world.say(`${entity.player.name} 被分配到红队`) entity.player.spawnPoint.set(5, 20, 喵)//设置红队的出生点在地图的一边 }
function joinBlue(entity) { entity.addTag('blue')//加蓝队标签 entity.player.color.set(0, 0, 1)//变蓝 world.say(`${entity.player.name} 被分配到蓝队`) entity.player.spawnPoint.set(122, 20, 喵)//设置蓝队的出生点在地图的另一边 }
world.onPlayerJoin(({ entity }) => {
const red = world.querySelectorAll('.red') //红队玩家列表 const blue = world.querySelectorAll('.blue') //蓝队玩家列表 if (red.length === blue.length) {//如果两队人数相同 if (Math.random() < 0.5) {//随机加入其中一队 joinBlue(entity)//加入蓝队 } else { joinRed(entity)//加入红队 } } else if (red.length > blue.length) {//如果红队人多 joinBlue(entity)//加入蓝队 } else { joinRed(entity)//加入红队 }
entity.player.forceRespawn() //传送到自己队伍的出生点 entity.enableDamage = true //允许玩家受伤 entity.score = 0 //玩家初始得分为0 entity.onDie(async ({ attacker }) => { let attackerTeam = teamName(attacker)//对手的队名 let myTeam = teamName(entity)//玩家的队名
world.say(`[${attackerTeam}]${attacker.player.name} 击败了 [${myTeam}]${entity.player.name}`) attacker.score += 1 //当玩家被击败时, 给对手加1分
await sleep(5000) //等待5秒后复活 entity.player.forceRespawn() //满血回到出生点 }) })
function teamName(entity) { if (entity.hasTag('red')) {//如果有红队标签 return '红队' } else if (entity.hasTag('blue')) {//如果有蓝队标签 return '蓝队' } return '未知队伍' }
world.onClick(({ entity, clicker }) => { if ( //如果攻击者和被击者在不同的队伍, 则被击者会受伤 (entity.hasTag('red') && clicker.hasTag('blue')) || //被击者是红队, 攻击者是蓝队 (entity.hasTag('blue') && clicker.hasTag('red')) //或者 被击者是蓝队, 攻击者是红队 ) { entity.hurt(10, { attacker: clicker }) //被点击者受到10点伤害, 并将点击者传递给onDie事件 } })
world.onPress(({ entity, button }) => { if (button == Box3ButtonType.ACTION1) { //右键查看自己的分数 entity.player.dialog({ type: Box3DialogType.TEXT, content: `本回合你击败了${entity.score}个对手` }) } })
world.onPlayerJoin(({entity}) => { entity.player.addWearable({ bodyPart: Box3BodyPart.HEAD, mesh: 'mesh/三级盔.vb', orientation: new Box3Quaternion(0,1,0,0).rotateY(-Math.PI/2), offset: new Box3Vector3(0,0.4,0.1), }); entity.player.addWearable({ bodyPart: Box3BodyPart.RIGHT_HAND, mesh: 'mesh/喵 [精美].vb', orientation: new Box3Quaternion(0,1,0,0).rotateY(Math.PI), offset: new Box3Vector3(-0.05,-0.1,0.5), scale: Box3Vector3 = new Box3Vector3(0.3, 0.3, 0.3), }); });
world.onPlayerJoin(({ entity }) => { entity.player.enable3DCursor = true // 开启方块光标 })
console.clear() const mscale = 1 / 16 const Quat = new Box3Quaternion(0, 0, 0, 1)
function buddyFollow(entity, mesh, y) { const buddy = world.createEntity({ mesh, position: entity.position, meshScale: [mscale, mscale, mscale], gravity: false, //不受重力影响 fixed: false, //可推移 collides: true, //可碰撞 friction: 0, //无摩擦力 mass: 0.01, //非常轻 })
const tgPos = entity.position//僚机的目标位置 const budPos = buddy.position//僚机的当前位置 const facing = entity.player.facingDirection//玩家的朝向 const ratio = 0.3//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置
const dist = 2 //与玩家保持的距离 const yOffset = y //y轴位移, 保持僚机在头顶或脚下
const ticker = world.onTick(() => {
//要让小精灵跟在玩家背后, 需要计算xz轴的位移: 玩家朝向的反方向 const xOffset = -facing.x * dist const zOffset = -facing.z * dist
//当前位置与目标位置在xyz轴的差距 const xDiff = tgPos.x - budPos.x const yDiff = tgPos.y - budPos.y const zDiff = tgPos.z - budPos.z
//计算xyz方向上 当前位置向目标位置靠拢的速度 const 喵 = (xDiff + xOffset) * ratio const vy = (yDiff + yOffset) * ratio const vz = (zDiff + zOffset) * ratio
buddy.velocity.set(喵, vy, vz)//设置僚机速度
if (buddy.velocity.sqrMag() > 0.005) {//速度要足够大, 才触发转向, 防止抖动 buddy.meshOrientation = Quat.rotateY(Math.atan2(zDiff, xDiff)) //让小精灵一直面向玩家 } })
return () => { ticker.cancel() //关掉tick循环 buddy.destroy() //移除僚机实体 } }
world.onPlayerJoin(({ entity }) => { entity.setPet = buddyFollow(entity, 'mesh/无人机.vb', -1) //给玩家增加宠物 })
world.onPlayerLeave(({ entity }) => { //玩家离开地图时, 切记一定要关掉tick循环以及销毁小精灵实体, 否则随着人数增加, 服务器积累到一定程度就会崩溃 entity.setPet() //干掉宠物 })
function cylinder(cx,cy,cz,vox,radius,height){ var xend=cx+radius var yend=cy+height var zend=cz+radius for(var x=cx-radius;x<=xend;x++){ for(var z=cz-radius;z<=zend;z++){ var dx=x-cx; var dz=z-cz; if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){ for(y=cy;y<yend;y++){ voxels.setVoxel(x,y,z,vox) } } } } }
for(var i=0;i<300;i++){ let x=Math.random()*125 let z=Math.random()*125 let r=2+Math.random()*5 let h=Math.random()*7 cylinder(x,9,z,'dirt',r,h) }
for(var y=9;y<17;y++){ for(var x=0;x<127;x++){ for(var z=0;z<127;z++){ if(voxels.getVoxel(x,y,z)!=0 && voxels.getVoxel(x,y+1,z)==0){ voxels.setVoxel(x,y,z,'grass') } } } }