From 0ea7fcf40d1c6ce0f0f83045ce9b2d7644fc9906 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Mon, 14 Dec 2015 20:40:42 +0100 Subject: [PATCH] don't spawn in water, fix #63 --- src/lib/plugins/login.js | 1 + src/lib/plugins/settings.js | 28 +++++++++++++++++++++++++--- src/lib/plugins/world.js | 4 ++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index 41ac053..eb98122 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -157,6 +157,7 @@ module.exports.player=function(player,serv) } addPlayer(); + await player.findSpawnPoint(); sendLogin(); await player.sendMap(); player.sendSpawnPosition(); diff --git a/src/lib/plugins/settings.js b/src/lib/plugins/settings.js index 379f9f3..3512924 100644 --- a/src/lib/plugins/settings.js +++ b/src/lib/plugins/settings.js @@ -9,14 +9,36 @@ module.exports.server=function(serv,settings) { serv.gameMode=settings.gameMode; - serv.getSpawnPoint = () => new Vec3(randomInt(5,20),81,randomInt(5,20)); + async function findSpawnZone(world,initialPoint) + { + var point=initialPoint; + while((await (world.getBlockType(point)))==0) + point=point.offset(0,-1,0); + while(true) + { + var p=await world.getBlockType(point); + if(p.type!=8 && p.type!=9) + break; + point=point.offset(1,0,0); + } + while((await world.getBlockType(point))!=0) + point = point.offset(0, 1, 0); + + return point; + } + + serv.getSpawnPoint = async (world) => { + return await findSpawnZone(world,new Vec3(randomInt(0,30),81,randomInt(0,30))); + }; }; -module.exports.player=function(player,serv) +module.exports.player=async function(player,serv) { player.gameMode=serv.gameMode; - player.spawnPoint=serv.getSpawnPoint(); + player.findSpawnPoint=async () => { + player.spawnPoint=await serv.getSpawnPoint(player.world); + }; player._client.on('settings',({viewDistance}) => { player.view=viewDistance; }); diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index f22fb0f..ddf9d70 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -143,8 +143,7 @@ module.exports.player=function(player,serv,settings) { player.changeWorld = async (world, opt) => { if(player.world == world) return Promise.resolve(); opt = opt || {}; - player.world = world; - player.world = world; + player.world = world player.loadedChunks={}; if (typeof opt.gamemode != 'undefined') player.gameMode = opt.gamemode; player._client.write("respawn",{ @@ -153,6 +152,7 @@ module.exports.player=function(player,serv,settings) { gamemode: opt.gamemode || player.gameMode, levelType:'default' }); + await player.findSpawnPoint(); player.position=player.spawnPoint.toFixedPosition(); player.sendSpawnPosition(); player.updateAndSpawn();