diff --git a/src/lib/plugins/blocks.js b/src/lib/plugins/blocks.js index 3095ca7..fc14ab2 100644 --- a/src/lib/plugins/blocks.js +++ b/src/lib/plugins/blocks.js @@ -1,5 +1,3 @@ -var Vec3 = require("vec3").Vec3; - module.exports.player=function(player,serv) { player.changeBlock=async (position,blockType,blockData) => @@ -33,7 +31,7 @@ module.exports.player=function(player,serv) 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); + return (player.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); } else { return parseInt(num); // return parseInt>>5 if position, not id } diff --git a/src/lib/plugins/chest.js b/src/lib/plugins/chest.js index 62d7de4..7b475fd 100644 --- a/src/lib/plugins/chest.js +++ b/src/lib/plugins/chest.js @@ -4,7 +4,7 @@ module.exports.player=function(player) { player._client.on('block_place', async ({location} = {}) => { var referencePosition=new Vec3(location.x,location.y,location.z); - if (player.entity.crouching) return; + if (player.crouching) return; try { var id = await player.world.getBlockType(referencePosition); var blockAbove = await player.world.getBlockType(referencePosition.clone().add(new Vec3(0, 1, 0))); diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 04dbce8..52c9103 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -76,7 +76,7 @@ module.exports.player=function(player,serv) player.changeBlock(location,0,0); // Drop block serv.spawnObject(2, player.world, location.offset(0.5, 0.5, 0.5), { - velocity: Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2), + velocity: new Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2), itemId: currentlyDugBlock.type, itemDamage: currentlyDugBlock.metadata }); diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index c3ec18c..4280a39 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -34,6 +34,7 @@ module.exports.server=function(serv,options) { 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.pickupTime = 200; object.itemId = itemId; object.itemDamage = itemDamage; @@ -72,6 +73,16 @@ module.exports.server=function(serv,options) { if (entity.deathTime && Date.now() - entity.bornTime >= entity.deathTime) { entity.destroy(); return; + } else if (entity.pickupTime && Date.now() - entity.bornTime >= entity.pickupTime) { + var players = serv.getNearby({ + world: entity.world, + position: entity.position, + radius: 1.5*32 // Seems good for now + }); + if (players.length) { + players[0].collect(entity); + entity.destroy(); + } } if (!entity.velocity || !entity.size) return; var oldPosAndOnGround = await entity.calculatePhysics(delta); @@ -241,19 +252,28 @@ module.exports.entity=function(entity,serv){ if (entity.type == 'player') { entity.despawnEntities(entitiesToRemove); entitiesToAdd.forEach(entity.spawnEntity); - entity.lastPositionPlayersUpdated=entity.position.clone(); - } else { - entity.lastPositionPlayersUpdated=entity.position.clone(); } + entity.lastPositionPlayersUpdated=entity.position.clone(); - var playersToAdd = entitiesToAdd.filter(e => e.type == 'player').map(e => e.player); - var playersToRemove = entitiesToRemove.filter(e => e.type == 'player').map(e => e.player); + var playersToAdd = entitiesToAdd.filter(e => e.type == 'player'); + var playersToRemove = entitiesToRemove.filter(e => e.type == 'player'); playersToRemove.forEach(p => p.despawnEntities([entity])); - playersToRemove.forEach(p => p.entity.nearbyEntities=p.entity.getNearby()); + playersToRemove.forEach(p => p.nearbyEntities=p.getNearby()); playersToAdd.forEach(p => p.spawnEntity(entity)); - playersToAdd.forEach(p => p.entity.nearbyEntities=p.entity.getNearby()); + playersToAdd.forEach(p => p.nearbyEntities=p.getNearby()); entity.nearbyEntities=updatedEntities; }; + + entity.collect = (collectEntity) => { + if (entity.type != 'player') serv.emit('error', 'Non-player entity (ttype ' + entity.type + ') cannot collect another entity'); + else { + serv._writeNearby('collect', { + collectedEntityId: collectEntity.id, + collectorEntityId: entity.id + }, collectEntity); + entity.playSoundAtSelf('random.pop'); + } + } }; \ No newline at end of file diff --git a/src/lib/plugins/sound.js b/src/lib/plugins/sound.js index 649de64..a194532 100644 --- a/src/lib/plugins/sound.js +++ b/src/lib/plugins/sound.js @@ -102,4 +102,10 @@ module.exports.player=function(player,serv) { serv.playSound(sound_name, player.world, player.position.scaled(1/32), {volume: volume,pitch: pitch}); } }); +}; + +module.exports.entity=function(entity,serv) { + entity.playSoundAtSelf = (sound, opt={}) => { + serv.playSound(sound, entity.world, entity.position.scaled(1/32), opt); + } }; \ No newline at end of file