From e3b7ad569b38d3bf7263e638667c51676be8ecc2 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Sun, 25 Oct 2015 21:03:02 +0100 Subject: [PATCH] fix stuff related to changeWorld * use writeOthersNearby everywhere * create player.playerViewDistance * put toFixedPosition in vec3 prototype * fix changeWorld (use the same function than in login) * use entity_destroy in changeWorld * sendPosition, not setPosition * disable pregenWorld : it just makes everything slow --- doc/api.md | 13 ------ src/lib/playerPlugins/animations.js | 4 +- src/lib/playerPlugins/blocks.js | 3 +- src/lib/playerPlugins/communication.js | 4 +- src/lib/playerPlugins/digging.js | 4 +- src/lib/playerPlugins/inventory.js | 12 +++--- src/lib/playerPlugins/login.js | 51 +++++------------------- src/lib/playerPlugins/logout.js | 2 +- src/lib/playerPlugins/updatePositions.js | 31 +++++--------- src/lib/playerPlugins/world.js | 40 +++++++++++++++++-- src/lib/serverPlugins/communication.js | 4 +- src/lib/serverPlugins/world.js | 6 +-- 12 files changed, 77 insertions(+), 97 deletions(-) diff --git a/doc/api.md b/doc/api.md index de0bd39..1d6148b 100644 --- a/doc/api.md +++ b/doc/api.md @@ -57,7 +57,6 @@ - ["chat" (message)](#chat-message) - ["kicked" (kicker,reason)](#kicked-kickerreason) - ["positionChanged"](#positionchanged) - - ["teleport"](#teleport) - [Methods](#methods-1) - [player.login()](#playerlogin) - [player.ban(reason)](#playerbanreason) @@ -71,7 +70,6 @@ - [player.setGameMode(gameMode)](#playersetgamemodegamemode) - [player.handleCommand(command)](#playerhandlecommandcommand) - [player.updateHealth(health)](#playerupdatehealthhealth) - - [player.sendPosition(position, opt)](#playersendpositionposition-opt) - [player.changeWorld(world, opt)](#playerchangeworldworld-opt) - [Low level properties](#low-level-properties) - [player._client](#player_client) @@ -300,10 +298,6 @@ Fires when the player says `message`. fires when the position changes in small amounts (walking, running, or flying) -#### "teleport" - -fires when the position changes in larger amounts (player's position set by `player.sendPosition()`) - ### Methods #### player.login() @@ -359,13 +353,6 @@ handle `command` update the player health. -#### player.sendPosition(position, opt) - -Teleport the player to any `position` in the same world. Use `player.changeWorld` to teleport to any world. Options: - -- yaw: Set the yaw, default is the current yaw of the player -- pitch: Set the pitch, default is the current pitch of the player - #### player.changeWorld(world, opt) The world object which the player is in (use serv.overworld, serv.netherworld, serv.endworld, or a custom world). Options: diff --git a/src/lib/playerPlugins/animations.js b/src/lib/playerPlugins/animations.js index c61400b..77f6905 100644 --- a/src/lib/playerPlugins/animations.js +++ b/src/lib/playerPlugins/animations.js @@ -3,7 +3,7 @@ module.exports=inject; function inject(serv, player) { player._client.on("arm_animation", function(packet) { - player._writeOthers("animation", { + player._writeOthersNearby("animation", { entityId: player.entity.id, animation: 0 }); @@ -12,7 +12,7 @@ function inject(serv, player) function setMetadata(metadata) { player.entity.metadata = metadata; - player._writeOthers("entity_metadata", { + player._writeOthersNearby("entity_metadata", { entityId: player.entity.id, metadata: player.entity.metadata }); diff --git a/src/lib/playerPlugins/blocks.js b/src/lib/playerPlugins/blocks.js index 81e6422..1e42cc1 100644 --- a/src/lib/playerPlugins/blocks.js +++ b/src/lib/playerPlugins/blocks.js @@ -4,8 +4,7 @@ function inject(serv,player) { async function changeBlock(position,blockType) { - player.getOthers().forEach(function(p) { - if (p.world != player.world) return; + player.getNearby().forEach(function(p) { p.sendBlock(position, blockType); }); return await player.world.setBlockType(position,blockType); diff --git a/src/lib/playerPlugins/communication.js b/src/lib/playerPlugins/communication.js index 484d046..9ac5910 100644 --- a/src/lib/playerPlugins/communication.js +++ b/src/lib/playerPlugins/communication.js @@ -10,7 +10,7 @@ function inject(serv,player) player._writeOthersNearby = function(packetName, packetFields) { serv._writeArray(packetName, packetFields, player.getNearby()); - } + }; player.getOthers = function() { return serv.players.filter(function (otherPlayer) { @@ -22,7 +22,7 @@ function inject(serv,player) return serv.getNearby({ world: player.world, position: player.entity.position, - radius: 150*32 + radius: player.playerViewDistance*32 }).filter((p) => p != player); } } \ No newline at end of file diff --git a/src/lib/playerPlugins/digging.js b/src/lib/playerPlugins/digging.js index db392f7..74d4df8 100644 --- a/src/lib/playerPlugins/digging.js +++ b/src/lib/playerPlugins/digging.js @@ -51,7 +51,7 @@ function inject(serv,player) if(newDestroyState!=lastDestroyState) { lastDestroyState=newDestroyState; - player._writeOthers("block_break_animation",{ + player._writeOthersNearby("block_break_animation",{ "entityId":currentAnimationId, "location":location, "destroyStage":newDestroyState @@ -63,7 +63,7 @@ function inject(serv,player) function cancelDigging(location) { clearInterval(animationInterval); - player._writeOthers("block_break_animation",{ + player._writeOthersNearby("block_break_animation",{ "entityId":currentAnimationId, "location":location, "destroyStage":-1 diff --git a/src/lib/playerPlugins/inventory.js b/src/lib/playerPlugins/inventory.js index 2bd3086..b214b40 100644 --- a/src/lib/playerPlugins/inventory.js +++ b/src/lib/playerPlugins/inventory.js @@ -14,7 +14,7 @@ function inject(serv, player) }; } player.heldItem = player.inventory[36+player.heldItemSlot]; - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:0, item:player.heldItem @@ -24,31 +24,31 @@ function inject(serv, player) player._client.on("set_creative_slot", function (packet) { player.inventory[packet.slot]=packet.item; if (packet.slot==36) - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:0, item:packet.item }); if (packet.slot==5) - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:4, item:packet.item }); if (packet.slot==6) - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:3, item:packet.item }); if (packet.slot==7) - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:2, item:packet.item }); if (packet.slot==8) - player._writeOthers("entity_equipment",{ + player._writeOthersNearby("entity_equipment",{ entityId:player.entity.id, slot:1, item:packet.item diff --git a/src/lib/playerPlugins/login.js b/src/lib/playerPlugins/login.js index 77de7cd..59f5281 100644 --- a/src/lib/playerPlugins/login.js +++ b/src/lib/playerPlugins/login.js @@ -13,6 +13,7 @@ function inject(serv,player) player.entity.player=player; player.entity.health = 20; player.entity.food = 20; + player.playerViewDistance = 150; player.view=8; player.world=serv.overworld; player.username=player._client.username; @@ -21,10 +22,6 @@ function inject(serv,player) player.loadedChunks={}; } - function toFixedPosition(p) - { - return p.scaled(32).floored(); - } function sendLogin() { // send init data so client will start rendering world @@ -37,44 +34,14 @@ function inject(serv,player) reducedDebugInfo: false, maxPlayers: serv._server.maxPlayers }); - player.entity.position=toFixedPosition(player.spawnPoint); + player.entity.position=player.spawnPoint.toFixedPosition(); } - function sendMap() + function sendChunkWhenMove() { - return player.sendNearbyChunks(3) - .catch((err) => setTimeout(function() { throw err; }), 0); - } - - function sendRestMap() - { - player.sendingChunks=true; - player.sendNearbyChunks(player.view) - .then(() => player.sendingChunks=false) - .catch((err)=> setTimeout(function(){throw err;},0)); - player.on("positionChanged",function(){ if(!player.sendingChunks && player.entity.position.distanceTo(player.lastPositionChunkUpdated)>16*32) - { - player.sendingChunks=true; - player.sendNearbyChunks(player.view) - .then(() => player.sendingChunks=false) - .catch((err)=> setTimeout(function(){throw err;},0)); - } - }); - player.on("teleport", function() { - player.sendingChunks=true; - player.sendNearbyChunks(player.view) - .then(() => player.sendingChunks=false) - .catch((err)=> setTimeout(function(){throw err;},0)); - }); - } - - function sendSpawnPosition() - { - console.log("setting spawn at "+player.spawnPoint); - player._client.write('spawn_position',{ - "location":player.spawnPoint + player.sendMap(); }); } @@ -139,20 +106,22 @@ function inject(serv,player) addPlayer(); sendLogin(); - await sendMap(); - sendSpawnPosition(); + await player.sendMap(); + player.sendSpawnPosition(); player.updateHealth(player.entity.health); - player.emit("spawned"); updateTime(); setGameMode(player.gameMode); fillTabList(); + player.spawnForOthers(); + player.sendNearbyPlayers(); player.spawn(); announceJoin(); + player.emit("spawned"); - setTimeout(sendRestMap,100); + setTimeout(function(){player.sendRestMap();sendChunkWhenMove();},100); } player.setGameMode=setGameMode; diff --git a/src/lib/playerPlugins/logout.js b/src/lib/playerPlugins/logout.js index c642799..7558eac 100644 --- a/src/lib/playerPlugins/logout.js +++ b/src/lib/playerPlugins/logout.js @@ -11,7 +11,7 @@ function inject(serv,player) UUID: player._client.uuid }] }); - player._writeOthers('entity_destroy', {'entityIds': [player.entity.id]}); + player._writeOthersNearby('entity_destroy', {'entityIds': [player.entity.id]}); delete serv.entities[player.entity.id]; player.emit('disconnected'); var index = serv.players.indexOf(player); diff --git a/src/lib/playerPlugins/updatePositions.js b/src/lib/playerPlugins/updatePositions.js index 8479b86..a9043a5 100644 --- a/src/lib/playerPlugins/updatePositions.js +++ b/src/lib/playerPlugins/updatePositions.js @@ -2,10 +2,9 @@ var vec3 = require("vec3"); module.exports=inject; -function toFixedPosition(p) -{ - return p.scaled(32).floored(); -} +vec3.Vec3.prototype.toFixedPosition=function() { + return this.scaled(32).floored(); +}; function inject(serv,player) { @@ -25,7 +24,7 @@ function inject(serv,player) var convYaw=conv(yaw); var convPitch=conv(pitch); if (convYaw == player.entity.yaw && convPitch == player.entity.pitch) return; - player._writeOthers("entity_look", { + player._writeOthersNearby("entity_look", { entityId: player.entity.id, yaw: convYaw, pitch: convPitch, @@ -34,7 +33,7 @@ function inject(serv,player) player.entity.yaw = convYaw; player.entity.pitch = convPitch; player.entity.onGround = onGround; - player._writeOthers("entity_head_rotation", { + player._writeOthersNearby("entity_head_rotation", { entityId: player.entity.id, headYaw: convYaw }); @@ -43,13 +42,13 @@ function inject(serv,player) player._client.on('position', function (packet) { var position = new vec3(packet.x, packet.y, packet.z); var onGround = packet.onGround; - sendRelativePositionChange(toFixedPosition(position), onGround); + sendRelativePositionChange(position.toFixedPosition(), onGround); }); player._client.on('position_look', function (packet) { var position = new vec3(packet.x, packet.y, packet.z); var onGround = packet.onGround; - sendRelativePositionChange(toFixedPosition(position), onGround); + sendRelativePositionChange(position.toFixedPosition(), onGround); sendLook(packet.yaw,packet.pitch,packet.onGround); }); @@ -58,7 +57,7 @@ function inject(serv,player) var diff = newPosition.minus(player.entity.position); if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) { - player._writeOthers('entity_teleport', { + player._writeOthersNearby('entity_teleport', { entityId:player.entity.id, x: newPosition.x, y: newPosition.y, @@ -69,7 +68,7 @@ function inject(serv,player) }); } else if (diff.distanceTo(new vec3(0, 0, 0)) != 0) { - player._writeOthers('rel_entity_move', { + player._writeOthersNearby('rel_entity_move', { entityId: player.entity.id, dX: diff.x, dY: diff.y, @@ -83,12 +82,7 @@ function inject(serv,player) player.emit("positionChanged"); } - function setPosition(pos, opt) { - opt = opt || {}; - if (pos) player.entity.position = toFixedPosition(pos); - if (typeof opt.yaw != 'undefined') player.entity.yaw=opt.yaw; - if (typeof opt.pitch != 'undefined') player.entity.pitch=opt.pitch; - + function sendPosition() { player._client.write('position', { x: player.entity.position.x/32, y: player.entity.position.y/32, @@ -97,9 +91,6 @@ function inject(serv,player) pitch: player.entity.pitch, flags: 0x00 }); - player.spawnForOthers(); - player.sendNearbyPlayers(); - player.emit('teleport'); } - player.setPosition = setPosition; + player.sendPosition = sendPosition; } \ No newline at end of file diff --git a/src/lib/playerPlugins/world.js b/src/lib/playerPlugins/world.js index b1c5420..fc5e038 100644 --- a/src/lib/playerPlugins/world.js +++ b/src/lib/playerPlugins/world.js @@ -5,7 +5,7 @@ module.exports = inject; function inject(serv, player) { function spawn() { - player.setPosition(player.spawnPoint, { yaw: 0, pitch: 0, exact: true }); + player.sendPosition(); } function spawnForOthers() { @@ -89,7 +89,30 @@ function inject(serv, player) { return new Promise(r => setTimeout(r, ms)); } - function changeWorld(world, opt) { + function sendMap() + { + return player.sendNearbyChunks(3) + .catch((err) => setTimeout(function() { throw err; }), 0); + } + + function sendRestMap() + { + player.sendingChunks=true; + player.sendNearbyChunks(player.view) + .then(() => player.sendingChunks=false) + .catch((err)=> setTimeout(function(){throw err;},0)); + } + + function sendSpawnPosition() + { + console.log("setting spawn at "+player.spawnPoint); + player._client.write('spawn_position',{ + "location":player.spawnPoint + }); + } + + async function changeWorld(world, opt) { + player._writeOthersNearby('entity_destroy', {'entityIds': [player.entity.id]}); opt = opt || {}; player.world = world; @@ -101,7 +124,15 @@ function inject(serv, player) { gamemode: opt.gamemode || player.gameMode, levelType:'default' }); - player.setPosition(opt.position || player.spawnPoint, { yaw: opt.yaw || 0, pitch: opt.pitch || 0 }); // Automatically sends chunks around players + player.entity.position=player.spawnPoint.toFixedPosition(); + player.sendSpawnPosition(); + + player.spawnForOthers(); + player.sendNearbyPlayers(); + await player.sendMap(); + setTimeout(player.sendRestMap,100); + player.sendPosition(); + player.emit('change_world'); } @@ -111,6 +142,9 @@ function inject(serv, player) { player.sendNearbyChunks = sendNearbyChunks; player.changeWorld = changeWorld; player.sendChunk = sendChunk; + player.sendMap = sendMap; + player.sendRestMap = sendRestMap; + player.sendSpawnPosition = sendSpawnPosition; player.on('chat', function(message) { if (message == 'world') { diff --git a/src/lib/serverPlugins/communication.js b/src/lib/serverPlugins/communication.js index 0268adc..cf764f7 100644 --- a/src/lib/serverPlugins/communication.js +++ b/src/lib/serverPlugins/communication.js @@ -12,11 +12,11 @@ function inject(serv,settings) players.forEach(function(player) { player._client.write(packetName, packetFields); }); - } + }; serv._writeNearby=function(packetName, packetFields, loc) { serv._writeArray(packetName, packetFields, serv.getNearby(loc)); - } + }; serv.getNearby=function(loc) { return serv.players.filter(function(player) { diff --git a/src/lib/serverPlugins/world.js b/src/lib/serverPlugins/world.js index 548b8ac..f124584 100644 --- a/src/lib/serverPlugins/world.js +++ b/src/lib/serverPlugins/world.js @@ -23,7 +23,7 @@ function inject(serv,{regionFolder,generation={"name":"diamond_square","options" serv._worldSync=new WorldSync(serv.overworld); function pregenWorld(world, size=10) { - var promises = Array(); + var promises = []; for (var x = -size; x < size; x++) { for (var z = -size; z < size; z++) { promises.push(world.getColumn(x, z)); @@ -33,6 +33,6 @@ function inject(serv,{regionFolder,generation={"name":"diamond_square","options" } serv.pregenWorld = pregenWorld; - serv.pregenWorld(serv.overworld).then(() => serv.log('Pre-Generated Overworld')); - serv.pregenWorld(serv.netherworld).then(() => serv.log('Pre-Generated Nether')); + //serv.pregenWorld(serv.overworld).then(() => serv.log('Pre-Generated Overworld')); + //serv.pregenWorld(serv.netherworld).then(() => serv.log('Pre-Generated Nether')); } \ No newline at end of file