mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-05 11:10:44 +00:00
Merge pull request #173 from mhsjlw/no_more_var
use const and let instead of var
This commit is contained in:
commit
7ac0117860
44 changed files with 454 additions and 460 deletions
12
src/index.js
12
src/index.js
|
|
@ -1,7 +1,7 @@
|
||||||
var mc = require('minecraft-protocol');
|
const mc = require('minecraft-protocol');
|
||||||
var EventEmitter = require('events').EventEmitter;
|
const EventEmitter = require('events').EventEmitter;
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var requireIndex = require('requireindex');
|
const requireIndex = require('requireindex');
|
||||||
require('emit-then').register();
|
require('emit-then').register();
|
||||||
if (process.env.NODE_ENV === 'dev'){
|
if (process.env.NODE_ENV === 'dev'){
|
||||||
require('longjohn');
|
require('longjohn');
|
||||||
|
|
@ -20,7 +20,7 @@ module.exports = {
|
||||||
|
|
||||||
function createMCServer(options) {
|
function createMCServer(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var mcServer = new MCServer();
|
const mcServer = new MCServer();
|
||||||
mcServer.connect(options);
|
mcServer.connect(options);
|
||||||
return mcServer;
|
return mcServer;
|
||||||
}
|
}
|
||||||
|
|
@ -32,7 +32,7 @@ class MCServer extends EventEmitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(options) {
|
connect(options) {
|
||||||
var plugins = requireIndex(path.join(__dirname, 'lib', 'plugins'));
|
const plugins = requireIndex(path.join(__dirname, 'lib', 'plugins'));
|
||||||
this._server = mc.createServer(options);
|
this._server = mc.createServer(options);
|
||||||
Object.keys(plugins)
|
Object.keys(plugins)
|
||||||
.filter(pluginName => plugins[pluginName].server!=undefined)
|
.filter(pluginName => plugins[pluginName].server!=undefined)
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
module.exports = (obj) => {
|
module.exports = (obj) => {
|
||||||
return async (eventName, data, func, cancelFunc) => {
|
return async (eventName, data, func, cancelFunc) => {
|
||||||
var hiddenCancelled = false;
|
let hiddenCancelled = false;
|
||||||
var cancelled = false;
|
let cancelled = false;
|
||||||
var cancelCount = 0;
|
let cancelCount = 0;
|
||||||
var defaultCancel = true;
|
let defaultCancel = true;
|
||||||
var cancel = (dC=true, hidden=false) => { // Hidden shouldn't be used often but it's not hard to implement so meh
|
const cancel = (dC=true, hidden=false) => { // Hidden shouldn't be used often but it's not hard to implement so meh
|
||||||
if (hidden) hiddenCancelled = true;
|
if (hidden) hiddenCancelled = true;
|
||||||
else {
|
else {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
|
|
@ -13,7 +13,7 @@ module.exports = (obj) => {
|
||||||
defaultCancel = dC;
|
defaultCancel = dC;
|
||||||
};
|
};
|
||||||
|
|
||||||
var resp;
|
let resp;
|
||||||
|
|
||||||
await obj.emitThen(eventName + '_cancel', data, cancel).catch((err)=> setTimeout(() => {throw err;},0));
|
await obj.emitThen(eventName + '_cancel', data, cancel).catch((err)=> setTimeout(() => {throw err;},0));
|
||||||
await obj.emitThen(eventName, data, cancelled, cancelCount).catch((err)=> setTimeout(() => {throw err;},0));
|
await obj.emitThen(eventName, data, cancelled, cancelCount).catch((err)=> setTimeout(() => {throw err;},0));
|
||||||
|
|
|
||||||
|
|
@ -11,21 +11,21 @@ class Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
find(command) {
|
find(command) {
|
||||||
var parts=command.split(" ");
|
const parts=command.split(" ");
|
||||||
var c=parts.shift();
|
const c=parts.shift();
|
||||||
var pars=parts.join(" ");
|
const pars=parts.join(" ");
|
||||||
if(this.hash[c])
|
if(this.hash[c])
|
||||||
return [this.hash[c], pars];
|
return [this.hash[c], pars];
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
async use(command, op=true) {
|
async use(command, op=true) {
|
||||||
var res = this.find(command);
|
let res = this.find(command);
|
||||||
|
|
||||||
if(res) {
|
if(res) {
|
||||||
var [com,pars]=res;
|
let [com,pars]=res;
|
||||||
if (com.params.op && !op) return 'You do not have permission to use this command';
|
if (com.params.op && !op) return 'You do not have permission to use this command';
|
||||||
var parse = com.params.parse;
|
const parse = com.params.parse;
|
||||||
if(parse) {
|
if(parse) {
|
||||||
if(typeof parse == 'function') {
|
if(typeof parse == 'function') {
|
||||||
pars = parse(pars);
|
pars = parse(pars);
|
||||||
|
|
@ -46,15 +46,15 @@ class Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateHistory() {
|
updateHistory() {
|
||||||
var all = '(.+?)';
|
const all = '(.+?)';
|
||||||
|
|
||||||
var list = [this.base];
|
const list = [this.base];
|
||||||
if(this.params.aliases && this.params.aliases.length) {
|
if(this.params.aliases && this.params.aliases.length) {
|
||||||
this.params.aliases.forEach(al => list.unshift(this.parentBase + al));
|
this.params.aliases.forEach(al => list.unshift(this.parentBase + al));
|
||||||
}
|
}
|
||||||
|
|
||||||
list.forEach((command) => {
|
list.forEach((command) => {
|
||||||
var parentBase = this.parent ? (this.parent.path || '') : '';
|
const parentBase = this.parent ? (this.parent.path || '') : '';
|
||||||
this.path = parentBase + this.space() + (command || all);
|
this.path = parentBase + this.space() + (command || all);
|
||||||
if(this.path == all && !this.parent) this.path = '';
|
if(this.path == all && !this.parent) this.path = '';
|
||||||
|
|
||||||
|
|
@ -68,7 +68,7 @@ class Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
space(end) {
|
space(end) {
|
||||||
var first = !(this.parent && this.parent.parent);
|
const first = !(this.parent && this.parent.parent);
|
||||||
return this.params.merged || (!end && first) ? '' : ' ';
|
return this.params.merged || (!end && first) ? '' : ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
module.exports={distanceToXpLevel,getXpLevel,getXpRequired,getBaseXpFromLevel};
|
module.exports={distanceToXpLevel,getXpLevel,getXpRequired,getBaseXpFromLevel};
|
||||||
|
|
||||||
function distanceToXpLevel(xp, toLevel) {
|
function distanceToXpLevel(xp, toLevel) {
|
||||||
var level = getXpLevel(xp);
|
const level = getXpLevel(xp);
|
||||||
if (!toLevel) toLevel = level+1;
|
if (!toLevel) toLevel = level+1;
|
||||||
var levelBaseXp = getBaseXpFromLevel(level);
|
const levelBaseXp = getBaseXpFromLevel(level);
|
||||||
var requiredXp = getXpRequired(level, toLevel);
|
const requiredXp = getXpRequired(level, toLevel);
|
||||||
return (xp - levelBaseXp) / requiredXp;
|
return (xp - levelBaseXp) / requiredXp;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getXpLevel(xp) {
|
function getXpLevel(xp) {
|
||||||
// I have to use quadratic equation to reverse the equation from getBaseXpFromLevel(). Ugh.
|
// I have to use quadratic equation to reverse the equation from getBaseXpFromLevel(). Ugh.
|
||||||
var a;
|
let a;
|
||||||
var b;
|
let b;
|
||||||
var c;
|
let c;
|
||||||
if (xp < 352) { // 352 == Experience at level 16
|
if (xp < 352) { // 352 == Experience at level 16
|
||||||
a = 1;
|
a = 1;
|
||||||
b = 6;
|
b = 6;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var Behavior = require("flying-squid").Behavior;
|
const Behavior = require("flying-squid").Behavior;
|
||||||
|
|
||||||
module.exports.server = function(serv) {
|
module.exports.server = function(serv) {
|
||||||
serv.behavior = new Behavior(serv);
|
serv.behavior = new Behavior(serv);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.player=function(player,serv)
|
module.exports.player=function(player,serv)
|
||||||
{
|
{
|
||||||
|
|
@ -34,12 +34,12 @@ module.exports.player=function(player,serv)
|
||||||
usage: '/setblock <x> <y> <z> <id> [data]',
|
usage: '/setblock <x> <y> <z> <id> [data]',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results = str.match(/^(~|~?-?[0-9]+) (~|~?-?[0-9]+) (~|~?-?[0-9]+) ([0-9]{1,3})(?: ([0-9]{1,3}))?/);
|
const results = str.match(/^(~|~?-?[0-9]+) (~|~?-?[0-9]+) (~|~?-?[0-9]+) ([0-9]{1,3})(?: ([0-9]{1,3}))?/);
|
||||||
if(!results) return false;
|
if(!results) return false;
|
||||||
return results;
|
return results;
|
||||||
},
|
},
|
||||||
action(params) {
|
action(params) {
|
||||||
var res = params.slice(1, 4);
|
let res = params.slice(1, 4);
|
||||||
res = res.map((val, i) => serv.posFromString(val, player.position[['x','y','z'][i]] / 32))
|
res = res.map((val, i) => serv.posFromString(val, player.position[['x','y','z'][i]] / 32))
|
||||||
player.setBlock(new Vec3(res[0], res[1], res[2]).floored(), params[4], params[5] || 0);
|
player.setBlock(new Vec3(res[0], res[1], res[2]).floored(), params[4], params[5] || 0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,17 +46,17 @@ module.exports.server=function(serv)
|
||||||
|
|
||||||
serv.parseClassic = (message) => {
|
serv.parseClassic = (message) => {
|
||||||
if (typeof message == 'object') return message;
|
if (typeof message == 'object') return message;
|
||||||
var messageList = [];
|
const messageList = [];
|
||||||
var text = '';
|
let text = '';
|
||||||
var nextChanged = false;
|
let nextChanged = false;
|
||||||
var color = 'white';
|
let color = 'white';
|
||||||
var bold = false;
|
let bold = false;
|
||||||
var italic = false;
|
let italic = false;
|
||||||
var underlined = false;
|
let underlined = false;
|
||||||
var strikethrough = false;
|
let strikethrough = false;
|
||||||
var random = false;
|
let random = false;
|
||||||
var colors = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f', 'k','l','m','n','o','r','&']
|
const colors = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f', 'k','l','m','n','o','r','&']
|
||||||
var convertColor = ['black', 'dark_blue','dark_green','dark_cyan','dark_red','dark_purple','gold',
|
const convertColor = ['black', 'dark_blue','dark_green','dark_cyan','dark_red','dark_purple','gold',
|
||||||
'gray', 'dark_gray', 'blue', 'green', 'aqua', 'red', 'light_purple', 'yellow', 'white',
|
'gray', 'dark_gray', 'blue', 'green', 'aqua', 'red', 'light_purple', 'yellow', 'white',
|
||||||
'random', 'bold', 'strikethrough', 'underlined', 'italic', 'reset', '&'];
|
'random', 'bold', 'strikethrough', 'underlined', 'italic', 'reset', '&'];
|
||||||
|
|
||||||
|
|
@ -75,9 +75,9 @@ module.exports.server=function(serv)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (message != '') {
|
while (message != '') {
|
||||||
var currChar = message[0];
|
const currChar = message[0];
|
||||||
if (nextChanged) {
|
if (nextChanged) {
|
||||||
var newColor = convertColor[colors.indexOf(currChar)];
|
const newColor = convertColor[colors.indexOf(currChar)];
|
||||||
if (newColor) {
|
if (newColor) {
|
||||||
if (newColor == 'bold') bold = true;
|
if (newColor == 'bold') bold = true;
|
||||||
else if (newColor == 'strikethrough') strikethrough = true;
|
else if (newColor == 'strikethrough') strikethrough = true;
|
||||||
|
|
@ -133,7 +133,7 @@ module.exports.player=function(player,serv)
|
||||||
whitelist: serv.players,
|
whitelist: serv.players,
|
||||||
blacklist: []
|
blacklist: []
|
||||||
}, ({message, prefix, text, whitelist, blacklist}) => {
|
}, ({message, prefix, text, whitelist, blacklist}) => {
|
||||||
var obj = serv.parseClassic(prefix);
|
const obj = serv.parseClassic(prefix);
|
||||||
if (!obj.extra) obj.extra = [];
|
if (!obj.extra) obj.extra = [];
|
||||||
obj.extra.push(serv.parseClassic(text));
|
obj.extra.push(serv.parseClassic(text));
|
||||||
serv.broadcast(obj, {
|
serv.broadcast(obj, {
|
||||||
|
|
@ -150,7 +150,7 @@ module.exports.player=function(player,serv)
|
||||||
};
|
};
|
||||||
|
|
||||||
player.emptyChat = (count=1) => {
|
player.emptyChat = (count=1) => {
|
||||||
for (var i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
player.chat('');
|
player.chat('');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.player=function(player)
|
module.exports.player=function(player)
|
||||||
{
|
{
|
||||||
player.on('placeBlock_cancel', async (opt, cancel) => {
|
player.on('placeBlock_cancel', async (opt, cancel) => {
|
||||||
if (player.crouching) return;
|
if (player.crouching) return;
|
||||||
try {
|
try {
|
||||||
var id = await player.world.getBlockType(opt.reference);
|
const id = await player.world.getBlockType(opt.reference);
|
||||||
var blockAbove = await player.world.getBlockType(opt.reference.plus(new Vec3(0, 1, 0)));
|
const blockAbove = await player.world.getBlockType(opt.reference.plus(new Vec3(0, 1, 0)));
|
||||||
if (id == 54) {
|
if (id == 54) {
|
||||||
opt.playSound = false;
|
opt.playSound = false;
|
||||||
if (blockAbove) {
|
if (blockAbove) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const UserError = require('flying-squid').UserError;
|
||||||
var UserError = require('flying-squid').UserError;
|
|
||||||
|
|
||||||
module.exports.player=function(player, serv) {
|
module.exports.player=function(player, serv) {
|
||||||
|
|
||||||
|
|
@ -8,45 +7,44 @@ module.exports.player=function(player, serv) {
|
||||||
info: 'to show all commands',
|
info: 'to show all commands',
|
||||||
usage: '/help [command]',
|
usage: '/help [command]',
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var params = str.split(' ');
|
const params = str.split(' ');
|
||||||
var page = parseInt(params[params.length-1]);
|
const page = parseInt(params[params.length-1]);
|
||||||
var search = '';
|
|
||||||
if (page) {
|
if (page) {
|
||||||
params.pop();
|
params.pop();
|
||||||
}
|
}
|
||||||
search = params.join(' ');
|
const search = params.join(' ');
|
||||||
return { search: search, page: (page && page - 1) || 0 };
|
return { search: search, page: (page && page - 1) || 0 };
|
||||||
},
|
},
|
||||||
action({search, page}) {
|
action({search, page}) {
|
||||||
if (page < 0) return 'Page # must be >= 1';
|
if (page < 0) return 'Page # must be >= 1';
|
||||||
var hash = player.commands.uniqueHash;
|
const hash = player.commands.uniqueHash;
|
||||||
|
|
||||||
var PAGE_LENGTH = 7;
|
const PAGE_LENGTH = 7;
|
||||||
|
|
||||||
var found = Object.keys(hash).filter(h => (h + ' ').indexOf((search && search + ' ') || '') == 0);
|
let found = Object.keys(hash).filter(h => (h + ' ').indexOf((search && search + ' ') || '') == 0);
|
||||||
|
|
||||||
if (found.length == 0) { // None found
|
if (found.length == 0) { // None found
|
||||||
return 'Could not find any matches';
|
return 'Could not find any matches';
|
||||||
} else if (found.length == 1) { // Single command found, giev info on command
|
} else if (found.length == 1) { // Single command found, giev info on command
|
||||||
var cmd = hash[found[0]];
|
const cmd = hash[found[0]];
|
||||||
var usage = (cmd.params && cmd.params.usage) || cmd.base;
|
const usage = (cmd.params && cmd.params.usage) || cmd.base;
|
||||||
var info = (cmd.params && cmd.params.info) || 'No info';
|
const info = (cmd.params && cmd.params.info) || 'No info';
|
||||||
player.chat(usage + ': ' + info);
|
player.chat(usage + ': ' + info);
|
||||||
} else { // Multiple commands found, give list with pages
|
} else { // Multiple commands found, give list with pages
|
||||||
var totalPages = Math.ceil((found.length-1) / PAGE_LENGTH);
|
const totalPages = Math.ceil((found.length-1) / PAGE_LENGTH);
|
||||||
if (page >= totalPages) return 'There are only' + totalPages + ' help pages';
|
if (page >= totalPages) return 'There are only' + totalPages + ' help pages';
|
||||||
found = found.sort();
|
found = found.sort();
|
||||||
if (found.indexOf('search') != -1) {
|
if (found.indexOf('search') != -1) {
|
||||||
var baseCmd = hash[search];
|
const baseCmd = hash[search];
|
||||||
player.chat(baseCmd.base + ' -' + ((baseCmd.params && baseCmd.params.info && ' ' + baseCmd.params.info) || '=-=-=-=-=-=-=-=-'));
|
player.chat(baseCmd.base + ' -' + ((baseCmd.params && baseCmd.params.info && ' ' + baseCmd.params.info) || '=-=-=-=-=-=-=-=-'));
|
||||||
} else {
|
} else {
|
||||||
player.chat('Help -=-=-=-=-=-=-=-=-');
|
player.chat('Help -=-=-=-=-=-=-=-=-');
|
||||||
}
|
}
|
||||||
for (var i = PAGE_LENGTH*page; i < Math.min(PAGE_LENGTH*(page + 1), found.length); i++) {
|
for (let i = PAGE_LENGTH*page; i < Math.min(PAGE_LENGTH*(page + 1), found.length); i++) {
|
||||||
if (found[i] === search) continue;
|
if (found[i] === search) continue;
|
||||||
var cmd = hash[found[i]];
|
const cmd = hash[found[i]];
|
||||||
var usage = (cmd.params && cmd.params.usage) || cmd.base;
|
const usage = (cmd.params && cmd.params.usage) || cmd.base;
|
||||||
var info = (cmd.params && cmd.params.info) || 'No info';
|
const info = (cmd.params && cmd.params.info) || 'No info';
|
||||||
player.chat(usage + ': ' + info);
|
player.chat(usage + ': ' + info);
|
||||||
}
|
}
|
||||||
player.chat('--=[Page ' + (page + 1) + ' of ' + totalPages + ']=--')
|
player.chat('--=[Page ' + (page + 1) + ' of ' + totalPages + ']=--')
|
||||||
|
|
@ -59,9 +57,9 @@ module.exports.player=function(player, serv) {
|
||||||
info: 'to pong!',
|
info: 'to pong!',
|
||||||
usage: '/ping [number]',
|
usage: '/ping [number]',
|
||||||
action(params) {
|
action(params) {
|
||||||
var num = params[0] * 1 + 1;
|
const num = params[0] * 1 + 1;
|
||||||
|
|
||||||
var str = 'pong';
|
let str = 'pong';
|
||||||
if(!isNaN(num)) str += ' [' + num + ']';
|
if(!isNaN(num)) str += ' [' + num + ']';
|
||||||
|
|
||||||
player.chat(str + '!');
|
player.chat(str + '!');
|
||||||
|
|
@ -105,7 +103,7 @@ module.exports.player=function(player, serv) {
|
||||||
return str || false;
|
return str || false;
|
||||||
},
|
},
|
||||||
action(sel) {
|
action(sel) {
|
||||||
var arr = serv.selectorString(sel, player.position.scaled(1/32), player.world);
|
const arr = serv.selectorString(sel, player.position.scaled(1/32), player.world);
|
||||||
player.chat(JSON.stringify(arr.map(a => a.id)));
|
player.chat(JSON.stringify(arr.map(a => a.id)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -113,7 +111,7 @@ module.exports.player=function(player, serv) {
|
||||||
|
|
||||||
player.handleCommand = async (str) => {
|
player.handleCommand = async (str) => {
|
||||||
try {
|
try {
|
||||||
var res = await player.commands.use(str, player.op);
|
const res = await player.commands.use(str, player.op);
|
||||||
if (res) player.chat(serv.color.red + res);
|
if (res) player.chat(serv.color.red + res);
|
||||||
}
|
}
|
||||||
catch(err) {
|
catch(err) {
|
||||||
|
|
@ -130,7 +128,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
module.exports.server = function(serv) {
|
module.exports.server = function(serv) {
|
||||||
|
|
||||||
function shuffleArray(array) {
|
function shuffleArray(array) {
|
||||||
var currentIndex = array.length, temporaryValue, randomIndex ;
|
let currentIndex = array.length, temporaryValue, randomIndex ;
|
||||||
|
|
||||||
// While there remain elements to shuffle...
|
// While there remain elements to shuffle...
|
||||||
while (0 !== currentIndex) {
|
while (0 !== currentIndex) {
|
||||||
|
|
@ -148,39 +146,39 @@ module.exports.server = function(serv) {
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
var notudf = i => typeof i != 'undefined';
|
const notudf = i => typeof i != 'undefined';
|
||||||
|
|
||||||
serv.selector = (type, opt) => {
|
serv.selector = (type, opt) => {
|
||||||
if (['all', 'random', 'near', 'entity'].indexOf(type) == -1)
|
if (['all', 'random', 'near', 'entity'].indexOf(type) == -1)
|
||||||
throw new UserError('serv.selector(): type must be either [all, random, near, or entity]');
|
throw new UserError('serv.selector(): type must be either [all, random, near, or entity]');
|
||||||
|
|
||||||
var count = typeof opt.count != 'undefined' ?
|
const count = typeof opt.count != 'undefined' ?
|
||||||
count :
|
count :
|
||||||
(type == 'all' || type == 'entity' ?serv.entities.length : 1);
|
(type == 'all' || type == 'entity' ?serv.entities.length : 1);
|
||||||
var pos = opt.pos;
|
const pos = opt.pos;
|
||||||
var sample;
|
let sample;
|
||||||
if (type == 'all') sample = serv.players;
|
if (type == 'all') sample = serv.players;
|
||||||
else if (type == 'random' || type == 'near') sample = serv.players.filter(p => p.health != 0);
|
else if (type == 'random' || type == 'near') sample = serv.players.filter(p => p.health != 0);
|
||||||
else if (type == 'entity') sample = Object.keys(serv.entities).map(k => serv.entities[k]);
|
else if (type == 'entity') sample = Object.keys(serv.entities).map(k => serv.entities[k]);
|
||||||
|
|
||||||
var checkOption = (val, compare) => {
|
const checkOption = (val, compare) => {
|
||||||
if (!val) return true;
|
if (!val) return true;
|
||||||
var not = val[0] == '!';
|
const not = val[0] == '!';
|
||||||
var v = val;
|
let v = val;
|
||||||
if (not) v = v.slice(1, v.length);
|
if (not) v = v.slice(1, v.length);
|
||||||
if (not && compare == v) return false;
|
if (not && compare == v) return false;
|
||||||
if (!not && compare != v) return false;
|
if (!not && compare != v) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
|
|
||||||
var scores = {
|
const scores = {
|
||||||
max: [],
|
max: [],
|
||||||
min: []
|
min: []
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.keys(opt).forEach(o => {
|
Object.keys(opt).forEach(o => {
|
||||||
if (o.indexOf('score_') != 0) return;
|
if (o.indexOf('score_') != 0) return;
|
||||||
var score = o.replace('score_', '');
|
const score = o.replace('score_', '');
|
||||||
if (score.indexOf('_min') == score.length - 1) {
|
if (score.indexOf('_min') == score.length - 1) {
|
||||||
scores.min.push({
|
scores.min.push({
|
||||||
score: score.replace('_min' ,''),
|
score: score.replace('_min' ,''),
|
||||||
|
|
@ -210,7 +208,7 @@ module.exports.server = function(serv) {
|
||||||
if (!checkOption(opt.name, s.username)) return false;
|
if (!checkOption(opt.name, s.username)) return false;
|
||||||
if (!checkOption(opt.type, s.name)) return false;
|
if (!checkOption(opt.type, s.name)) return false;
|
||||||
|
|
||||||
var fail = false;
|
let fail = false;
|
||||||
scores.max.forEach(m => {
|
scores.max.forEach(m => {
|
||||||
if (fail) return;
|
if (fail) return;
|
||||||
if (!notudf(s.scores[m.score])) fail = true;
|
if (!notudf(s.scores[m.score])) fail = true;
|
||||||
|
|
@ -237,29 +235,29 @@ module.exports.server = function(serv) {
|
||||||
|
|
||||||
serv.selectorString = (str, pos, world, allowUser=true) => {
|
serv.selectorString = (str, pos, world, allowUser=true) => {
|
||||||
pos = pos.clone();
|
pos = pos.clone();
|
||||||
var player = serv.getPlayer(str);
|
const player = serv.getPlayer(str);
|
||||||
if (!player && str[0] != '@') return [];
|
if (!player && str[0] != '@') return [];
|
||||||
else if (player) return allowUser ? [player] : [];
|
else if (player) return allowUser ? [player] : [];
|
||||||
var match = str.match(/^@([a,r,p,e])(?:\[([^\]]+)\])?$/);
|
const match = str.match(/^@([a,r,p,e])(?:\[([^\]]+)\])?$/);
|
||||||
if (match == null) throw new UserError('Invalid selector format');
|
if (match == null) throw new UserError('Invalid selector format');
|
||||||
var typeConversion = {
|
const typeConversion = {
|
||||||
a: 'all',
|
a: 'all',
|
||||||
r: 'random',
|
r: 'random',
|
||||||
p: 'near',
|
p: 'near',
|
||||||
e: 'entity'
|
e: 'entity'
|
||||||
};
|
};
|
||||||
var type = typeConversion[match[1]];
|
const type = typeConversion[match[1]];
|
||||||
var opt = match[2] ? match[2].split(',') : [];
|
const opt = match[2] ? match[2].split(',') : [];
|
||||||
var optPair = [];
|
const optPair = [];
|
||||||
var err;
|
let err;
|
||||||
opt.forEach(o => {
|
opt.forEach(o => {
|
||||||
var match = o.match(/^([^=]+)=([^=]+)$/);
|
const match = o.match(/^([^=]+)=([^=]+)$/);
|
||||||
if (match == null) err = new UserError('Invalid selector option format: "' + o + '"');
|
if (match == null) err = new UserError('Invalid selector option format: "' + o + '"');
|
||||||
else optPair.push({key: match[1], val: match[2]});
|
else optPair.push({key: match[1], val: match[2]});
|
||||||
});
|
});
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
var optConversion = {
|
const optConversion = {
|
||||||
type: 'type',
|
type: 'type',
|
||||||
r: 'radius',
|
r: 'radius',
|
||||||
rm: 'minRadius',
|
rm: 'minRadius',
|
||||||
|
|
@ -274,9 +272,9 @@ module.exports.server = function(serv) {
|
||||||
ry: 'pitch',
|
ry: 'pitch',
|
||||||
rym: 'minPitch'
|
rym: 'minPitch'
|
||||||
};
|
};
|
||||||
var convertInt = ['r', 'rm', 'm', 'c', 'l', 'lm', 'rx', 'rxm', 'ry', 'rym'];
|
const convertInt = ['r', 'rm', 'm', 'c', 'l', 'lm', 'rx', 'rxm', 'ry', 'rym'];
|
||||||
|
|
||||||
var data = {
|
const data = {
|
||||||
pos: pos,
|
pos: pos,
|
||||||
world: world,
|
world: world,
|
||||||
scores: [],
|
scores: [],
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/time <add|query|set> <value>',
|
usage: '/time <add|query|set> <value>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/);
|
const data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/);
|
||||||
if(!data) return false;
|
if(!data) return false;
|
||||||
return {
|
return {
|
||||||
action: data[1],
|
action: data[1],
|
||||||
|
|
@ -52,7 +52,7 @@ module.exports.player=function(player,serv){
|
||||||
if(action == "query") {
|
if(action == "query") {
|
||||||
player.chat("It is "+serv.time);
|
player.chat("It is "+serv.time);
|
||||||
} else {
|
} else {
|
||||||
var newTime;
|
let newTime;
|
||||||
|
|
||||||
if(action == "set") {
|
if(action == "set") {
|
||||||
newTime = value;
|
newTime = value;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.player=function(player,serv)
|
module.exports.player=function(player,serv)
|
||||||
{
|
{
|
||||||
|
|
@ -8,13 +8,13 @@ module.exports.player=function(player,serv)
|
||||||
}
|
}
|
||||||
|
|
||||||
player._client.on("block_dig",async ({location,status,face}) => {
|
player._client.on("block_dig",async ({location,status,face}) => {
|
||||||
var pos=new Vec3(location.x,location.y,location.z);
|
let pos=new Vec3(location.x,location.y,location.z);
|
||||||
|
|
||||||
var directionVector=directionToVector[face];
|
const directionVector=directionToVector[face];
|
||||||
var facedPos=pos.plus(directionVector);
|
const facedPos=pos.plus(directionVector);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let facedBlock = await player.world.getBlock(facedPos);
|
const facedBlock = await player.world.getBlock(facedPos);
|
||||||
let block;
|
let block;
|
||||||
if(facedBlock.name=="fire")
|
if(facedBlock.name=="fire")
|
||||||
{
|
{
|
||||||
|
|
@ -55,12 +55,12 @@ module.exports.player=function(player,serv)
|
||||||
return currentlyDugBlock.digTime();
|
return currentlyDugBlock.digTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentlyDugBlock;
|
let currentlyDugBlock;
|
||||||
var startDiggingTime;
|
let startDiggingTime;
|
||||||
var animationInterval;
|
let animationInterval;
|
||||||
var expectedDiggingTime;
|
let expectedDiggingTime;
|
||||||
var lastDestroyState;
|
let lastDestroyState;
|
||||||
var currentAnimationId;
|
let currentAnimationId;
|
||||||
function startDigging(location)
|
function startDigging(location)
|
||||||
{
|
{
|
||||||
serv.entityMaxId++;
|
serv.entityMaxId++;
|
||||||
|
|
@ -72,8 +72,8 @@ module.exports.player=function(player,serv)
|
||||||
animationInterval=setInterval(updateAnimation,100);
|
animationInterval=setInterval(updateAnimation,100);
|
||||||
function updateAnimation()
|
function updateAnimation()
|
||||||
{
|
{
|
||||||
var currentDiggingTime=new Date()-startDiggingTime;
|
const currentDiggingTime=new Date()-startDiggingTime;
|
||||||
var newDestroyState=Math.floor(9*currentDiggingTime/expectedDiggingTime);
|
let newDestroyState=Math.floor(9*currentDiggingTime/expectedDiggingTime);
|
||||||
newDestroyState=newDestroyState>9 ? 9 : newDestroyState;
|
newDestroyState=newDestroyState>9 ? 9 : newDestroyState;
|
||||||
if(newDestroyState!=lastDestroyState)
|
if(newDestroyState!=lastDestroyState)
|
||||||
{
|
{
|
||||||
|
|
@ -108,8 +108,8 @@ module.exports.player=function(player,serv)
|
||||||
async function completeDigging(location)
|
async function completeDigging(location)
|
||||||
{
|
{
|
||||||
clearInterval(animationInterval);
|
clearInterval(animationInterval);
|
||||||
var diggingTime=new Date()-startDiggingTime;
|
const diggingTime=new Date()-startDiggingTime;
|
||||||
var stop = false;
|
let stop = false;
|
||||||
if(expectedDiggingTime-diggingTime<100) {
|
if(expectedDiggingTime-diggingTime<100) {
|
||||||
stop = player.behavior('forceCancelDig', {
|
stop = player.behavior('forceCancelDig', {
|
||||||
stop: true,
|
stop: true,
|
||||||
|
|
@ -175,4 +175,4 @@ module.exports.player=function(player,serv)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
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)];
|
const 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)];
|
||||||
22
src/lib/plugins/effects.js
vendored
22
src/lib/plugins/effects.js
vendored
|
|
@ -1,15 +1,15 @@
|
||||||
|
|
||||||
module.exports.entity = function(entity, serv) {
|
module.exports.entity = function(entity, serv) {
|
||||||
entity.effects = {};
|
entity.effects = {};
|
||||||
for (var i = 1; i <= 23; i++) { // 23 in 1.8, 27 in 1.9
|
for (let i = 1; i <= 23; i++) { // 23 in 1.8, 27 in 1.9
|
||||||
entity.effects[i] = null; // Just so we know it's a real potion and not undefined/not existant
|
entity.effects[i] = null; // Just so we know it's a real potion and not undefined/not existant
|
||||||
}
|
}
|
||||||
|
|
||||||
entity.sendEffect = (effectId, {amplifier=0,duration=30*20,particles=true,whitelist,blacklist=[]}={}) => {
|
entity.sendEffect = (effectId, {amplifier=0,duration=30*20,particles=true,whitelist,blacklist=[]}={}) => {
|
||||||
if (!whitelist) whitelist = serv.getNearby(entity);
|
if (!whitelist) whitelist = serv.getNearby(entity);
|
||||||
if (entity.type == 'player' && [1].indexOf(effectId) != -1) entity.sendAbilities();
|
if (entity.type == 'player' && [1].indexOf(effectId) != -1) entity.sendAbilities();
|
||||||
var sendTo = whitelist.filter(p => blacklist.indexOf(p) == -1);
|
const sendTo = whitelist.filter(p => blacklist.indexOf(p) == -1);
|
||||||
var data = {
|
const data = {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
effectId: effectId,
|
effectId: effectId,
|
||||||
amplifier: amplifier,
|
amplifier: amplifier,
|
||||||
|
|
@ -21,7 +21,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
|
|
||||||
entity.sendRemoveEffect = (effectId, {whitelist,blacklist=[]}={}) => {
|
entity.sendRemoveEffect = (effectId, {whitelist,blacklist=[]}={}) => {
|
||||||
if (!whitelist) whitelist = serv.getNearby(entity);
|
if (!whitelist) whitelist = serv.getNearby(entity);
|
||||||
var sendTo = whitelist.filter(p => blacklist.indexOf(p) == -1);
|
const sendTo = whitelist.filter(p => blacklist.indexOf(p) == -1);
|
||||||
serv._writeArray('remove_entity_effect', {
|
serv._writeArray('remove_entity_effect', {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
effectId: effectId
|
effectId: effectId
|
||||||
|
|
@ -29,7 +29,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
};
|
};
|
||||||
|
|
||||||
entity.addEffect = (effectId, opt={}) => {
|
entity.addEffect = (effectId, opt={}) => {
|
||||||
var amp = typeof opt.amplifier == 'undefined' ? 0 : opt.amplifier;
|
const amp = typeof opt.amplifier == 'undefined' ? 0 : opt.amplifier;
|
||||||
if (!entity.effects[effectId] || opt.override || amp < entity.effects[effectId].amplifier) {
|
if (!entity.effects[effectId] || opt.override || amp < entity.effects[effectId].amplifier) {
|
||||||
entity.effects[effectId] = {
|
entity.effects[effectId] = {
|
||||||
amplifier: opt.amplifier || 0,
|
amplifier: opt.amplifier || 0,
|
||||||
|
|
@ -40,7 +40,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
entity.sendEffect(effectId, opt);
|
entity.sendEffect(effectId, opt);
|
||||||
return true;
|
return true;
|
||||||
} else return false;
|
} else return false;
|
||||||
}
|
};
|
||||||
|
|
||||||
entity.removeEffect = (effectId, opt) => {
|
entity.removeEffect = (effectId, opt) => {
|
||||||
entity.effects[effectId] = null;
|
entity.effects[effectId] = null;
|
||||||
|
|
@ -49,7 +49,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
|
|
||||||
serv.on('tick', () => {
|
serv.on('tick', () => {
|
||||||
Object.keys(entity.effects).forEach(effectId => {
|
Object.keys(entity.effects).forEach(effectId => {
|
||||||
var e = entity.effects[effectId];
|
const e = entity.effects[effectId];
|
||||||
if (e && e.end <= Date.now()) entity.removeEffect(effectId);
|
if (e && e.end <= Date.now()) entity.removeEffect(effectId);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -64,14 +64,14 @@ module.exports.player = function(player, serv) {
|
||||||
return str.match(/(.+?) (\d+)(?: (\d+))?(?: (\d+))?(?: (true|false))?|.*? clear/) || false;
|
return str.match(/(.+?) (\d+)(?: (\d+))?(?: (\d+))?(?: (true|false))?|.*? clear/) || false;
|
||||||
},
|
},
|
||||||
action(params) {
|
action(params) {
|
||||||
var targets = player.selectorString(params[1]);
|
const targets = player.selectorString(params[1]);
|
||||||
if (params[2] == 'clear') {
|
if (params[2] == 'clear') {
|
||||||
targets.forEach(e => Object.keys(e.effects).forEach(effectId => {
|
targets.forEach(e => Object.keys(e.effects).forEach(effectId => {
|
||||||
if (e.effects[effectId] != null) e.removeEffect(effectId);
|
if (e.effects[effectId] != null) e.removeEffect(effectId);
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
targets.forEach(e => {
|
targets.forEach(e => {
|
||||||
var effId = parseInt(params[2]);
|
const effId = parseInt(params[2]);
|
||||||
if (e.effects[effId]) {
|
if (e.effects[effId]) {
|
||||||
e.removeEffect(effId);
|
e.removeEffect(effId);
|
||||||
}
|
}
|
||||||
|
|
@ -82,10 +82,10 @@ module.exports.player = function(player, serv) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var chatSelect = (targets.length == 1 ? (targets[0].type == 'player' ? targets[0].username : 'entity') : 'entities');
|
const chatSelect = (targets.length == 1 ? (targets[0].type == 'player' ? targets[0].username : 'entity') : 'entities');
|
||||||
if (params[2] == 'clear') player.chat('Remove all effects from ' + chatSelect + '.' );
|
if (params[2] == 'clear') player.chat('Remove all effects from ' + chatSelect + '.' );
|
||||||
else player.chat('Gave ' + chatSelect + ' effect ' + params[2] + '(' + (params[4] || 0) + ') for ' +
|
else player.chat('Gave ' + chatSelect + ' effect ' + params[2] + '(' + (params[4] || 0) + ') for ' +
|
||||||
(parseInt(params[3]) || 30) + ' seconds');
|
(parseInt(params[3]) || 30) + ' seconds');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
|
||||||
|
|
||||||
module.exports.server=function(serv,options) {
|
module.exports.server=function(serv,options) {
|
||||||
serv.on('tick', function(delta) {
|
serv.on('tick', function(delta) {
|
||||||
Promise.all(
|
Promise.all(
|
||||||
Object.keys(serv.entities).map(async (id) => {
|
Object.keys(serv.entities).map(async (id) => {
|
||||||
var entity = serv.entities[id];
|
const entity = serv.entities[id];
|
||||||
if (entity.deathTime && Date.now() - entity.bornTime >= entity.deathTime) {
|
if (entity.deathTime && Date.now() - entity.bornTime >= entity.deathTime) {
|
||||||
entity.destroy();
|
entity.destroy();
|
||||||
return;
|
return;
|
||||||
} else if (entity.pickupTime && Date.now() - entity.bornTime >= entity.pickupTime) {
|
} else if (entity.pickupTime && Date.now() - entity.bornTime >= entity.pickupTime) {
|
||||||
var players = serv.getNearby({
|
const players = serv.getNearby({
|
||||||
world: entity.world,
|
world: entity.world,
|
||||||
position: entity.position,
|
position: entity.position,
|
||||||
radius: 1.5*32 // Seems good for now
|
radius: 1.5*32 // Seems good for now
|
||||||
|
|
@ -19,7 +17,7 @@ module.exports.server=function(serv,options) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!entity.velocity || !entity.size) return;
|
if (!entity.velocity || !entity.size) return;
|
||||||
var posAndOnGround = await entity.calculatePhysics(delta);
|
const posAndOnGround = await entity.calculatePhysics(delta);
|
||||||
if (entity.type == 'mob') entity.sendPosition(posAndOnGround.position, posAndOnGround.onGround);
|
if (entity.type == 'mob') entity.sendPosition(posAndOnGround.position, posAndOnGround.onGround);
|
||||||
})
|
})
|
||||||
).catch((err)=> setTimeout(() => {throw err;},0));
|
).catch((err)=> setTimeout(() => {throw err;},0));
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var {distanceToXpLevel,getXpLevel,getBaseXpFromLevel}=require("flying-squid").experience;
|
const {distanceToXpLevel,getXpLevel,getBaseXpFromLevel}=require("flying-squid").experience;
|
||||||
|
|
||||||
module.exports.player = function(player) {
|
module.exports.player = function(player) {
|
||||||
player.xp = 0;
|
player.xp = 0;
|
||||||
|
|
@ -39,18 +39,18 @@ module.exports.player = function(player) {
|
||||||
return str.match(/(-?\d+)(L)? ?([a-zA-Z0-9_]+)?/) || false;
|
return str.match(/(-?\d+)(L)? ?([a-zA-Z0-9_]+)?/) || false;
|
||||||
},
|
},
|
||||||
action(args) {
|
action(args) {
|
||||||
var isLevel = !!args[2];
|
const isLevel = !!args[2];
|
||||||
var amt = parseInt(args[1]);
|
const amt = parseInt(args[1]);
|
||||||
var user = args[3] ? serv.getPlayer(args[3]) : player;
|
const user = args[3] ? serv.getPlayer(args[3]) : player;
|
||||||
if (!user) return args[3] + ' is not on this server!';
|
if (!user) return args[3] + ' is not on this server!';
|
||||||
|
|
||||||
if (!isLevel) {
|
if (!isLevel) {
|
||||||
user.setXp(user.xp + amt);
|
user.setXp(user.xp + amt);
|
||||||
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
|
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
|
||||||
} else {
|
} else {
|
||||||
var currLevel = getXpLevel(player.xp);
|
const currLevel = getXpLevel(player.xp);
|
||||||
var baseCurrLevel = getBaseXpFromLevel(currLevel);
|
const baseCurrLevel = getBaseXpFromLevel(currLevel);
|
||||||
var extraXp = player.xp - baseCurrLevel;
|
const extraXp = player.xp - baseCurrLevel;
|
||||||
user.setXp(getBaseXpFromLevel(currLevel + amt) + extraXp);
|
user.setXp(getBaseXpFromLevel(currLevel + amt) + extraXp);
|
||||||
player.chat('Gave ' + user.username + ' ' + amt + ' levels');
|
player.chat('Gave ' + user.username + ' ' + amt + ' levels');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ module.exports.server = function(serv, settings) {
|
||||||
});
|
});
|
||||||
|
|
||||||
serv.on('asap', () => {
|
serv.on('asap', () => {
|
||||||
for (var p in serv.plugins) {
|
for (let p in serv.plugins) {
|
||||||
serv.log('[PLUGINS] Loaded "' + serv.plugins[p].name + '"');
|
serv.log('[PLUGINS] Loaded "' + serv.plugins[p].name + '"');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -49,7 +49,7 @@ module.exports.server = function(serv, settings) {
|
||||||
|
|
||||||
module.exports.player = function(player, serv) {
|
module.exports.player = function(player, serv) {
|
||||||
Object.keys(serv.plugins).forEach(p => {
|
Object.keys(serv.plugins).forEach(p => {
|
||||||
var plugin = serv.plugins[p];
|
const plugin = serv.plugins[p];
|
||||||
if (plugin.player) plugin.player.call(plugin, player, serv);
|
if (plugin.player) plugin.player.call(plugin, player, serv);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
@ -67,7 +67,7 @@ module.exports.entity = function(entity, serv) {
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.keys(serv.plugins).forEach(p => {
|
Object.keys(serv.plugins).forEach(p => {
|
||||||
var plugin = serv.plugins[p];
|
const plugin = serv.plugins[p];
|
||||||
if (plugin.entity) plugin.entity.call(plugin, entity, serv);
|
if (plugin.entity) plugin.entity.call(plugin, entity, serv);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
var version = require("flying-squid").version;
|
const version = require("flying-squid").version;
|
||||||
var windows = require("prismarine-windows")(version).windows;
|
const windows = require("prismarine-windows")(version).windows;
|
||||||
var Item = require("prismarine-item")(version);
|
const Item = require("prismarine-item")(version);
|
||||||
|
|
||||||
module.exports.player = function(player,serv)
|
module.exports.player = function(player,serv)
|
||||||
{
|
{
|
||||||
|
|
@ -138,14 +138,14 @@ module.exports.player = function(player,serv)
|
||||||
player.inventory.updateSlot(slot, undefined);
|
player.inventory.updateSlot(slot, undefined);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var newItem = Item.fromNotch(item);
|
const newItem = Item.fromNotch(item);
|
||||||
player.inventory.updateSlot(slot, newItem);
|
player.inventory.updateSlot(slot, newItem);
|
||||||
});
|
});
|
||||||
|
|
||||||
player.inventory.on("windowUpdate", function(slot,oldItem,newItem){
|
player.inventory.on("windowUpdate", function(slot,oldItem,newItem){
|
||||||
|
|
||||||
var equipments={
|
const equipments={
|
||||||
5:4,
|
5:4,
|
||||||
6:3,
|
6:3,
|
||||||
7:2,
|
7:2,
|
||||||
|
|
@ -173,8 +173,8 @@ module.exports.player = function(player,serv)
|
||||||
player.collect = (collectEntity) => {
|
player.collect = (collectEntity) => {
|
||||||
|
|
||||||
// Add it to a stack already in the player's inventory if possible
|
// Add it to a stack already in the player's inventory if possible
|
||||||
for(var itemKey=0;itemKey<player.inventory.slots.length;itemKey++) {
|
for(let itemKey=0;itemKey<player.inventory.slots.length;itemKey++) {
|
||||||
var item = player.inventory.slots[itemKey];
|
const item = player.inventory.slots[itemKey];
|
||||||
if(item == undefined) continue;
|
if(item == undefined) continue;
|
||||||
if(item.type == collectEntity.itemId){
|
if(item.type == collectEntity.itemId){
|
||||||
item.count += 1;
|
item.count += 1;
|
||||||
|
|
@ -190,7 +190,7 @@ module.exports.player = function(player,serv)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we couldn't add it to a already existing stack, put it in a new stack if the inventory has room
|
// If we couldn't add it to a already existing stack, put it in a new stack if the inventory has room
|
||||||
var emptySlot = player.inventory.firstEmptyInventorySlot();
|
const emptySlot = player.inventory.firstEmptyInventorySlot();
|
||||||
if(emptySlot != null){
|
if(emptySlot != null){
|
||||||
collectEntity._writeOthersNearby('collect', {
|
collectEntity._writeOthersNearby('collect', {
|
||||||
collectedEntityId: collectEntity.id,
|
collectedEntityId: collectEntity.id,
|
||||||
|
|
@ -198,7 +198,7 @@ module.exports.player = function(player,serv)
|
||||||
});
|
});
|
||||||
player.playSoundAtSelf('random.pop');
|
player.playSoundAtSelf('random.pop');
|
||||||
|
|
||||||
var newItem = new Item(collectEntity.itemId, 1, collectEntity.damage);
|
const newItem = new Item(collectEntity.itemId, 1, collectEntity.damage);
|
||||||
player.inventory.updateSlot(emptySlot, newItem);
|
player.inventory.updateSlot(emptySlot, newItem);
|
||||||
collectEntity.destroy()
|
collectEntity.destroy()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
var fs = require('fs');
|
const fs = require('fs');
|
||||||
var timeStarted = Math.floor(new Date() / 1000).toString();
|
const timeStarted = Math.floor(new Date() / 1000).toString();
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var mkdirp = require('mkdirp');
|
const mkdirp = require('mkdirp');
|
||||||
var moment=require("moment");
|
const moment=require("moment");
|
||||||
|
|
||||||
module.exports.server=function(serv,settings)
|
module.exports.server=function(serv,settings)
|
||||||
{
|
{
|
||||||
|
|
@ -16,7 +16,7 @@ module.exports.server=function(serv,settings)
|
||||||
|
|
||||||
serv.on("seed", (seed) => serv.log("seed: "+seed));
|
serv.on("seed", (seed) => serv.log("seed: "+seed));
|
||||||
|
|
||||||
var logFile=path.join("logs",timeStarted + ".log");
|
const logFile=path.join("logs",timeStarted + ".log");
|
||||||
|
|
||||||
serv.log = message => {
|
serv.log = message => {
|
||||||
message=moment().format('MMMM Do YYYY, HH:mm:ss')+" "+message;
|
message=moment().format('MMMM Do YYYY, HH:mm:ss')+" "+message;
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
var Entity=require("prismarine-entity");
|
const Vec3 = require("vec3").Vec3;
|
||||||
var Vec3 = require("vec3").Vec3;
|
|
||||||
|
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var requireIndex = require('requireindex');
|
const requireIndex = require('requireindex');
|
||||||
var plugins = requireIndex(path.join(__dirname,'..', 'plugins'));
|
const plugins = requireIndex(path.join(__dirname,'..', 'plugins'));
|
||||||
var Command = require('flying-squid').Command;
|
const Command = require('flying-squid').Command;
|
||||||
|
|
||||||
module.exports.server=function(serv,options)
|
module.exports.server=function(serv,options)
|
||||||
{
|
{
|
||||||
|
|
@ -14,7 +13,7 @@ module.exports.server=function(serv,options)
|
||||||
serv._server.on('login', async (client) => {
|
serv._server.on('login', async (client) => {
|
||||||
if(client.socket.listeners('end').length==0) return; // TODO: should be fixed properly in nmp instead
|
if(client.socket.listeners('end').length==0) return; // TODO: should be fixed properly in nmp instead
|
||||||
try {
|
try {
|
||||||
var player = serv.initEntity('player', null, serv.overworld, new Vec3(0,0,0));
|
const player = serv.initEntity('player', null, serv.overworld, new Vec3(0,0,0));
|
||||||
player._client=client;
|
player._client=client;
|
||||||
|
|
||||||
player.profileProperties=player._client.profile ? player._client.profile.properties : [];
|
player.profileProperties=player._client.profile ? player._client.profile.properties : [];
|
||||||
|
|
@ -129,10 +128,10 @@ module.exports.player=function(player,serv)
|
||||||
}
|
}
|
||||||
|
|
||||||
player.waitPlayerLogin = () => {
|
player.waitPlayerLogin = () => {
|
||||||
var events=["flying","look"];
|
const events=["flying","look"];
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
|
|
||||||
var listener=()=> {
|
const listener=()=> {
|
||||||
events.map(event => player._client.removeListener(event,listener));
|
events.map(event => player._client.removeListener(event,listener));
|
||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var once = require('event-promise');
|
const once = require('event-promise');
|
||||||
|
|
||||||
module.exports.server=function(serv)
|
module.exports.server=function(serv)
|
||||||
{
|
{
|
||||||
|
|
@ -30,7 +30,7 @@ module.exports.player=function(player,serv)
|
||||||
player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnEntities([player]));
|
player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnEntities([player]));
|
||||||
delete serv.entities[player.id];
|
delete serv.entities[player.id];
|
||||||
player.emit('disconnected');
|
player.emit('disconnected');
|
||||||
var index = serv.players.indexOf(player);
|
const index = serv.players.indexOf(player);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
serv.players.splice(index, 1);
|
serv.players.splice(index, 1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
var moment=require("moment");
|
const moment=require("moment");
|
||||||
var rp=require("request-promise");
|
const rp=require("request-promise");
|
||||||
var nodeUuid=require('node-uuid');
|
const nodeUuid=require('node-uuid');
|
||||||
|
|
||||||
module.exports.server=function(serv)
|
module.exports.server=function(serv)
|
||||||
{
|
{
|
||||||
|
|
@ -15,13 +15,11 @@ module.exports.server=function(serv)
|
||||||
serv.bannedIPs[IP] = {
|
serv.bannedIPs[IP] = {
|
||||||
time: +moment(),
|
time: +moment(),
|
||||||
reason: reason || "Your IP is banned!"
|
reason: reason || "Your IP is banned!"
|
||||||
}
|
};
|
||||||
for(var uuid in serv.players){
|
Object.keys(serv.players)
|
||||||
if(serv.players[uuid]._client.socket.remoteAddress == IP){
|
.filter(uuid => serv.players[uuid]._client.socket.remoteAddress == IP)
|
||||||
serv.players[uuid].kick(serv.bannedIPs[serv.players[uuid]._client.socket.remoteAddress].reason)
|
.forEach(uuid => serv.players[uuid].kick(serv.bannedIPs[serv.players[uuid]._client.socket.remoteAddress].reason));
|
||||||
}
|
};
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function uuidInParts(plainUUID)
|
function uuidInParts(plainUUID)
|
||||||
{
|
{
|
||||||
|
|
@ -71,7 +69,7 @@ module.exports.player=function(player,serv)
|
||||||
player.ban = reason => {
|
player.ban = reason => {
|
||||||
reason = reason || "You were banned!";
|
reason = reason || "You were banned!";
|
||||||
player.kick(reason);
|
player.kick(reason);
|
||||||
var uuid=player._client.uuid;
|
const uuid=player._client.uuid;
|
||||||
serv.ban(uuid, reason);
|
serv.ban(uuid, reason);
|
||||||
};
|
};
|
||||||
player.banIP = reason => {
|
player.banIP = reason => {
|
||||||
|
|
@ -92,14 +90,14 @@ module.exports.player=function(player,serv)
|
||||||
parse(str) {
|
parse(str) {
|
||||||
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
|
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
|
||||||
return false;
|
return false;
|
||||||
var parts = str.split(' ');
|
const parts = str.split(' ');
|
||||||
return {
|
return {
|
||||||
username:parts.shift(),
|
username:parts.shift(),
|
||||||
reason:parts.join(' ')
|
reason:parts.join(' ')
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
action({username,reason}) {
|
action({username,reason}) {
|
||||||
var kickPlayer = serv.getPlayer(username);
|
const kickPlayer = serv.getPlayer(username);
|
||||||
if (!kickPlayer) {
|
if (!kickPlayer) {
|
||||||
player.chat(username + " is not on this server!");
|
player.chat(username + " is not on this server!");
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -117,14 +115,14 @@ module.exports.player=function(player,serv)
|
||||||
parse(str) {
|
parse(str) {
|
||||||
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
|
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
|
||||||
return false;
|
return false;
|
||||||
var parts = str.split(' ');
|
const parts = str.split(' ');
|
||||||
return {
|
return {
|
||||||
username:parts.shift(),
|
username:parts.shift(),
|
||||||
reason:parts.join(' ')
|
reason:parts.join(' ')
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
action({username,reason}) {
|
action({username,reason}) {
|
||||||
var banPlayer = serv.getPlayer(username);
|
const banPlayer = serv.getPlayer(username);
|
||||||
|
|
||||||
if (!banPlayer) {
|
if (!banPlayer) {
|
||||||
serv.banUsername(username, reason)
|
serv.banUsername(username, reason)
|
||||||
|
|
@ -146,7 +144,7 @@ module.exports.player=function(player,serv)
|
||||||
usage: '/ban-ip <ip> [reason]',
|
usage: '/ban-ip <ip> [reason]',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str){
|
parse(str){
|
||||||
var argv = str.split(' ');
|
const argv = str.split(' ');
|
||||||
if(argv.length < 1) return;
|
if(argv.length < 1) return;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
@ -166,7 +164,7 @@ module.exports.player=function(player,serv)
|
||||||
usage: '/pardon-ip <ip>',
|
usage: '/pardon-ip <ip>',
|
||||||
op: true,
|
op: true,
|
||||||
action(IP) {
|
action(IP) {
|
||||||
var result=serv.pardonIP(IP);
|
const result=serv.pardonIP(IP);
|
||||||
player.chat(result ? IP + " was IP pardonned" : IP+" is not banned");
|
player.chat(result ? IP + " was IP pardonned" : IP+" is not banned");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -198,7 +196,7 @@ module.exports.player=function(player,serv)
|
||||||
return str;
|
return str;
|
||||||
},
|
},
|
||||||
action(username) {
|
action(username) {
|
||||||
var user = serv.getPlayer(username);
|
const user = serv.getPlayer(username);
|
||||||
if (!user) return 'That player is not on the server.'
|
if (!user) return 'That player is not on the server.'
|
||||||
user.op = true;
|
user.op = true;
|
||||||
player.chat(username + ' is opped');
|
player.chat(username + ' is opped');
|
||||||
|
|
@ -215,7 +213,7 @@ module.exports.player=function(player,serv)
|
||||||
return str;
|
return str;
|
||||||
},
|
},
|
||||||
action(username) {
|
action(username) {
|
||||||
var user = serv.getPlayer(username);
|
const user = serv.getPlayer(username);
|
||||||
if (!user) return 'That player is not on the server.'
|
if (!user) return 'That player is not on the server.'
|
||||||
user.op = false;
|
user.op = false;
|
||||||
player.chat(username + ' is deopped');
|
player.chat(username + ' is deopped');
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,20 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var dir = require("node-dir");
|
const dir = require("node-dir");
|
||||||
var fs = require("fs");
|
const fs = require("fs");
|
||||||
|
|
||||||
function requireFromString(src, filename) {
|
function requireFromString(src, filename) {
|
||||||
var Module = module.constructor;
|
let Module = module.constructor;
|
||||||
var m = new Module();
|
let m = new Module();
|
||||||
m._compile(src, filename);
|
m._compile(src, filename);
|
||||||
return m.exports;
|
return m.exports;
|
||||||
}
|
}
|
||||||
|
|
||||||
function modpeApi() {
|
function modpeApi() {
|
||||||
var Vec3 = null;
|
let Vec3 = null;
|
||||||
var vec3 = null;
|
let vec3 = null;
|
||||||
|
|
||||||
var server = null;
|
let server = null;
|
||||||
var player = null;
|
let player = null;
|
||||||
|
|
||||||
module.exports.startDestroyBlock = startDestroyBlock;
|
module.exports.startDestroyBlock = startDestroyBlock;
|
||||||
module.exports.destroyBlock = destroyBlock;
|
module.exports.destroyBlock = destroyBlock;
|
||||||
|
|
@ -75,12 +75,12 @@ function modpeApi() {
|
||||||
return player.heldItem.blockId;
|
return player.heldItem.blockId;
|
||||||
}
|
}
|
||||||
|
|
||||||
var Player = {
|
let Player = {
|
||||||
getCarriedItem: function () {
|
getCarriedItem: function () {
|
||||||
return player.heldItem.blockId;
|
return player.heldItem.blockId;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var Entity = {
|
let Entity = {
|
||||||
getPitch: function () {
|
getPitch: function () {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -88,7 +88,7 @@ function modpeApi() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var Level = {
|
let Level = {
|
||||||
getGameMode: function () {
|
getGameMode: function () {
|
||||||
return player.gameMode;
|
return player.gameMode;
|
||||||
}
|
}
|
||||||
|
|
@ -99,18 +99,18 @@ function modpeApi() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function convert(code) {
|
function convert(code) {
|
||||||
var api = modpeApi.toString()
|
let api = modpeApi.toString()
|
||||||
.split("\n");
|
.split("\n");
|
||||||
api[0] = "";
|
api[0] = "";
|
||||||
api[api.length - 1] = "";
|
api[api.length - 1] = "";
|
||||||
var finapi = api.join("\n");
|
let finapi = api.join("\n");
|
||||||
code = finapi + code;
|
code = finapi + code;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.server=function(serv,settings)
|
module.exports.server=function(serv,settings)
|
||||||
{
|
{
|
||||||
var verboseMPE=false;
|
let verboseMPE=false;
|
||||||
function log(msg){
|
function log(msg){
|
||||||
if(verboseMPE) serv.log("[MPE]: "+msg);
|
if(verboseMPE) serv.log("[MPE]: "+msg);
|
||||||
}
|
}
|
||||||
|
|
@ -119,10 +119,10 @@ module.exports.server=function(serv,settings)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log("Modpe injection start...");
|
log("Modpe injection start...");
|
||||||
var modPePluginsDir = __dirname+"/../../../modpePlugins";
|
let modPePluginsDir = __dirname+"/../../../modpePlugins";
|
||||||
log("Place your scripts in " + modPePluginsDir);
|
log("Place your scripts in " + modPePluginsDir);
|
||||||
var modCount = 0;
|
let modCount = 0;
|
||||||
var mods = [];
|
let mods = [];
|
||||||
dir.readFiles(modPePluginsDir, {
|
dir.readFiles(modPePluginsDir, {
|
||||||
match: /.js/
|
match: /.js/
|
||||||
, exclude: /^\./
|
, exclude: /^\./
|
||||||
|
|
@ -130,7 +130,7 @@ module.exports.server=function(serv,settings)
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
log("Converting " + fname);
|
log("Converting " + fname);
|
||||||
content = convert(content);
|
content = convert(content);
|
||||||
var modname = fname.split("/")[fname.split("/")
|
let modname = fname.split("/")[fname.split("/")
|
||||||
.length - 1].split(".")[0];
|
.length - 1].split(".")[0];
|
||||||
log("Loading mod " + modname);
|
log("Loading mod " + modname);
|
||||||
mods.push(requireFromString(content));
|
mods.push(requireFromString(content));
|
||||||
|
|
@ -153,7 +153,7 @@ module.exports.server=function(serv,settings)
|
||||||
newLevel();
|
newLevel();
|
||||||
|
|
||||||
player._client.on("block_dig", function (packet) {
|
player._client.on("block_dig", function (packet) {
|
||||||
var pos = new Vec3(packet.location.x,packet.location.y,packet.location.z);
|
let pos = new Vec3(packet.location.x,packet.location.y,packet.location.z);
|
||||||
if (packet.status == 0 && player.gameMode != 1)
|
if (packet.status == 0 && player.gameMode != 1)
|
||||||
startDestroyBlock(pos.x, pos.y, pos.z, 0);
|
startDestroyBlock(pos.x, pos.y, pos.z, 0);
|
||||||
else if (packet.status == 2)
|
else if (packet.status == 2)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.server=function(serv) {
|
module.exports.server=function(serv) {
|
||||||
serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance=true,size=new Vec3(1, 1, 1),count=1}={}) => {
|
serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance=true,size=new Vec3(1, 1, 1),count=1}={}) => {
|
||||||
var players = (typeof whitelist != 'undefined' ? (whitelist instanceof Array ? whitelist : [whitelist]) : serv.getNearby({
|
const players = (typeof whitelist != 'undefined' ? (whitelist instanceof Array ? whitelist : [whitelist]) : serv.getNearby({
|
||||||
world: world,
|
world: world,
|
||||||
position: position.scaled(32).floored(),
|
position: position.scaled(32).floored(),
|
||||||
radius: radius // 32 blocks, fixed position
|
radius: radius // 32 blocks, fixed position
|
||||||
|
|
@ -31,7 +31,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/particle <id> [amount] [<sizeX> <sizeY> <sizeZ>]',
|
usage: '/particle <id> [amount] [<sizeX> <sizeY> <sizeZ>]',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results=str.match(/(\d+)(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?/);
|
const results=str.match(/(\d+)(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?/);
|
||||||
if(!results) return false;
|
if(!results) return false;
|
||||||
return {
|
return {
|
||||||
particle:parseInt(results[1]),
|
particle:parseInt(results[1]),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
var blocks=require("minecraft-data")(require("flying-squid").version).blocks;
|
const blocks=require("minecraft-data")(require("flying-squid").version).blocks;
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.entity=function(entity){
|
module.exports.entity=function(entity){
|
||||||
entity.calculatePhysics = async (delta) => {
|
entity.calculatePhysics = async (delta) => {
|
||||||
|
|
@ -9,17 +9,17 @@ module.exports.entity=function(entity){
|
||||||
addGravity(entity, 'z', delta);
|
addGravity(entity, 'z', delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
var vSign = getSign(entity.velocity);
|
const vSign = getSign(entity.velocity);
|
||||||
var sizeSigned = new Vec3(vSign.x * entity.size.x, vSign.y * entity.size.y, vSign.z * entity.size.z);
|
const sizeSigned = new Vec3(vSign.x * entity.size.x, vSign.y * entity.size.y, vSign.z * entity.size.z);
|
||||||
|
|
||||||
var xVec = entity.position.offset(entity.velocity.x*delta + sizeSigned.x/2, 0, 0).scaled(1/32).floored();
|
const xVec = entity.position.offset(entity.velocity.x*delta + sizeSigned.x/2, 0, 0).scaled(1/32).floored();
|
||||||
var yVec = entity.position.offset(0, entity.velocity.y*delta + sizeSigned.y/2, 0).scaled(1/32).floored();
|
const yVec = entity.position.offset(0, entity.velocity.y*delta + sizeSigned.y/2, 0).scaled(1/32).floored();
|
||||||
var zVec = entity.position.offset(0, 0, entity.velocity.z*delta + sizeSigned.z/2).scaled(1/32).floored();
|
const zVec = entity.position.offset(0, 0, entity.velocity.z*delta + sizeSigned.z/2).scaled(1/32).floored();
|
||||||
|
|
||||||
// Get block for each (x/y/z)Vec, check to avoid duplicate getBlockTypes
|
// Get block for each (x/y/z)Vec, check to avoid duplicate getBlockTypes
|
||||||
var xBlock = blocks[await entity.world.getBlockType(xVec)].boundingBox == 'block';
|
const xBlock = blocks[await entity.world.getBlockType(xVec)].boundingBox == 'block';
|
||||||
var yBlock = yVec.equals(xVec) ? xBlock : blocks[await entity.world.getBlockType(yVec)].boundingBox == 'block';
|
const yBlock = yVec.equals(xVec) ? xBlock : blocks[await entity.world.getBlockType(yVec)].boundingBox == 'block';
|
||||||
var zBlock = zVec.equals(yVec) ? yBlock : (zVec.equals(xVec) ? xBlock : blocks[await entity.world.getBlockType(zVec)].boundingBox == 'block');
|
const zBlock = zVec.equals(yVec) ? yBlock : (zVec.equals(xVec) ? xBlock : blocks[await entity.world.getBlockType(zVec)].boundingBox == 'block');
|
||||||
|
|
||||||
|
|
||||||
if (xBlock || yBlock || zBlock) {
|
if (xBlock || yBlock || zBlock) {
|
||||||
|
|
@ -27,7 +27,7 @@ module.exports.entity=function(entity){
|
||||||
entity.velocity.z = getFriction(entity.velocity.z, entity.friction.z, delta);
|
entity.velocity.z = getFriction(entity.velocity.z, entity.friction.z, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
var newPos = entity.position.clone();
|
const newPos = entity.position.clone();
|
||||||
|
|
||||||
newPos.x += getMoveAmount('x', xBlock, entity, delta, sizeSigned.x);
|
newPos.x += getMoveAmount('x', xBlock, entity, delta, sizeSigned.x);
|
||||||
newPos.y += getMoveAmount('y', yBlock, entity, delta, sizeSigned.y);
|
newPos.y += getMoveAmount('y', yBlock, entity, delta, sizeSigned.y);
|
||||||
|
|
@ -38,9 +38,9 @@ module.exports.entity=function(entity){
|
||||||
};
|
};
|
||||||
|
|
||||||
entity.sendVelocity = (vel, maxVel) => {
|
entity.sendVelocity = (vel, maxVel) => {
|
||||||
var velocity = vel.scaled(32).floored(); // Make fixed point
|
const velocity = vel.scaled(32).floored(); // Make fixed point
|
||||||
var maxVelocity = maxVel.scaled(32).floored();
|
const maxVelocity = maxVel.scaled(32).floored();
|
||||||
var scaledVelocity = velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
const scaledVelocity = velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
||||||
entity._writeNearby('entity_velocity', {
|
entity._writeNearby('entity_velocity', {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
velocityX: scaledVelocity.x,
|
velocityX: scaledVelocity.x,
|
||||||
|
|
@ -88,7 +88,7 @@ module.exports.entity=function(entity){
|
||||||
}
|
}
|
||||||
|
|
||||||
function addVelocityWithMax(current, newVel, max) {
|
function addVelocityWithMax(current, newVel, max) {
|
||||||
var x, y, z;
|
let x, y, z;
|
||||||
if (current.x > max.x || current.x < -max.x) x = current.x;
|
if (current.x > max.x || current.x < -max.x) x = current.x;
|
||||||
else x = Math.max(-max.x, Math.min(max.x, current.x + newVel.x));
|
else x = Math.max(-max.x, Math.min(max.x, current.x + newVel.x));
|
||||||
if (current.y > max.y || current.y < -max.y) y = current.y;
|
if (current.y > max.y || current.y < -max.y) y = current.y;
|
||||||
|
|
@ -109,9 +109,9 @@ module.exports.player = function(player, serv) {
|
||||||
return str.match(/(.+?) (\d+) (\d+) (\d+)/) || false;
|
return str.match(/(.+?) (\d+) (\d+) (\d+)/) || false;
|
||||||
},
|
},
|
||||||
action(params) {
|
action(params) {
|
||||||
var selector = player.selectorString(params[1]);
|
const selector = player.selectorString(params[1]);
|
||||||
var vec = new Vec3(parseInt(params[2]), parseInt(params[3]), parseInt(params[4]));
|
const vec = new Vec3(parseInt(params[2]), parseInt(params[3]), parseInt(params[4]));
|
||||||
selector.forEach(e => e.sendVelocity(vec, vec.scaled(5)));
|
selector.forEach(e => e.sendVelocity(vec, vec.scaled(5)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
var blocks=require("minecraft-data")(require("flying-squid").version).blocks;
|
const blocks=require("minecraft-data")(require("flying-squid").version).blocks;
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
var materialToSound = {
|
const materialToSound = {
|
||||||
undefined: 'stone',
|
undefined: 'stone',
|
||||||
'rock': 'stone',
|
'rock': 'stone',
|
||||||
'dirt': 'grass',
|
'dirt': 'grass',
|
||||||
|
|
@ -15,9 +15,9 @@ module.exports.player=function(player,serv)
|
||||||
{
|
{
|
||||||
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
||||||
if(direction==-1 || heldItem.blockId==-1 || !blocks[heldItem.blockId]) return;
|
if(direction==-1 || heldItem.blockId==-1 || !blocks[heldItem.blockId]) return;
|
||||||
var referencePosition=new Vec3(location.x,location.y,location.z);
|
const referencePosition=new Vec3(location.x,location.y,location.z);
|
||||||
var directionVector=directionToVector[direction];
|
const directionVector=directionToVector[direction];
|
||||||
var placedPosition=referencePosition.plus(directionVector);
|
const placedPosition=referencePosition.plus(directionVector);
|
||||||
player.behavior('placeBlock', {
|
player.behavior('placeBlock', {
|
||||||
direction: directionVector,
|
direction: directionVector,
|
||||||
heldItem: heldItem,
|
heldItem: heldItem,
|
||||||
|
|
@ -47,11 +47,11 @@ module.exports.player=function(player,serv)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, async () => {
|
}, async () => {
|
||||||
var id = await player.world.getBlockType(placedPosition);
|
const id = await player.world.getBlockType(placedPosition);
|
||||||
var damage = await player.world.getBlockData(placedPosition);
|
const damage = await player.world.getBlockData(placedPosition);
|
||||||
player.sendBlock(placedPosition, id, damage);
|
player.sendBlock(placedPosition, id, damage);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
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)];
|
const 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)];
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ module.exports.server=function(serv)
|
||||||
serv.entities={};
|
serv.entities={};
|
||||||
|
|
||||||
serv.getPlayer = username => {
|
serv.getPlayer = username => {
|
||||||
for (var p in serv.players) {
|
const found=serv.players.filter(pl => pl.username == username);
|
||||||
if (serv.players[p].username == username) return serv.players[p]
|
if(found.length>0)
|
||||||
}
|
return found[0];
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -21,7 +21,7 @@ module.exports.player=function(player){
|
||||||
usage: '/gamemode <0-3>',
|
usage: '/gamemode <0-3>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results;
|
let results;
|
||||||
if(!(results = str.match(/^([0-3])$/)))
|
if(!(results = str.match(/^([0-3])$/)))
|
||||||
return false;
|
return false;
|
||||||
return parseInt(str);
|
return parseInt(str);
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
var {detectFrame,generatePortal,addPortalToWorld}=require("flying-squid").portal_detector;
|
const {detectFrame,generatePortal,addPortalToWorld}=require("flying-squid").portal_detector;
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var UserError=require("flying-squid").UserError;
|
const UserError=require("flying-squid").UserError;
|
||||||
|
|
||||||
module.exports.player=function(player,serv) {
|
module.exports.player=function(player,serv) {
|
||||||
player.use_flint_and_steel=async (referencePosition,direction,position) => {
|
player.use_flint_and_steel=async (referencePosition,direction,position) => {
|
||||||
let block=await player.world.getBlock(referencePosition);
|
let block=await player.world.getBlock(referencePosition);
|
||||||
if(block.name=="obsidian")
|
if(block.name=="obsidian")
|
||||||
{
|
{
|
||||||
var frames=await detectFrame(player.world,referencePosition,direction);
|
const frames=await detectFrame(player.world,referencePosition,direction);
|
||||||
if(frames.length!=0) {
|
if(frames.length!=0) {
|
||||||
var air = frames[0].air;
|
const air = frames[0].air;
|
||||||
air.forEach(pos => player.setBlock(pos, 90, (frames[0].bottom[0].x - frames[0].bottom[1].x) != 0 ? 1 : 2));
|
air.forEach(pos => player.setBlock(pos, 90, (frames[0].bottom[0].x - frames[0].bottom[1].x) != 0 ? 1 : 2));
|
||||||
player.world.portals.push(frames[0]);
|
player.world.portals.push(frames[0]);
|
||||||
return;
|
return;
|
||||||
|
|
@ -52,7 +52,7 @@ module.exports.player=function(player,serv) {
|
||||||
usage: '/portal <bottomLeft:<x> <y> <z>> <direction:x|z> <width> <height>',
|
usage: '/portal <bottomLeft:<x> <y> <z>> <direction:x|z> <width> <height>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var pars=str.split(' ');
|
const pars=str.split(' ');
|
||||||
if(pars.length!=6)
|
if(pars.length!=6)
|
||||||
return false;
|
return false;
|
||||||
let [x,y,z,direction,width,height]=pars;
|
let [x,y,z,direction,width,height]=pars;
|
||||||
|
|
@ -64,7 +64,7 @@ module.exports.player=function(player,serv) {
|
||||||
return {bottomLeft,direction,width,height};
|
return {bottomLeft,direction,width,height};
|
||||||
},
|
},
|
||||||
async action({bottomLeft,direction,width,height}) {
|
async action({bottomLeft,direction,width,height}) {
|
||||||
var portal=generatePortal(bottomLeft,direction,width,height);
|
const portal=generatePortal(bottomLeft,direction,width,height);
|
||||||
await addPortalToWorld(player.world,portal,[],[],async (pos,type) => {
|
await addPortalToWorld(player.world,portal,[],[],async (pos,type) => {
|
||||||
await serv.setBlock(player.world,pos,type,0);
|
await serv.setBlock(player.world,pos,type,0);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var UserError = require('flying-squid').UserError;
|
const UserError = require('flying-squid').UserError;
|
||||||
|
|
||||||
module.exports.player=function(player,serv)
|
module.exports.player=function(player,serv)
|
||||||
{
|
{
|
||||||
|
|
@ -15,7 +15,7 @@ module.exports.player=function(player,serv)
|
||||||
|
|
||||||
function attackEntity(entityId)
|
function attackEntity(entityId)
|
||||||
{
|
{
|
||||||
var attackedEntity = serv.entities[entityId];
|
const attackedEntity = serv.entities[entityId];
|
||||||
if(!attackedEntity || (attackedEntity.gameMode != 0 && attackedEntity.type == 'player')) return;
|
if(!attackedEntity || (attackedEntity.gameMode != 0 && attackedEntity.type == 'player')) return;
|
||||||
|
|
||||||
player.behavior('attack', {
|
player.behavior('attack', {
|
||||||
|
|
@ -27,7 +27,7 @@ module.exports.player=function(player,serv)
|
||||||
player._client.on("use_entity", ({mouse,target} = {}) => {
|
player._client.on("use_entity", ({mouse,target} = {}) => {
|
||||||
if(!serv.entities[target])
|
if(!serv.entities[target])
|
||||||
{
|
{
|
||||||
var dragon;
|
let dragon;
|
||||||
for(dragon=target-1;dragon>=target-7 && !serv.entities[dragon];dragon--){}
|
for(dragon=target-1;dragon>=target-7 && !serv.entities[dragon];dragon--){}
|
||||||
if(serv.entities[dragon] && serv.entities[dragon].entityType==63)
|
if(serv.entities[dragon] && serv.entities[dragon].entityType==63)
|
||||||
target=dragon;
|
target=dragon;
|
||||||
|
|
@ -45,7 +45,7 @@ module.exports.player=function(player,serv)
|
||||||
return str || false;
|
return str || false;
|
||||||
},
|
},
|
||||||
action(sel) {
|
action(sel) {
|
||||||
var arr = player.selectorString(sel);
|
let arr = player.selectorString(sel);
|
||||||
if (arr.length==0) throw new UserError('Could not find player');
|
if (arr.length==0) throw new UserError('Could not find player');
|
||||||
|
|
||||||
arr.map(entity => entity.takeDamage({damage:20}));
|
arr.map(entity => entity.takeDamage({damage:20}));
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
|
|
||||||
function randomInt (low, high) {
|
function randomInt (low, high) {
|
||||||
|
|
@ -11,12 +11,12 @@ module.exports.server=function(serv,settings)
|
||||||
|
|
||||||
async function findSpawnZone(world,initialPoint)
|
async function findSpawnZone(world,initialPoint)
|
||||||
{
|
{
|
||||||
var point=initialPoint;
|
let point=initialPoint;
|
||||||
while((await (world.getBlockType(point)))==0)
|
while((await (world.getBlockType(point)))==0)
|
||||||
point=point.offset(0,-1,0);
|
point=point.offset(0,-1,0);
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
var p=await world.getBlockType(point);
|
const p=await world.getBlockType(point);
|
||||||
if(p!=8 && p!=9)
|
if(p!=8 && p!=9)
|
||||||
break;
|
break;
|
||||||
point=point.offset(1,0,0);
|
point=point.offset(1,0,0);
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
|
|
||||||
module.exports.server=function(serv) {
|
module.exports.server=function(serv) {
|
||||||
serv.playSound = (sound, world, position, {whitelist,blacklist=[],radius=32*32,volume=1.0,pitch=1.0}={}) => {
|
serv.playSound = (sound, world, position, {whitelist,blacklist=[],radius=32*32,volume=1.0,pitch=1.0}={}) => {
|
||||||
var players = (typeof whitelist != 'undefined' ? (typeof whitelist instanceof Array ? whitelist : [whitelist]) : serv.getNearby({
|
const players = (typeof whitelist != 'undefined' ? (typeof whitelist instanceof Array ? whitelist : [whitelist]) : serv.getNearby({
|
||||||
world: world,
|
world: world,
|
||||||
position: position.scaled(32).floored(),
|
position: position.scaled(32).floored(),
|
||||||
radius: radius // 32 blocks, fixed position
|
radius: radius // 32 blocks, fixed position
|
||||||
}));
|
}));
|
||||||
players.filter(player => blacklist.indexOf(player) == -1)
|
players.filter(player => blacklist.indexOf(player) == -1)
|
||||||
.forEach(player => {
|
.forEach(player => {
|
||||||
var pos = (position || player.position.scaled(1/32)).scaled(8).floored();
|
const pos = (position || player.position.scaled(1/32)).scaled(8).floored();
|
||||||
player._client.write('named_sound_effect', {
|
player._client.write('named_sound_effect', {
|
||||||
soundName: sound,
|
soundName: sound,
|
||||||
x: pos.x,
|
x: pos.x,
|
||||||
|
|
@ -42,11 +42,11 @@ module.exports.player=function(player,serv) {
|
||||||
|
|
||||||
player.on('placeBlock_cancel', async ({reference}, cancel) => {
|
player.on('placeBlock_cancel', async ({reference}, cancel) => {
|
||||||
if (player.crouching) return;
|
if (player.crouching) return;
|
||||||
var id = await player.world.getBlockType(reference);
|
const id = await player.world.getBlockType(reference);
|
||||||
if (id != 25) return;
|
if (id != 25) return;
|
||||||
cancel(false);
|
cancel(false);
|
||||||
if (!player.world.blockEntityData[reference.toString()]) player.world.blockEntityData[reference.toString()] = {};
|
if (!player.world.blockEntityData[reference.toString()]) player.world.blockEntityData[reference.toString()] = {};
|
||||||
var data = player.world.blockEntityData[reference.toString()];
|
const data = player.world.blockEntityData[reference.toString()];
|
||||||
if (typeof data.note == 'undefined') data.note = -1;
|
if (typeof data.note == 'undefined') data.note = -1;
|
||||||
data.note++;
|
data.note++;
|
||||||
data.note %= 25;
|
data.note %= 25;
|
||||||
|
|
@ -54,11 +54,11 @@ module.exports.player=function(player,serv) {
|
||||||
});
|
});
|
||||||
|
|
||||||
player.on('dig_cancel', async ({position}, cancel) => {
|
player.on('dig_cancel', async ({position}, cancel) => {
|
||||||
var id = await player.world.getBlockType(position);
|
const id = await player.world.getBlockType(position);
|
||||||
if (id != 25) return;
|
if (id != 25) return;
|
||||||
cancel(false);
|
cancel(false);
|
||||||
if (!player.world.blockEntityData[position.toString()]) player.world.blockEntityData[position.toString()] = {};
|
if (!player.world.blockEntityData[position.toString()]) player.world.blockEntityData[position.toString()] = {};
|
||||||
var data = player.world.blockEntityData[position.toString()];
|
const data = player.world.blockEntityData[position.toString()];
|
||||||
if (typeof data.note == 'undefined') data.note = 0;
|
if (typeof data.note == 'undefined') data.note = 0;
|
||||||
serv.playNoteBlock(data.note ,player.world, position);
|
serv.playNoteBlock(data.note ,player.world, position);
|
||||||
});
|
});
|
||||||
|
|
@ -70,7 +70,7 @@ module.exports.player=function(player,serv) {
|
||||||
usage: '/playsound <sound_name> [volume] [pitch]',
|
usage: '/playsound <sound_name> [volume] [pitch]',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/);
|
const results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/);
|
||||||
if(!results) return false;
|
if(!results) return false;
|
||||||
return {
|
return {
|
||||||
sound_name:results[1],
|
sound_name:results[1],
|
||||||
|
|
@ -90,7 +90,7 @@ module.exports.player=function(player,serv) {
|
||||||
usage: '/playsoundforall <sound_name> [volume] [pitch]',
|
usage: '/playsoundforall <sound_name> [volume] [pitch]',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/);
|
const results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/);
|
||||||
if(!results) return false;
|
if(!results) return false;
|
||||||
return {
|
return {
|
||||||
sound_name:results[1],
|
sound_name:results[1],
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
var version = require("flying-squid").version;
|
const version = require("flying-squid").version;
|
||||||
var entitiesByName=require("minecraft-data")(version).entitiesByName;
|
const entitiesByName=require("minecraft-data")(version).entitiesByName;
|
||||||
var entitiesById=require("minecraft-data")(version).entities;
|
const entitiesById=require("minecraft-data")(version).entities;
|
||||||
var Entity = require("prismarine-entity");
|
const Entity = require("prismarine-entity");
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var requireIndex = require('requireindex');
|
const requireIndex = require('requireindex');
|
||||||
var plugins = requireIndex(path.join(__dirname,'..', 'plugins'));
|
const plugins = requireIndex(path.join(__dirname,'..', 'plugins'));
|
||||||
var Item = require("prismarine-item")(version);
|
const Item = require("prismarine-item")(version);
|
||||||
var UserError = require('flying-squid').UserError;
|
const UserError = require('flying-squid').UserError;
|
||||||
|
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.server=function(serv,options) {
|
module.exports.server=function(serv,options) {
|
||||||
serv.initEntity = (type, entityType, world, position) => {
|
serv.initEntity = (type, entityType, world, position) => {
|
||||||
serv.entityMaxId++;
|
serv.entityMaxId++;
|
||||||
var entity = new Entity(serv.entityMaxId);
|
const entity = new Entity(serv.entityMaxId);
|
||||||
|
|
||||||
Object.keys(plugins)
|
Object.keys(plugins)
|
||||||
.filter(pluginName => plugins[pluginName].entity!=undefined)
|
.filter(pluginName => plugins[pluginName].entity!=undefined)
|
||||||
|
|
@ -27,7 +27,7 @@ module.exports.server=function(serv,options) {
|
||||||
};
|
};
|
||||||
|
|
||||||
serv.spawnObject = (type, world, position, {pitch=0,yaw=0,velocity=new Vec3(0,0,0),data=1,itemId,itemDamage=0,pickupTime=undefined,deathTime=undefined}) => {
|
serv.spawnObject = (type, world, position, {pitch=0,yaw=0,velocity=new Vec3(0,0,0),data=1,itemId,itemDamage=0,pickupTime=undefined,deathTime=undefined}) => {
|
||||||
var object = serv.initEntity('object', type, world, position.scaled(32).floored());
|
const object = serv.initEntity('object', type, world, position.scaled(32).floored());
|
||||||
object.data = data;
|
object.data = data;
|
||||||
object.velocity = velocity.scaled(32).floored();
|
object.velocity = velocity.scaled(32).floored();
|
||||||
object.pitch = pitch;
|
object.pitch = pitch;
|
||||||
|
|
@ -45,7 +45,7 @@ module.exports.server=function(serv,options) {
|
||||||
};
|
};
|
||||||
|
|
||||||
serv.spawnMob = (type, world, position, {pitch=0,yaw=0,headPitch=0,velocity=new Vec3(0,0,0),metadata=[]}={}) => {
|
serv.spawnMob = (type, world, position, {pitch=0,yaw=0,headPitch=0,velocity=new Vec3(0,0,0),metadata=[]}={}) => {
|
||||||
var mob = serv.initEntity('mob', type, world, position.scaled(32).floored());
|
const mob = serv.initEntity('mob', type, world, position.scaled(32).floored());
|
||||||
mob.name=entitiesById[type].name;
|
mob.name=entitiesById[type].name;
|
||||||
mob.velocity = velocity.scaled(32).floored();
|
mob.velocity = velocity.scaled(32).floored();
|
||||||
mob.pitch = pitch;
|
mob.pitch = pitch;
|
||||||
|
|
@ -78,7 +78,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/spawn <entity_id>',
|
usage: '/spawn <entity_id>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results=str.match(/(\d+)/);
|
const results=str.match(/(\d+)/);
|
||||||
if (!results) return false;
|
if (!results) return false;
|
||||||
return {
|
return {
|
||||||
id: parseInt(results[1])
|
id: parseInt(results[1])
|
||||||
|
|
@ -97,7 +97,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/spawnObject <entity_id>',
|
usage: '/spawnObject <entity_id>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var results=str.match(/(\d+)/);
|
const results=str.match(/(\d+)/);
|
||||||
if (!results) return false;
|
if (!results) return false;
|
||||||
return {
|
return {
|
||||||
id: parseInt(results[1])
|
id: parseInt(results[1])
|
||||||
|
|
@ -116,7 +116,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/summon <entity_name>',
|
usage: '/summon <entity_name>',
|
||||||
op: true,
|
op: true,
|
||||||
action(name) {
|
action(name) {
|
||||||
var entity=entitiesByName[name];
|
const entity=entitiesByName[name];
|
||||||
if(!entity) {
|
if(!entity) {
|
||||||
player.chat("No entity named "+name);
|
player.chat("No entity named "+name);
|
||||||
return;
|
return;
|
||||||
|
|
@ -133,7 +133,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/pile <entities types>',
|
usage: '/pile <entities types>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var args=str.split(' ');
|
const args=str.split(' ');
|
||||||
if(args.length==0)
|
if(args.length==0)
|
||||||
return false;
|
return false;
|
||||||
return args
|
return args
|
||||||
|
|
@ -159,7 +159,7 @@ module.exports.player=function(player,serv){
|
||||||
usage: '/attach <carrier> <attached>',
|
usage: '/attach <carrier> <attached>',
|
||||||
op: true,
|
op: true,
|
||||||
parse(str) {
|
parse(str) {
|
||||||
var args=str.split(' ');
|
const args=str.split(' ');
|
||||||
if(args.length!=2)
|
if(args.length!=2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -221,7 +221,7 @@ module.exports.entity=function(entity,serv) {
|
||||||
};
|
};
|
||||||
|
|
||||||
entity.getSpawnPacket = () => {
|
entity.getSpawnPacket = () => {
|
||||||
var scaledVelocity = entity.velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
const scaledVelocity = entity.velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
||||||
if (entity.type == 'player') {
|
if (entity.type == 'player') {
|
||||||
return {
|
return {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
|
|
@ -271,17 +271,17 @@ module.exports.entity=function(entity,serv) {
|
||||||
|
|
||||||
|
|
||||||
entity.updateAndSpawn = () => {
|
entity.updateAndSpawn = () => {
|
||||||
var updatedEntities=entity.getNearby();
|
const updatedEntities=entity.getNearby();
|
||||||
var entitiesToAdd=updatedEntities.filter(e => entity.nearbyEntities.indexOf(e)==-1);
|
const entitiesToAdd=updatedEntities.filter(e => entity.nearbyEntities.indexOf(e)==-1);
|
||||||
var entitiesToRemove=entity.nearbyEntities.filter(e => updatedEntities.indexOf(e)==-1);
|
const entitiesToRemove=entity.nearbyEntities.filter(e => updatedEntities.indexOf(e)==-1);
|
||||||
if (entity.type == 'player') {
|
if (entity.type == 'player') {
|
||||||
entity.despawnEntities(entitiesToRemove);
|
entity.despawnEntities(entitiesToRemove);
|
||||||
entitiesToAdd.forEach(entity.spawnEntity);
|
entitiesToAdd.forEach(entity.spawnEntity);
|
||||||
}
|
}
|
||||||
entity.lastPositionPlayersUpdated=entity.position.clone();
|
entity.lastPositionPlayersUpdated=entity.position.clone();
|
||||||
|
|
||||||
var playersToAdd = entitiesToAdd.filter(e => e.type == 'player');
|
const playersToAdd = entitiesToAdd.filter(e => e.type == 'player');
|
||||||
var playersToRemove = entitiesToRemove.filter(e => e.type == 'player');
|
const playersToRemove = entitiesToRemove.filter(e => e.type == 'player');
|
||||||
|
|
||||||
playersToRemove.forEach(p => p.despawnEntities([entity]));
|
playersToRemove.forEach(p => p.despawnEntities([entity]));
|
||||||
playersToRemove.forEach(p => p.nearbyEntities=p.getNearby());
|
playersToRemove.forEach(p => p.nearbyEntities=p.getNearby());
|
||||||
|
|
@ -303,7 +303,7 @@ module.exports.entity=function(entity,serv) {
|
||||||
|
|
||||||
entity.attach= (attachedEntity,leash=false) =>
|
entity.attach= (attachedEntity,leash=false) =>
|
||||||
{
|
{
|
||||||
var p={
|
const p={
|
||||||
entityId:attachedEntity.id,
|
entityId:attachedEntity.id,
|
||||||
vehicleId:entity.id,
|
vehicleId:entity.id,
|
||||||
leash:leash
|
leash:leash
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ module.exports.server=function(serv) {
|
||||||
|
|
||||||
serv.tickInterval = setInterval(() => {
|
serv.tickInterval = setInterval(() => {
|
||||||
serv.tickCount++;
|
serv.tickCount++;
|
||||||
var t=Date.now();
|
const t=Date.now();
|
||||||
var time = (t - serv.lastTickTime) / 1000;
|
let time = (t - serv.lastTickTime) / 1000;
|
||||||
if (time > 100) time = 0;
|
if (time > 100) time = 0;
|
||||||
serv.emit('tick', time, serv.tickCount);
|
serv.emit('tick', time, serv.tickCount);
|
||||||
serv.lastTickTime = t;
|
serv.lastTickTime = t;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var UserError = require('flying-squid').UserError;
|
const UserError = require('flying-squid').UserError;
|
||||||
|
|
||||||
module.exports.player = (player, serv) => {
|
module.exports.player = (player, serv) => {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
Vec3.prototype.toFixedPosition=function() {
|
Vec3.prototype.toFixedPosition=function() {
|
||||||
return this.scaled(32).floored();
|
return this.scaled(32).floored();
|
||||||
|
|
@ -10,7 +10,7 @@ module.exports.player=function(player)
|
||||||
|
|
||||||
// float (degrees) --> byte (1/256 "degrees")
|
// float (degrees) --> byte (1/256 "degrees")
|
||||||
function conv(f){
|
function conv(f){
|
||||||
var b = Math.floor((f % 360) * 256 / 360);
|
let b = Math.floor((f % 360) * 256 / 360);
|
||||||
if (b < -128) b += 256;
|
if (b < -128) b += 256;
|
||||||
else if (b > 127) b -= 256;
|
else if (b > 127) b -= 256;
|
||||||
return b;
|
return b;
|
||||||
|
|
@ -22,8 +22,8 @@ module.exports.player=function(player)
|
||||||
pitch: pitch,
|
pitch: pitch,
|
||||||
onGround: onGround
|
onGround: onGround
|
||||||
}, () => {
|
}, () => {
|
||||||
var convYaw=conv(yaw);
|
const convYaw=conv(yaw);
|
||||||
var convPitch=conv(pitch);
|
const convPitch=conv(pitch);
|
||||||
if (convYaw == player.yaw && convPitch == player.pitch) return;
|
if (convYaw == player.yaw && convPitch == player.pitch) return;
|
||||||
player._writeOthersNearby("entity_look", {
|
player._writeOthersNearby("entity_look", {
|
||||||
entityId: player.id,
|
entityId: player.id,
|
||||||
|
|
@ -64,18 +64,18 @@ module.exports.player=function(player)
|
||||||
};
|
};
|
||||||
|
|
||||||
player.teleport = async (position) => {
|
player.teleport = async (position) => {
|
||||||
var notCancelled = await player.sendPosition(position.scaled(32).floored(), false, true);
|
const notCancelled = await player.sendPosition(position.scaled(32).floored(), false, true);
|
||||||
if (notCancelled) player.sendSelfPosition();
|
if (notCancelled) player.sendSelfPosition();
|
||||||
}
|
};
|
||||||
|
|
||||||
player.sendAbilities = () => { // TODO: Fix all of this...
|
player.sendAbilities = () => { // TODO: Fix all of this...
|
||||||
var godmode = player.gameMode == 1 || player.gameMode == 3;
|
const godmode = player.gameMode == 1 || player.gameMode == 3;
|
||||||
var canFly = player.gameMode == 1 || player.gameMode == 3;
|
const canFly = player.gameMode == 1 || player.gameMode == 3;
|
||||||
var isFlying = !player.onGround && canFly;
|
const isFlying = !player.onGround && canFly;
|
||||||
var creativeMode = player.gameMode == 1;
|
const creativeMode = player.gameMode == 1;
|
||||||
var f = (+godmode*8) + (+canFly*4) + (+isFlying*2) + (+creativeMode*1);
|
const f = (+godmode*8) + (+canFly*4) + (+isFlying*2) + (+creativeMode*1);
|
||||||
var walkingSpeed = 0.2 * (1 + (player.effects[1] != null ? (player.effects[1].amplifier + 1) : 0) * 0.2)
|
const walkingSpeed = 0.2 * (1 + (player.effects[1] != null ? (player.effects[1].amplifier + 1) : 0) * 0.2)
|
||||||
var flyingSpeed = 0.1;
|
const flyingSpeed = 0.1;
|
||||||
/*console.log(walkingSpeed, flyingSpeed);
|
/*console.log(walkingSpeed, flyingSpeed);
|
||||||
player._client.write('abilities', { // FIIIIXXXXXXX
|
player._client.write('abilities', { // FIIIIXXXXXXX
|
||||||
flags: f,
|
flags: f,
|
||||||
|
|
@ -94,7 +94,7 @@ module.exports.entity=function(entity,serv){
|
||||||
onGround: onGround,
|
onGround: onGround,
|
||||||
teleport: teleport
|
teleport: teleport
|
||||||
}, ({position,onGround}) => {
|
}, ({position,onGround}) => {
|
||||||
var diff = position.minus(entity.position);
|
const diff = position.minus(entity.position);
|
||||||
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)
|
||||||
entity._writeOthersNearby('entity_teleport', {
|
entity._writeOthersNearby('entity_teleport', {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
var items=require("minecraft-data")(require("flying-squid").version).items;
|
const items=require("minecraft-data")(require("flying-squid").version).items;
|
||||||
var Item = require("prismarine-item")(require("flying-squid").version);
|
const Item = require("prismarine-item")(require("flying-squid").version);
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
|
|
||||||
module.exports.player=function(player,serv)
|
module.exports.player=function(player,serv)
|
||||||
{
|
{
|
||||||
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
player._client.on("block_place",({direction,heldItem,location} = {}) => {
|
||||||
if (direction == -1 || heldItem.blockId == -1 || !items[heldItem.blockId]) return;
|
if (direction == -1 || heldItem.blockId == -1 || !items[heldItem.blockId]) return;
|
||||||
var item=Item.fromNotch(heldItem);
|
const item=Item.fromNotch(heldItem);
|
||||||
var referencePosition = new Vec3(location.x, location.y, location.z);
|
const referencePosition = new Vec3(location.x, location.y, location.z);
|
||||||
var directionVector = directionToVector[direction];
|
const directionVector = directionToVector[direction];
|
||||||
var position = referencePosition.plus(directionVector);
|
const position = referencePosition.plus(directionVector);
|
||||||
|
|
||||||
if(item.name=="flint_and_steel")
|
if(item.name=="flint_and_steel")
|
||||||
player.use_flint_and_steel(referencePosition,directionVector,position);
|
player.use_flint_and_steel(referencePosition,directionVector,position);
|
||||||
|
|
@ -17,4 +17,4 @@ module.exports.player=function(player,serv)
|
||||||
serv.spawnMob(item.metadata,player.world,position);
|
serv.spawnMob(item.metadata,player.world,position);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
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)];
|
const 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,9 +1,9 @@
|
||||||
var spiralloop = require('spiralloop');
|
const spiralloop = require('spiralloop');
|
||||||
|
|
||||||
var World = require('prismarine-world');
|
const World = require('prismarine-world');
|
||||||
var WorldSync = require("prismarine-world-sync");
|
const WorldSync = require("prismarine-world-sync");
|
||||||
|
|
||||||
var generations=require("flying-squid").generations;
|
const generations=require("flying-squid").generations;
|
||||||
|
|
||||||
module.exports.server=function(serv,{regionFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) {
|
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);
|
generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32);
|
||||||
|
|
@ -22,9 +22,9 @@ module.exports.server=function(serv,{regionFolder,generation={"name":"diamond_sq
|
||||||
//////////////
|
//////////////
|
||||||
|
|
||||||
serv.pregenWorld = (world, size=3) => {
|
serv.pregenWorld = (world, size=3) => {
|
||||||
var promises = [];
|
const promises = [];
|
||||||
for (var x = -size; x < size; x++) {
|
for (let x = -size; x < size; x++) {
|
||||||
for (var z = -size; z < size; z++) {
|
for (let z = -size; z < size; z++) {
|
||||||
promises.push(world.getColumn(x, z));
|
promises.push(world.getColumn(x, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -79,7 +79,7 @@ module.exports.player=function(player,serv,settings) {
|
||||||
|
|
||||||
function spiral(arr)
|
function spiral(arr)
|
||||||
{
|
{
|
||||||
var t=[];
|
const t=[];
|
||||||
spiralloop(arr,(x,z) => {
|
spiralloop(arr,(x,z) => {
|
||||||
t.push([x,z]);
|
t.push([x,z]);
|
||||||
});
|
});
|
||||||
|
|
@ -89,8 +89,8 @@ module.exports.player=function(player,serv,settings) {
|
||||||
player.sendNearbyChunks = (view,group) =>
|
player.sendNearbyChunks = (view,group) =>
|
||||||
{
|
{
|
||||||
player.lastPositionChunkUpdated=player.position;
|
player.lastPositionChunkUpdated=player.position;
|
||||||
var playerChunkX=Math.floor(player.position.x/16/32);
|
const playerChunkX=Math.floor(player.position.x/16/32);
|
||||||
var playerChunkZ=Math.floor(player.position.z/16/32);
|
const playerChunkZ=Math.floor(player.position.z/16/32);
|
||||||
|
|
||||||
Object.keys(player.loadedChunks)
|
Object.keys(player.loadedChunks)
|
||||||
.map((key) => key.split(",").map(a => parseInt(a)))
|
.map((key) => key.split(",").map(a => parseInt(a)))
|
||||||
|
|
@ -103,13 +103,13 @@ module.exports.player=function(player,serv,settings) {
|
||||||
chunkZ:playerChunkZ+t[1]-view
|
chunkZ:playerChunkZ+t[1]-view
|
||||||
}))
|
}))
|
||||||
.filter(({chunkX,chunkZ}) => {
|
.filter(({chunkX,chunkZ}) => {
|
||||||
var key=chunkX+","+chunkZ;
|
const key=chunkX+","+chunkZ;
|
||||||
var loaded=player.loadedChunks[key];
|
const loaded=player.loadedChunks[key];
|
||||||
if(!loaded) player.loadedChunks[key]=1;
|
if(!loaded) player.loadedChunks[key]=1;
|
||||||
return !loaded;
|
return !loaded;
|
||||||
})
|
})
|
||||||
.reduce((acc,{chunkX,chunkZ})=> {
|
.reduce((acc,{chunkX,chunkZ})=> {
|
||||||
var p=acc
|
const p=acc
|
||||||
.then(() => player.world.getColumn(chunkX, chunkZ))
|
.then(() => player.world.getColumn(chunkX, chunkZ))
|
||||||
.then((column) => player.sendChunk(chunkX, chunkZ, column));
|
.then((column) => player.sendChunk(chunkX, chunkZ, column));
|
||||||
return group ? p.then(() => sleep(5)) : p;
|
return group ? p.then(() => sleep(5)) : p;
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var assert = require('assert');
|
const assert = require('assert');
|
||||||
var flatMap = require('flatmap');
|
const flatMap = require('flatmap');
|
||||||
var range = require('range').range;
|
const range = require('range').range;
|
||||||
|
|
||||||
module.exports={detectFrame,findPotentialLines,findBorder,getAir,generateLine,generatePortal,addPortalToWorld,makeWorldWithPortal};
|
module.exports={detectFrame,findPotentialLines,findBorder,getAir,generateLine,generatePortal,addPortalToWorld,makeWorldWithPortal};
|
||||||
|
|
||||||
async function findLineInDirection(world,startingPoint,type,direction,directionV)
|
async function findLineInDirection(world,startingPoint,type,direction,directionV)
|
||||||
{
|
{
|
||||||
var line=[];
|
const line=[];
|
||||||
var point=startingPoint;
|
let point=startingPoint;
|
||||||
while((await world.getBlock(point)).name==type && (await world.getBlockType(point.plus(directionV)))==0)
|
while((await world.getBlock(point)).name==type && (await world.getBlockType(point.plus(directionV)))==0)
|
||||||
{
|
{
|
||||||
line.push(point);
|
line.push(point);
|
||||||
|
|
@ -19,15 +19,15 @@ async function findLineInDirection(world,startingPoint,type,direction,directionV
|
||||||
|
|
||||||
async function findLine(world,startingPoint,type,direction,directionV)
|
async function findLine(world,startingPoint,type,direction,directionV)
|
||||||
{
|
{
|
||||||
var firstSegment=(await findLineInDirection(world,startingPoint.plus(direction.scaled(-1)),type,direction.scaled(-1),directionV)).reverse();
|
const firstSegment=(await findLineInDirection(world,startingPoint.plus(direction.scaled(-1)),type,direction.scaled(-1),directionV)).reverse();
|
||||||
var secondSegment=await findLineInDirection(world,startingPoint,type,direction,directionV);
|
const secondSegment=await findLineInDirection(world,startingPoint,type,direction,directionV);
|
||||||
return firstSegment.concat(secondSegment);
|
return firstSegment.concat(secondSegment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function findPotentialLines(world,startingPoint,directionV)
|
async function findPotentialLines(world,startingPoint,directionV)
|
||||||
{
|
{
|
||||||
var firstLineDirection=directionV.y!=0 ? [new Vec3(1,0,0),new Vec3(0,0,1)] :
|
const firstLineDirection=directionV.y!=0 ? [new Vec3(1,0,0),new Vec3(0,0,1)] :
|
||||||
[new Vec3(0,1,0)];
|
[new Vec3(0,1,0)];
|
||||||
return (await Promise.all(firstLineDirection
|
return (await Promise.all(firstLineDirection
|
||||||
.map(async d => ({direction:d,line:(await findLine(world,startingPoint,'obsidian',d,directionV))}))))
|
.map(async d => ({direction:d,line:(await findLine(world,startingPoint,'obsidian',d,directionV))}))))
|
||||||
|
|
@ -44,15 +44,15 @@ function positiveOrder(line,direction)
|
||||||
|
|
||||||
async function findBorder(world,{line,direction},directionV)
|
async function findBorder(world,{line,direction},directionV)
|
||||||
{
|
{
|
||||||
var bottom=line;
|
let bottom=line;
|
||||||
if(bottom.length==0)
|
if(bottom.length==0)
|
||||||
return [];
|
return [];
|
||||||
var left=await findLineInDirection(world,bottom[0].plus(direction.scaled(-1).plus(directionV)),'obsidian',directionV,direction);
|
let left=await findLineInDirection(world,bottom[0].plus(direction.scaled(-1).plus(directionV)),'obsidian',directionV,direction);
|
||||||
var right=await findLineInDirection(world,bottom[line.length-1].plus(direction).plus(directionV),'obsidian',
|
let right=await findLineInDirection(world,bottom[line.length-1].plus(direction).plus(directionV),'obsidian',
|
||||||
directionV,direction.scaled(-1));
|
directionV,direction.scaled(-1));
|
||||||
if(left.length==0 || left.length!=right.length)
|
if(left.length==0 || left.length!=right.length)
|
||||||
return null;
|
return null;
|
||||||
var top=await findLineInDirection(world,left[left.length-1].plus(direction).plus(directionV),'obsidian',
|
let top=await findLineInDirection(world,left[left.length-1].plus(direction).plus(directionV),'obsidian',
|
||||||
direction,directionV.scaled(-1));
|
direction,directionV.scaled(-1));
|
||||||
if(bottom.length!=top.length)
|
if(bottom.length!=top.length)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -66,7 +66,7 @@ async function findBorder(world,{line,direction},directionV)
|
||||||
[bottom,left,right,top]=[left,bottom,top,right];
|
[bottom,left,right,top]=[left,bottom,top,right];
|
||||||
|
|
||||||
[bottom,top]=directionV.y<0 ? [top,bottom] : [bottom,top];
|
[bottom,top]=directionV.y<0 ? [top,bottom] : [bottom,top];
|
||||||
var horDir=direction.x!=0 || directionV.x!=0 ? 'x' :'z';
|
const horDir=direction.x!=0 || directionV.x!=0 ? 'x' :'z';
|
||||||
[left,right]=direction[horDir]<0 || directionV[horDir]<0 ? [right,left] : [left,right];
|
[left,right]=direction[horDir]<0 || directionV[horDir]<0 ? [right,left] : [left,right];
|
||||||
|
|
||||||
if(bottom.length<2 || top.length<2 || left.length<3 || right.length<3)
|
if(bottom.length<2 || top.length<2 || left.length<3 || right.length<3)
|
||||||
|
|
@ -103,20 +103,20 @@ async function isAllAir(world,blocks)
|
||||||
|
|
||||||
function getAir(border)
|
function getAir(border)
|
||||||
{
|
{
|
||||||
var {bottom,top}=border;
|
const {bottom,top}=border;
|
||||||
return flatMap(bottom,pos => range(1,top[0].y-bottom[0].y).map(i => pos.offset(0,i,0)));
|
return flatMap(bottom,pos => range(1,top[0].y-bottom[0].y).map(i => pos.offset(0,i,0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var World = require('prismarine-world');
|
const World = require('prismarine-world');
|
||||||
var Chunk = require('prismarine-chunk')(require("./version"));
|
const Chunk = require('prismarine-chunk')(require("./version"));
|
||||||
|
|
||||||
function generateLine(startingPoint,direction,length) {
|
function generateLine(startingPoint,direction,length) {
|
||||||
return range(0,length).map(i => startingPoint.plus(direction.scaled(i)));
|
return range(0,length).map(i => startingPoint.plus(direction.scaled(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
function generatePortal(bottomLeft,direction,width,height){
|
function generatePortal(bottomLeft,direction,width,height){
|
||||||
var directionV=new Vec3(0,1,0);
|
const directionV=new Vec3(0,1,0);
|
||||||
return {
|
return {
|
||||||
bottom:generateLine(bottomLeft.plus(direction),direction,width-2),
|
bottom:generateLine(bottomLeft.plus(direction),direction,width-2),
|
||||||
left:generateLine(bottomLeft.plus(directionV),directionV,height-2),
|
left:generateLine(bottomLeft.plus(directionV),directionV,height-2),
|
||||||
|
|
@ -131,9 +131,9 @@ function addPortalToWorld(world,portal,additionalAir,additionalObsidian,setBlock
|
||||||
{
|
{
|
||||||
if(setBlockType==null)
|
if(setBlockType==null)
|
||||||
setBlockType=world.setBlockType.bind(world);
|
setBlockType=world.setBlockType.bind(world);
|
||||||
let {bottom,left,right,top,air}=portal;
|
const {bottom,left,right,top,air}=portal;
|
||||||
|
|
||||||
var p=flatMap([bottom,left,right,top],border => border.map(pos => setBlockType(pos,49)));
|
const p=flatMap([bottom,left,right,top],border => border.map(pos => setBlockType(pos,49)));
|
||||||
p.push(air.map(pos => setBlockType(pos,0)));
|
p.push(air.map(pos => setBlockType(pos,0)));
|
||||||
|
|
||||||
p.push(additionalAir.map(pos => setBlockType(pos,0)));
|
p.push(additionalAir.map(pos => setBlockType(pos,0)));
|
||||||
|
|
@ -145,7 +145,7 @@ function addPortalToWorld(world,portal,additionalAir,additionalObsidian,setBlock
|
||||||
|
|
||||||
async function makeWorldWithPortal(portal,additionalAir,additionalObsidian)
|
async function makeWorldWithPortal(portal,additionalAir,additionalObsidian)
|
||||||
{
|
{
|
||||||
var world=new World(() => new Chunk());
|
const world=new World(() => new Chunk());
|
||||||
await addPortalToWorld(world,portal,additionalAir,additionalObsidian);
|
await addPortalToWorld(world,portal,additionalAir,additionalObsidian);
|
||||||
|
|
||||||
return world;
|
return world;
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
var Chunk = require('prismarine-chunk')(require("../version"));
|
const Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
var blocks=require("minecraft-data")(require("../version")).blocks;
|
const blocks=require("minecraft-data")(require("../version")).blocks;
|
||||||
|
|
||||||
function generation() {
|
function generation() {
|
||||||
function generateSimpleChunk() {
|
function generateSimpleChunk() {
|
||||||
var chunk = new Chunk();
|
const chunk = new Chunk();
|
||||||
|
|
||||||
var i=2;
|
let i=2;
|
||||||
for (var x = 0; x < 16;x++) {
|
for (let x = 0; x < 16;x++) {
|
||||||
for (var z = 0; z < 16; z++) {
|
for (let z = 0; z < 16; z++) {
|
||||||
var y;
|
let y;
|
||||||
for(y=47;y<=50;y++)
|
for(y=47;y<=50;y++)
|
||||||
{
|
{
|
||||||
chunk.setBlockType(new Vec3(x,y,z), i);
|
chunk.setBlockType(new Vec3(x,y,z), i);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
var Chunk = require('prismarine-chunk')(require("../version"));
|
const Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
var rand = require('random-seed');
|
const rand = require('random-seed');
|
||||||
|
|
||||||
class DiamondSquare {
|
class DiamondSquare {
|
||||||
constructor(size, roughness, seed) {
|
constructor(size, roughness, seed) {
|
||||||
|
|
@ -33,7 +33,7 @@ class DiamondSquare {
|
||||||
|
|
||||||
if (this.data[x + '_' + y] == null) {
|
if (this.data[x + '_' + y] == null) {
|
||||||
this.opCountN++;
|
this.opCountN++;
|
||||||
var base = 1;
|
let base = 1;
|
||||||
while (((x & base) == 0) && ((y & base) == 0))
|
while (((x & base) == 0) && ((y & base) == 0))
|
||||||
base <<= 1;
|
base <<= 1;
|
||||||
|
|
||||||
|
|
@ -47,13 +47,14 @@ class DiamondSquare {
|
||||||
}
|
}
|
||||||
|
|
||||||
randFromPair(x, y) {
|
randFromPair(x, y) {
|
||||||
for (var i = 0; i < 80; i++) {
|
let xm7,xm13,xm1301081,ym8461,ym105467,ym105943;
|
||||||
var xm7 = x % 7;
|
for (let i = 0; i < 80; i++) {
|
||||||
var xm13 = x % 13;
|
xm7 = x % 7;
|
||||||
var xm1301081 = x % 1301081;
|
xm13 = x % 13;
|
||||||
var ym8461 = y % 8461;
|
xm1301081 = x % 1301081;
|
||||||
var ym105467 = y % 105467;
|
ym8461 = y % 8461;
|
||||||
var ym105943 = y % 105943;
|
ym105467 = y % 105467;
|
||||||
|
ym105943 = y % 105943;
|
||||||
//y = (i < 40 ? seed : x);
|
//y = (i < 40 ? seed : x);
|
||||||
y = x + this.seed;
|
y = x + this.seed;
|
||||||
x += (xm7 + xm13 + xm1301081 + ym8461 + ym105467 + ym105943);
|
x += (xm7 + xm13 + xm1301081 + ym8461 + ym105467 + ym105943);
|
||||||
|
|
@ -89,27 +90,27 @@ class DiamondSquare {
|
||||||
|
|
||||||
function generation({seed,worldHeight=80,waterline=20}={}) {
|
function generation({seed,worldHeight=80,waterline=20}={}) {
|
||||||
// Selected empirically
|
// Selected empirically
|
||||||
var size = 10000000;
|
const size = 10000000;
|
||||||
var space = new DiamondSquare(size, size / 500, seed);
|
const space = new DiamondSquare(size, size / 500, seed);
|
||||||
|
|
||||||
function generateSimpleChunk(chunkX, chunkZ) {
|
function generateSimpleChunk(chunkX, chunkZ) {
|
||||||
var chunk = new Chunk();
|
const chunk = new Chunk();
|
||||||
var seedRand = rand.create(seed+':'+chunkX+':'+chunkZ);
|
const seedRand = rand.create(seed+':'+chunkX+':'+chunkZ);
|
||||||
|
|
||||||
var worldX = chunkX * 16 + size / 2;
|
const worldX = chunkX * 16 + size / 2;
|
||||||
var worldZ = chunkZ * 16 + size / 2;
|
const worldZ = chunkZ * 16 + size / 2;
|
||||||
|
|
||||||
for (var x = 0; x < 16; x++) {
|
for (let x = 0; x < 16; x++) {
|
||||||
for (var z = 0; z < 16; z++) {
|
for (let z = 0; z < 16; z++) {
|
||||||
var level = Math.floor(space.value(worldX + x, worldZ + z) * worldHeight);
|
const level = Math.floor(space.value(worldX + x, worldZ + z) * worldHeight);
|
||||||
var dirtheight = level - 4 + seedRand(3);
|
const dirtheight = level - 4 + seedRand(3);
|
||||||
var bedrockheight = 1 + seedRand(4);
|
const bedrockheight = 1 + seedRand(4);
|
||||||
for (var y = 0; y < 256; y++) {
|
for (let y = 0; y < 256; y++) {
|
||||||
let block;
|
let block;
|
||||||
let data;
|
let data;
|
||||||
|
|
||||||
var surfaceblock = level < waterline ? 12 : 2; // Sand below water, grass
|
const surfaceblock = level < waterline ? 12 : 2; // Sand below water, grass
|
||||||
var belowblock = level < waterline ? 12 : 3; // 3-5 blocks below surface
|
const belowblock = level < waterline ? 12 : 3; // 3-5 blocks below surface
|
||||||
|
|
||||||
if (y < bedrockheight) block = 7; // Solid bedrock at bottom
|
if (y < bedrockheight) block = 7; // Solid bedrock at bottom
|
||||||
else if (y < level && y >= dirtheight) block = belowblock; // Dirt/sand below surface
|
else if (y < level && y >= dirtheight) block = belowblock; // Dirt/sand below surface
|
||||||
|
|
@ -121,7 +122,7 @@ function generation({seed,worldHeight=80,waterline=20}={}) {
|
||||||
data = 1;
|
data = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos = new Vec3(x, y, z);
|
const pos = new Vec3(x, y, z);
|
||||||
if (block) chunk.setBlockType(pos, block);
|
if (block) chunk.setBlockType(pos, block);
|
||||||
if (data) chunk.setBlockData(pos, data);
|
if (data) chunk.setBlockData(pos, data);
|
||||||
chunk.setSkyLight(pos, 15);
|
chunk.setSkyLight(pos, 15);
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
var Chunk = require('prismarine-chunk')(require("../version"));
|
const Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
|
|
||||||
function generation() {
|
function generation() {
|
||||||
function generateSimpleChunk() {
|
function generateSimpleChunk() {
|
||||||
var chunk = new Chunk();
|
const chunk = new Chunk();
|
||||||
|
|
||||||
for (var x = 0; x < 16; x++) {
|
for (let x = 0; x < 16; x++) {
|
||||||
for (var z = 0; z < 16; z++) {
|
for (let z = 0; z < 16; z++) {
|
||||||
chunk.setBlockType(new Vec3(x, 50, z), 2);
|
chunk.setBlockType(new Vec3(x, 50, z), 2);
|
||||||
for (var y = 0; y < 256; y++) {
|
for (let y = 0; y < 256; y++) {
|
||||||
chunk.setSkyLight(new Vec3(x, y, z), 15);
|
chunk.setSkyLight(new Vec3(x, y, z), 15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
var Chunk = require('prismarine-chunk')(require("../version"));
|
const Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
var rand = require('random-seed');
|
const rand = require('random-seed');
|
||||||
|
|
||||||
function generation({seed,level=50}={}) {
|
function generation({seed,level=50}={}) {
|
||||||
function generateChunk(chunkX, chunkZ) {
|
function generateChunk(chunkX, chunkZ) {
|
||||||
var seedRand = rand.create(seed+':'+chunkX+':'+chunkZ);
|
const seedRand = rand.create(seed+':'+chunkX+':'+chunkZ);
|
||||||
var chunk=new Chunk();
|
const chunk=new Chunk();
|
||||||
for (var x = 0; x < 16; x++) {
|
for (let x = 0; x < 16; x++) {
|
||||||
for (var z = 0; z < 16; z++) {
|
for (let z = 0; z < 16; z++) {
|
||||||
var bedrockheighttop = 1 + seedRand(4);
|
const bedrockheighttop = 1 + seedRand(4);
|
||||||
var bedrockheightbottom = 1 + seedRand(4);
|
const bedrockheightbottom = 1 + seedRand(4);
|
||||||
for (var y = 0; y < 128; y++) { // Nether only goes up to 128
|
for (let y = 0; y < 128; y++) { // Nether only goes up to 128
|
||||||
let block;
|
let block;
|
||||||
let data;
|
let data;
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ function generation({seed,level=50}={}) {
|
||||||
else if (y < level) block = 87;
|
else if (y < level) block = 87;
|
||||||
else if (y > 127 - bedrockheighttop) block = 7;
|
else if (y > 127 - bedrockheighttop) block = 7;
|
||||||
|
|
||||||
var pos = new Vec3(x, y, z);
|
const pos = new Vec3(x, y, z);
|
||||||
if (block) chunk.setBlockType(pos, block);
|
if (block) chunk.setBlockType(pos, block);
|
||||||
if (data) chunk.setBlockData(pos, data);
|
if (data) chunk.setBlockData(pos, data);
|
||||||
// Don't need to set light data in nether
|
// Don't need to set light data in nether
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
var Chunk = require('prismarine-chunk')(require("../version"));
|
const Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
|
|
||||||
function generation({opt='default',bottom_id=7,middle_id=1,top_id=2,middle_thickness=3,debug=false}={}) {
|
function generation({opt='default',bottom_id=7,middle_id=1,top_id=2,middle_thickness=3,debug=false}={}) {
|
||||||
function generateChunk() {
|
function generateChunk() {
|
||||||
var chunk=new Chunk();
|
const chunk=new Chunk();
|
||||||
var height = middle_thickness + 1;
|
const height = middle_thickness + 1;
|
||||||
var DEBUG_POINTS = [new Vec3(0, height, 0), new Vec3(15, height, 0), new Vec3(0, height, 15), new Vec3(15, height, 15)];
|
const DEBUG_POINTS = [new Vec3(0, height, 0), new Vec3(15, height, 0), new Vec3(0, height, 15), new Vec3(15, height, 15)];
|
||||||
for (var x = 0; x < 16; x++) {
|
for (let x = 0; x < 16; x++) {
|
||||||
for (var z = 0; z < 16; z++) {
|
for (let z = 0; z < 16; z++) {
|
||||||
for (var y = 0; y < middle_thickness + 2; y++) {
|
for (let y = 0; y < middle_thickness + 2; y++) {
|
||||||
if (y == 0) chunk.setBlockType(new Vec3(x, y, z), bottom_id);
|
if (y == 0) chunk.setBlockType(new Vec3(x, y, z), bottom_id);
|
||||||
else if (y < middle_thickness + 1) chunk.setBlockType(new Vec3(x, y, z), middle_id);
|
else if (y < middle_thickness + 1) chunk.setBlockType(new Vec3(x, y, z), middle_id);
|
||||||
else chunk.setBlockType(new Vec3(x, y, z), top_id);
|
else chunk.setBlockType(new Vec3(x, y, z), top_id);
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,25 @@
|
||||||
var net = require('net');
|
const net = require('net');
|
||||||
var mcServer=require("flying-squid");
|
const mcServer=require("flying-squid");
|
||||||
var settings = require('../config/default-settings');
|
const settings = require('../config/default-settings');
|
||||||
var mineflayer = require("mineflayer");
|
const mineflayer = require("mineflayer");
|
||||||
var assert = require('chai').assert;
|
const assert = require('chai').assert;
|
||||||
var Vec3 = require('vec3').Vec3;
|
const Vec3 = require('vec3').Vec3;
|
||||||
|
|
||||||
function assertPosEqual(actual,expected) {
|
function assertPosEqual(actual,expected) {
|
||||||
assert.isBelow(actual.distanceTo(expected),1,"expected: "+expected+", actual: "+actual+"\n");
|
assert.isBelow(actual.distanceTo(expected),1,"expected: "+expected+", actual: "+actual+"\n");
|
||||||
}
|
}
|
||||||
var once = require('event-promise');
|
const once = require('event-promise');
|
||||||
|
|
||||||
describe("Server with mineflayer connection", function() {
|
describe("Server with mineflayer connection", function() {
|
||||||
this.timeout(10 * 60 * 1000);
|
this.timeout(10 * 60 * 1000);
|
||||||
var bot;
|
let bot;
|
||||||
var bot2;
|
let bot2;
|
||||||
var serv;
|
let serv;
|
||||||
|
|
||||||
async function onGround(bot)
|
async function onGround(bot)
|
||||||
{
|
{
|
||||||
await new Promise((cb) => {
|
await new Promise((cb) => {
|
||||||
var l=() => {
|
const l=() => {
|
||||||
if(bot.entity.onGround) {
|
if(bot.entity.onGround) {
|
||||||
bot.removeListener("move",l);
|
bot.removeListener("move",l);
|
||||||
cb();
|
cb();
|
||||||
|
|
@ -30,19 +30,19 @@ describe("Server with mineflayer connection", function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function waitMessage(bot,message) {
|
async function waitMessage(bot,message) {
|
||||||
let msg1=await once(bot,'message');
|
const msg1=await once(bot,'message');
|
||||||
assert.equal(msg1.extra[0].text,message);
|
assert.equal(msg1.extra[0].text,message);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function waitMessages(bot,messages) {
|
async function waitMessages(bot,messages) {
|
||||||
var toReceive=messages.reduce((acc,message) => {
|
const toReceive=messages.reduce((acc,message) => {
|
||||||
acc[message]=1;
|
acc[message]=1;
|
||||||
return acc;
|
return acc;
|
||||||
},{});
|
},{});
|
||||||
var received={};
|
const received={};
|
||||||
return new Promise(cb => {
|
return new Promise(cb => {
|
||||||
var listener=msg => {
|
const listener=msg => {
|
||||||
var message=msg.extra[0].text;
|
const message=msg.extra[0].text;
|
||||||
if(!toReceive[message]) throw new Error("Received "+message+" , expected to receive one of "+messages);
|
if(!toReceive[message]) throw new Error("Received "+message+" , expected to receive one of "+messages);
|
||||||
if(received[message]) throw new Error("Received "+message+" two times");
|
if(received[message]) throw new Error("Received "+message+" two times");
|
||||||
received[message]=1;
|
received[message]=1;
|
||||||
|
|
@ -62,7 +62,7 @@ describe("Server with mineflayer connection", function() {
|
||||||
|
|
||||||
beforeEach(async function () {
|
beforeEach(async function () {
|
||||||
this.timeout(10 * 60 * 1000);
|
this.timeout(10 * 60 * 1000);
|
||||||
var options = settings;
|
const options = settings;
|
||||||
options["online-mode"]=false;
|
options["online-mode"]=false;
|
||||||
options["port"]=25566;
|
options["port"]=25566;
|
||||||
options["view-distance"]=2;
|
options["view-distance"]=2;
|
||||||
|
|
@ -94,10 +94,10 @@ describe("Server with mineflayer connection", function() {
|
||||||
|
|
||||||
function waitSpawnZone(bot,view)
|
function waitSpawnZone(bot,view)
|
||||||
{
|
{
|
||||||
var nbChunksExpected=(view*2)*(view*2);
|
const nbChunksExpected=(view*2)*(view*2);
|
||||||
var c=0;
|
let c=0;
|
||||||
return new Promise(cb => {
|
return new Promise(cb => {
|
||||||
var listener=() => {
|
const listener=() => {
|
||||||
c++;
|
c++;
|
||||||
if(c==nbChunksExpected)
|
if(c==nbChunksExpected)
|
||||||
{
|
{
|
||||||
|
|
@ -113,7 +113,7 @@ describe("Server with mineflayer connection", function() {
|
||||||
this.timeout(10 * 60 * 1000);
|
this.timeout(10 * 60 * 1000);
|
||||||
await Promise.all([waitSpawnZone(bot,2),waitSpawnZone(bot2,2),onGround(bot),onGround(bot2)]);
|
await Promise.all([waitSpawnZone(bot,2),waitSpawnZone(bot2,2),onGround(bot),onGround(bot2)]);
|
||||||
|
|
||||||
var pos=bot.entity.position.offset(0,-1,0).floored();
|
const pos=bot.entity.position.offset(0,-1,0).floored();
|
||||||
bot.dig(bot.blockAt(pos));
|
bot.dig(bot.blockAt(pos));
|
||||||
|
|
||||||
let [oldBlock,newBlock]=await once(bot2,'blockUpdate',{array:true});
|
let [oldBlock,newBlock]=await once(bot2,'blockUpdate',{array:true});
|
||||||
|
|
@ -126,7 +126,7 @@ describe("Server with mineflayer connection", function() {
|
||||||
this.timeout(10 * 60 * 1000);
|
this.timeout(10 * 60 * 1000);
|
||||||
await Promise.all([waitSpawnZone(bot,2),waitSpawnZone(bot2,2),onGround(bot),onGround(bot2)]);
|
await Promise.all([waitSpawnZone(bot,2),waitSpawnZone(bot2,2),onGround(bot),onGround(bot2)]);
|
||||||
|
|
||||||
var pos=bot.entity.position.offset(0,-2,0).floored();
|
const pos=bot.entity.position.offset(0,-2,0).floored();
|
||||||
bot.dig(bot.blockAt(pos));
|
bot.dig(bot.blockAt(pos));
|
||||||
|
|
||||||
let [oldBlock,newBlock]=await once(bot2,'blockUpdate',{array:true});
|
let [oldBlock,newBlock]=await once(bot2,'blockUpdate',{array:true});
|
||||||
|
|
@ -168,7 +168,7 @@ describe("Server with mineflayer connection", function() {
|
||||||
function waitDragon()
|
function waitDragon()
|
||||||
{
|
{
|
||||||
return new Promise((done) => {
|
return new Promise((done) => {
|
||||||
var listener=(entity) => {
|
const listener=(entity) => {
|
||||||
if(entity.name=="EnderDragon") {
|
if(entity.name=="EnderDragon") {
|
||||||
bot.removeListener('entitySpawn',listener);
|
bot.removeListener('entitySpawn',listener);
|
||||||
done();
|
done();
|
||||||
|
|
@ -208,14 +208,14 @@ describe("Server with mineflayer connection", function() {
|
||||||
});
|
});
|
||||||
it("can tp with relative positions",async () => {
|
it("can tp with relative positions",async () => {
|
||||||
await onGround(bot);
|
await onGround(bot);
|
||||||
var initialPosition=bot.entity.position.clone();
|
const initialPosition=bot.entity.position.clone();
|
||||||
bot.chat('/tp ~1 ~-2 ~3');
|
bot.chat('/tp ~1 ~-2 ~3');
|
||||||
await once(bot,'forcedMove');
|
await once(bot,'forcedMove');
|
||||||
assertPosEqual(bot.entity.position,initialPosition.offset(1,-2,3));
|
assertPosEqual(bot.entity.position,initialPosition.offset(1,-2,3));
|
||||||
});
|
});
|
||||||
it("can tp somebody else with relative positions",async () => {
|
it("can tp somebody else with relative positions",async () => {
|
||||||
await Promise.all([onGround(bot),onGround(bot2)]);
|
await Promise.all([onGround(bot),onGround(bot2)]);
|
||||||
var initialPosition=bot2.entity.position.clone();
|
const initialPosition=bot2.entity.position.clone();
|
||||||
bot.chat('/tp bot2 ~1 ~-2 ~3');
|
bot.chat('/tp bot2 ~1 ~-2 ~3');
|
||||||
await once(bot2,'forcedMove');
|
await once(bot2,'forcedMove');
|
||||||
assertPosEqual(bot2.entity.position,initialPosition.offset(1,-2,3));
|
assertPosEqual(bot2.entity.position,initialPosition.offset(1,-2,3));
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
var {detectFrame,findPotentialLines,findBorder,getAir,generateLine,generatePortal,addPortalToWorld,makeWorldWithPortal}=require("flying-squid").portal_detector;
|
const {detectFrame,findPotentialLines,findBorder,getAir,generateLine,generatePortal,addPortalToWorld,makeWorldWithPortal}=require("flying-squid").portal_detector;
|
||||||
var Vec3 = require("vec3").Vec3;
|
const Vec3 = require("vec3").Vec3;
|
||||||
var assert = require('chai').assert;
|
const assert = require('chai').assert;
|
||||||
var range = require('range').range;
|
const range = require('range').range;
|
||||||
|
|
||||||
|
|
||||||
describe("Generate portal",function(){
|
describe("Generate portal",function(){
|
||||||
|
|
@ -20,7 +20,7 @@ describe("Generate portal",function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Detect portal", function() {
|
describe("Detect portal", function() {
|
||||||
var portalData=[];
|
const portalData=[];
|
||||||
portalData.push({
|
portalData.push({
|
||||||
name:"simple portal frame x",
|
name:"simple portal frame x",
|
||||||
bottomLeft:new Vec3(2,1,1),
|
bottomLeft:new Vec3(2,1,1),
|
||||||
|
|
@ -57,7 +57,7 @@ describe("Detect portal", function() {
|
||||||
additionalAir:[],
|
additionalAir:[],
|
||||||
additionalObsidian:[new Vec3(2,1,1),new Vec3(5,1,1),new Vec3(2,6,1),new Vec3(5,6,1)]
|
additionalObsidian:[new Vec3(2,1,1),new Vec3(5,1,1),new Vec3(2,6,1),new Vec3(5,6,1)]
|
||||||
});
|
});
|
||||||
var {bottom,left,right,top,air}=generatePortal(new Vec3(2,1,2),new Vec3(1,0,0),4,5);
|
const {bottom,left,right,top,air}=generatePortal(new Vec3(2,1,2),new Vec3(1,0,0),4,5);
|
||||||
|
|
||||||
portalData.push({
|
portalData.push({
|
||||||
name:"2 portals",
|
name:"2 portals",
|
||||||
|
|
@ -82,12 +82,12 @@ describe("Detect portal", function() {
|
||||||
|
|
||||||
|
|
||||||
portalData.forEach(({name,bottomLeft,direction,width,height,additionalAir,additionalObsidian}) => {
|
portalData.forEach(({name,bottomLeft,direction,width,height,additionalAir,additionalObsidian}) => {
|
||||||
var portal=generatePortal(bottomLeft,direction,width,height);
|
const portal=generatePortal(bottomLeft,direction,width,height);
|
||||||
var {bottom,left,right,top,air}=portal;
|
const {bottom,left,right,top,air}=portal;
|
||||||
describe("Detect "+name,() => {
|
describe("Detect "+name,() => {
|
||||||
var expectedBorder={bottom,left,right,top};
|
const expectedBorder={bottom,left,right,top};
|
||||||
|
|
||||||
var world;
|
let world;
|
||||||
before(async function(){
|
before(async function(){
|
||||||
world=await makeWorldWithPortal(portal,additionalAir,additionalObsidian);
|
world=await makeWorldWithPortal(portal,additionalAir,additionalObsidian);
|
||||||
});
|
});
|
||||||
|
|
@ -147,7 +147,7 @@ describe("Detect portal", function() {
|
||||||
|
|
||||||
describe("find borders",function() {
|
describe("find borders",function() {
|
||||||
it("find borders from bottom", async function () {
|
it("find borders from bottom", async function () {
|
||||||
var border = await findBorder(world, {
|
const border = await findBorder(world, {
|
||||||
"direction": direction,
|
"direction": direction,
|
||||||
"line": bottom
|
"line": bottom
|
||||||
}, new Vec3(0, 1, 0));
|
}, new Vec3(0, 1, 0));
|
||||||
|
|
@ -155,7 +155,7 @@ describe("Detect portal", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("find borders from top", async function () {
|
it("find borders from top", async function () {
|
||||||
var border = await findBorder(world, {
|
const border = await findBorder(world, {
|
||||||
"direction": direction,
|
"direction": direction,
|
||||||
"line": top
|
"line": top
|
||||||
}, new Vec3(0, -1, 0));
|
}, new Vec3(0, -1, 0));
|
||||||
|
|
@ -163,14 +163,14 @@ describe("Detect portal", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("find borders from left", async function () {
|
it("find borders from left", async function () {
|
||||||
var border = await findBorder(world, {
|
const border = await findBorder(world, {
|
||||||
"direction": new Vec3(0, 1, 0),
|
"direction": new Vec3(0, 1, 0),
|
||||||
"line": left
|
"line": left
|
||||||
},direction);
|
},direction);
|
||||||
assert.deepEqual(border, expectedBorder)
|
assert.deepEqual(border, expectedBorder)
|
||||||
});
|
});
|
||||||
it("find borders from right", async function () {
|
it("find borders from right", async function () {
|
||||||
var border = await findBorder(world, {
|
const border = await findBorder(world, {
|
||||||
"direction": new Vec3(0, 1, 0),
|
"direction": new Vec3(0, 1, 0),
|
||||||
"line": right
|
"line": right
|
||||||
}, direction.scaled(-1));
|
}, direction.scaled(-1));
|
||||||
|
|
@ -180,21 +180,21 @@ describe("Detect portal", function() {
|
||||||
|
|
||||||
describe("detect portals",function(){
|
describe("detect portals",function(){
|
||||||
it("detect portals from bottom left",async function() {
|
it("detect portals from bottom left",async function() {
|
||||||
var portals=await detectFrame(world,bottom[0],new Vec3(0,1,0));
|
const portals=await detectFrame(world,bottom[0],new Vec3(0,1,0));
|
||||||
assert.deepEqual(portals,[portal])
|
assert.deepEqual(portals,[portal])
|
||||||
});
|
});
|
||||||
it("detect portals from top left",async function() {
|
it("detect portals from top left",async function() {
|
||||||
var portals=await detectFrame(world,top[0],new Vec3(0,-1,0));
|
const portals=await detectFrame(world,top[0],new Vec3(0,-1,0));
|
||||||
assert.deepEqual(portals,[portal])
|
assert.deepEqual(portals,[portal])
|
||||||
});
|
});
|
||||||
it("detect portals from right top",async function() {
|
it("detect portals from right top",async function() {
|
||||||
var portals=await detectFrame(world,right[right.length-1],direction.scaled(-1));
|
const portals=await detectFrame(world,right[right.length-1],direction.scaled(-1));
|
||||||
assert.deepEqual(portals,[portal])
|
assert.deepEqual(portals,[portal])
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it("get air",function(){
|
it("get air",function(){
|
||||||
var foundAir=getAir(expectedBorder);
|
const foundAir=getAir(expectedBorder);
|
||||||
assert.deepEqual(foundAir,air);
|
assert.deepEqual(foundAir,air);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -205,7 +205,7 @@ describe("Detect portal", function() {
|
||||||
|
|
||||||
|
|
||||||
describe("Doesn't detect non-portal",function() {
|
describe("Doesn't detect non-portal",function() {
|
||||||
var portalData=[];
|
const portalData=[];
|
||||||
|
|
||||||
portalData.push({
|
portalData.push({
|
||||||
name:"simple portal frame x with one obsidian in the middle",
|
name:"simple portal frame x with one obsidian in the middle",
|
||||||
|
|
@ -218,25 +218,25 @@ describe("Doesn't detect non-portal",function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
portalData.forEach(({name,bottomLeft,direction,width,height,additionalAir,additionalObsidian}) => {
|
portalData.forEach(({name,bottomLeft,direction,width,height,additionalAir,additionalObsidian}) => {
|
||||||
var portal = generatePortal(bottomLeft, direction, width, height);
|
const portal = generatePortal(bottomLeft, direction, width, height);
|
||||||
var {bottom,left,right,top,air}=portal;
|
const {bottom,left,right,top,air}=portal;
|
||||||
describe("Doesn't detect detect " + name, () => {
|
describe("Doesn't detect detect " + name, () => {
|
||||||
var world;
|
let world;
|
||||||
before(async function () {
|
before(async function () {
|
||||||
world=await makeWorldWithPortal(portal, additionalAir, additionalObsidian);
|
world=await makeWorldWithPortal(portal, additionalAir, additionalObsidian);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("doesn't detect portals",function(){
|
describe("doesn't detect portals",function(){
|
||||||
it("doesn't detect portals from bottom left",async function() {
|
it("doesn't detect portals from bottom left",async function() {
|
||||||
var portals=await detectFrame(world,bottom[0],new Vec3(0,1,0));
|
const portals=await detectFrame(world,bottom[0],new Vec3(0,1,0));
|
||||||
assert.deepEqual(portals,[])
|
assert.deepEqual(portals,[])
|
||||||
});
|
});
|
||||||
it("doesn't detect portals from top left",async function() {
|
it("doesn't detect portals from top left",async function() {
|
||||||
var portals=await detectFrame(world,top[0],new Vec3(0,-1,0));
|
const portals=await detectFrame(world,top[0],new Vec3(0,-1,0));
|
||||||
assert.deepEqual(portals,[])
|
assert.deepEqual(portals,[])
|
||||||
});
|
});
|
||||||
it("doesn't detect portals from right top",async function() {
|
it("doesn't detect portals from right top",async function() {
|
||||||
var portals=await detectFrame(world,right[right.length-1],direction.scaled(-1));
|
const portals=await detectFrame(world,right[right.length-1],direction.scaled(-1));
|
||||||
assert.deepEqual(portals,[])
|
assert.deepEqual(portals,[])
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
var net = require('net');
|
const net = require('net');
|
||||||
describe("Server", function() {
|
describe("Server", function() {
|
||||||
var serv;
|
let serv;
|
||||||
before(function(done){
|
before(function(done){
|
||||||
serv=require("../app");
|
serv=require("../app");
|
||||||
serv.on("listening",function(){
|
serv.on("listening",function(){
|
||||||
|
|
@ -15,7 +15,7 @@ describe("Server", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Is running", function(done) {
|
it("Is running", function(done) {
|
||||||
var client = net.Socket();
|
const client = net.Socket();
|
||||||
client.connect(serv._server.socketServer.address().port, '127.0.0.1', done);
|
client.connect(serv._server.socketServer.address().port, '127.0.0.1', done);
|
||||||
client.on('error', done);
|
client.on('error', done);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue