Almost done with entities, needs some more finishing touches

This commit is contained in:
DemiPixel 2015-11-10 21:12:53 -08:00
parent 9c61b7b009
commit f0c17d38b4
4 changed files with 47 additions and 29 deletions

View file

@ -320,7 +320,7 @@ function inject(serv, player) {
}, },
action({id}) { action({id}) {
serv.spawnMob(id, player.world, player.entity.position.scaled(1/32), { serv.spawnMob(id, player.world, player.entity.position.scaled(1/32), {
velocity: Vec3((Math.random() - 0.5) * 5 + 5, Math.random()*10 + 10, (Math.random() - 0.5) * 5 + 5) velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10)
}); });
} }
}) })

View file

@ -70,12 +70,22 @@ function inject(serv,player)
}); });
} }
function completeDigging(location) async function completeDigging(location)
{ {
clearInterval(animationInterval); clearInterval(animationInterval);
var diggingTime=new Date()-startDiggingTime; var diggingTime=new Date()-startDiggingTime;
if(expectedDiggingTime-diggingTime<100) if(expectedDiggingTime-diggingTime<100) {
player.changeBlock(location,0,0); player.changeBlock(location,0,0);
// Drop block
var vec = Vec3(location.x, location.y, location.z);
var id = await player.world.getBlockType(vec);
var damage = await player.world.getBlockData(vec);
serv.spawnObject(2, player.world, vec.clone().add(Vec3(0.5, 0.5, 0.5)), {
velocity: Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2),
itemId: id,
itemDamage: damage
});
}
else else
{ {
player._client.write("block_change",{ player._client.write("block_change",{
@ -86,16 +96,8 @@ function inject(serv,player)
} }
async function creativeDigging(location) function creativeDigging(location)
{ {
var vec = Vec3(location.x, location.y, location.z);
var id = await player.world.getBlockType(vec);
var damage = await player.world.getBlockData(vec);
serv.spawnObject(2, player.world, vec.clone().add(Vec3(0.5, 0.5, 0.5)), {
velocity: Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2),
itemId: id,
itemDamage: damage
});
return player.changeBlock(location,0,0); return player.changeBlock(location,0,0);
} }

View file

@ -7,6 +7,16 @@ function inject(serv, player) {
player.spawnEntity = entity => { player.spawnEntity = entity => {
player._client.write(entity.spawnPacketName, entity.getSpawnPacket()); player._client.write(entity.spawnPacketName, entity.getSpawnPacket());
if (typeof entity.itemId != 'undefined') {
entity.setMetadata([{
"key": 10,
"type": 5,
"value": {
blockId: entity.itemId,
itemDamage: entity.itemDamage
}
}]);
}
}; };
player.sendChunk = (chunkX,chunkZ,column) => player.sendChunk = (chunkX,chunkZ,column) =>

View file

@ -2,21 +2,27 @@ var Entity=require("prismarine-entity");
var blocks=require("minecraft-data")(require("../version")).blocks; var blocks=require("minecraft-data")(require("../version")).blocks;
var mobs=require("minecraft-data")(require("../version")).entitiesByName; var mobs=require("minecraft-data")(require("../version")).entitiesByName;
var vec3 = require("vec3"); var vec3 = require("vec3");
var EventEmitter = require('events').EventEmitter;
var util = require('util');
module.exports = inject; module.exports = inject;
function inject(serv) { function inject(serv) {
util.inherits(Entity, EventEmitter);
serv.initEntity = (type, entityType, world, position) => { serv.initEntity = (type, entityType, world, position) => {
serv.entityMaxId++; serv.entityMaxId++;
var entity = new Entity(serv.entityMaxId); var entity = new Entity(serv.entityMaxId);
EventEmitter.call(entity);
entity.type = type; entity.type = type;
entity.spawnPacketName = ''; entity.spawnPacketName = '';
entity.entityType = entityType; entity.entityType = entityType;
entity.world = world; entity.world = world;
entity.position = position; entity.position = position;
entity.lastPositionPlayersUpdated = entity.position.clone();
entity.nearbyEntities = []; entity.nearbyEntities = [];
entity.viewDistance = 15; entity.viewDistance = 150;
entity.bornTime = Date.now(); entity.bornTime = Date.now();
serv.entities[entity.id] = entity; serv.entities[entity.id] = entity;
@ -25,6 +31,11 @@ function inject(serv) {
else if (entity.type == 'object') entity.spawnPacketName = 'spawn_entity'; else if (entity.type == 'object') entity.spawnPacketName = 'spawn_entity';
else if (entity.type == 'mob') entity.spawnPacketName = 'spawn_entity_living'; else if (entity.type == 'mob') entity.spawnPacketName = 'spawn_entity_living';
entity.on("positionChanged",() => {
if(entity.position.distanceTo(entity.lastPositionPlayersUpdated)>2*32)
entity.updateAndSpawn();
});
entity.setMetadata = (data) => { entity.setMetadata = (data) => {
serv._writeNearby('entity_metadata', { serv._writeNearby('entity_metadata', {
entityId: entity.id, entityId: entity.id,
@ -74,6 +85,7 @@ function inject(serv) {
entity.sendPosition = ({oldPos,onGround}) => { entity.sendPosition = ({oldPos,onGround}) => {
var diff = entity.position.minus(oldPos); var diff = entity.position.minus(oldPos);
if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127)
serv._writeNearby('entity_teleport', { serv._writeNearby('entity_teleport', {
entityId: entity.id, entityId: entity.id,
@ -83,7 +95,7 @@ function inject(serv) {
yaw: entity.yaw, yaw: entity.yaw,
pitch: entity.pitch, pitch: entity.pitch,
onGround: onGround onGround: onGround
}); }, entity);
else serv._writeNearby('rel_entity_move', { else serv._writeNearby('rel_entity_move', {
entityId: entity.id, entityId: entity.id,
dX: diff.x, dX: diff.x,
@ -91,6 +103,8 @@ function inject(serv) {
dZ: diff.z, dZ: diff.z,
onGround: onGround onGround: onGround
}, entity); }, entity);
entity.emit('positionChanged', oldPos);
} }
entity.getSpawnPacket = () => { entity.getSpawnPacket = () => {
@ -156,14 +170,14 @@ function inject(serv) {
if (entity.type == 'player') { if (entity.type == 'player') {
entity.player.despawnEntities(entitiesToRemove); entity.player.despawnEntities(entitiesToRemove);
entitiesToAdd.forEach(entity.player.spawnEntity); entitiesToAdd.forEach(entity.player.spawnEntity);
entity.player.lastPositionPlayersUpdated=entity.position; entity.player.lastPositionPlayersUpdated=entity.position.clone();
} else {
entity.lastPositionPlayersUpdated=entity.position.clone();
} }
var playersToAdd = entitiesToAdd.filter(e => e.type == 'player').map(e => e.player); 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 playersToRemove = entitiesToRemove.filter(e => e.type == 'player').map(e => e.player);
console.log('players',playersToAdd.length,playersToRemove.length,'ents',entitiesToAdd.length,entitiesToRemove.length);
playersToRemove.forEach(p => p.despawnEntities([entity])); playersToRemove.forEach(p => p.despawnEntities([entity]));
playersToRemove.forEach(p => p.entity.nearbyEntities=p.entity.getNearby()); playersToRemove.forEach(p => p.entity.nearbyEntities=p.entity.getNearby());
playersToAdd.forEach(p => p.spawnEntity(entity)); playersToAdd.forEach(p => p.spawnEntity(entity));
@ -186,19 +200,10 @@ function inject(serv) {
object.friction = vec3(10*32, 0, 10*32).floored(); 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.size = vec3(0.25*32, 0.25*32, 0.25*32); // Hardcoded, will be dependent on type!
object.deathTime = 60*1000; // 60 seconds object.deathTime = 60*1000; // 60 seconds
object.itemId = itemId;
object.itemDamage = itemDamage;
object.updateAndSpawn(); object.updateAndSpawn();
if (typeof itemId != 'undefined') {
object.setMetadata([{
"key": 10,
"type": 5,
"value": {
blockId: itemId,
itemDamage: itemDamage
}
}]);
}
} }
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=vec3(0,0,0),metadata=[]}={}) => {
@ -226,7 +231,8 @@ function inject(serv) {
} }
if (!entity.velocity || !entity.size) return; if (!entity.velocity || !entity.size) return;
var oldPosAndOnGround = await entity.calculatePhysics(delta); var oldPosAndOnGround = await entity.calculatePhysics(delta);
if (entity.type == 'mob') entity.sendPosition(oldPosAndOnGround); if (!oldPosAndOnGround.oldPos.equals(vec3(0,0,0)))
if (entity.type == 'mob') entity.sendPosition(oldPosAndOnGround);
}) })
).catch((err)=> setTimeout(() => {throw err;},0)); ).catch((err)=> setTimeout(() => {throw err;},0));
}); });