mirror of
https://github.com/danbulant/flying-squid
synced 2026-06-19 06:21:08 +00:00
153 lines
No EOL
3.9 KiB
JavaScript
153 lines
No EOL
3.9 KiB
JavaScript
var Entity=require("prismarine-entity");
|
|
var Vec3=require("vec3");
|
|
|
|
module.exports=inject;
|
|
|
|
function inject(serv,player)
|
|
{
|
|
function addPlayer()
|
|
{
|
|
serv.entityMaxId++;
|
|
player.entity=new Entity(serv.entityMaxId);
|
|
serv.entities[player.entity.id]=player.entity;
|
|
player.entity.player=player;
|
|
player.entity.health = 20;
|
|
player.entity.food = 20;
|
|
player.playerViewDistance = 150;
|
|
player.view=8;
|
|
player.world=serv.overworld;
|
|
player.username=player._client.username;
|
|
serv.players.push(player);
|
|
serv.uuidToPlayer[player._client.uuid] = player;
|
|
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()
|
|
{
|
|
player.on("positionChanged",function(){
|
|
if(player.entity.position.distanceTo(player.lastPositionPlayersUpdated)>2*32)
|
|
player.updateAndSpawnNearbyPlayers();
|
|
});
|
|
}
|
|
|
|
function sendLogin()
|
|
{
|
|
// send init data so client will start rendering world
|
|
player._client.write('login', {
|
|
entityId: player.entity.id,
|
|
levelType: 'default',
|
|
gameMode: player.gameMode,
|
|
dimension: 0,
|
|
difficulty: 0,
|
|
reducedDebugInfo: false,
|
|
maxPlayers: serv._server.maxPlayers
|
|
});
|
|
player.entity.position=player.spawnPoint.toFixedPosition();
|
|
}
|
|
|
|
function sendChunkWhenMove()
|
|
{
|
|
player.on("positionChanged",function(){
|
|
if(!player.sendingChunks && player.entity.position.distanceTo(player.lastPositionChunkUpdated)>16*32)
|
|
player.sendRestMap();
|
|
});
|
|
}
|
|
|
|
function updateTime()
|
|
{
|
|
player._client.write('update_time', {
|
|
age: [0, 0],
|
|
time: [0, serv.time]
|
|
});
|
|
}
|
|
|
|
player.setGameMode = gameMode =>
|
|
{
|
|
player._client.write('game_state_change', {
|
|
reason: 3,
|
|
gameMode: gameMode
|
|
});
|
|
player.gameMode=gameMode;
|
|
};
|
|
|
|
function fillTabList()
|
|
{
|
|
player._writeOthers('player_info',{
|
|
action: 0,
|
|
data: [{
|
|
UUID: player._client.uuid,
|
|
name: player.username,
|
|
properties: [],
|
|
gamemode: player.gameMode,
|
|
ping: 1
|
|
}]
|
|
});
|
|
|
|
player._client.write('player_info', {
|
|
action: 0,
|
|
data: serv.players.map((otherPlayer) => ({
|
|
UUID: otherPlayer._client.uuid,
|
|
name: otherPlayer.username,
|
|
properties: [],
|
|
gamemode: otherPlayer.gameMode,
|
|
ping: 1
|
|
}))
|
|
});
|
|
}
|
|
|
|
function announceJoin()
|
|
{
|
|
serv.broadcast(player.username + ' joined the game.', "yellow");
|
|
player.emit("connected");
|
|
}
|
|
|
|
player.login = async () =>
|
|
{
|
|
if (serv.uuidToPlayer[player._client.uuid]) {
|
|
player._client.end("You are already connected");
|
|
return;
|
|
}
|
|
if (serv.bannedPlayers[player._client.uuid]) {
|
|
player.kick(serv.bannedPlayers[player._client.uuid].reason);
|
|
return;
|
|
}
|
|
|
|
addPlayer();
|
|
sendLogin();
|
|
await player.sendMap();
|
|
player.sendSpawnPosition();
|
|
player.sendPosition();
|
|
player.updateHealth(player.entity.health);
|
|
|
|
|
|
updateTime();
|
|
player.setGameMode(player.gameMode);
|
|
fillTabList();
|
|
player.updateAndSpawnNearbyPlayers();
|
|
|
|
announceJoin();
|
|
player.emit("spawned");
|
|
sendPlayersWhenMove();
|
|
|
|
setTimeout(function(){player.sendRestMap();sendChunkWhenMove();},100);
|
|
};
|
|
} |