diff --git a/src/index.js b/src/index.js index e30e3f2..dd54436 100644 --- a/src/index.js +++ b/src/index.js @@ -40,5 +40,7 @@ class MCServer extends EventEmitter { this._server.on('error', error => this.emit('error',error)); this._server.on('listening', () => this.emit('listening',this._server.socketServer.address().port)); this.emit('asap'); + + process.on('unhandledRejection', err => this.emit('error',err)); } } \ No newline at end of file diff --git a/src/lib/behavior.js b/src/lib/behavior.js index c22fce6..f0274fd 100644 --- a/src/lib/behavior.js +++ b/src/lib/behavior.js @@ -19,14 +19,16 @@ module.exports = (obj) => { await obj.emitThen(eventName, data, cancelled, cancelCount).catch((err)=> setTimeout(() => {throw err;},0)); if (!hiddenCancelled && !cancelled) { - resp = await func(data).catch((err)=> setTimeout(() => {throw err;},0)); + resp = func(data); + if (resp instanceof Promise) resp = await resp.catch((err)=> setTimeout(() => {throw err;},0)); if (typeof resp == 'undefined') resp = true; } else if (cancelFunc && defaultCancel) { - resp = await cancelFunc(data).catch((err)=> setTimeout(() => {throw err;},0)); + resp = cancelFunc(data); + if (resp instanceof Promise) resp = await resp.catch((err)=> setTimeout(() => {throw err;},0)); if (typeof resp == 'undefined') resp = false; } - await obj.emitThen(eventName + '_done', data, cancelled).catch((err)=> setTimeout(() => {throw err;},0)); + return resp; } }; \ No newline at end of file diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index f4e4cf9..c373992 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -20,7 +20,7 @@ module.exports.server=function(serv,options) { } if (!entity.velocity || !entity.size) return; var posAndOnGround = await entity.calculatePhysics(delta); - if (entity.type == 'mob') entity.sendPosition(posAndOnGround); + if (entity.type == 'mob') entity.sendPosition(posAndOnGround.position, posAndOnGround.onGround); }) ).catch((err)=> setTimeout(() => {throw err;},0)); }); diff --git a/src/lib/plugins/tp.js b/src/lib/plugins/tp.js index d6c7645..3dc2191 100644 --- a/src/lib/plugins/tp.js +++ b/src/lib/plugins/tp.js @@ -23,14 +23,15 @@ module.exports.player = (player, serv) => { let z = serv.posFromString(args[2], player.position.z / 32); player.teleport(new Vec3(x, y, z)); + } else if(args.length === 4) { let entities_from = player.selectorString(args[0]); - let x = serv.posFromString(args[1], player_from.x / 32); - let y = serv.posFromString(args[2], player_from.y / 32); - let z = serv.posFromString(args[3], player_from.z / 32); - - entities_from.forEach(e => e.teleport(new Vec3(x, y, z))); + entities_from.forEach(e => e.teleport(new Vec3( + serv.posFromString(args[1], e.position.x / 32), + serv.posFromString(args[2], e.position.y / 32), + serv.posFromString(args[3], e.position.z / 32) + ))); } } }); diff --git a/src/lib/plugins/updatePositions.js b/src/lib/plugins/updatePositions.js index 997116a..55fe0af 100644 --- a/src/lib/plugins/updatePositions.js +++ b/src/lib/plugins/updatePositions.js @@ -64,17 +64,19 @@ module.exports.player=function(player) }; player.teleport = async (position) => { - var notCancelled = await player.sendSelfPosition(position.scaled(32).floored(), false, true); + var notCancelled = await player.sendPosition(position.scaled(32).floored(), false, true); if (notCancelled) player.sendSelfPosition(); } }; module.exports.entity=function(entity,serv){ entity.sendPosition = (position, onGround, teleport=false) => { + if (typeof position == 'undefined') throw new Error('undef'); if (entity.position.equals(position) && entity.onGround == onGround) return Promise.resolve(); - return entity.behavior(teleport ? 'teleport' : 'move', { + return entity.behavior('move', { position: position, - onGround: onGround + onGround: onGround, + teleport: teleport }, ({position,onGround}) => { var diff = position.minus(entity.position); if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) @@ -87,7 +89,7 @@ module.exports.entity=function(entity,serv){ pitch: entity.pitch, onGround: onGround }); - else if (diff.distanceTo(new Vec3(0, 0, 0)) != 0) serv._writeOthersNearby('rel_entity_move', { + else if (diff.distanceTo(new Vec3(0, 0, 0)) != 0) entity._writeOthersNearby('rel_entity_move', { entityId: entity.id, dX: diff.x, dY: diff.y, @@ -119,7 +121,7 @@ module.exports.entity=function(entity,serv){ }; entity.teleport = (pos) => { // Overwritten in players inject above - entity.sendPosition(entity.position, false, true); + entity.sendPosition(pos.scaled(32), false, true); } function addVelocityWithMax(current, newVel, max) {