mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-05 19:20:54 +00:00
Trying to work on sending entities, fair amount of broken stuff
This commit is contained in:
parent
687b8b971f
commit
9c61b7b009
7 changed files with 122 additions and 84 deletions
|
|
@ -8,15 +8,17 @@ function inject(serv,player)
|
||||||
.forEach((otherPlayer) => otherPlayer._client.write(packetName, packetFields));
|
.forEach((otherPlayer) => otherPlayer._client.write(packetName, packetFields));
|
||||||
|
|
||||||
player._writeOthersNearby = (packetName, packetFields) =>
|
player._writeOthersNearby = (packetName, packetFields) =>
|
||||||
serv._writeArray(packetName, packetFields, player.nearbyPlayers);
|
serv._writeArray(packetName, packetFields, player.nearbyPlayers());
|
||||||
|
|
||||||
player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player);
|
player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player);
|
||||||
|
|
||||||
player.getNearby = () => serv
|
player.getNearbyPlayers = (radius=player.entity.viewDistance*32) => serv.getNearby({
|
||||||
.getNearby({
|
world: player.world,
|
||||||
world: player.world,
|
position: player.position,
|
||||||
position: player.entity.position,
|
radius: radius
|
||||||
radius: player.playerViewDistance*32
|
});
|
||||||
})
|
|
||||||
.filter((p) => p != player);
|
player.nearbyPlayers = (radius=player.entity.viewDistance*32) => player.entity.nearbyEntities
|
||||||
|
.filter(e => e.type == 'player')
|
||||||
|
.map(e => e.player);
|
||||||
}
|
}
|
||||||
|
|
@ -7,46 +7,25 @@ function inject(serv,player)
|
||||||
{
|
{
|
||||||
function addPlayer()
|
function addPlayer()
|
||||||
{
|
{
|
||||||
serv.entityMaxId++;
|
player.entity=serv.initEntity('player', null, serv.overworld, Vec3(0,0,0));
|
||||||
player.entity=new Entity(serv.entityMaxId);
|
player.entity.type = 'player';
|
||||||
serv.entities[player.entity.id]=player.entity;
|
|
||||||
player.entity.player=player;
|
player.entity.player=player;
|
||||||
player.entity.health = 20;
|
player.entity.health = 20;
|
||||||
player.entity.food = 20;
|
player.entity.food = 20;
|
||||||
player.entity.crouching = false; // Needs added in prismarine-entity later
|
player.entity.crouching = false; // Needs added in prismarine-entity later
|
||||||
player.playerViewDistance = 150;
|
|
||||||
player.view=10;
|
player.view=10;
|
||||||
player.world=serv.overworld;
|
player.world=serv.overworld;
|
||||||
player.username=player._client.username;
|
player.username=player._client.username;
|
||||||
serv.players.push(player);
|
serv.players.push(player);
|
||||||
serv.uuidToPlayer[player._client.uuid] = player;
|
serv.uuidToPlayer[player._client.uuid] = player;
|
||||||
player.loadedChunks={};
|
player.loadedChunks={};
|
||||||
player.nearbyPlayers=[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.updateAndSpawnNearbyPlayers = () =>
|
|
||||||
{
|
|
||||||
player.lastPositionPlayersUpdated=player.entity.position;
|
|
||||||
var updatedPlayers=player.getNearby();
|
|
||||||
var playersToAdd=updatedPlayers.filter(p => player.nearbyPlayers.indexOf(p)==-1);
|
|
||||||
var playersToRemove=player.nearbyPlayers.filter(p => updatedPlayers.indexOf(p)==-1);
|
|
||||||
player.despawnPlayers(playersToRemove);
|
|
||||||
playersToAdd.forEach(player.spawnAPlayer);
|
|
||||||
|
|
||||||
playersToRemove.forEach(p => p.despawnPlayers([player]));
|
|
||||||
playersToRemove.forEach(p => p.nearbyPlayers=p.getNearby());
|
|
||||||
playersToAdd.forEach(p => p.spawnAPlayer(player));
|
|
||||||
playersToAdd.forEach(p => p.nearbyPlayers=p.getNearby());
|
|
||||||
|
|
||||||
player.nearbyPlayers=updatedPlayers;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
function sendPlayersWhenMove()
|
function sendPlayersWhenMove()
|
||||||
{
|
{
|
||||||
player.on("positionChanged",() => {
|
player.on("positionChanged",() => {
|
||||||
if(player.entity.position.distanceTo(player.lastPositionPlayersUpdated)>2*32)
|
if(player.entity.position.distanceTo(player.lastPositionPlayersUpdated)>2*32)
|
||||||
player.updateAndSpawnNearbyPlayers();
|
player.entity.updateAndSpawn();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -167,7 +146,7 @@ function inject(serv,player)
|
||||||
updateTime();
|
updateTime();
|
||||||
player.setGameMode(player.gameMode);
|
player.setGameMode(player.gameMode);
|
||||||
fillTabList();
|
fillTabList();
|
||||||
player.updateAndSpawnNearbyPlayers();
|
player.entity.updateAndSpawn();
|
||||||
|
|
||||||
announceJoin();
|
announceJoin();
|
||||||
player.emit("spawned");
|
player.emit("spawned");
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,10 @@ function inject(serv,player)
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
player.despawnEntities = entities => player._client.write('entity_destroy', {
|
||||||
|
'entityIds': entities.map(e => e.id)
|
||||||
|
});
|
||||||
|
|
||||||
player._client.on('end', () => {
|
player._client.on('end', () => {
|
||||||
if(player.entity) {
|
if(player.entity) {
|
||||||
serv.broadcast(player.username + ' quit the game.', "yellow");
|
serv.broadcast(player.username + ' quit the game.', "yellow");
|
||||||
|
|
@ -17,7 +21,7 @@ function inject(serv,player)
|
||||||
UUID: player._client.uuid
|
UUID: player._client.uuid
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
player.nearbyPlayers.forEach(otherPlayer => otherPlayer.despawnPlayers([player]));
|
player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnPlayers([player]));
|
||||||
delete serv.entities[player.entity.id];
|
delete serv.entities[player.entity.id];
|
||||||
player.emit('disconnected');
|
player.emit('disconnected');
|
||||||
var index = serv.players.indexOf(player);
|
var index = serv.players.indexOf(player);
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ function inject(serv,player)
|
||||||
|
|
||||||
function sendRelativePositionChange(newPosition, onGround) {
|
function sendRelativePositionChange(newPosition, onGround) {
|
||||||
if (player.entity.position.distanceTo(new vec3(0, 0, 0)) != 0) {
|
if (player.entity.position.distanceTo(new vec3(0, 0, 0)) != 0) {
|
||||||
var diff = newPosition.scaled(1/32).scaled(32).minus(player.entity.position.scaled(1/32).scaled(32));
|
var diff = newPosition.minus(player.entity.position);
|
||||||
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)
|
||||||
{
|
{
|
||||||
player._writeOthersNearby('entity_teleport', {
|
player._writeOthersNearby('entity_teleport', {
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,8 @@ module.exports = inject;
|
||||||
|
|
||||||
function inject(serv, player) {
|
function inject(serv, player) {
|
||||||
|
|
||||||
player.spawnAPlayer = spawnedPlayer => {
|
player.spawnEntity = entity => {
|
||||||
player._client.write('named_entity_spawn', {
|
player._client.write(entity.spawnPacketName, entity.getSpawnPacket());
|
||||||
entityId: spawnedPlayer.entity.id,
|
|
||||||
playerUUID: spawnedPlayer._client.uuid,
|
|
||||||
x: spawnedPlayer.entity.position.x,
|
|
||||||
y: spawnedPlayer.entity.position.y,
|
|
||||||
z: spawnedPlayer.entity.position.z,
|
|
||||||
yaw: spawnedPlayer.entity.yaw,
|
|
||||||
pitch: spawnedPlayer.entity.pitch,
|
|
||||||
currentItem: 0,
|
|
||||||
metadata: spawnedPlayer.entity.metadata
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
player.sendChunk = (chunkX,chunkZ,column) =>
|
player.sendChunk = (chunkX,chunkZ,column) =>
|
||||||
|
|
@ -96,6 +86,7 @@ function inject(serv, player) {
|
||||||
if(player.world == world) return Promise.resolve();
|
if(player.world == world) return Promise.resolve();
|
||||||
opt = opt || {};
|
opt = opt || {};
|
||||||
player.world = world;
|
player.world = world;
|
||||||
|
player.entity.world = world;
|
||||||
player.loadedChunks={};
|
player.loadedChunks={};
|
||||||
if (typeof opt.gamemode != 'undefined') player.gameMode = opt.gamemode;
|
if (typeof opt.gamemode != 'undefined') player.gameMode = opt.gamemode;
|
||||||
player._client.write("respawn",{
|
player._client.write("respawn",{
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,11 @@ function inject(serv,settings)
|
||||||
player.world == world &&
|
player.world == world &&
|
||||||
player.entity.position.distanceTo(position) <= radius
|
player.entity.position.distanceTo(position) <= radius
|
||||||
);
|
);
|
||||||
|
|
||||||
|
serv.getNearbyEntities= ({world,position,radius=8*16*32}) => Object.keys(serv.entities)
|
||||||
|
.map(eId => serv.entities[eId])
|
||||||
|
.filter(entity =>
|
||||||
|
entity.world == world &&
|
||||||
|
entity.position.distanceTo(position) <= radius
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -11,23 +11,30 @@ function inject(serv) {
|
||||||
serv.entityMaxId++;
|
serv.entityMaxId++;
|
||||||
var entity = new Entity(serv.entityMaxId);
|
var entity = new Entity(serv.entityMaxId);
|
||||||
entity.type = type;
|
entity.type = type;
|
||||||
|
entity.spawnPacketName = '';
|
||||||
entity.entityType = entityType;
|
entity.entityType = entityType;
|
||||||
entity.world = world;
|
entity.world = world;
|
||||||
entity.position = position;
|
entity.position = position;
|
||||||
|
entity.nearbyEntities = [];
|
||||||
|
entity.viewDistance = 15;
|
||||||
|
|
||||||
entity.bornTime = Date.now();
|
entity.bornTime = Date.now();
|
||||||
serv.entities[entity.id] = entity;
|
serv.entities[entity.id] = entity;
|
||||||
|
|
||||||
|
if (entity.type == 'player') entity.spawnPacketName = 'named_entity_spawn';
|
||||||
|
else if (entity.type == 'object') entity.spawnPacketName = 'spawn_entity';
|
||||||
|
else if (entity.type == 'mob') entity.spawnPacketName = 'spawn_entity_living';
|
||||||
|
|
||||||
entity.setMetadata = (data) => {
|
entity.setMetadata = (data) => {
|
||||||
serv._writeNearby('entity_metadata', {
|
serv._writeNearby('entity_metadata', {
|
||||||
entityId: entity.id,
|
entityId: entity.id,
|
||||||
metadata: data
|
metadata: data
|
||||||
}, entity);
|
}, entity);
|
||||||
}
|
};
|
||||||
|
|
||||||
entity.destroy = () => {
|
entity.destroy = () => {
|
||||||
serv.destroyEntity(entity);
|
serv.destroyEntity(entity);
|
||||||
}
|
};
|
||||||
|
|
||||||
entity.calculatePhysics = async (delta) => {
|
entity.calculatePhysics = async (delta) => {
|
||||||
if (entity.gravity) {
|
if (entity.gravity) {
|
||||||
|
|
@ -63,7 +70,7 @@ function inject(serv) {
|
||||||
|
|
||||||
//serv.emitParticle(30, serv.overworld, entity.position.scaled(1/32), { size: vec3(0, 0, 0) });
|
//serv.emitParticle(30, serv.overworld, entity.position.scaled(1/32), { size: vec3(0, 0, 0) });
|
||||||
return { oldPos: oldPos, onGround: yBlock}
|
return { oldPos: oldPos, onGround: yBlock}
|
||||||
}
|
};
|
||||||
|
|
||||||
entity.sendPosition = ({oldPos,onGround}) => {
|
entity.sendPosition = ({oldPos,onGround}) => {
|
||||||
var diff = entity.position.minus(oldPos);
|
var diff = entity.position.minus(oldPos);
|
||||||
|
|
@ -86,6 +93,85 @@ function inject(serv) {
|
||||||
}, entity);
|
}, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entity.getSpawnPacket = () => {
|
||||||
|
var scaledVelocity = entity.velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
||||||
|
if (entity.type == 'player') {
|
||||||
|
return {
|
||||||
|
entityId: entity.id,
|
||||||
|
playerUUID: entity.player._client.uuid,
|
||||||
|
x: entity.position.x,
|
||||||
|
y: entity.position.y,
|
||||||
|
z: entity.position.z,
|
||||||
|
yaw: entity.yaw,
|
||||||
|
pitch: entity.pitch,
|
||||||
|
currentItem: 0,
|
||||||
|
metadata: entity.metadata
|
||||||
|
}
|
||||||
|
} else if (entity.type == 'object') {
|
||||||
|
return {
|
||||||
|
entityId: entity.id,
|
||||||
|
type: entity.entityType,
|
||||||
|
x: entity.position.x,
|
||||||
|
y: entity.position.y,
|
||||||
|
z: entity.position.z,
|
||||||
|
pitch: entity.pitch,
|
||||||
|
yaw: entity.yaw,
|
||||||
|
objectData: {
|
||||||
|
intField: entity.data,
|
||||||
|
velocityX: scaledVelocity.x,
|
||||||
|
velocityY: scaledVelocity.y,
|
||||||
|
velocityZ: scaledVelocity.z
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (entity.type == 'mob') {
|
||||||
|
return {
|
||||||
|
entityId: entity.id,
|
||||||
|
type: entity.entityType,
|
||||||
|
x: entity.position.x,
|
||||||
|
y: entity.position.y,
|
||||||
|
z: entity.position.z,
|
||||||
|
yaw: entity.yaw,
|
||||||
|
pitch: entity.pitch,
|
||||||
|
headPitch: entity.headPitch,
|
||||||
|
velocityX: scaledVelocity.x,
|
||||||
|
velocityY: scaledVelocity.y,
|
||||||
|
velocityZ: scaledVelocity.z,
|
||||||
|
metadata: entity.metadata
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
entity.getNearby = () => serv
|
||||||
|
.getNearbyEntities({
|
||||||
|
world: entity.world,
|
||||||
|
position: entity.position,
|
||||||
|
radius: entity.viewDistance*32
|
||||||
|
})
|
||||||
|
.filter((e) => e != entity);
|
||||||
|
|
||||||
|
entity.updateAndSpawn = () => {
|
||||||
|
var updatedEntities=entity.getNearby();
|
||||||
|
var entitiesToAdd=updatedEntities.filter(e => entity.nearbyEntities.indexOf(e)==-1);
|
||||||
|
var entitiesToRemove=entity.nearbyEntities.filter(e => updatedEntities.indexOf(e)==-1);
|
||||||
|
if (entity.type == 'player') {
|
||||||
|
entity.player.despawnEntities(entitiesToRemove);
|
||||||
|
entitiesToAdd.forEach(entity.player.spawnEntity);
|
||||||
|
entity.player.lastPositionPlayersUpdated=entity.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
var playersToAdd = entitiesToAdd.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.entity.nearbyEntities=p.entity.getNearby());
|
||||||
|
playersToAdd.forEach(p => p.spawnEntity(entity));
|
||||||
|
playersToAdd.forEach(p => p.entity.nearbyEntities=p.entity.getNearby());
|
||||||
|
|
||||||
|
entity.nearbyEntities=updatedEntities;
|
||||||
|
};
|
||||||
|
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,23 +187,7 @@ function inject(serv) {
|
||||||
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
|
||||||
|
|
||||||
var scaledVelocity = object.velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick
|
object.updateAndSpawn();
|
||||||
|
|
||||||
serv._writeNearby('spawn_entity', {
|
|
||||||
entityId: object.id,
|
|
||||||
type: object.entityType,
|
|
||||||
x: object.position.x,
|
|
||||||
y: object.position.y,
|
|
||||||
z: object.position.z,
|
|
||||||
pitch: object.pitch,
|
|
||||||
yaw: object.yaw,
|
|
||||||
objectData: {
|
|
||||||
intField: data,
|
|
||||||
velocityX: scaledVelocity.x,
|
|
||||||
velocityY: scaledVelocity.y,
|
|
||||||
velocityZ: scaledVelocity.z
|
|
||||||
}
|
|
||||||
}, object);
|
|
||||||
|
|
||||||
if (typeof itemId != 'undefined') {
|
if (typeof itemId != 'undefined') {
|
||||||
object.setMetadata([{
|
object.setMetadata([{
|
||||||
|
|
@ -128,7 +198,7 @@ function inject(serv) {
|
||||||
itemDamage: itemDamage
|
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=[]}={}) => {
|
||||||
|
|
@ -143,22 +213,7 @@ function inject(serv) {
|
||||||
mob.size = vec3(0.75, 1.75, 0.75);
|
mob.size = vec3(0.75, 1.75, 0.75);
|
||||||
mob.metadata = metadata;
|
mob.metadata = metadata;
|
||||||
|
|
||||||
var scaledVelocity = mob.velocity.scaled(8000/32/20).floored();
|
mob.updateAndSpawn();
|
||||||
|
|
||||||
serv._writeNearby('spawn_entity_living', {
|
|
||||||
entityId: mob.id,
|
|
||||||
type: mob.entityType,
|
|
||||||
x: mob.position.x,
|
|
||||||
y: mob.position.y,
|
|
||||||
z: mob.position.z,
|
|
||||||
yaw: mob.yaw,
|
|
||||||
pitch: mob.pitch,
|
|
||||||
headPitch: mob.headPitch,
|
|
||||||
velocityX: scaledVelocity.x,
|
|
||||||
velocityY: scaledVelocity.y,
|
|
||||||
velocityZ: scaledVelocity.z,
|
|
||||||
metadata: mob.metadata
|
|
||||||
}, mob);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
serv.on('tick', function(delta) {
|
serv.on('tick', function(delta) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue