mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-05 11:10:44 +00:00
put together player plugins and server plugins
This commit is contained in:
parent
15350791df
commit
39dc37f94d
42 changed files with 527 additions and 593 deletions
|
|
@ -2,7 +2,7 @@ var mc = require('minecraft-protocol');
|
||||||
var EventEmitter = require('events').EventEmitter;
|
var EventEmitter = require('events').EventEmitter;
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var requireIndex = require('requireindex');
|
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'){
|
if (process.env.NODE_ENV === 'dev'){
|
||||||
require('longjohn');
|
require('longjohn');
|
||||||
}
|
}
|
||||||
|
|
@ -26,7 +26,9 @@ class MCServer extends EventEmitter {
|
||||||
|
|
||||||
connect(options) {
|
connect(options) {
|
||||||
this._server = mc.createServer(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();
|
if(options.logging == true) this.createLog();
|
||||||
this._server.on('error', error => this.emit('error',error));
|
this._server.on('error', error => this.emit('error',error));
|
||||||
this._server.on('listening', () => this.emit('listening',this._server.socketServer.address().port));
|
this._server.on('listening', () => this.emit('listening',this._server.socketServer.address().port));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
@ -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 + ")" : "")));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
module.exports=inject;
|
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
|
||||||
//WIP: temporary removed
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player._client.on("arm_animation", () =>
|
player._client.on("arm_animation", () =>
|
||||||
player._writeOthersNearby("animation", {
|
player._writeOthersNearby("animation", {
|
||||||
|
|
@ -30,4 +28,4 @@ function inject(serv, player)
|
||||||
player.entity.crouching = false;
|
player.entity.crouching = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv,player)
|
||||||
|
|
||||||
function inject(serv,player)
|
|
||||||
{
|
{
|
||||||
player.changeBlock=async (position,blockType,blockData) =>
|
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);
|
player.setBlock = (position,blockType,blockData) => serv.setBlock(player.world,position,blockType,blockData);
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
//WIP: Does't work
|
//WIP: Does't work
|
||||||
/* player._client.write('world_border', {
|
/* player._client.write('world_border', {
|
||||||
|
|
@ -18,4 +16,4 @@ function inject(serv, player)
|
||||||
action: 0,
|
action: 0,
|
||||||
radius: 15
|
radius: 15
|
||||||
});*/
|
});*/
|
||||||
}
|
};
|
||||||
|
|
@ -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} = {}) => {
|
player._client.on('chat', ({message} = {}) => {
|
||||||
if(message[0]=="/") {
|
if(message[0]=="/") {
|
||||||
|
|
@ -20,4 +27,4 @@ function inject(serv, player)
|
||||||
player.system = message => {
|
player.system = message => {
|
||||||
player._client.write('chat', { message: JSON.stringify(message), position: 2 });
|
player._client.write('chat', { message: JSON.stringify(message), position: 2 });
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
var vec3 = require("vec3");
|
var vec3 = require("vec3");
|
||||||
|
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player._client.on('block_place', async ({location} = {}) => {
|
player._client.on('block_place', async ({location} = {}) => {
|
||||||
var referencePosition=new vec3(location.x,location.y,location.z);
|
var referencePosition=new vec3(location.x,location.y,location.z);
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
var Vec3 = require('vec3');
|
var Vec3 = require('vec3');
|
||||||
module.exports = inject;
|
|
||||||
|
|
||||||
var Command = require('../command');
|
var Command = require('../command');
|
||||||
|
|
||||||
function inject(serv, player) {
|
module.exports.player=function(serv, player) {
|
||||||
var base = new Command({});
|
var base = new Command({});
|
||||||
|
|
||||||
base.add({
|
base.add({
|
||||||
|
|
@ -331,4 +330,4 @@ function inject(serv, player) {
|
||||||
var res = base.use(str);
|
var res = base.use(str);
|
||||||
if(res) player.chat('' + res);
|
if(res) player.chat('' + res);
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
46
src/lib/plugins/communication.js
Normal file
46
src/lib/plugins/communication.js
Normal 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);
|
||||||
|
};
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
|
module.exports.server=function(serv, settings) {
|
||||||
module.exports = inject;
|
|
||||||
|
|
||||||
function inject(serv, settings) {
|
|
||||||
serv.setTime = (time) => {
|
serv.setTime = (time) => {
|
||||||
serv.time = time;
|
serv.time = time;
|
||||||
serv._writeAll('update_time', {
|
serv._writeAll('update_time', {
|
||||||
|
|
@ -18,6 +15,6 @@ function inject(serv, settings) {
|
||||||
if (!serv.doDaylightCycle) return;
|
if (!serv.doDaylightCycle) return;
|
||||||
if (count % 20 == 0) {
|
if (count % 20 == 0) {
|
||||||
serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second
|
serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
};
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
var Vec3 = require("vec3");
|
var Vec3 = require("vec3");
|
||||||
|
|
||||||
module.exports=inject;
|
module.exports.player=function(serv,player)
|
||||||
|
|
||||||
function inject(serv,player)
|
|
||||||
{
|
{
|
||||||
player._client.on("block_dig",({location,status} = {}) => {
|
player._client.on("block_dig",({location,status} = {}) => {
|
||||||
var pos=new Vec3(location);
|
var pos=new Vec3(location);
|
||||||
|
|
@ -5,9 +5,7 @@ var vec3 = require("vec3");
|
||||||
var EventEmitter = require('events').EventEmitter;
|
var EventEmitter = require('events').EventEmitter;
|
||||||
var util = require('util');
|
var util = require('util');
|
||||||
|
|
||||||
module.exports = inject;
|
module.exports.server=function(serv) {
|
||||||
|
|
||||||
function inject(serv) {
|
|
||||||
|
|
||||||
util.inherits(Entity, EventEmitter);
|
util.inherits(Entity, EventEmitter);
|
||||||
|
|
||||||
|
|
@ -97,12 +95,12 @@ function inject(serv) {
|
||||||
onGround: onGround
|
onGround: onGround
|
||||||
}, entity);
|
}, entity);
|
||||||
else serv._writeNearby('rel_entity_move', {
|
else serv._writeNearby('rel_entity_move', {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
dX: diff.x,
|
dX: diff.x,
|
||||||
dY: diff.y,
|
dY: diff.y,
|
||||||
dZ: diff.z,
|
dZ: diff.z,
|
||||||
onGround: onGround
|
onGround: onGround
|
||||||
}, entity);
|
}, entity);
|
||||||
|
|
||||||
entity.emit('positionChanged', oldPos);
|
entity.emit('positionChanged', oldPos);
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player.playerlistUpdateText = (header, footer) =>
|
player.playerlistUpdateText = (header, footer) =>
|
||||||
player._client.write('playerlist_header', {
|
player._client.write('playerlist_header', {
|
||||||
|
|
@ -9,4 +7,4 @@ function inject(serv, player)
|
||||||
});
|
});
|
||||||
|
|
||||||
player.playerlistUpdateText("Flying squid", "Test server");
|
player.playerlistUpdateText("Flying squid", "Test server");
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player.heldItemSlot=0;
|
player.heldItemSlot=0;
|
||||||
player.heldItem=0;
|
player.heldItem=0;
|
||||||
|
|
@ -55,4 +53,4 @@ function inject(serv, player)
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -4,9 +4,7 @@ var path = require('path');
|
||||||
var mkdirp = require('mkdirp');
|
var mkdirp = require('mkdirp');
|
||||||
var moment=require("moment");
|
var moment=require("moment");
|
||||||
|
|
||||||
module.exports=inject;
|
module.exports.server=function(serv,settings)
|
||||||
|
|
||||||
function inject(serv,settings)
|
|
||||||
{
|
{
|
||||||
serv.on("error", error => serv.log('[ERR]: Server: '+error.stack));
|
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));
|
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 + ")" : "")));
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -1,9 +1,34 @@
|
||||||
var Entity=require("prismarine-entity");
|
var Entity=require("prismarine-entity");
|
||||||
var Vec3=require("vec3");
|
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()
|
function addPlayer()
|
||||||
{
|
{
|
||||||
|
|
@ -162,4 +187,4 @@ function inject(serv,player)
|
||||||
player.sendRestMap();
|
player.sendRestMap();
|
||||||
sendChunkWhenMove();
|
sendChunkWhenMove();
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv,player)
|
||||||
|
|
||||||
function inject(serv,player)
|
|
||||||
{
|
{
|
||||||
player.despawnPlayers = despawnedPlayers => {
|
player.despawnPlayers = despawnedPlayers => {
|
||||||
player._client.write('entity_destroy', {
|
player._client.write('entity_destroy', {
|
||||||
|
|
@ -31,4 +29,4 @@ function inject(serv,player)
|
||||||
delete serv.uuidToPlayer[player._client.uuid];
|
delete serv.uuidToPlayer[player._client.uuid];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -2,9 +2,7 @@ var moment=require("moment");
|
||||||
var rp=require("request-promise");
|
var rp=require("request-promise");
|
||||||
var nodeUuid=require('node-uuid');
|
var nodeUuid=require('node-uuid');
|
||||||
|
|
||||||
module.exports = inject;
|
module.exports.server=function(serv)
|
||||||
|
|
||||||
function inject(serv)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
serv.ban = (uuid, reason) => {
|
serv.ban = (uuid, reason) => {
|
||||||
|
|
@ -47,4 +45,23 @@ function inject(serv)
|
||||||
}
|
}
|
||||||
|
|
||||||
serv.bannedPlayers = {};
|
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
241
src/lib/plugins/modpe.js
Normal 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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
var vec3 = require("vec3");
|
var vec3 = require("vec3");
|
||||||
|
|
||||||
module.exports = inject;
|
module.exports.server=function(serv) {
|
||||||
|
|
||||||
function inject(serv) {
|
|
||||||
serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance,size,count}={}) => {
|
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({
|
var players = (typeof whitelist != 'undefined' ? (typeof whitelist == 'array' ? whitelist : [whitelist]) : serv.getNearby({
|
||||||
world: world,
|
world: world,
|
||||||
|
|
@ -27,4 +25,4 @@ function inject(serv) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
@ -9,11 +9,9 @@ var materialToSound = {
|
||||||
'wool': 'cloth',
|
'wool': 'cloth',
|
||||||
'web': 'cloth',
|
'web': 'cloth',
|
||||||
'wood': 'wood'
|
'wood': 'wood'
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports=inject;
|
module.exports.player=function(serv,player)
|
||||||
|
|
||||||
function inject(serv,player)
|
|
||||||
{
|
{
|
||||||
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
||||||
if(direction==-1 || heldItem.blockId==-1) return;
|
if(direction==-1 || heldItem.blockId==-1) return;
|
||||||
|
|
@ -41,6 +39,6 @@ function inject(serv,player)
|
||||||
}
|
}
|
||||||
}).catch((err)=> setTimeout(() => {throw err;},0));
|
}).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)];
|
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)];
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.server=function(serv)
|
||||||
|
|
||||||
function inject(serv)
|
|
||||||
{
|
{
|
||||||
serv.entityMaxId=0;
|
serv.entityMaxId=0;
|
||||||
serv.players=[];
|
serv.players=[];
|
||||||
|
|
@ -13,4 +11,4 @@ function inject(serv)
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
player.updateHealth = (health) => {
|
player.updateHealth = (health) => {
|
||||||
|
|
@ -37,4 +35,4 @@ function inject(serv, player)
|
||||||
attackEntity(target);
|
attackEntity(target);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player._client.on("client_command", ({payload}) => {
|
player._client.on("client_command", ({payload}) => {
|
||||||
if(payload == 0) {
|
if(payload == 0) {
|
||||||
|
|
@ -16,4 +14,4 @@ function inject(serv, player)
|
||||||
player.updateAndSpawnNearbyPlayers();
|
player.updateAndSpawnNearbyPlayers();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
23
src/lib/plugins/settings.js
Normal file
23
src/lib/plugins/settings.js
Normal 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
4
src/lib/plugins/signs.js
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
module.exports.player=function(serv, player)
|
||||||
|
{
|
||||||
|
//WIP: temporary removed
|
||||||
|
};
|
||||||
|
|
@ -1,12 +1,43 @@
|
||||||
var vec3 = require('vec3');
|
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={}) => {
|
player.playSound = (sound, opt={}) => {
|
||||||
opt.whitelist = player;
|
opt.whitelist = player;
|
||||||
serv.playSound(sound, player.world, null, opt);
|
serv.playSound(sound, player.world, null, opt);
|
||||||
}
|
};
|
||||||
|
|
||||||
player._client.on('block_place', ({location}={}) => {
|
player._client.on('block_place', ({location}={}) => {
|
||||||
if (player.entity.crouching) return;
|
if (player.entity.crouching) return;
|
||||||
|
|
@ -33,4 +64,4 @@ function inject(serv, player) {
|
||||||
serv.playNoteBlock(player.world, pos, data.note);
|
serv.playNoteBlock(player.world, pos, data.note);
|
||||||
}).catch((err)=> setTimeout(() => {throw err;},0));
|
}).catch((err)=> setTimeout(() => {throw err;},0));
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports=inject;
|
module.exports.player=function(serv, player)
|
||||||
|
|
||||||
function inject(serv, player)
|
|
||||||
{
|
{
|
||||||
player._client.on('client_command', ({payload} = {}) => {
|
player._client.on('client_command', ({payload} = {}) => {
|
||||||
if(payload==1){
|
if(payload==1){
|
||||||
|
|
@ -8,4 +6,4 @@ function inject(serv, player)
|
||||||
player.system ("WIP, press ESC");
|
player.system ("WIP, press ESC");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
|
module.exports.server=function(serv, settings) {
|
||||||
module.exports = inject;
|
|
||||||
|
|
||||||
function inject(serv, settings) {
|
|
||||||
serv.tickCount = 0;
|
serv.tickCount = 0;
|
||||||
serv.lastTickTime = 0;
|
serv.lastTickTime = 0;
|
||||||
|
|
||||||
|
|
@ -25,5 +22,5 @@ function inject(serv, settings) {
|
||||||
|
|
||||||
|
|
||||||
serv.setTickInterval(20);
|
serv.setTickInterval(20);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
var vec3 = require("vec3");
|
var vec3 = require("vec3");
|
||||||
|
|
||||||
module.exports=inject;
|
|
||||||
|
|
||||||
vec3.Vec3.prototype.toFixedPosition=function() {
|
vec3.Vec3.prototype.toFixedPosition=function() {
|
||||||
return this.scaled(32).floored();
|
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));
|
player._client.on('look', ({yaw,pitch,onGround} = {}) => sendLook(yaw,pitch,onGround));
|
||||||
|
|
||||||
|
|
@ -85,4 +83,4 @@ function inject(serv,player)
|
||||||
flags: 0x00
|
flags: 0x00
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
@ -1,9 +1,58 @@
|
||||||
var vec3=require("vec3");
|
var vec3=require("vec3");
|
||||||
var spiralloop = require('spiralloop');
|
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.spawnEntity = entity => {
|
||||||
player._client.write(entity.spawnPacketName, entity.getSpawnPacket());
|
player._client.write(entity.spawnPacketName, entity.getSpawnPacket());
|
||||||
|
|
@ -118,4 +167,4 @@ function inject(serv, player) {
|
||||||
player.sendRestMap();
|
player.sendRestMap();
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
module.exports=inject;
|
|
||||||
|
|
||||||
function inject(serv)
|
|
||||||
{
|
|
||||||
serv.broadcast = (message, color) =>
|
|
||||||
serv.players.forEach(player => player.chat({
|
|
||||||
"text": message,
|
|
||||||
"color": color
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
@ -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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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));
|
|
||||||
}
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
@ -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'));
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue