flying-squid/src/lib/playerPlugins/login.js
Romain Beaumont e3b7ad569b fix stuff related to changeWorld
* use writeOthersNearby everywhere
* create player.playerViewDistance
* put toFixedPosition in vec3 prototype
* fix changeWorld (use the same function than in login)
* use entity_destroy in changeWorld
* sendPosition, not setPosition
* disable pregenWorld : it just makes everything slow
2015-10-25 21:03:02 +01:00

129 lines
No EOL
2.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={};
}
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.sendMap();
});
}
function updateTime()
{
player._client.write('update_time', {
age: [0, 0],
time: [0, serv.time]
});
}
function 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");
}
async function login()
{
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.updateHealth(player.entity.health);
updateTime();
setGameMode(player.gameMode);
fillTabList();
player.spawnForOthers();
player.sendNearbyPlayers();
player.spawn();
announceJoin();
player.emit("spawned");
setTimeout(function(){player.sendRestMap();sendChunkWhenMove();},100);
}
player.setGameMode=setGameMode;
player.login=login;
}