diff --git a/src/lib/plugins/blocks.js b/src/lib/plugins/blocks.js index 9fb8895..3453cb3 100644 --- a/src/lib/plugins/blocks.js +++ b/src/lib/plugins/blocks.js @@ -17,4 +17,27 @@ module.exports.player=function(player,serv) }); player.setBlock = (position,blockType,blockData) => serv.setBlock(player.world,position,blockType,blockData); + + + player.commands.add({ + base: 'setblock', + info: 'to put a block', + usage: '/setblock ', + parse(str) { + var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3}) ([0-9]{1,3})/); + if(!results) return false; + return results; + }, + action(params) { + var res = params.map((num, i) => { // parseInt paramaters + if (num.indexOf('~') == 0) { + return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); + } else { + return parseInt(num); // return parseInt>>5 if position, not id + } + }); + + player.setBlock(new Vec3(res[1], res[2], res[3]), res[4],res[5]); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/chest.js b/src/lib/plugins/chest.js index f63e4e4..62d7de4 100644 --- a/src/lib/plugins/chest.js +++ b/src/lib/plugins/chest.js @@ -1,13 +1,13 @@ -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3; module.exports.player=function(player) { player._client.on('block_place', async ({location} = {}) => { - var referencePosition=new vec3(location.x,location.y,location.z); + var referencePosition=new Vec3(location.x,location.y,location.z); if (player.entity.crouching) return; try { var id = await player.world.getBlockType(referencePosition); - var blockAbove = await player.world.getBlockType(referencePosition.clone().add(new vec3(0, 1, 0))); + var blockAbove = await player.world.getBlockType(referencePosition.clone().add(new Vec3(0, 1, 0))); if (id == 54) { if (blockAbove) { return; diff --git a/src/lib/plugins/commands.js b/src/lib/plugins/commands.js index 8f16e5e..edfc963 100644 --- a/src/lib/plugins/commands.js +++ b/src/lib/plugins/commands.js @@ -1,20 +1,15 @@ -var Vec3 = require('vec3'); +module.exports.player=function(player) { -var Command = require('../command'); - -module.exports.player=function(player, serv) { - var base = new Command({}); - - base.add({ + player.commands.add({ base: 'help', info: 'to show all commands', usage: '/help [command]', action(params) { var c = params[0]; - var hash = base.hash; + var hash = player.commands.hash; if(c) { - var res = base.find(params[0])[0]; + var res = player.commands.find(params[0])[0]; var help = res.params.help && res.params.help(params); return help ? '' + help : 'Information not found'; @@ -37,154 +32,7 @@ module.exports.player=function(player, serv) { } }); - base.add({ - base: 'gamemode', - aliases: ['gm'], - info: 'to change game mode', - usage: '/gamemode <0-3>', - parse(str) { - var results; - if(!(results = str.match(/^([0-3])$/))) - return false; - return parseInt(str); - }, - action(mode) { - player.setGameMode(mode); - } - }); - - base.add({ - base: 'setblock', - info: 'to put a block', - usage: '/setblock ', - parse(str) { - var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3}) ([0-9]{1,3})/); - if(!results) return false; - return results; - }, - action(params) { - var res = params.map((num, i) => { // parseInt paramaters - if (num.indexOf('~') == 0) { - return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); - } else { - return parseInt(num); // return parseInt>>5 if position, not id - } - }); - - player.setBlock(new Vec3(res[1], res[2], res[3]), res[4],res[5]); - } - }); - - base.add({ - base: 'kick', - info: 'to kick a player', - usage: '/kick [reason]', - parse(str) { - if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/)) - return false; - var parts = str.split(' '); - return { - username:parts.shift(), - reason:parts.join(' ') - }; - }, - action({username,reason}) { - var kickPlayer = serv.getPlayer(username); - if (!kickPlayer) { - player.chat(username + " is not on this server!"); - } else { - kickPlayer.kick(reason); - kickPlayer.emit("kicked", player, reason); - } - } - }); - - base.add({ - base: 'ban', - info: 'to ban a player', - usage: '/ban [reason]', - parse(str) { - if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/)) - return false; - var parts = str.split(' '); - return { - username:parts.shift(), - reason:parts.join(' ') - }; - }, - action({username,reason}) { - var banPlayer = serv.getPlayer(username); - - if (!banPlayer) { - serv.banUsername(username, reason) - .then(() => { - serv.emit('banned', player, username, reason); - player.chat(username + ' was banned'); - }) - .catch(err => player.chat(username + " is not a valid player!")); - } else { - banPlayer.ban(reason); - serv.emit("banned", player, username, reason); - } - } - }); - - base.add({ - base: 'pardon', - info: 'to pardon a player', - usage: '/pardon ', - parse(str) { - if(!str.match(/([a-zA-Z0-9_]+)/)) - return false; - return str; - }, - action(nick) { - serv.pardonUsername(nick) - .then(()=> player.chat(nick + " is unbanned")) - .catch(err => player.chat(nick + " is not banned")); - } - }); - - base.add({ - base: 'time', - info: 'to change a time', - usage: '/time ', - parse(str) { - var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); - if(!data) return false; - return { - action: data[1], - value: data[2] == 'day' ? 1000 : (data[2] == 'night' ? 13000 : parseInt(data[2])) - }; - }, - action({action,value}) { - if(action == "query") { - player.chat("It is "+serv.time); - } else { - var newTime; - - if(action == "set") { - newTime = value; - } else if(action == "add") { - newTime = value + serv.time; - } - - player.chat("Time was changed from " + serv.time + " to " + newTime); - serv.setTime(newTime); - } - } - }); - - base.add({ - base: 'day', - info: 'to change a time to day', - usage: '/day', - action(params) { - player.handleCommand('time set day'); - } - }); - - base.add({ + player.commands.add({ base: 'ping', info: 'to pong!', usage: '/ping [number]', @@ -198,16 +46,7 @@ module.exports.player=function(player, serv) { } }); - base.add({ - base: 'night', - info: 'to change a time to night', - usage: '/night', - action(params) { - player.handleCommand('time set night'); - } - }); - - base.add({ + player.commands.add({ base: 'modpe', info: 'for modpe commands', usage: '/modpe ', @@ -217,7 +56,7 @@ module.exports.player=function(player, serv) { } }); - base.add({ + player.commands.add({ base: 'version', info: 'to get version of the server', usage: '/version', @@ -226,7 +65,7 @@ module.exports.player=function(player, serv) { } }); - base.add({ + player.commands.add({ base: 'bug', info: 'to bug report', usage: '/bug', @@ -235,99 +74,9 @@ module.exports.player=function(player, serv) { } }); - base.add({ - base: 'changeworld', - info: 'to change world', - usage: '/changeworld overworld|nether', - action(world) { - if(world=="nether") player.changeWorld(serv.netherworld, {dimension: -1}); - if(world=="overworld") player.changeWorld(serv.overworld, {dimension: 0}); - } - }); - - base.add({ - base: 'playsound', - info: 'to play sound for yourself', - usage: '/playsound [volume] [pitch]', - parse(str) { - var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/); - if(!results) return false; - return { - sound_name:results[1], - volume:results[2] ? parseFloat(results[2]) : 1.0, - pitch:results[3] ? parseFloat(results[3]) : 1.0 - }; - }, - action({sound_name,volume,pitch}) { - player.chat('Playing "'+sound_name+'" (volume: ' + volume + ', pitch: ' + pitch + ')'); - player.playSound(sound_name, {volume: volume,pitch: pitch}); - } - }); - - base.add({ - base: 'playsoundforall', - info: 'to play sound for everyone', - usage: '/playsoundforall [volume] [pitch]', - parse(str) { - var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/); - if(!results) return false; - return { - sound_name:results[1], - volume:results[2] ? parseFloat(results[2]) : 1.0, - pitch:results[3] ? parseFloat(results[3]) : 1.0 - }; - }, - action({sound_name,volume,pitch}) { - player.chat('Playing "'+sound_name+'" (volume: ' + volume + ', pitch: ' + pitch + ')'); - serv.playSound(sound_name, player.world, player.entity.position.scaled(1/32), {volume: volume,pitch: pitch}); - } - }); - - base.add({ - base: 'particle', - info: 'emit a particle at a position', - usage: '/particle [amount] [ ]', - parse(str) { - var results=str.match(/(\d+)(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?/); - if(!results) return false; - return { - particle:parseInt(results[1]), - amount:results[2] ? parseInt(results[2]) : 1, - size:results[5] ? new Vec3(parseInt(results[3]), parseInt(results[4]), parseInt(results[5])) : new Vec3(1, 1, 1) - }; - }, - action({particle,amount,size}) { - if (amount >= 100000) { - player.chat('You cannot emit more than 100,000 particles!'); - return; - } - player.chat('Emitting "' + particle + '" (count: ' + amount + ', size: ' + size.toString() + ')'); - serv.emitParticle(particle, player.world, player.entity.position.scaled(1/32), {count: amount,size: size}); - } - }); - - base.add({ - base: 'spawn', - info: 'Spawn an entity', - usage: '/spawn ', - parse(str) { - var results=str.match(/(\d+)/); - if (!results) return false; - return { - id: parseInt(results[1]) - } - }, - action({id}) { - serv.spawnMob(id, player.world, player.entity.position.scaled(1/32), { - velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10) - }); - } - }) - - serv.commands = base; player.handleCommand = (str) => { - var res = base.use(str); + var res = player.commands.use(str); if(res) player.chat('' + res); }; }; diff --git a/src/lib/plugins/daycycle.js b/src/lib/plugins/daycycle.js index dbed975..6048f86 100644 --- a/src/lib/plugins/daycycle.js +++ b/src/lib/plugins/daycycle.js @@ -17,4 +17,54 @@ module.exports.server=function(serv) { serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second } }) +}; + +module.exports.player=function(player,serv){ + player.commands.add({ + base: 'night', + info: 'to change a time to night', + usage: '/night', + action(params) { + player.handleCommand('time set night'); + } + }); + + player.commands.add({ + base: 'time', + info: 'to change a time', + usage: '/time ', + parse(str) { + var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); + if(!data) return false; + return { + action: data[1], + value: data[2] == 'day' ? 1000 : (data[2] == 'night' ? 13000 : parseInt(data[2])) + }; + }, + action({action,value}) { + if(action == "query") { + player.chat("It is "+serv.time); + } else { + var newTime; + + if(action == "set") { + newTime = value; + } else if(action == "add") { + newTime = value + serv.time; + } + + player.chat("Time was changed from " + serv.time + " to " + newTime); + serv.setTime(newTime); + } + } + }); + + player.commands.add({ + base: 'day', + info: 'to change a time to day', + usage: '/day', + action(params) { + player.handleCommand('time set day'); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 9edfb97..2061cd7 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -1,4 +1,4 @@ -var Vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 module.exports.player=function(player,serv) { diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index d0ba0d5..671c90f 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -2,7 +2,7 @@ var Entity=require("prismarine-entity"); var util = require('util'); var EventEmitter = require('events').EventEmitter; util.inherits(Entity, EventEmitter); -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3; var path = require('path'); var requireIndex = require('requireindex'); @@ -26,16 +26,16 @@ module.exports.server=function(serv,options) { return entity; }; - serv.spawnObject = (type, world, position, {pitch=0,yaw=0,velocity=vec3(0,0,0),data=1,itemId,itemDamage=0}={}) => { + serv.spawnObject = (type, world, position, {pitch=0,yaw=0,velocity=new Vec3(0,0,0),data=1,itemId,itemDamage=0}={}) => { var object = serv.initEntity('object', type, world, position.scaled(32).floored()); object.data = data; object.velocity = velocity.scaled(32).floored(); object.pitch = pitch; object.yaw = yaw; - object.gravity = vec3(0, -20*32, 0); - object.terminalvelocity = vec3(27*32, 27*32, 27*32); - object.friction = vec3(10*32, 0, 10*32).floored(); - object.size = vec3(0.25*32, 0.25*32, 0.25*32); // Hardcoded, will be dependent on type! + object.gravity = new Vec3(0, -20*32, 0); + object.terminalvelocity = new Vec3(27*32, 27*32, 27*32); + object.friction = (new Vec3(10*32, 0, 10*32)).floored(); + object.size = new Vec3(0.25*32, 0.25*32, 0.25*32); // Hardcoded, will be dependent on type! object.deathTime = 60*1000; // 60 seconds object.itemId = itemId; object.itemDamage = itemDamage; @@ -43,16 +43,16 @@ module.exports.server=function(serv,options) { object.updateAndSpawn(); }; - serv.spawnMob = (type, world, position, {pitch=0,yaw=0,headPitch=0,velocity=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()); mob.velocity = velocity.scaled(32).floored(); mob.pitch = pitch; mob.headPitch = headPitch; mob.yaw = yaw; - mob.gravity = vec3(0, -20*32, 0); - mob.terminalvelocity = vec3(27*32, 27*32, 27*32); - mob.friction = vec3(10*32, 0, 10*32); - mob.size = vec3(0.75, 1.75, 0.75); + mob.gravity = new Vec3(0, -20*32, 0); + mob.terminalvelocity = new Vec3(27*32, 27*32, 27*32); + mob.friction = new Vec3(10*32, 0, 10*32); + mob.size = new Vec3(0.75, 1.75, 0.75); mob.metadata = metadata; mob.updateAndSpawn(); @@ -69,6 +69,26 @@ module.exports.server=function(serv,options) { } }; +module.exports.player=function(player,serv){ + player.commands.add({ + base: 'spawn', + info: 'Spawn an entity', + usage: '/spawn ', + parse(str) { + var results=str.match(/(\d+)/); + if (!results) return false; + return { + id: parseInt(results[1]) + } + }, + action({id}) { + serv.spawnMob(id, player.world, player.entity.position.scaled(1/32), { + velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10) + }); + } + }); +}; + module.exports.entity=function(entity,serv){ entity.initEntity=(type, entityType, world, position)=>{ @@ -103,7 +123,7 @@ module.exports.entity=function(entity,serv){ catch(err){ setTimeout(() => {throw err;},0) } - if (!oldPosAndOnGround.oldPos.equals(vec3(0,0,0))) + if (!oldPosAndOnGround.oldPos.equals(new Vec3(0,0,0))) if (entity.type == 'mob') entity.sendPosition(oldPosAndOnGround); }); diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index e25603b..f417753 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -1,10 +1,11 @@ var Entity=require("prismarine-entity"); -var Vec3=require("vec3"); +var Vec3 = require("vec3").Vec3 var path = require('path'); var requireIndex = require('requireindex'); var plugins = requireIndex(path.join(__dirname,'..', 'plugins')); var Player=require("../player"); +var Command = require('../command'); module.exports.server=function(serv,options) { @@ -14,6 +15,7 @@ module.exports.server=function(serv,options) serv._server.on('login', async (client) => { var player=new Player(); player._client=client; + player.commands = new Command({}); Object.keys(plugins) .filter(pluginName => plugins[pluginName].player!=undefined) .forEach(pluginName => plugins[pluginName].player(player, serv, options)); @@ -32,7 +34,7 @@ module.exports.player=function(player,serv) { function addPlayer() { - player.entity=serv.initEntity('player', null, serv.overworld, Vec3(0,0,0)); + player.entity=serv.initEntity('player', null, serv.overworld, new Vec3(0,0,0)); player.entity.type = 'player'; player.entity.player=player; player.entity.health = 20; diff --git a/src/lib/plugins/moderation.js b/src/lib/plugins/moderation.js index d765196..27090bd 100644 --- a/src/lib/plugins/moderation.js +++ b/src/lib/plugins/moderation.js @@ -64,4 +64,76 @@ module.exports.player=function(player,serv) }; player.pardon = () => serv.pardon(player._client.uuid); + + + + player.commands.add({ + base: 'kick', + info: 'to kick a player', + usage: '/kick [reason]', + parse(str) { + if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/)) + return false; + var parts = str.split(' '); + return { + username:parts.shift(), + reason:parts.join(' ') + }; + }, + action({username,reason}) { + var kickPlayer = serv.getPlayer(username); + if (!kickPlayer) { + player.chat(username + " is not on this server!"); + } else { + kickPlayer.kick(reason); + kickPlayer.emit("kicked", player, reason); + } + } + }); + + player.commands.add({ + base: 'ban', + info: 'to ban a player', + usage: '/ban [reason]', + parse(str) { + if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/)) + return false; + var parts = str.split(' '); + return { + username:parts.shift(), + reason:parts.join(' ') + }; + }, + action({username,reason}) { + var banPlayer = serv.getPlayer(username); + + if (!banPlayer) { + serv.banUsername(username, reason) + .then(() => { + serv.emit('banned', player, username, reason); + player.chat(username + ' was banned'); + }) + .catch(err => player.chat(username + " is not a valid player!")); + } else { + banPlayer.ban(reason); + serv.emit("banned", player, username, reason); + } + } + }); + + player.commands.add({ + base: 'pardon', + info: 'to pardon a player', + usage: '/pardon ', + parse(str) { + if(!str.match(/([a-zA-Z0-9_]+)/)) + return false; + return str; + }, + action(nick) { + serv.pardonUsername(nick) + .then(()=> player.chat(nick + " is unbanned")) + .catch(err => player.chat(nick + " is not banned")); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/modpe.js b/src/lib/plugins/modpe.js index 3adde42..2b0398c 100644 --- a/src/lib/plugins/modpe.js +++ b/src/lib/plugins/modpe.js @@ -1,4 +1,4 @@ -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 var dir = require("node-dir"); var fs = require("fs"); @@ -50,11 +50,11 @@ function modpeApi() { } function setTile(x, y, z, id, damage) { - server.setBlock(server.overworld,new vec3(x, y, z), id, damage); + server.setBlock(server.overworld,new Vec3(x, y, z), id, damage); } function getTile(x, y, z) { - return server._worldSync.getBlockType(new vec3(x, y, z)); + return server._worldSync.getBlockType(new Vec3(x, y, z)); } function preventDefault() { @@ -158,7 +158,7 @@ module.exports.server=function(serv,settings) newLevel(); player._client.on("block_dig", function (packet) { - var pos = new vec3(packet.location); + var pos = new Vec3(packet.location); if (packet.status == 0 && player.gameMode != 1) startDestroyBlock(pos.x, pos.y, pos.z, 0); else if (packet.status == 2) @@ -177,7 +177,7 @@ module.exports.server=function(serv,settings) if (packet.location.y < 0) return; useItem(packet.location.x, packet.location.y, packet.location.z, packet.heldItem.blockId, - serv._worldSync.getBlockType(new vec3(packet.location.x, packet.location.y, packet.location.z))); + serv._worldSync.getBlockType(new Vec3(packet.location.x, packet.location.y, packet.location.z))); }); player.on('modpe', function (command) { diff --git a/src/lib/plugins/particle.js b/src/lib/plugins/particle.js index 1a7f272..b9b6982 100644 --- a/src/lib/plugins/particle.js +++ b/src/lib/plugins/particle.js @@ -1,4 +1,4 @@ -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 module.exports.server=function(serv) { serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance,size,count}={}) => { @@ -7,7 +7,7 @@ module.exports.server=function(serv) { position: position.scaled(32).floored(), radius: radius // 32 blocks, fixed position })); - if (!size) size = vec3(1.0, 1.0, 1.0); + if (!size) size = new Vec3(1.0, 1.0, 1.0); players.filter(player => blacklist.indexOf(player) == -1) .forEach(player => { player._client.write('world_particles', { @@ -25,4 +25,29 @@ module.exports.server=function(serv) { }); }); } +}; + +module.exports.player=function(player,serv){ + player.commands.add({ + base: 'particle', + info: 'emit a particle at a position', + usage: '/particle [amount] [ ]', + parse(str) { + var results=str.match(/(\d+)(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?(?: (\d+))?/); + if(!results) return false; + return { + particle:parseInt(results[1]), + amount:results[2] ? parseInt(results[2]) : 1, + size:results[5] ? new Vec3(parseInt(results[3]), parseInt(results[4]), parseInt(results[5])) : new Vec3(1, 1, 1) + }; + }, + action({particle,amount,size}) { + if (amount >= 100000) { + player.chat('You cannot emit more than 100,000 particles!'); + return; + } + player.chat('Emitting "' + particle + '" (count: ' + amount + ', size: ' + size.toString() + ')'); + serv.emitParticle(particle, player.world, player.entity.position.scaled(1/32), {count: amount,size: size}); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/physics.js b/src/lib/plugins/physics.js index 15708bc..a7662ff 100644 --- a/src/lib/plugins/physics.js +++ b/src/lib/plugins/physics.js @@ -1,5 +1,5 @@ var blocks=require("minecraft-data")(require("../version")).blocks; -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 module.exports.entity=function(entity){ entity.calculatePhysics = async (delta) => { @@ -10,7 +10,7 @@ module.exports.entity=function(entity){ } var vSign = getSign(entity.velocity); - var sizeSigned = vec3(vSign.x * entity.size.x, vSign.y * entity.size.y, vSign.z * entity.size.z); + var 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(); var yVec = entity.position.offset(0, entity.velocity.y*delta + sizeSigned.y/2, 0).scaled(1/32).floored(); @@ -34,7 +34,7 @@ module.exports.entity=function(entity){ entity.position.y += getMoveAmount('y', yBlock, entity, delta, sizeSigned.y); entity.position.z += getMoveAmount('z', zBlock, entity, delta, sizeSigned.z); - //serv.emitParticle(30, serv.overworld, entity.position.scaled(1/32), { size: vec3(0, 0, 0) }); + //serv.emitParticle(30, serv.overworld, entity.position.scaled(1/32), { size: new Vec3(0, 0, 0) }); return { oldPos: oldPos, onGround: yBlock} }; @@ -49,7 +49,7 @@ module.exports.entity=function(entity){ } function getSign(vec) { - return vec3(Math.sign(vec.x), Math.sign(vec.y), Math.sign(vec.z)); + return new Vec3(Math.sign(vec.x), Math.sign(vec.y), Math.sign(vec.z)); } diff --git a/src/lib/plugins/placeBlock.js b/src/lib/plugins/placeBlock.js index a58a00e..b4da784 100644 --- a/src/lib/plugins/placeBlock.js +++ b/src/lib/plugins/placeBlock.js @@ -1,5 +1,5 @@ var blocks=require("minecraft-data")(require("../version")).blocks; -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 var materialToSound = { undefined: 'stone', @@ -15,13 +15,13 @@ module.exports.player=function(player,serv) { player._client.on("block_place",({direction,heldItem,location} = {}) => { if(direction==-1 || heldItem.blockId==-1) return; - var referencePosition=new vec3(location.x,location.y,location.z); + var referencePosition=new Vec3(location.x,location.y,location.z); var directionVector=directionToVector[direction]; var placedPosition=referencePosition.plus(directionVector); player.world.getBlockType(referencePosition).then((id) => { if([25].indexOf(id) != -1) return; var sound = 'dig.' + (materialToSound[blocks[heldItem.blockId].material] || 'stone'); - serv.playSound(sound, player.world, placedPosition.clone().add(vec3(0.5, 0.5, 0.5)), { + serv.playSound(sound, player.world, placedPosition.clone().add(new Vec3(0.5, 0.5, 0.5)), { pitch: 0.8 }); if(heldItem.blockId!=323){ @@ -41,4 +41,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)]; +var directionToVector=[new Vec3(0,-1,0),new Vec3(0,1,0),new Vec3(0,0,-1),new Vec3(0,0,1),new Vec3(-1,0,0),new Vec3(1,0,0)]; diff --git a/src/lib/plugins/players.js b/src/lib/plugins/players.js index 59b668e..570f289 100644 --- a/src/lib/plugins/players.js +++ b/src/lib/plugins/players.js @@ -11,4 +11,22 @@ module.exports.server=function(serv) } return null; }; +}; + +module.exports.player=function(player){ + player.commands.add({ + base: 'gamemode', + aliases: ['gm'], + info: 'to change game mode', + usage: '/gamemode <0-3>', + parse(str) { + var results; + if(!(results = str.match(/^([0-3])$/))) + return false; + return parseInt(str); + }, + action(mode) { + player.setGameMode(mode); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/settings.js b/src/lib/plugins/settings.js index 7e37225..379f9f3 100644 --- a/src/lib/plugins/settings.js +++ b/src/lib/plugins/settings.js @@ -1,4 +1,4 @@ -var vec3=require("vec3"); +var Vec3 = require("vec3").Vec3; function randomInt (low, high) { @@ -9,7 +9,7 @@ module.exports.server=function(serv,settings) { serv.gameMode=settings.gameMode; - serv.getSpawnPoint = () => new vec3(randomInt(5,20),81,randomInt(5,20)); + serv.getSpawnPoint = () => new Vec3(randomInt(5,20),81,randomInt(5,20)); }; diff --git a/src/lib/plugins/sound.js b/src/lib/plugins/sound.js index 6a0285c..a8be48c 100644 --- a/src/lib/plugins/sound.js +++ b/src/lib/plugins/sound.js @@ -1,5 +1,4 @@ -var vec3 = require('vec3'); - +var Vec3 = require('vec3').Vec3; module.exports.server=function(serv) { serv.playSound = (sound, world, position, {whitelist,blacklist=[],radius=32*32,volume=1.0,pitch=1.0}={}) => { @@ -23,9 +22,9 @@ module.exports.server=function(serv) { }; serv.playNoteBlock = (world, position, pitch) => { - serv.emitParticle(23, world, position.clone().add(vec3(0.5, 1.5, 0.5)), { + serv.emitParticle(23, world, position.clone().add(new Vec3(0.5, 1.5, 0.5)), { count: 1, - size: vec3(0, 0, 0) + size: new Vec3(0, 0, 0) }); serv.playSound('note.harp', world, position, { pitch: serv.getNote(pitch) }); }; @@ -41,7 +40,7 @@ module.exports.player=function(player,serv) { player._client.on('block_place', ({location}={}) => { if (player.entity.crouching) return; - var pos=new vec3(location.x,location.y,location.z); + var pos=new Vec3(location.x,location.y,location.z); player.world.getBlockType(pos).then((id) => { if (id != 25) return; if (!player.world.blockEntityData[pos.toString()]) player.world.blockEntityData[pos.toString()] = {}; @@ -55,7 +54,7 @@ module.exports.player=function(player,serv) { player._client.on('block_dig', ({location,status} = {}) => { if (status != 0 || player.gameMode == 1) return; - var pos=new vec3(location.x,location.y,location.z); + var pos=new Vec3(location.x,location.y,location.z); player.world.getBlockType(pos).then((id) => { if (id != 25) return; if (!player.world.blockEntityData[pos.toString()]) player.world.blockEntityData[pos.toString()] = {}; @@ -64,4 +63,43 @@ module.exports.player=function(player,serv) { serv.playNoteBlock(player.world, pos, data.note); }).catch((err)=> setTimeout(() => {throw err;},0)); }); + + + player.commands.add({ + base: 'playsound', + info: 'to play sound for yourself', + usage: '/playsound [volume] [pitch]', + parse(str) { + var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/); + if(!results) return false; + return { + sound_name:results[1], + volume:results[2] ? parseFloat(results[2]) : 1.0, + pitch:results[3] ? parseFloat(results[3]) : 1.0 + }; + }, + action({sound_name,volume,pitch}) { + player.chat('Playing "'+sound_name+'" (volume: ' + volume + ', pitch: ' + pitch + ')'); + player.playSound(sound_name, {volume: volume,pitch: pitch}); + } + }); + + player.commands.add({ + base: 'playsoundforall', + info: 'to play sound for everyone', + usage: '/playsoundforall [volume] [pitch]', + parse(str) { + var results=str.match(/([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?/); + if(!results) return false; + return { + sound_name:results[1], + volume:results[2] ? parseFloat(results[2]) : 1.0, + pitch:results[3] ? parseFloat(results[3]) : 1.0 + }; + }, + action({sound_name,volume,pitch}) { + player.chat('Playing "'+sound_name+'" (volume: ' + volume + ', pitch: ' + pitch + ')'); + serv.playSound(sound_name, player.world, player.entity.position.scaled(1/32), {volume: volume,pitch: pitch}); + } + }); }; \ No newline at end of file diff --git a/src/lib/plugins/updatePositions.js b/src/lib/plugins/updatePositions.js index a7c3051..927c4a2 100644 --- a/src/lib/plugins/updatePositions.js +++ b/src/lib/plugins/updatePositions.js @@ -1,6 +1,6 @@ -var vec3 = require("vec3"); +var Vec3 = require("vec3").Vec3 -vec3.Vec3.prototype.toFixedPosition=function() { +Vec3.prototype.toFixedPosition=function() { return this.scaled(32).floored(); }; @@ -36,15 +36,15 @@ module.exports.player=function(player) } player._client.on('position', ({x,y,z,onGround} = {}) => - sendRelativePositionChange((new vec3(x, y, z)).toFixedPosition(), onGround)); + sendRelativePositionChange((new Vec3(x, y, z)).toFixedPosition(), onGround)); player._client.on('position_look', ({x,y,z,onGround,yaw,pitch} = {}) => { - sendRelativePositionChange((new vec3(x, y, z)).toFixedPosition(), onGround); + sendRelativePositionChange((new Vec3(x, y, z)).toFixedPosition(), onGround); sendLook(yaw,pitch,onGround); }); function sendRelativePositionChange(newPosition, onGround) { - if (player.entity.position.distanceTo(new vec3(0, 0, 0)) != 0) { + if (player.entity.position.distanceTo(new Vec3(0, 0, 0)) != 0) { var diff = newPosition.minus(player.entity.position); if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) { @@ -58,7 +58,7 @@ module.exports.player=function(player) onGround: onGround }); } - else if (diff.distanceTo(new vec3(0, 0, 0)) != 0) { + else if (diff.distanceTo(new Vec3(0, 0, 0)) != 0) { player._writeOthersNearby('rel_entity_move', { entityId: player.entity.id, dX: diff.x, diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index f19f7c0..8a9d83f 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -1,9 +1,8 @@ -var vec3=require("vec3"); +var Vec3 = require("vec3").Vec3 var spiralloop = require('spiralloop'); var Chunk = require('prismarine-chunk')(require("../version")); var World = require('prismarine-world'); -var Vec3 = require('vec3'); var WorldSync = require("prismarine-world-sync"); var generations={ @@ -52,7 +51,7 @@ module.exports.server=function(serv,{regionFolder,generation={"name":"diamond_sq //serv.pregenWorld(serv.netherworld).then(() => serv.log('Pre-Generated Nether')); }; -module.exports.player=function(player) { +module.exports.player=function(player,serv) { player.spawnEntity = entity => { player._client.write(entity.spawnPacketName, entity.getSpawnPacket()); @@ -167,4 +166,14 @@ module.exports.player=function(player) { player.sendRestMap(); }; + + player.commands.add({ + base: 'changeworld', + info: 'to change world', + usage: '/changeworld overworld|nether', + action(world) { + if(world=="nether") player.changeWorld(serv.netherworld, {dimension: -1}); + if(world=="overworld") player.changeWorld(serv.overworld, {dimension: 0}); + } + }); }; \ No newline at end of file diff --git a/src/lib/worldGenerations/all_the_blocks.js b/src/lib/worldGenerations/all_the_blocks.js index aaa14d1..332db57 100644 --- a/src/lib/worldGenerations/all_the_blocks.js +++ b/src/lib/worldGenerations/all_the_blocks.js @@ -1,5 +1,5 @@ var Chunk = require('prismarine-chunk')(require("../version")); -var Vec3 = require('vec3'); +var Vec3 = require('vec3').Vec3; var blocks=require("minecraft-data")(require("../version")).blocks; function generation() { diff --git a/src/lib/worldGenerations/diamond_square.js b/src/lib/worldGenerations/diamond_square.js index 7b5ed18..4ee311a 100644 --- a/src/lib/worldGenerations/diamond_square.js +++ b/src/lib/worldGenerations/diamond_square.js @@ -1,5 +1,5 @@ var Chunk = require('prismarine-chunk')(require("../version")); -var Vec3 = require('vec3'); +var Vec3 = require('vec3').Vec3; var rand = require('random-seed'); class DiamondSquare { diff --git a/src/lib/worldGenerations/grass_field.js b/src/lib/worldGenerations/grass_field.js index 0a8a204..a306272 100644 --- a/src/lib/worldGenerations/grass_field.js +++ b/src/lib/worldGenerations/grass_field.js @@ -1,5 +1,5 @@ var Chunk = require('prismarine-chunk')(require("../version")); -var Vec3 = require('vec3'); +var Vec3 = require('vec3').Vec3; function generation() { function generateSimpleChunk(chunkX, chunkZ) { diff --git a/src/lib/worldGenerations/nether.js b/src/lib/worldGenerations/nether.js index fd375df..a091689 100644 --- a/src/lib/worldGenerations/nether.js +++ b/src/lib/worldGenerations/nether.js @@ -1,5 +1,5 @@ var Chunk = require('prismarine-chunk')(require("../version")); -var Vec3 = require('vec3'); +var Vec3 = require('vec3').Vec3; var rand = require('random-seed'); function generation({seed,level=50}={}) { diff --git a/src/lib/worldGenerations/superflat.js b/src/lib/worldGenerations/superflat.js index ec84073..5054b22 100644 --- a/src/lib/worldGenerations/superflat.js +++ b/src/lib/worldGenerations/superflat.js @@ -1,5 +1,5 @@ var Chunk = require('prismarine-chunk')(require("../version")); -var Vec3 = require('vec3'); +var Vec3 = require('vec3').Vec3; function generation({opt='default',bottom_id=7,middle_id=1,top_id=2,middle_thickness=3,debug=false}={}) { function generateChunk(chunkX,chunkZ) {