mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-05 19:20:54 +00:00
Almost done with entities, needs some more finishing touches
This commit is contained in:
parent
9c61b7b009
commit
f0c17d38b4
4 changed files with 47 additions and 29 deletions
|
|
@ -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)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue