flying-squid
Version:
A minecraft server written in node.js
59 lines (55 loc) • 1.9 kB
JavaScript
const Vec3 = require('vec3').Vec3
module.exports.server = function (serv) {
serv.emitParticle = (particle, world, position, { whitelist, blacklist = [], radius = 32, longDistance = true, size = new Vec3(1, 1, 1), count = 1 } = {}) => {
const players = (typeof whitelist !== 'undefined'
? (whitelist instanceof Array ? whitelist : [whitelist])
: serv.getNearby({
world,
position,
radius
}))
serv._writeArray('world_particles', {
particleId: particle,
longDistance,
x: position.x,
y: position.y,
z: position.z,
offsetX: size.x,
offsetY: size.y,
offsetZ: size.z,
particleData: 1.0,
particles: count,
amount: count, // 1.20.5+
data: [],
velocityOffset: 0, // 1.20.5+
particle: {
type: 'bubble',
data: null
}
}, players.filter(p => blacklist.indexOf(p) === -1))
}
serv.commands.add({
base: 'particle',
info: 'emit a particle at a position',
usage: '/particle <id> [amount] [<sizeX> <sizeY> <sizeZ>]',
onlyPlayer: true,
op: true,
parse (str) {
const 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 }, ctx) {
if (amount >= 100000) {
ctx.player.chat('You cannot emit more than 100,000 particles!')
return
}
ctx.player.chat('Emitting "' + particle + '" (count: ' + amount + ', size: ' + size.toString() + ')')
serv.emitParticle(particle, ctx.player.world, ctx.player.position, { count: amount, size })
}
})
}