From f0cce9fadb31feed19438c4631b4224ece086a1c Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Sat, 24 Oct 2015 21:02:26 -0700 Subject: [PATCH] Added lots of communication stuff --- doc/api.md | 34 +++++++++++++++++++++++++- package.json | 7 +++--- src/lib/playerPlugins/communication.js | 12 +++++++++ src/lib/playerPlugins/world.js | 5 ++-- src/lib/serverPlugins/communication.js | 16 ++++++++++++ src/lib/serverPlugins/world.js | 10 ++++---- 6 files changed, 72 insertions(+), 12 deletions(-) diff --git a/doc/api.md b/doc/api.md index 05045dd..de0bd39 100644 --- a/doc/api.md +++ b/doc/api.md @@ -31,6 +31,7 @@ - [serv.broadcast(message[,color])](#servbroadcastmessagecolor) - [serv.setBlock(position,blockType)](#servsetblockpositionblocktype) - [serv.getPlayer(username)](#servgetplayerusername) + - [serv.getNearby(loc)](#servgetnearbyloc) - [server.banUsername(username,reason,callback)](#serverbanusernameusernamereasoncallback) - [server.ban(uuid,reason)](#serverbanuuidreason) - [server.pardonUsername(username,callback)](#serverpardonusernameusernamecallback) @@ -38,6 +39,10 @@ - [server.getUUIDFromUsername(username,callback)](#servergetuuidfromusernameusernamecallback) - [server.setTime(time)](#serversettimetime) - [server.setTickInterval(ticksPerSecond)](#serversettickintervaltickspersecond) + - [Low level methods](#low-level-methods) + - [server._writeAll(packetName, packetFields)](#server_writeallpacketname-packetfields) + - [server._writeArray(packetName, packetFields, playerArray)](#server_writearraypacketname-packetfields-playerarray) + - [server._writeNearby(packetName, packetFields, loc)](#server_writenearbypacketname-packetfields-loc) - [Player](#player) - [Properties](#properties-1) - [player.entity](#playerentity) @@ -70,8 +75,9 @@ - [player.changeWorld(world, opt)](#playerchangeworldworld-opt) - [Low level properties](#low-level-properties) - [player._client](#player_client) - - [Low level methods](#low-level-methods) + - [Low level methods](#low-level-methods-1) - [player._writeOthers(packetName, packetFields)](#player_writeotherspacketname-packetfields) + - [player._writeOthersNearby(packetName, packetFields)](#player_writeothersnearbypacketname-packetfields) @@ -190,6 +196,14 @@ Saves block in world and sends block update to all players. Returns player object with that username or, if no such player is on the server, null. +#### serv.getNearby(loc) + +Returns array of players within loc. loc is a required paramater. The object contains: + +* world: World position is in +* position: Center position +* radius: Distance from position + #### server.banUsername(username,reason,callback) Bans players given a username. Mainly used if player is not online, otherwise use `player.ban()`. @@ -222,6 +236,20 @@ Resets tick interval to occur `ticksPerSecond` times per second. Use `server.stopTickInterval()` if you want but this method already calls that and you can use `serv.doDaylightCycle` to stop it anyway. +### Low level methods + +#### server._writeAll(packetName, packetFields) + +Writes packet to every player on the server + +#### server._writeArray(packetName, packetFields, playerArray) + +Writes packet to every player in playerArray + +#### server._writeNearby(packetName, packetFields, loc) + +Writes packet to all players within distance of loc. loc has the same paramater as loc in server.getNearby() + ## Player ### Properties @@ -360,3 +388,7 @@ The internal implementation to communicate with a client #### player._writeOthers(packetName, packetFields) write to other players than `player` the packet `packetName` with fields `packetFields` + +#### player._writeOthersNearby(packetName, packetFields) + +write to other players in same world that are within 150 blocks (see player.getNearby()) diff --git a/package.json b/package.json index 9e5f971..e24f2bc 100644 --- a/package.json +++ b/package.json @@ -27,18 +27,19 @@ "minecraft-protocol": "^0.15.0", "mkdirp": "0.5.1", "moment": "^2.10.6", + "node-dir": "~0.1.9", "node-uuid": "^1.4.3", "prismarine-block": "0.1.0", "prismarine-chunk": "0.2.1", "prismarine-entity": "0.1.0", "prismarine-world": "0.3.0", + "prismarine-world-sync": "0.1.0", + "random-seed": "^0.2.0", "request-promise": "^0.4.3", "requireindex": "~1.0.0", - "vec3": "0.1.3", "spiralloop": "1.0.2", - "node-dir": "~0.1.9", "uuid-1345": "~0.99.6", - "prismarine-world-sync": "0.1.0" + "vec3": "0.1.3" }, "repository": { "type": "git", diff --git a/src/lib/playerPlugins/communication.js b/src/lib/playerPlugins/communication.js index 2488188..5f3c8a7 100644 --- a/src/lib/playerPlugins/communication.js +++ b/src/lib/playerPlugins/communication.js @@ -8,9 +8,21 @@ function inject(serv,player) }); }; + player._writeOthersNearby = function(packetName, packetFields) { + serv._writeArray(packetName, packetFields, player.getNearby(); + } + player.getOthers = function() { return serv.players.filter(function (otherPlayer) { return otherPlayer != player; }); }; + + player.getNearby = function() { + return serv.getNearby({ + world: player.world, + position: player.entity.position, + radius: 150 + }).filter((p => p != player)); + } } \ No newline at end of file diff --git a/src/lib/playerPlugins/world.js b/src/lib/playerPlugins/world.js index e23b95e..b1c5420 100644 --- a/src/lib/playerPlugins/world.js +++ b/src/lib/playerPlugins/world.js @@ -9,7 +9,7 @@ function inject(serv, player) { } function spawnForOthers() { - player._writeOthers('named_entity_spawn',{ // _writeOthersWithinDistance? + player._writeOthersNearby('named_entity_spawn',{ entityId: player.entity.id, playerUUID: player._client.uuid, x: player.entity.position.x, @@ -23,8 +23,7 @@ function inject(serv, player) { } function sendNearbyPlayers() { - player.getOthers().forEach(function (otherPlayer) { - if (otherPlayer.world != player.world) return; // Also check distance from player? + player.getNearby().forEach(function (otherPlayer) { player._client.write('named_entity_spawn', { entityId: otherPlayer.entity.id, playerUUID: otherPlayer._client.uuid, diff --git a/src/lib/serverPlugins/communication.js b/src/lib/serverPlugins/communication.js index d555bc3..3a88ebd 100644 --- a/src/lib/serverPlugins/communication.js +++ b/src/lib/serverPlugins/communication.js @@ -7,4 +7,20 @@ function inject(serv,settings) player._client.write(packetName, packetFields); }); }; + + serv._writeArray=function(packetName, packetFields, players) { + 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) { + serv.players.filter(function(player) { + return player.world == loc.world && player.entity.position.distanceTo(loc.position) <= loc.radius; + }) + } } \ No newline at end of file diff --git a/src/lib/serverPlugins/world.js b/src/lib/serverPlugins/world.js index a3e86af..548b8ac 100644 --- a/src/lib/serverPlugins/world.js +++ b/src/lib/serverPlugins/world.js @@ -23,16 +23,16 @@ function inject(serv,{regionFolder,generation={"name":"diamond_square","options" serv._worldSync=new WorldSync(serv.overworld); function pregenWorld(world, size=10) { + var promises = Array(); for (var x = -size; x < size; x++) { for (var z = -size; z < size; z++) { - world.getColumn(x, z); + promises.push(world.getColumn(x, z)); } } + return Promise.all(promises); } serv.pregenWorld = pregenWorld; - serv.pregenWorld(serv.overworld); - serv.log('Pre-Generated Overworld'); - serv.pregenWorld(serv.netherworld); - 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