move modpe to a plugin, fix #66, fix #69

This commit is contained in:
Romain Beaumont 2016-02-21 20:35:26 +01:00
parent ee5beb43c6
commit f46c4225b5
4 changed files with 1 additions and 240 deletions

View file

@ -43,6 +43,7 @@ Currently used between our test server (rom1504.fr) and our gitter room (through
* [flying-squid-schematic](https://github.com/rom1504/flying-squid-schematic) Flying-squid plugin providing /listSchemas and /loadSchema commands.
You can add schema through a simple http api and then add them in your world by just calling /loadSchema in game.
Http api available in the test instance at [flying-squid.rom1504.fr](http://flying-squid.rom1504.fr)
* [flying-squid-modpe](https://github.com/PrismarineJS/flying-squid-modpe) load modpe plugins
## Documentation
Documentation for how to operate and how to customize your server are coming soon!

View file

@ -44,7 +44,6 @@
"prismarine-provider-anvil": "^1.0.0",
"prismarine-windows": "^1.0.0",
"prismarine-world": "^1.0.0",
"prismarine-world-sync": "^0.1.0",
"random-seed": "^0.3.0",
"range": "^0.0.3",
"request-promise": "^2.0.0",

View file

@ -1,236 +0,0 @@
const Vec3 = require("vec3").Vec3;
const dir = require("node-dir");
const fs = require("fs");
function requireFromString(src, filename) {
let Module = module.constructor;
let m = new Module();
m._compile(src, filename);
return m.exports;
}
function modpeApi() {
let Vec3 = null;
let vec3 = null;
let server = null;
let 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) {
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.position.x/32;
}
function getPlayerY() {
return player.position.y/32;
}
function getPlayerZ() {
return player.position.z/32;
}
function getPlayerEnt() {
return null;
}
function getCarriedItem() {
return player.heldItem.blockId;
}
let Player = {
getCarriedItem: function () {
return player.heldItem.blockId;
}
};
let Entity = {
getPitch: function () {
return 1;
}
, getYaw: function () {
return 1;
}
};
let Level = {
getGameMode: function () {
return player.gameMode;
}
, getData: function (x, y, z) {
return 0;
}
};
}
function convert(code) {
let api = modpeApi.toString()
.split("\n");
api[0] = "";
api[api.length - 1] = "";
let finapi = api.join("\n");
code = finapi + code;
return code;
}
module.exports.server=function(serv,settings)
{
let verboseMPE=false;
function log(msg){
if(verboseMPE) serv.log("[MPE]: "+msg);
}
if(!settings.modpe){
log("Modpe support is not enabled, disabling injecting...");
return;
}
log("Modpe injection start...");
let modPePluginsDir = __dirname+"/../../../modpePlugins";
log("Place your scripts in " + modPePluginsDir);
let modCount = 0;
let mods = [];
dir.readFiles(modPePluginsDir, {
match: /.js/
, exclude: /^\./
}, function (err, content, fname, next) {
if (err) throw err;
log("Converting " + fname);
content = convert(content);
let 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(player,serv);
});
function injectPlayer(player,serv) {
log("Injected into player");
initSquid(player, serv, Vec3);
newLevel();
player._client.on("block_dig", function (packet) {
let pos = new Vec3(packet.location.x,packet.location.y,packet.location.z);
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)
{/*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) {
serv.emit("error",err);
}
});
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,7 +1,6 @@
const spiralloop = require('spiralloop');
const World = require('prismarine-world');
const WorldSync = require("prismarine-world-sync");
const generations=require("flying-squid").generations;
import {fs} from 'node-promise-es6';
@ -37,8 +36,6 @@ module.exports.server=async function(serv,{worldFolder,generation={"name":"diamo
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 = {};