use Vec3 correctly + move commands in the related plugins

This commit is contained in:
Romain Beaumont 2015-11-16 22:22:58 +01:00
parent 9bcbb991bb
commit f522dfac97
22 changed files with 321 additions and 315 deletions

View file

@ -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 <x> <y> <z> <id> <data>',
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]);
}
});
};

View file

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

View file

@ -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 <x> <y> <z> <id> <data>',
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 <player> [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 <player> [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 <player>',
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 <add|query|set> <value>',
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 <params>',
@ -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 <sound_name> [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 <sound_name> [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 <id> [amount] [<sizeX> <sizeY> <sizeZ>]',
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 <entity_id>',
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);
};
};

View file

@ -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 <add|query|set> <value>',
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');
}
});
};

View file

@ -1,4 +1,4 @@
var Vec3 = require("vec3");
var Vec3 = require("vec3").Vec3
module.exports.player=function(player,serv)
{

View file

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

View file

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

View file

@ -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 <player> [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 <player> [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 <player>',
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"));
}
});
};

View file

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

View file

@ -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 <id> [amount] [<sizeX> <sizeY> <sizeZ>]',
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});
}
});
};

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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() {

View file

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

View file

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

View file

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

View file

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