put together player plugins and server plugins

This commit is contained in:
Romain Beaumont 2015-11-16 20:23:09 +01:00
parent 15350791df
commit 39dc37f94d
42 changed files with 527 additions and 593 deletions

View file

@ -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));

View file

@ -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);
}

View file

@ -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 + ")" : "")));
}

View file

@ -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);
}

View file

@ -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;
});
}

View file

@ -1,6 +0,0 @@
module.exports=inject;
function inject(serv, player)
{
//WIP: temporary removed
}

View file

@ -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;
}
});
}
};

View file

@ -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);
}
};

View file

@ -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
});*/
}
};

View file

@ -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 });
};
}
};

View file

@ -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);

View file

@ -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);
};
}
};

View file

@ -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);
};

View file

@ -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
}
}
})
}
};

View file

@ -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);

View file

@ -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]

View file

@ -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");
}
};

View file

@ -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)
});
});
}
};

View file

@ -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)
});
});
};
}
};
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 + ")" : "")));
};

View file

@ -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();
};
}
};

View file

@ -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];
}
});
}
};

View file

@ -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 = {};
}
};
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);
};

241
src/lib/plugins/modpe.js Normal file
View file

@ -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);
});
}
}
};

View file

@ -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) {
});
});
}
}
};

View file

@ -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)];

View file

@ -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;
};
}
};

View file

@ -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);
});
}
};

View file

@ -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();
}
});
}
};

View file

@ -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;
});
};

4
src/lib/plugins/signs.js Normal file
View file

@ -0,0 +1,4 @@
module.exports.player=function(serv, player)
{
//WIP: temporary removed
};

View file

@ -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));
});
}
};

View file

@ -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");
}
});
}
};

View file

@ -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);
}
};

View file

@ -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
});
};
}
};

View file

@ -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();
};
}
};

View file

@ -1,10 +0,0 @@
module.exports=inject;
function inject(serv)
{
serv.broadcast = (message, color) =>
serv.players.forEach(player => player.chat({
"text": message,
"color": color
}));
}

View file

@ -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
);
}

View file

@ -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)
}
});
}

View file

@ -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);
});
}
}
}

View file

@ -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));
}

View file

@ -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);
}

View file

@ -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'));
}