flying-squid
Version:
A minecraft server written in node.js
56 lines (53 loc) • 1.69 kB
JavaScript
module.exports.server = function (serv) {
let ticking = false
serv.on('tick', function (delta) {
if (ticking || delta > 1) { return }
ticking = true
Promise.all(
Object.keys(serv.entities).map(async (id) => {
const entity = serv.entities[id]
if (entity.deathTime && Date.now() - entity.bornTime >= entity.deathTime) {
entity.destroy()
return
} else if (entity.pickupTime && Date.now() - entity.bornTime >= entity.pickupTime) {
const players = serv.getNearby({
world: entity.world,
position: entity.position,
radius: 1.75 // Seems good for now
})
if (players.length) {
players[0].collect(entity)
}
}
if (!entity.velocity || !entity.size) return
const { position, onGround } = await entity.calculatePhysics(delta)
if (entity.type === 'mob' ||
(entity.type === 'object' &&
(
entity.velocity.x !== 0 ||
entity.velocity.y !== 0 ||
entity.velocity.z !== 0
)
)) entity.sendPosition(position, onGround)
})
)
.then(() => { ticking = false })
.catch((err) => setTimeout(() => { throw err }, 0))
})
}
module.exports.entity = function (entity, serv) {
entity.sendMetadata = (data) => {
if (serv.registry.version['>=']('1.20.2')) {
// todo: fix in mcdata
return
}
entity._writeOthersNearby('entity_metadata', {
entityId: entity.id,
metadata: data
})
}
entity.setAndUpdateMetadata = (data) => {
entity.metadata = data
entity.sendMetadata(data)
}
}