From 39dc37f94df5d4032a4fdfb7b06e9f9025a368f5 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Mon, 16 Nov 2015 20:23:09 +0100 Subject: [PATCH] put together player plugins and server plugins --- src/index.js | 6 +- src/lib/playerPlugins/communication.js | 24 -- src/lib/playerPlugins/log.js | 17 -- src/lib/playerPlugins/moderation.js | 22 -- src/lib/playerPlugins/settings.js | 10 - src/lib/playerPlugins/signs.js | 6 - .../{playerPlugins => plugins}/animations.js | 6 +- src/lib/{playerPlugins => plugins}/blocks.js | 6 +- src/lib/{playerPlugins => plugins}/border.js | 6 +- src/lib/{playerPlugins => plugins}/chat.js | 13 +- src/lib/{playerPlugins => plugins}/chest.js | 4 +- .../{playerPlugins => plugins}/commands.js | 5 +- src/lib/plugins/communication.js | 46 ++++ .../{serverPlugins => plugins}/daycycle.js | 9 +- src/lib/{playerPlugins => plugins}/digging.js | 4 +- .../{serverPlugins => plugins}/entities.js | 20 +- src/lib/{playerPlugins => plugins}/header.js | 6 +- .../{playerPlugins => plugins}/inventory.js | 6 +- src/lib/{serverPlugins => plugins}/log.js | 22 +- src/lib/{playerPlugins => plugins}/login.js | 31 ++- src/lib/{playerPlugins => plugins}/logout.js | 6 +- .../{serverPlugins => plugins}/moderation.js | 25 +- src/lib/plugins/modpe.js | 241 +++++++++++++++++ .../{serverPlugins => plugins}/particle.js | 6 +- .../{playerPlugins => plugins}/placeBlock.js | 8 +- src/lib/{serverPlugins => plugins}/players.js | 6 +- src/lib/{playerPlugins => plugins}/pvp.js | 6 +- src/lib/{playerPlugins => plugins}/respawn.js | 6 +- src/lib/plugins/settings.js | 23 ++ src/lib/plugins/signs.js | 4 + src/lib/{playerPlugins => plugins}/sound.js | 39 ++- src/lib/{playerPlugins => plugins}/stats.js | 6 +- src/lib/{serverPlugins => plugins}/tick.js | 7 +- .../updatePositions.js | 6 +- src/lib/{playerPlugins => plugins}/world.js | 55 +++- src/lib/serverPlugins/chat.js | 10 - src/lib/serverPlugins/communication.js | 25 -- src/lib/serverPlugins/login.js | 27 -- src/lib/serverPlugins/modpe.js | 243 ------------------ src/lib/serverPlugins/settings.js | 15 -- src/lib/serverPlugins/sound.js | 35 --- src/lib/serverPlugins/world.js | 52 ---- 42 files changed, 527 insertions(+), 593 deletions(-) delete mode 100644 src/lib/playerPlugins/communication.js delete mode 100644 src/lib/playerPlugins/log.js delete mode 100644 src/lib/playerPlugins/moderation.js delete mode 100644 src/lib/playerPlugins/settings.js delete mode 100644 src/lib/playerPlugins/signs.js rename src/lib/{playerPlugins => plugins}/animations.js (93%) rename src/lib/{playerPlugins => plugins}/blocks.js (92%) rename src/lib/{playerPlugins => plugins}/border.js (86%) rename src/lib/{playerPlugins => plugins}/chat.js (69%) rename src/lib/{playerPlugins => plugins}/chest.js (93%) rename src/lib/{playerPlugins => plugins}/commands.js (99%) create mode 100644 src/lib/plugins/communication.js rename src/lib/{serverPlugins => plugins}/daycycle.js (85%) rename src/lib/{playerPlugins => plugins}/digging.js (98%) rename src/lib/{serverPlugins => plugins}/entities.js (97%) rename src/lib/{playerPlugins => plugins}/header.js (81%) rename src/lib/{playerPlugins => plugins}/inventory.js (96%) rename src/lib/{serverPlugins => plugins}/log.js (68%) rename src/lib/{playerPlugins => plugins}/login.js (82%) rename src/lib/{playerPlugins => plugins}/logout.js (94%) rename src/lib/{serverPlugins => plugins}/moderation.js (70%) create mode 100644 src/lib/plugins/modpe.js rename src/lib/{serverPlugins => plugins}/particle.js (94%) rename src/lib/{playerPlugins => plugins}/placeBlock.js (96%) rename src/lib/{serverPlugins => plugins}/players.js (84%) rename src/lib/{playerPlugins => plugins}/pvp.js (94%) rename src/lib/{playerPlugins => plugins}/respawn.js (87%) create mode 100644 src/lib/plugins/settings.js create mode 100644 src/lib/plugins/signs.js rename src/lib/{playerPlugins => plugins}/sound.js (53%) rename src/lib/{playerPlugins => plugins}/stats.js (74%) rename src/lib/{serverPlugins => plugins}/tick.js (89%) rename src/lib/{playerPlugins => plugins}/updatePositions.js (97%) rename src/lib/{playerPlugins => plugins}/world.js (61%) delete mode 100644 src/lib/serverPlugins/chat.js delete mode 100644 src/lib/serverPlugins/communication.js delete mode 100644 src/lib/serverPlugins/login.js delete mode 100644 src/lib/serverPlugins/modpe.js delete mode 100644 src/lib/serverPlugins/settings.js delete mode 100644 src/lib/serverPlugins/sound.js delete mode 100644 src/lib/serverPlugins/world.js diff --git a/src/index.js b/src/index.js index a4e830a..db538ac 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,7 @@ var mc = require('minecraft-protocol'); var EventEmitter = require('events').EventEmitter; var path = require('path'); var requireIndex = require('requireindex'); -var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins')); +var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'plugins')); if (process.env.NODE_ENV === 'dev'){ require('longjohn'); } @@ -26,7 +26,9 @@ class MCServer extends EventEmitter { connect(options) { this._server = mc.createServer(options); - Object.keys(serverPlugins).forEach(pluginName => serverPlugins[pluginName](this, options)); + Object.keys(serverPlugins) + .filter(pluginName => serverPlugins[pluginName].server!=undefined) + .forEach(pluginName => serverPlugins[pluginName].server(this, options)); if(options.logging == true) this.createLog(); this._server.on('error', error => this.emit('error',error)); this._server.on('listening', () => this.emit('listening',this._server.socketServer.address().port)); diff --git a/src/lib/playerPlugins/communication.js b/src/lib/playerPlugins/communication.js deleted file mode 100644 index 0138f41..0000000 --- a/src/lib/playerPlugins/communication.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports=inject; - -function inject(serv,player) -{ - player._writeOthers= (packetName, packetFields) => - player - .getOthers() - .forEach((otherPlayer) => otherPlayer._client.write(packetName, packetFields)); - - player._writeOthersNearby = (packetName, packetFields) => - serv._writeArray(packetName, packetFields, player.nearbyPlayers()); - - player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player); - - player.getNearbyPlayers = (radius=player.entity.viewDistance*32) => serv.getNearby({ - world: player.world, - position: player.position, - radius: radius - }); - - player.nearbyPlayers = (radius=player.entity.viewDistance*32) => player.entity.nearbyEntities - .filter(e => e.type == 'player') - .map(e => e.player); -} \ No newline at end of file diff --git a/src/lib/playerPlugins/log.js b/src/lib/playerPlugins/log.js deleted file mode 100644 index eb92a72..0000000 --- a/src/lib/playerPlugins/log.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports=inject; - -function inject(serv,player) -{ - - player.on("connected",() => serv.log("[INFO]: " + player.username + ' connected')); - - player.on("spawned",() => serv.log("[INFO]: position written, player spawning...")); - - player.on("disconnected",() => serv.log("[INFO]: " + player.username + ' disconnected')); - - player.on("chat", message => serv.log("[INFO] " + '<' + player.username + '>' + ' ' + message)); - - player.on("kicked",(kicker,reason) => - serv.log(kicker.username + " kicked " + player.username + (reason ? " (" + reason + ")" : ""))); - -} \ No newline at end of file diff --git a/src/lib/playerPlugins/moderation.js b/src/lib/playerPlugins/moderation.js deleted file mode 100644 index 5735090..0000000 --- a/src/lib/playerPlugins/moderation.js +++ /dev/null @@ -1,22 +0,0 @@ -var moment=require("moment"); - -module.exports=inject; - -function inject(serv,player) -{ - player.kick = reason => - { - player._client.write('kick_disconnect', { - reason: reason ? JSON.stringify(reason) : '"You were kicked!"' - }); - }; - - player.ban = reason => { - reason = reason || "You were banned!"; - player.kick(reason); - var uuid=player._client.uuid; - serv.ban(uuid, reason); - }; - - player.pardon = () => serv.pardon(player._client.uuid); -} \ No newline at end of file diff --git a/src/lib/playerPlugins/settings.js b/src/lib/playerPlugins/settings.js deleted file mode 100644 index b1c0071..0000000 --- a/src/lib/playerPlugins/settings.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports=inject; - -function inject(serv,player) -{ - player.gameMode=serv.gameMode; - player.spawnPoint=serv.getSpawnPoint(); - player._client.on('settings',({viewDistance}) => { - player.view=viewDistance; - }); -} \ No newline at end of file diff --git a/src/lib/playerPlugins/signs.js b/src/lib/playerPlugins/signs.js deleted file mode 100644 index 298ef7e..0000000 --- a/src/lib/playerPlugins/signs.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports=inject; - -function inject(serv, player) -{ -//WIP: temporary removed -} \ No newline at end of file diff --git a/src/lib/playerPlugins/animations.js b/src/lib/plugins/animations.js similarity index 93% rename from src/lib/playerPlugins/animations.js rename to src/lib/plugins/animations.js index 4153248..3b730ed 100644 --- a/src/lib/playerPlugins/animations.js +++ b/src/lib/plugins/animations.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player._client.on("arm_animation", () => player._writeOthersNearby("animation", { @@ -30,4 +28,4 @@ function inject(serv, player) player.entity.crouching = false; } }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/blocks.js b/src/lib/plugins/blocks.js similarity index 92% rename from src/lib/playerPlugins/blocks.js rename to src/lib/plugins/blocks.js index 2394d23..00d64c2 100644 --- a/src/lib/playerPlugins/blocks.js +++ b/src/lib/plugins/blocks.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv,player) +module.exports.player=function(serv,player) { player.changeBlock=async (position,blockType,blockData) => { @@ -19,4 +17,4 @@ function inject(serv,player) }); player.setBlock = (position,blockType,blockData) => serv.setBlock(player.world,position,blockType,blockData); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/border.js b/src/lib/plugins/border.js similarity index 86% rename from src/lib/playerPlugins/border.js rename to src/lib/plugins/border.js index 3229d05..31f45ce 100644 --- a/src/lib/playerPlugins/border.js +++ b/src/lib/plugins/border.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { //WIP: Does't work /* player._client.write('world_border', { @@ -18,4 +16,4 @@ function inject(serv, player) action: 0, radius: 15 });*/ -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/chat.js b/src/lib/plugins/chat.js similarity index 69% rename from src/lib/playerPlugins/chat.js rename to src/lib/plugins/chat.js index d135414..ea4a213 100644 --- a/src/lib/playerPlugins/chat.js +++ b/src/lib/plugins/chat.js @@ -1,6 +1,13 @@ -module.exports=inject; +module.exports.server=function(serv) +{ + serv.broadcast = (message, color) => + serv.players.forEach(player => player.chat({ + "text": message, + "color": color + })); +}; -function inject(serv, player) +module.exports.player=function(serv, player) { player._client.on('chat', ({message} = {}) => { if(message[0]=="/") { @@ -20,4 +27,4 @@ function inject(serv, player) player.system = message => { player._client.write('chat', { message: JSON.stringify(message), position: 2 }); }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/chest.js b/src/lib/plugins/chest.js similarity index 93% rename from src/lib/playerPlugins/chest.js rename to src/lib/plugins/chest.js index ae9e0b8..2f90607 100644 --- a/src/lib/playerPlugins/chest.js +++ b/src/lib/plugins/chest.js @@ -1,8 +1,6 @@ var vec3 = require("vec3"); -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player._client.on('block_place', async ({location} = {}) => { var referencePosition=new vec3(location.x,location.y,location.z); diff --git a/src/lib/playerPlugins/commands.js b/src/lib/plugins/commands.js similarity index 99% rename from src/lib/playerPlugins/commands.js rename to src/lib/plugins/commands.js index 81924dc..cf43a36 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/plugins/commands.js @@ -1,9 +1,8 @@ var Vec3 = require('vec3'); -module.exports = inject; var Command = require('../command'); -function inject(serv, player) { +module.exports.player=function(serv, player) { var base = new Command({}); base.add({ @@ -331,4 +330,4 @@ function inject(serv, player) { var res = base.use(str); if(res) player.chat('' + res); }; -} +}; diff --git a/src/lib/plugins/communication.js b/src/lib/plugins/communication.js new file mode 100644 index 0000000..759b4cf --- /dev/null +++ b/src/lib/plugins/communication.js @@ -0,0 +1,46 @@ +module.exports.server=function(serv,settings) +{ + serv._writeAll= (packetName, packetFields) => + serv.players.forEach((player) => player._client.write(packetName, packetFields)); + + serv._writeArray= (packetName, packetFields, players) => + players.forEach((player) =>player._client.write(packetName, packetFields)); + + serv._writeNearby= (packetName, packetFields, loc) => + serv._writeArray(packetName, packetFields, serv.getNearby(loc)); + + serv.getNearby= ({world,position,radius=8*16*32}) => serv.players.filter( player => + player.world == world && + player.entity.position.distanceTo(position) <= radius + ); + + serv.getNearbyEntities= ({world,position,radius=8*16*32}) => Object.keys(serv.entities) + .map(eId => serv.entities[eId]) + .filter(entity => + entity.world == world && + entity.position.distanceTo(position) <= radius + ); +}; + +module.exports.player=function(serv,player) +{ + player._writeOthers= (packetName, packetFields) => + player + .getOthers() + .forEach((otherPlayer) => otherPlayer._client.write(packetName, packetFields)); + + player._writeOthersNearby = (packetName, packetFields) => + serv._writeArray(packetName, packetFields, player.nearbyPlayers()); + + player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player); + + player.getNearbyPlayers = (radius=player.entity.viewDistance*32) => serv.getNearby({ + world: player.world, + position: player.position, + radius: radius + }); + + player.nearbyPlayers = (radius=player.entity.viewDistance*32) => player.entity.nearbyEntities + .filter(e => e.type == 'player') + .map(e => e.player); +}; \ No newline at end of file diff --git a/src/lib/serverPlugins/daycycle.js b/src/lib/plugins/daycycle.js similarity index 85% rename from src/lib/serverPlugins/daycycle.js rename to src/lib/plugins/daycycle.js index e5606fd..41a39ea 100644 --- a/src/lib/serverPlugins/daycycle.js +++ b/src/lib/plugins/daycycle.js @@ -1,7 +1,4 @@ - -module.exports = inject; - -function inject(serv, settings) { +module.exports.server=function(serv, settings) { serv.setTime = (time) => { serv.time = time; serv._writeAll('update_time', { @@ -18,6 +15,6 @@ function inject(serv, settings) { if (!serv.doDaylightCycle) return; if (count % 20 == 0) { serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second - } + } }) -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/digging.js b/src/lib/plugins/digging.js similarity index 98% rename from src/lib/playerPlugins/digging.js rename to src/lib/plugins/digging.js index e022820..0147f2f 100644 --- a/src/lib/playerPlugins/digging.js +++ b/src/lib/plugins/digging.js @@ -1,8 +1,6 @@ var Vec3 = require("vec3"); -module.exports=inject; - -function inject(serv,player) +module.exports.player=function(serv,player) { player._client.on("block_dig",({location,status} = {}) => { var pos=new Vec3(location); diff --git a/src/lib/serverPlugins/entities.js b/src/lib/plugins/entities.js similarity index 97% rename from src/lib/serverPlugins/entities.js rename to src/lib/plugins/entities.js index 74f8e9d..8fdaf94 100644 --- a/src/lib/serverPlugins/entities.js +++ b/src/lib/plugins/entities.js @@ -5,9 +5,7 @@ var vec3 = require("vec3"); var EventEmitter = require('events').EventEmitter; var util = require('util'); -module.exports = inject; - -function inject(serv) { +module.exports.server=function(serv) { util.inherits(Entity, EventEmitter); @@ -86,7 +84,7 @@ function inject(serv) { entity.sendPosition = ({oldPos,onGround}) => { var diff = entity.position.minus(oldPos); - if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) + if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) serv._writeNearby('entity_teleport', { entityId: entity.id, x: entity.position.x, @@ -97,12 +95,12 @@ function inject(serv) { onGround: onGround }, entity); else serv._writeNearby('rel_entity_move', { - entityId: entity.id, - dX: diff.x, - dY: diff.y, - dZ: diff.z, - onGround: onGround - }, entity); + entityId: entity.id, + dX: diff.x, + dY: diff.y, + dZ: diff.z, + onGround: onGround + }, entity); entity.emit('positionChanged', oldPos); } @@ -236,7 +234,7 @@ function inject(serv) { }) ).catch((err)=> setTimeout(() => {throw err;},0)); }); - + serv.destroyEntity = entity => { serv._writeNearby('entity_destroy', { entityIds: [entity.id] diff --git a/src/lib/playerPlugins/header.js b/src/lib/plugins/header.js similarity index 81% rename from src/lib/playerPlugins/header.js rename to src/lib/plugins/header.js index ad06385..722bce7 100644 --- a/src/lib/playerPlugins/header.js +++ b/src/lib/plugins/header.js @@ -1,6 +1,4 @@ - module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player.playerlistUpdateText = (header, footer) => player._client.write('playerlist_header', { @@ -9,4 +7,4 @@ function inject(serv, player) }); player.playerlistUpdateText("Flying squid", "Test server"); -} +}; diff --git a/src/lib/playerPlugins/inventory.js b/src/lib/plugins/inventory.js similarity index 96% rename from src/lib/playerPlugins/inventory.js rename to src/lib/plugins/inventory.js index de2c39e..49a9249 100644 --- a/src/lib/playerPlugins/inventory.js +++ b/src/lib/plugins/inventory.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player.heldItemSlot=0; player.heldItem=0; @@ -55,4 +53,4 @@ function inject(serv, player) }); }); -} +}; diff --git a/src/lib/serverPlugins/log.js b/src/lib/plugins/log.js similarity index 68% rename from src/lib/serverPlugins/log.js rename to src/lib/plugins/log.js index a7529f4..bdd14d4 100644 --- a/src/lib/serverPlugins/log.js +++ b/src/lib/plugins/log.js @@ -4,9 +4,7 @@ var path = require('path'); var mkdirp = require('mkdirp'); var moment=require("moment"); -module.exports=inject; - -function inject(serv,settings) +module.exports.server=function(serv,settings) { serv.on("error", error => serv.log('[ERR]: Server: '+error.stack)); serv.on("clientError", (client,error) => serv.log('[ERR]: Client '+client.socket.remoteAddress + ':' + client.socket.remotePort+' : '+error.stack)); @@ -44,4 +42,20 @@ function inject(serv,settings) }); }); }; -} \ No newline at end of file +}; + +module.exports.player=function(serv,player) +{ + + player.on("connected",() => serv.log("[INFO]: " + player.username + ' connected')); + + player.on("spawned",() => serv.log("[INFO]: position written, player spawning...")); + + player.on("disconnected",() => serv.log("[INFO]: " + player.username + ' disconnected')); + + player.on("chat", message => serv.log("[INFO] " + '<' + player.username + '>' + ' ' + message)); + + player.on("kicked",(kicker,reason) => + serv.log(kicker.username + " kicked " + player.username + (reason ? " (" + reason + ")" : ""))); + +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/login.js b/src/lib/plugins/login.js similarity index 82% rename from src/lib/playerPlugins/login.js rename to src/lib/plugins/login.js index 8f24092..261f3c7 100644 --- a/src/lib/playerPlugins/login.js +++ b/src/lib/plugins/login.js @@ -1,9 +1,34 @@ var Entity=require("prismarine-entity"); var Vec3=require("vec3"); -module.exports=inject; +var path = require('path'); +var requireIndex = require('requireindex'); +var playerPlugins = requireIndex(path.join(__dirname,'..', 'plugins')); +var Player=require("../player"); -function inject(serv,player) +module.exports.server=function(serv,options) +{ + serv._server.on('connection', client => + client.on('error',error => serv.emit('clientError',client,error))); + + serv._server.on('login', async (client) => { + var player=new Player(); + player._client=client; + Object.keys(playerPlugins) + .filter(pluginName => playerPlugins[pluginName].player!=undefined) + .forEach(pluginName => playerPlugins[pluginName].player(serv, player, options)); + + serv.emit("newPlayer",player); + try { + await player.login(); + } + catch(err){ + setTimeout(() => {throw err;},0) + } + }); +}; + +module.exports.player=function(serv,player) { function addPlayer() { @@ -162,4 +187,4 @@ function inject(serv,player) player.sendRestMap(); sendChunkWhenMove(); }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/logout.js b/src/lib/plugins/logout.js similarity index 94% rename from src/lib/playerPlugins/logout.js rename to src/lib/plugins/logout.js index 99b6e6b..2edafd7 100644 --- a/src/lib/playerPlugins/logout.js +++ b/src/lib/plugins/logout.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv,player) +module.exports.player=function(serv,player) { player.despawnPlayers = despawnedPlayers => { player._client.write('entity_destroy', { @@ -31,4 +29,4 @@ function inject(serv,player) delete serv.uuidToPlayer[player._client.uuid]; } }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/serverPlugins/moderation.js b/src/lib/plugins/moderation.js similarity index 70% rename from src/lib/serverPlugins/moderation.js rename to src/lib/plugins/moderation.js index 626acfb..fd5b870 100644 --- a/src/lib/serverPlugins/moderation.js +++ b/src/lib/plugins/moderation.js @@ -2,9 +2,7 @@ var moment=require("moment"); var rp=require("request-promise"); var nodeUuid=require('node-uuid'); -module.exports = inject; - -function inject(serv) +module.exports.server=function(serv) { serv.ban = (uuid, reason) => { @@ -47,4 +45,23 @@ function inject(serv) } serv.bannedPlayers = {}; -} \ No newline at end of file +}; + +module.exports.player=function(serv,player) +{ + player.kick = reason => + { + player._client.write('kick_disconnect', { + reason: reason ? JSON.stringify(reason) : '"You were kicked!"' + }); + }; + + player.ban = reason => { + reason = reason || "You were banned!"; + player.kick(reason); + var uuid=player._client.uuid; + serv.ban(uuid, reason); + }; + + player.pardon = () => serv.pardon(player._client.uuid); +}; \ No newline at end of file diff --git a/src/lib/plugins/modpe.js b/src/lib/plugins/modpe.js new file mode 100644 index 0000000..22f2779 --- /dev/null +++ b/src/lib/plugins/modpe.js @@ -0,0 +1,241 @@ +var vec3 = require("vec3"); +var dir = require("node-dir"); +var fs = require("fs"); + +function requireFromString(src, filename) { + var Module = module.constructor; + var m = new Module(); + m._compile(src, filename); + return m.exports; +} + +function log(msg) { + console.log("[MODPE-NOINJECT] " + msg); +} + +function modpeApi() { + var Vec3 = null; + var vec3 = null; + + var server = null; + var player = null; + + module.exports.startDestroyBlock = startDestroyBlock; + module.exports.destroyBlock = destroyBlock; + module.exports.newLevel = newLevel; + module.exports.procCmd = procCmd; + module.exports.exec = exec; + module.exports.modTick = modTick; + module.exports.useItem = useItem; + module.exports.initSquid = initSquid; + function modTick(){} + function newLevel(){} + + function useItem(x,y,z,itemId,blockId){} + function startDestroyBlock(x,y,z,side){} + function destroyBlock(x,y,z,side){} + function procCmd(command){} + function exec(code){eval(code)} + + function initSquid(pl1, srv, v3) { + player = pl1; + server = srv; + vec3=v3; + Vec3=v3; + } + + function clientMessage(message) { + console.log(message); + player.chat(message); + } + + function setTile(x, y, z, id, damage) { + server.setBlock(server.overworld,new vec3(x, y, z), id, damage); + } + + function getTile(x, y, z) { + return server._worldSync.getBlockType(new vec3(x, y, z)); + } + + function preventDefault() { + } + + function getPlayerX() { + return player.entity.position.x/32; + } + + function getPlayerY() { + return player.entity.position.y/32; + } + + function getPlayerZ() { + return player.entity.position.z/32; + } + + function getPlayerEnt() { + return null; + } + + function getCarriedItem() { + return player.heldItem.blockId; + } + + var Player = { + getCarriedItem: function () { + return player.heldItem.blockId; + } + }; + var Entity = { + getPitch: function () { + return 1; + } + , getYaw: function () { + return 1; + } + }; + var Level = { + getGameMode: function () { + return player.gameMode; + } + , getData: function (x, y, z) { + return 0; + } + }; +} + +function convert(code) { + log("Started conversion..."); + var api = modpeApi.toString() + .split("\n"); + api[0] = ""; + api[api.length - 1] = ""; + var finapi = api.join("\n"); + code = finapi + code; + return code; +} + +module.exports.server=function(serv,settings) +{ + function log(msg){ + serv.log("[MPE]: "+msg); + } + if(!settings.modpe){ + log("Modpe support is not enabled, disabling injecting..."); + return; + } + log("Modpe injection start..."); + var modPePluginsDir = __dirname+"/../../../modpePlugins"; + log("Place your scripts in " + modPePluginsDir); + var modCount = 0; + var mods = []; + dir.readFiles(modPePluginsDir, { + match: /.js/ + , exclude: /^\./ + }, function (err, content, fname, next) { + if (err) throw err; + log("Converting " + fname); + content = convert(content); + var modname = fname.split("/")[fname.split("/") + .length - 1].split(".")[0]; + log("Loading mod " + modname); + mods.push(requireFromString(content)); + modCount++; + next(); + } + , function (err, files) { + if(err) return; + log('Loaded ' + modCount + " mods"); + }); + + serv.on("newPlayer", function (player) { + injectPlayer(serv, player); + }); + + function injectPlayer(serv, player) { + log("Injected into player"); + + initSquid(player, serv, vec3); + newLevel(); + + player._client.on("block_dig", function (packet) { + var pos = new vec3(packet.location); + if (packet.status == 0 && player.gameMode != 1) + startDestroyBlock(pos.x, pos.y, pos.z, 0); + else if (packet.status == 2) + destroyBlock(pos.x, pos.y, pos.z, 0); + else if (packet.status == 1) + console.log("Unused in ModPE"); + else if (packet.status == 0 && player.gameMode == 1) + destroyBlock(pos.x, pos.y, pos.z, 0); + }); + + player._client.on('position', function (packet) { + modTick(); + }); + + player._client.on("block_place", function (packet) { + if (packet.location.y < 0) return; + useItem(packet.location.x, packet.location.y, packet.location.z, + packet.heldItem.blockId, + serv._worldSync.getBlockType(new vec3(packet.location.x, packet.location.y, packet.location.z))); + }); + + player.on('modpe', function (command) { + try { + procCmd(command); + } + catch(err) { + console.log("MODPE error: "+err.stack); + } + }); + + function newLevel() { + mods.forEach(function (element, index, array) { + element.newLevel(); + }); + } + + function useItem(x, y, z, itemId, blockId) { + mods.forEach(function (element, index, array) { + element.useItem(x, y, z, itemId, blockId); + element.exec("lastUsedItem=" + itemId); + }); + } + + function modTick() { + mods.forEach(function (element, index, array) { + element.modTick(); + }); + } + + function exec(code) { + mods.forEach(function (element, index, array) { + element.exec(code); + }); + } + + function procCmd(command) { + mods.forEach(function (element, index, array) { + element.procCmd(command); + }); + } + + function startDestroyBlock(x, y, z, side) { + mods.forEach(function (element, index, array) { + element.startDestroyBlock(x, y, z, side); + }); + } + + function destroyBlock(x, y, z, side) { + mods.forEach(function (element, index, array) { + element.destroyBlock(x, y, z, side); + }); + } + + function initSquid(pl, sr, v3) { + mods.forEach(function (element, index, array) { + element.initSquid(pl, sr, v3); + }); + } + } +}; diff --git a/src/lib/serverPlugins/particle.js b/src/lib/plugins/particle.js similarity index 94% rename from src/lib/serverPlugins/particle.js rename to src/lib/plugins/particle.js index c83dc7c..1a7f272 100644 --- a/src/lib/serverPlugins/particle.js +++ b/src/lib/plugins/particle.js @@ -1,8 +1,6 @@ var vec3 = require("vec3"); -module.exports = inject; - -function inject(serv) { +module.exports.server=function(serv) { serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance,size,count}={}) => { var players = (typeof whitelist != 'undefined' ? (typeof whitelist == 'array' ? whitelist : [whitelist]) : serv.getNearby({ world: world, @@ -27,4 +25,4 @@ function inject(serv) { }); }); } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/placeBlock.js b/src/lib/plugins/placeBlock.js similarity index 96% rename from src/lib/playerPlugins/placeBlock.js rename to src/lib/plugins/placeBlock.js index 26ed2e6..00318b4 100644 --- a/src/lib/playerPlugins/placeBlock.js +++ b/src/lib/plugins/placeBlock.js @@ -9,11 +9,9 @@ var materialToSound = { 'wool': 'cloth', 'web': 'cloth', 'wood': 'wood' -} +}; -module.exports=inject; - -function inject(serv,player) +module.exports.player=function(serv,player) { player._client.on("block_place",({direction,heldItem,location} = {}) => { if(direction==-1 || heldItem.blockId==-1) return; @@ -41,6 +39,6 @@ function inject(serv,player) } }).catch((err)=> setTimeout(() => {throw err;},0)); }); -} +}; var directionToVector=[new vec3(0,-1,0),new vec3(0,1,0),new vec3(0,0,-1),new vec3(0,0,1),new vec3(-1,0,0),new vec3(1,0,0)]; diff --git a/src/lib/serverPlugins/players.js b/src/lib/plugins/players.js similarity index 84% rename from src/lib/serverPlugins/players.js rename to src/lib/plugins/players.js index 7be716d..59b668e 100644 --- a/src/lib/serverPlugins/players.js +++ b/src/lib/plugins/players.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv) +module.exports.server=function(serv) { serv.entityMaxId=0; serv.players=[]; @@ -13,4 +11,4 @@ function inject(serv) } return null; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/pvp.js b/src/lib/plugins/pvp.js similarity index 94% rename from src/lib/playerPlugins/pvp.js rename to src/lib/plugins/pvp.js index 01c875b..8fdeeaa 100644 --- a/src/lib/playerPlugins/pvp.js +++ b/src/lib/plugins/pvp.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player.updateHealth = (health) => { @@ -37,4 +35,4 @@ function inject(serv, player) attackEntity(target); }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/respawn.js b/src/lib/plugins/respawn.js similarity index 87% rename from src/lib/playerPlugins/respawn.js rename to src/lib/plugins/respawn.js index 01b028b..ef55ac8 100644 --- a/src/lib/playerPlugins/respawn.js +++ b/src/lib/plugins/respawn.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player._client.on("client_command", ({payload}) => { if(payload == 0) { @@ -16,4 +14,4 @@ function inject(serv, player) player.updateAndSpawnNearbyPlayers(); } }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/plugins/settings.js b/src/lib/plugins/settings.js new file mode 100644 index 0000000..b56df06 --- /dev/null +++ b/src/lib/plugins/settings.js @@ -0,0 +1,23 @@ +var vec3=require("vec3"); + + +function randomInt (low, high) { + return Math.floor(Math.random() * (high - low) + low); +} + +module.exports.server=function(serv,settings) +{ + serv.gameMode=settings.gameMode; + + serv.getSpawnPoint = () => new vec3(randomInt(5,20),81,randomInt(5,20)); +}; + + +module.exports.player=function(serv,player) +{ + player.gameMode=serv.gameMode; + player.spawnPoint=serv.getSpawnPoint(); + player._client.on('settings',({viewDistance}) => { + player.view=viewDistance; + }); +}; \ No newline at end of file diff --git a/src/lib/plugins/signs.js b/src/lib/plugins/signs.js new file mode 100644 index 0000000..c973881 --- /dev/null +++ b/src/lib/plugins/signs.js @@ -0,0 +1,4 @@ +module.exports.player=function(serv, player) +{ +//WIP: temporary removed +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/sound.js b/src/lib/plugins/sound.js similarity index 53% rename from src/lib/playerPlugins/sound.js rename to src/lib/plugins/sound.js index b4d8071..8e53fbe 100644 --- a/src/lib/playerPlugins/sound.js +++ b/src/lib/plugins/sound.js @@ -1,12 +1,43 @@ var vec3 = require('vec3'); -module.exports = inject; -function inject(serv, player) { +module.exports.server=function(serv) { + serv.playSound = (sound, world, position, {whitelist,blacklist=[],radius=32*32,volume=1.0,pitch=1.0}={}) => { + var players = (typeof whitelist != 'undefined' ? (typeof whitelist == 'array' ? whitelist : [whitelist]) : serv.getNearby({ + world: world, + position: position.scaled(32).floored(), + radius: radius // 32 blocks, fixed position + })); + players.filter(player => blacklist.indexOf(player) == -1) + .forEach(player => { + var pos = (position || player.entity.position.scaled(1/32)).scaled(8).floored(); + player._client.write('named_sound_effect', { + soundName: sound, + x: pos.x, + y: pos.y, + z: pos.z, + volume: volume, + pitch: Math.round(pitch*63) + }); + }); + }; + + serv.playNoteBlock = (world, position, pitch) => { + serv.emitParticle(23, world, position.clone().add(vec3(0.5, 1.5, 0.5)), { + count: 1, + size: vec3(0, 0, 0) + }); + serv.playSound('note.harp', world, position, { pitch: serv.getNote(pitch) }); + }; + + serv.getNote = note => 0.5 * Math.pow(Math.pow(2, 1/12), note); +}; + +module.exports.player=function(serv, player) { player.playSound = (sound, opt={}) => { opt.whitelist = player; serv.playSound(sound, player.world, null, opt); - } + }; player._client.on('block_place', ({location}={}) => { if (player.entity.crouching) return; @@ -33,4 +64,4 @@ function inject(serv, player) { serv.playNoteBlock(player.world, pos, data.note); }).catch((err)=> setTimeout(() => {throw err;},0)); }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/stats.js b/src/lib/plugins/stats.js similarity index 74% rename from src/lib/playerPlugins/stats.js rename to src/lib/plugins/stats.js index 1c7cd72..de14487 100644 --- a/src/lib/playerPlugins/stats.js +++ b/src/lib/plugins/stats.js @@ -1,6 +1,4 @@ -module.exports=inject; - -function inject(serv, player) +module.exports.player=function(serv, player) { player._client.on('client_command', ({payload} = {}) => { if(payload==1){ @@ -8,4 +6,4 @@ function inject(serv, player) player.system ("WIP, press ESC"); } }); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/serverPlugins/tick.js b/src/lib/plugins/tick.js similarity index 89% rename from src/lib/serverPlugins/tick.js rename to src/lib/plugins/tick.js index 5ec0a6d..a7351bd 100644 --- a/src/lib/serverPlugins/tick.js +++ b/src/lib/plugins/tick.js @@ -1,7 +1,4 @@ - -module.exports = inject; - -function inject(serv, settings) { +module.exports.server=function(serv, settings) { serv.tickCount = 0; serv.lastTickTime = 0; @@ -25,5 +22,5 @@ function inject(serv, settings) { serv.setTickInterval(20); -} +}; diff --git a/src/lib/playerPlugins/updatePositions.js b/src/lib/plugins/updatePositions.js similarity index 97% rename from src/lib/playerPlugins/updatePositions.js rename to src/lib/plugins/updatePositions.js index d9c6bb5..731e1af 100644 --- a/src/lib/playerPlugins/updatePositions.js +++ b/src/lib/plugins/updatePositions.js @@ -1,12 +1,10 @@ var vec3 = require("vec3"); -module.exports=inject; - vec3.Vec3.prototype.toFixedPosition=function() { return this.scaled(32).floored(); }; -function inject(serv,player) +module.exports.player=function(serv,player) { player._client.on('look', ({yaw,pitch,onGround} = {}) => sendLook(yaw,pitch,onGround)); @@ -85,4 +83,4 @@ function inject(serv,player) flags: 0x00 }); }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/playerPlugins/world.js b/src/lib/plugins/world.js similarity index 61% rename from src/lib/playerPlugins/world.js rename to src/lib/plugins/world.js index 73e5c51..0a69c2f 100644 --- a/src/lib/playerPlugins/world.js +++ b/src/lib/plugins/world.js @@ -1,9 +1,58 @@ var vec3=require("vec3"); var spiralloop = require('spiralloop'); -module.exports = inject; +var Chunk = require('prismarine-chunk')(require("../version")); +var World = require('prismarine-world'); +var Vec3 = require('vec3'); +var WorldSync = require("prismarine-world-sync"); -function inject(serv, player) { +var generations={ + 'grass_field':require("../worldGenerations/grass_field"), + 'diamond_square':require("../worldGenerations/diamond_square"), + 'superflat':require("../worldGenerations/superflat"), + 'all_the_blocks':require("../worldGenerations/all_the_blocks"), + 'nether':require("../worldGenerations/nether") +}; + +module.exports.server=function(serv,{regionFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) { + generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32); + serv.emit("seed",generation.options.seed); + serv.overworld = new World(generations[generation.name](generation.options), regionFolder); + serv.netherworld = new World(generations["nether"]({})); + //serv.endworld = new World(generations["end"]({})); + + serv._worldSync=new WorldSync(serv.overworld); + + // WILL BE REMOVED WHEN ACTUALLY IMPLEMENTED + serv.overworld.blockEntityData = {}; + serv.netherworld.blockEntityData = {}; + ////////////// + + serv.pregenWorld = (world, size=3) => { + var promises = []; + for (var x = -size; x < size; x++) { + for (var z = -size; z < size; z++) { + promises.push(world.getColumn(x, z)); + } + } + return Promise.all(promises); + }; + + serv.setBlock = async (world,position,blockType,blockData) => + { + serv.players + .filter(p => p.world==world) + .forEach(player => player.sendBlock(position, blockType, blockData)); + + await world.setBlockType(position,blockType); + await world.setBlockData(position,blockData); + }; + + //serv.pregenWorld(serv.overworld).then(() => serv.log('Pre-Generated Overworld')); + //serv.pregenWorld(serv.netherworld).then(() => serv.log('Pre-Generated Nether')); +}; + +module.exports.player=function(serv, player) { player.spawnEntity = entity => { player._client.write(entity.spawnPacketName, entity.getSpawnPacket()); @@ -118,4 +167,4 @@ function inject(serv, player) { player.sendRestMap(); }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/lib/serverPlugins/chat.js b/src/lib/serverPlugins/chat.js deleted file mode 100644 index cb8726a..0000000 --- a/src/lib/serverPlugins/chat.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports=inject; - -function inject(serv) -{ - serv.broadcast = (message, color) => - serv.players.forEach(player => player.chat({ - "text": message, - "color": color - })); -} \ No newline at end of file diff --git a/src/lib/serverPlugins/communication.js b/src/lib/serverPlugins/communication.js deleted file mode 100644 index e58f414..0000000 --- a/src/lib/serverPlugins/communication.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports=inject; - -function inject(serv,settings) -{ - serv._writeAll= (packetName, packetFields) => - serv.players.forEach((player) => player._client.write(packetName, packetFields)); - - serv._writeArray= (packetName, packetFields, players) => - players.forEach((player) =>player._client.write(packetName, packetFields)); - - serv._writeNearby= (packetName, packetFields, loc) => - serv._writeArray(packetName, packetFields, serv.getNearby(loc)); - - serv.getNearby= ({world,position,radius=8*16*32}) => serv.players.filter( player => - player.world == world && - player.entity.position.distanceTo(position) <= radius - ); - - serv.getNearbyEntities= ({world,position,radius=8*16*32}) => Object.keys(serv.entities) - .map(eId => serv.entities[eId]) - .filter(entity => - entity.world == world && - entity.position.distanceTo(position) <= radius - ); -} \ No newline at end of file diff --git a/src/lib/serverPlugins/login.js b/src/lib/serverPlugins/login.js deleted file mode 100644 index 8718b27..0000000 --- a/src/lib/serverPlugins/login.js +++ /dev/null @@ -1,27 +0,0 @@ -var path = require('path'); -var requireIndex = require('requireindex'); -var playerPlugins = requireIndex(path.join(__dirname,'..', 'playerPlugins')); -var Player=require("../player"); - -module.exports = inject; - -function inject(serv,options) -{ - serv._server.on('connection', client => - client.on('error',error => serv.emit('clientError',client,error))); - - serv._server.on('login', async (client) => { - var player=new Player(); - player._client=client; - Object.keys(playerPlugins) - .forEach(pluginName => playerPlugins[pluginName](serv, player, options)); - - serv.emit("newPlayer",player); - try { - await player.login(); - } - catch(err){ - setTimeout(() => {throw err;},0) - } - }); -} \ No newline at end of file diff --git a/src/lib/serverPlugins/modpe.js b/src/lib/serverPlugins/modpe.js deleted file mode 100644 index 43b4a90..0000000 --- a/src/lib/serverPlugins/modpe.js +++ /dev/null @@ -1,243 +0,0 @@ -var vec3 = require("vec3"); -var dir = require("node-dir"); -var fs = require("fs"); - -module.exports=inject; - -function requireFromString(src, filename) { - var Module = module.constructor; - var m = new Module(); - m._compile(src, filename); - return m.exports; -} - -function log(msg) { - console.log("[MODPE-NOINJECT] " + msg); -} - -function modpeApi() { - var Vec3 = null; - var vec3 = null; - - var server = null; - var player = null; - - module.exports.startDestroyBlock = startDestroyBlock; - module.exports.destroyBlock = destroyBlock; - module.exports.newLevel = newLevel; - module.exports.procCmd = procCmd; - module.exports.exec = exec; - module.exports.modTick = modTick; - module.exports.useItem = useItem; - module.exports.initSquid = initSquid; - function modTick(){} - function newLevel(){} - - function useItem(x,y,z,itemId,blockId){} - function startDestroyBlock(x,y,z,side){} - function destroyBlock(x,y,z,side){} - function procCmd(command){} - function exec(code){eval(code)} - - function initSquid(pl1, srv, v3) { - player = pl1; - server = srv; - vec3=v3; - Vec3=v3; - } - - function clientMessage(message) { - console.log(message); - player.chat(message); - } - - function setTile(x, y, z, id, damage) { - server.setBlock(server.overworld,new vec3(x, y, z), id, damage); - } - - function getTile(x, y, z) { - return server._worldSync.getBlockType(new vec3(x, y, z)); - } - - function preventDefault() { - } - - function getPlayerX() { - return player.entity.position.x/32; - } - - function getPlayerY() { - return player.entity.position.y/32; - } - - function getPlayerZ() { - return player.entity.position.z/32; - } - - function getPlayerEnt() { - return null; - } - - function getCarriedItem() { - return player.heldItem.blockId; - } - - var Player = { - getCarriedItem: function () { - return player.heldItem.blockId; - } - }; - var Entity = { - getPitch: function () { - return 1; - } - , getYaw: function () { - return 1; - } - }; - var Level = { - getGameMode: function () { - return player.gameMode; - } - , getData: function (x, y, z) { - return 0; - } - }; -} - -function convert(code) { - log("Started conversion..."); - var api = modpeApi.toString() - .split("\n"); - api[0] = ""; - api[api.length - 1] = ""; - var finapi = api.join("\n"); - code = finapi + code; - return code; -} - -function inject(serv,settings) -{ - function log(msg){ - serv.log("[MPE]: "+msg); - } - if(!settings.modpe){ - log("Modpe support is not enabled, disabling injecting..."); - return; - } - log("Modpe injection start..."); - var modPePluginsDir = __dirname+"/../../../modpePlugins"; - log("Place your scripts in " + modPePluginsDir); - var modCount = 0; - var mods = []; - dir.readFiles(modPePluginsDir, { - match: /.js/ - , exclude: /^\./ - }, function (err, content, fname, next) { - if (err) throw err; - log("Converting " + fname); - content = convert(content); - var modname = fname.split("/")[fname.split("/") - .length - 1].split(".")[0]; - log("Loading mod " + modname); - mods.push(requireFromString(content)); - modCount++; - next(); - } - , function (err, files) { - if(err) return; - log('Loaded ' + modCount + " mods"); - }); - - serv.on("newPlayer", function (player) { - injectPlayer(serv, player); - }); - - function injectPlayer(serv, player) { - log("Injected into player"); - - initSquid(player, serv, vec3); - newLevel(); - - player._client.on("block_dig", function (packet) { - var pos = new vec3(packet.location); - if (packet.status == 0 && player.gameMode != 1) - startDestroyBlock(pos.x, pos.y, pos.z, 0); - else if (packet.status == 2) - destroyBlock(pos.x, pos.y, pos.z, 0); - else if (packet.status == 1) - console.log("Unused in ModPE"); - else if (packet.status == 0 && player.gameMode == 1) - destroyBlock(pos.x, pos.y, pos.z, 0); - }); - - player._client.on('position', function (packet) { - modTick(); - }); - - player._client.on("block_place", function (packet) { - if (packet.location.y < 0) return; - useItem(packet.location.x, packet.location.y, packet.location.z, - packet.heldItem.blockId, - serv._worldSync.getBlockType(new vec3(packet.location.x, packet.location.y, packet.location.z))); - }); - - player.on('modpe', function (command) { - try { - procCmd(command); - } - catch(err) { - console.log("MODPE error: "+err.stack); - } - }); - - function newLevel() { - mods.forEach(function (element, index, array) { - element.newLevel(); - }); - } - - function useItem(x, y, z, itemId, blockId) { - mods.forEach(function (element, index, array) { - element.useItem(x, y, z, itemId, blockId); - element.exec("lastUsedItem=" + itemId); - }); - } - - function modTick() { - mods.forEach(function (element, index, array) { - element.modTick(); - }); - } - - function exec(code) { - mods.forEach(function (element, index, array) { - element.exec(code); - }); - } - - function procCmd(command) { - mods.forEach(function (element, index, array) { - element.procCmd(command); - }); - } - - function startDestroyBlock(x, y, z, side) { - mods.forEach(function (element, index, array) { - element.startDestroyBlock(x, y, z, side); - }); - } - - function destroyBlock(x, y, z, side) { - mods.forEach(function (element, index, array) { - element.destroyBlock(x, y, z, side); - }); - } - - function initSquid(pl, sr, v3) { - mods.forEach(function (element, index, array) { - element.initSquid(pl, sr, v3); - }); - } - } -} diff --git a/src/lib/serverPlugins/settings.js b/src/lib/serverPlugins/settings.js deleted file mode 100644 index e9af119..0000000 --- a/src/lib/serverPlugins/settings.js +++ /dev/null @@ -1,15 +0,0 @@ -var vec3=require("vec3"); - -module.exports=inject; - - -function randomInt (low, high) { - return Math.floor(Math.random() * (high - low) + low); -} - -function inject(serv,settings) -{ - serv.gameMode=settings.gameMode; - - serv.getSpawnPoint = () => new vec3(randomInt(5,20),81,randomInt(5,20)); -} diff --git a/src/lib/serverPlugins/sound.js b/src/lib/serverPlugins/sound.js deleted file mode 100644 index 5ce5764..0000000 --- a/src/lib/serverPlugins/sound.js +++ /dev/null @@ -1,35 +0,0 @@ -var vec3 = require('vec3'); - -module.exports = inject; - -function inject(serv) { - serv.playSound = (sound, world, position, {whitelist,blacklist=[],radius=32*32,volume=1.0,pitch=1.0}={}) => { - var players = (typeof whitelist != 'undefined' ? (typeof whitelist == 'array' ? whitelist : [whitelist]) : serv.getNearby({ - world: world, - position: position.scaled(32).floored(), - radius: radius // 32 blocks, fixed position - })); - players.filter(player => blacklist.indexOf(player) == -1) - .forEach(player => { - var pos = (position || player.entity.position.scaled(1/32)).scaled(8).floored(); - player._client.write('named_sound_effect', { - soundName: sound, - x: pos.x, - y: pos.y, - z: pos.z, - volume: volume, - pitch: Math.round(pitch*63) - }); - }); - } - - serv.playNoteBlock = (world, position, pitch) => { - serv.emitParticle(23, world, position.clone().add(vec3(0.5, 1.5, 0.5)), { - count: 1, - size: vec3(0, 0, 0) - }); - serv.playSound('note.harp', world, position, { pitch: serv.getNote(pitch) }); - } - - serv.getNote = note => 0.5 * Math.pow(Math.pow(2, 1/12), note); -} \ No newline at end of file diff --git a/src/lib/serverPlugins/world.js b/src/lib/serverPlugins/world.js deleted file mode 100644 index 8b6c4eb..0000000 --- a/src/lib/serverPlugins/world.js +++ /dev/null @@ -1,52 +0,0 @@ -var Chunk = require('prismarine-chunk')(require("../version")); -var World = require('prismarine-world'); -var Vec3 = require('vec3'); -var WorldSync = require("prismarine-world-sync"); - -var generations={ - 'grass_field':require("../worldGenerations/grass_field"), - 'diamond_square':require("../worldGenerations/diamond_square"), - 'superflat':require("../worldGenerations/superflat"), - 'all_the_blocks':require("../worldGenerations/all_the_blocks"), - 'nether':require("../worldGenerations/nether") -}; - -module.exports = inject; - -function inject(serv,{regionFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) { - generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32); - serv.emit("seed",generation.options.seed); - serv.overworld = new World(generations[generation.name](generation.options), regionFolder); - serv.netherworld = new World(generations["nether"]({})); - //serv.endworld = new World(generations["end"]({})); - - serv._worldSync=new WorldSync(serv.overworld); - - // WILL BE REMOVED WHEN ACTUALLY IMPLEMENTED - serv.overworld.blockEntityData = {}; - serv.netherworld.blockEntityData = {}; - ////////////// - - serv.pregenWorld = (world, size=3) => { - var promises = []; - for (var x = -size; x < size; x++) { - for (var z = -size; z < size; z++) { - promises.push(world.getColumn(x, z)); - } - } - return Promise.all(promises); - }; - - serv.setBlock = async (world,position,blockType,blockData) => - { - serv.players - .filter(p => p.world==world) - .forEach(player => player.sendBlock(position, blockType, blockData)); - - await world.setBlockType(position,blockType); - await world.setBlockData(position,blockData); - }; - - //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